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;
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';
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;
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
var fact:FacturasEmitidasType;
fact := FacturasEmitidasType.Create;
fact.RegistroFacturacion := RegistroFacturacionType.Create;
fact.RegistroFacturacion.SOAPToObject()
SetLength(RegistroAltaFacturas, x+1);
RegistroAltaFacturas[x] := fact;
end;
alta.RegistroAltaFacturas := RegistroAltaFacturas;
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