Ver Mensaje Individual
  #1419  
Antiguo 04-03-2024
Avatar de ramherfer
ramherfer ramherfer is offline
Miembro
 
Registrado: may 2013
Ubicación: Valencia
Posts: 51
Reputación: 11
ramherfer Va por buen camino
Cita:
Empezado por Delphier Ver Mensaje
Antes de nada , saludar al foro y dar las gracias a todos los que han escrito, me han ayudado mucho a decidir como empezar , con la pereza que me daba.

Como soy novato en el foro , es mi primer post y os cuento como lo voy a plantear Inicialmente, modo básico y esquemático , por si le sirve a alguien o por si alguien más experto me recomienda que abandone las cervecitas urgentemente

Es verdad que cuando me ponga seguro pueden cambiar cosas , es solo un planteamiento incial para empezar a trabajar, no entro en los requisitos de huella,firma etc....

En principio la idea es no tocar las tablas actuales de facturas ,etc. que ya existen en mi sistema.

1.- Voy a crear una tabla nueva para guardar los registros verifactu de cada factura

básicamente tendrá:

campo que identifica la factura en el fichero de facturas
campo para guardar el xml "RegistroFacturacion"
campo para guardar el número de envío , si 0 = Pendiente de enviar.

seguro que al final tenga que añadir alguno más....


2.- Voy a crear una tabla nueva para guardar los registros de los envíos verifactu

campo con un código interno de envío
campo para guardar el xml AltaFactuSistemaFacturacion enviado.
campo para guardar la respuesta de la aeat.

seguro que al final tenga que añadir alguno más....


Cada factura que se genere usare Fact.RegistroFacturacion.ObjectToSOAP para obtener el xml y guardarlo en la tabla de los registros verifactu.

Partiendo del código de Neftali , aqui va un ejemplo de como obtener el xml con ObjectToSOAP , solo hay que meter en el Form un XMLDocument1, TOPToSoapDomConvert

Código Delphi [-]
procedure TForm4.Button7Click(Sender: TObject);
var
  ARootNode, ElemNode, NewNode: IXMLNode;
  RefId,Swdsl : String;
begin
  XMLDocument1.Active := True;

  XMLDocument1.Version:='1.0';
  XMLDocument1.Encoding:='utf-8';

  with XMLDOcument1 do
  begin
    ARootNode := CreateNode('RegistroFacturacion');
  end;


  // Factura ejemplo
  var fact:FacturasEmitidasType;
  fact := FacturasEmitidasType.Create;
  fact.RegistroFacturacion := RegistroFacturacionType.Create;
  fact.RegistroFacturacion.IDFactura := IDFacturaExpedidaType.Create;
  fact.RegistroFacturacion.IDFactura.NumSerieFacturaEmisor := '23/123456';
  fact.RegistroFacturacion.IDFactura.FechaExpedicionFacturaEmisor := '31/12/23';
  fact.RegistroFacturacion.IDFactura.IDEmisorFactura := IDEmisorFactura.Create;
  fact.RegistroFacturacion.IDFactura.IDEmisorFactura.NIF := '3333333';
  fact.RegistroFacturacion.DescripcionOperacion := 'venta de mercaderías';

    // Resto de datos de la factura....

  Swdsl := "no puedo poner enlaces   xxxxxenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl";


  newNode := Fact.RegistroFacturacion.ObjectToSOAP( ARootNode, ARootNode, OPToSoapDomConvert1, 'RegistroFacturacionType', Swdsl, 'T',[], RefId  ); 

  XMLDocument1.DocumentElement := ARootNode;
  Memo1.Lines.Clear;
  Memo1.Lines.Add(XMLDocument1.XML.Text);
  XMLDocument1.Active := False;


  fact.DisposeOf;
  fact.RegistroFacturacion.DisposeOf;

end;


Luego al generar los envíos , aprovechar el ejemplo de Neftali para ir recogiendo los RegistroFacturacion guardados con SOAPToObject

Código Delphi [-]
procedure TForm4.Button5Click(Sender: TObject);
var
  arrayDetalles : array of DetalleType;
  RegistroAltaFacturas: Array_Of_FacturasEmitidasType;
  x : Integer;
begin
  var alta:AltaFactuSistemaFacturacion := AltaFactuSistemaFacturacion.Create;

  // Cabecera
  var cab := Cabecera.Create;
  cab.IDVersion := VersionType._1_0;

  cab.ObligadoEmision := PersonaFisicaJuridicaESType.Create;
  cab.ObligadoEmision.NombreRazon := 'Empresa pruebas';
  cab.ObligadoEmision.NIF := '11111111H';
  cab.TipoRegistroAEAT := TipoRegistroAEATType.T0;
  cab.FechaFinVeriFactu := '01/01/2026';
  alta.Cabecera := cab;


  for x := 0 to 1 do
  Begin


    // Factura
    var fact:FacturasEmitidasType;
    fact := FacturasEmitidasType.Create;


    fact.RegistroFacturacion := RegistroFacturacionType.Create;
    fact.RegistroFacturacion.SOAPToObject()  // Codigo pendiente de poner y probar , solo es para mostrar el planteamiento , pero es el contrario de ObjectToSOAP

 
   // Lista de facturas del envío
   SetLength(RegistroAltaFacturas, x+1);

    RegistroAltaFacturas[x] := fact;

  end;


  // Factura 1
  alta.RegistroAltaFacturas := RegistroAltaFacturas;




  // envío
  try
    var res:RespuestaAltaFactuSistemaFacturacion := RespuestaAltaFactuSistemaFacturacion.Create;
    res := GetsfSOAP(False, '', HTTPRIO1).AltaFactuSistemaFacturacion(alta);

    ShowMessage('Se ha realizado el envío; ' + sLineBreak +
                '   CSV: ' + res.CSV  + sLineBreak +
                '   TimeStamp: ' + res.DatosPresentacion.TimestampPresentacion
                );
  except
    on E:Exception do begin
      ShowMessage(Format('Error al realizar el envío; (%s)-%s',[E.ClassName, E.Message]));
    end;
  end;
end;

Un Saludo a todos y no me metáis mucha caña
Pues he probado la primera parte y me genera el fichero xml, pero con unos NS1, NS2, NSn y type que no se si será correcto guardar cada registro de facturación con esta codificación:
Código:
<RegistroFacturacion xmlns:NS1="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SistemaFacturacion.wsdl" xmlns:NS2="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd" xmlns:NS3="http://www.w3.org/2001/XMLSchema" xmlns:NS4="http://schemas.xmlsoap.org/soap/encoding/" xmlns:NS5="http://www.w3.org/2001/XMLSchema-instance">
<NS1:RegistroFacturacionType id="1" type="NS2:RegistroFacturacionType">
<IDFactura href="#2"/>
<NombreRazonEmisor type="NS3:string"/>
<TipoRegistroSIF type="NS2:TipoRegistroSIFType">S0</TipoRegistroSIF>
<TipoFactura type="NS2:ClaveTipoFacturaType">F1</TipoFactura>
<DescripcionOperacion type="NS3:string">venta de mercaderías</DescripcionOperacion>
<Desglose type="NS4:Array" NS4:arrayType="NS2:DetalleType[0]"/>
<ImporteTotal type="NS3:string"/>
<EncadenamientoRegistroAnterior NS5:nil="true"/>
<SistemaInformatico NS5:nil="true"/>
<FechaGenRegistro NS5:type="NS3:string"/>
<HoraGenRegistro NS5:type="NS3:string"/>
<HusoHorarioGenRegistro NS5:type="NS2:HusoHorarioGenRegistroType">01</HusoHorarioGenRegistro>
</NS1:RegistroFacturacionType>
<NS2:IDFactura id="2" type="NS2:IDFacturaExpedidaType">
<IDEmisorFactura href="#3"/>
<NumSerieFacturaEmisor type="NS3:string">23/123456</NumSerieFacturaEmisor>
<FechaExpedicionFacturaEmisor type="NS3:string">31/12/23</FechaExpedicionFacturaEmisor>
</NS2:IDFactura>
<NS2:IDEmisorFactura id="3" type="NS2:IDEmisorFactura">
<NIF type="NS3:string">3333333</NIF>
</NS2:IDEmisorFactura>
</RegistroFacturacion>
En principio me parece bueno y funciona, correcto ya no se si decir si sería correcto. Hay mucha gente más capacitada que yo para calificarlo si sería correcto o no.

Sería muy interesante probar la segunda parte (envío) y que intentaré probar durante la semana. El planteamiento en mi humilde opinión parece bueno de narices.
__________________
Se humilde para admitir tus errores, inteligente para aprender de ellos y maduro para corregirlos.
Responder Con Cita