Ver Mensaje Individual
  #1398  
Antiguo 01-03-2024
Delphier Delphier is offline
Miembro
 
Registrado: feb 2024
Posts: 14
Reputación: 0
Delphier Va por buen camino
Presentación y Planteamiento

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

Última edición por Neftali [Germán.Estévez] fecha: 04-03-2024 a las 08:31:18.
Responder Con Cita