Ver Mensaje Individual
  #811  
Antiguo 06-07-2023
seccion_31 seccion_31 is offline
Miembro
 
Registrado: ene 2017
Posts: 112
Reputación: 8
seccion_31 Va por buen camino
He creado este codigo que genera un archivo XML, calcado al del ejemplo de ermendalenda:

Es un codigo muy basico, pero quizas a alguien le ayude, ahora voy a mirar como calcular la huella, que creo ha sido tratado en este foro.

(no lo formateo porque lo altera para mal)

Código Delphi [-]type TSistemaInformatico=record nombreRazon:string; NIF:string; IdsistemaInformatico:string; version:string; numeroInstalacion:string; TipoUsoSistema:string; end; TEncadenamiento=record IdEmisorFacturaAnterior:string; NumSerieFacturaAnterior:string; FechaExpedicionFacturaAnterior:Tdatetime; HuellaFacturaAnterior:string; end; TPeriodoliquidacion=record ejercicio:string; periodo:string; end; TIDFactura=record IdEmisor_nif:string; NumSerieFacturaEmisor:string; FechaExpedicionFacturaEmisor:Tdatetime; end; TDesglose=record claveRegimen:string; CalificacionOperacion:string; TipoImpositivo:real; BaseImponibleOImporteNoSujeto:real; CuotaRepercutida:real; end; TRegistroFactura=record PeriodoLiquidacion:TPeriodoliquidacion; IDFactura:TIDFactura; tipoFactura:string; FechaOperacion:Tdatetime; DescripcionOperacion:String; Desglose:array of TDesglose; ImporteTotal:real; EncadenamientoFacturaAnterior:TEncadenamiento; SistemaInformatico:TSistemaInformatico; end;



procedimientos:


Código:
function moneda(n:real):string;
begin
      FormatSettings.DecimalSeparator := '.';
      result:=trim(Format('%8.2f',[n]));
end;

function nodo(clave, valor:string):string;
begin
      result:='<'+clave+'>'+valor+'</'+clave+'>';
end;

procedure cabecera(xmlLista:TStringList; idVersion:string; NombreRazon, Nif:string);
begin
       if idVersion='' then idVersion:='0.1';

       xmlLista.add('<?xml version="1.0" encoding="UTF-8"?>');
       xmlLista.add('<SistemaFacturacionAltaFact xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/TR/xmldsig-core/xmldsig-core-schema.xsd">');
       xmlLista.add('<Cabecera>');
       xmlLista.add(nodo('IDVersion',idVersion));
       xmlLista.add('<ObligadoEmision>');
       xmlLista.add(nodo('NombreRazon',NombreRazon));
       xmlLista.add(nodo('NIF',Nif));
       xmlLista.add('</ObligadoEmision>');
       xmlLista.add('</Cabecera>');
end;

procedure iniciaRegistroAltaFacturas(xmlLista:TStringList);
begin
      xmlLista.add('<RegistroAltaFacturas>');
end;

function moneda(n:real):string;
begin
      FormatSettings.DecimalSeparator := '.';
      result:=trim(Format('%8.2f',[n]));
end;


procedure registroFacturacion(xmlLista:TStringList; registroFactura:TRegistroFactura);
var
  I:integer;
begin
      xmlLista.add('<RegistroFacturacion>');

      xmlLista.add('<PeriodoLiquidacion>');
      xmlLista.add(nodo('Ejercicio',registroFactura.PeriodoLiquidacion.ejercicio) );
      xmlLista.add(nodo('Periodo',registroFactura.PeriodoLiquidacion.periodo));
      xmlLista.add('</PeriodoLiquidacion>');

      xmlLista.add('<IdFactura>');
      xmlLista.add('<IdEmisorFactura>');
      xmlLista.add(nodo('NIF',registroFactura.IDFactura.IdEmisor_nif));
      xmlLista.add('</IdEmisorFactura>');

      xmlLista.add(nodo('NumSerieFacturaEmisor',registroFactura.IDFactura.NumSerieFacturaEmisor ));
      xmlLista.add(nodo('FechaExpedicionFacturaEmisor',datetostr(registroFactura.IDFactura.FechaExpedicionFacturaEmisor) ));
      xmlLista.add('</IdFactura>');

      xmlLista.add(nodo('TipoFactura',registroFactura.tipoFactura));
      xmlLista.add(nodo('FechaOperacion',datetostr(registroFactura.FechaOperacion)));
      xmlLista.add(nodo('DescripcionOperacion',registroFactura.DescripcionOperacion));

      // array de desgloses
      xmlLista.add('<Desglose>');
      for I := Low(registroFactura.Desglose) to High(registroFactura.Desglose) do
      begin
                xmlLista.add('<DetalleDesglose>');

                xmlLista.add(nodo('ClaveRegimen',registroFactura.Desglose[i].claveRegimen ));
                xmlLista.add(nodo('CalificacionOperacion',registroFactura.Desglose[i].CalificacionOperacion ));
                xmlLista.add(nodo('TipoImpositivo',moneda(registroFactura.Desglose[i].TipoImpositivo)));
                xmlLista.add(nodo('BaseImponibleOimporteNoSujeto',moneda(registroFactura.Desglose[i].BaseImponibleOImporteNoSujeto)));
                xmlLista.add(nodo('CuotaRepercutida',moneda(registroFactura.Desglose[i].CuotaRepercutida)));

                xmlLista.add('</DetalleDesglose>');
      end;
      xmlLista.add('</Desglose>');

      xmlLista.add(nodo('ImporteTotal',moneda(registroFactura.ImporteTotal)));

      xmlLista.add('<EncadenamientoFacturaAnterior>');
      xmlLista.add(nodo('IDEmisorFacturaAnterior',registroFactura.EncadenamientoFacturaAnterior.IdEmisorFacturaAnterior));
      xmlLista.add(nodo('NumSerieFacturaAnterior',registroFactura.EncadenamientoFacturaAnterior.NumSerieFacturaAnterior));
      xmlLista.add(nodo('FechaExpedicionFacturaAnterior',datetostr(registroFactura.EncadenamientoFacturaAnterior.FechaExpedicionFacturaAnterior)));
      xmlLista.add(nodo('HuellaFacturaAnterior',registroFactura.EncadenamientoFacturaAnterior.HuellaFacturaAnterior));
      xmlLista.add('</EncadenamientoFacturaAnterior>');


      xmlLista.add('<SistemaInformatico>');
      xmlLista.add(nodo('NombreRazon',registroFactura.SistemaInformatico.nombreRazon ));
      xmlLista.add(nodo('NIF', registroFactura.SistemaInformatico.NIF ) );
      xmlLista.add(nodo('IdSistemaInformatico', registroFactura.SistemaInformatico.IdsistemaInformatico ) );
      xmlLista.add(nodo('Version',registroFactura.SistemaInformatico.version));
      xmlLista.add(nodo('NumeroInstalacion',registroFactura.SistemaInformatico.numeroInstalacion));
      xmlLista.add(nodo('TipoUsoSistema',registroFactura.SistemaInformatico.TipoUsoSistema));
      xmlLista.add('</SistemaInformatico>');
      xmlLista.add('</RegistroFacturacion>');
end;


function finalizaRegistroAltaFacturas(xmlLista:TStringList):string;
var
  _huella:string;
begin
      // calculo de la huella: (por hacer)
      _huella:='005948F5A441A56ABF584804036409719AB89892608FD708BAB8AE5088C896AD';
      result:=_huella;
      //


      xmlLista.add('<DatosControl>');
      xmlLista.add(nodo('Huella',_huella) );
      xmlLista.add(nodo('TipoHash','01') );
      xmlLista.add(nodo('FechaGenRegistro',dateTostr(date)) );
      xmlLista.add(nodo('HoraGenRegistro',timeTostr(time)) );
      xmlLista.add(nodo('HUsoHorarioGenRegistro','02') );
      xmlLista.add('</DatosControl>');

      xmlLista.add('</RegistroAltaFacturas>');
      xmlLista.add('</SistemaFacturacionAltaFact>');
end;


// datos de la factura "desde la base de datos:"

procedure anadeDatosFactura(var factura:TRegistroFactura);
begin
      factura.PeriodoLiquidacion.ejercicio:='2022';
      factura.PeriodoLiquidacion.periodo:='3T';
      factura.IDFactura.IdEmisor_nif:='00000006Y';
      factura.IDFactura.NumSerieFacturaEmisor:='84.2.1.2566';
      factura.IDFactura.FechaExpedicionFacturaEmisor:=strtodate('31/07/2022');
      factura.tipoFactura:='F2';
      factura.FechaOperacion:=factura.IDFactura.FechaExpedicionFacturaEmisor;
      factura.DescripcionOperacion:='VENTA MINORISTA';

      setLength(factura.Desglose,1);

      factura.Desglose[0].claveRegimen:='01';
      factura.Desglose[0].CalificacionOperacion:='S1';
      factura.Desglose[0].TipoImpositivo:=4;
      factura.Desglose[0].BaseImponibleOImporteNoSujeto:=1;
      factura.Desglose[0].CuotaRepercutida:=0.04;

      factura.ImporteTotal:=1.04;

      // encadenamiento factura anterior
      factura.EncadenamientoFacturaAnterior.IdEmisorFacturaAnterior:='00000006Y';
      factura.EncadenamientoFacturaAnterior.NumSerieFacturaAnterior:='84.2.1.2565';
      factura.EncadenamientoFacturaAnterior.FechaExpedicionFacturaAnterior:=strTodate('31/07/2022');
      factura.EncadenamientoFacturaAnterior.HuellaFacturaAnterior:='9yYI6U89U3IUIQE345EUGWEBsd7EKFCBP9trtYUJSD0JFFKJKrtthAuysfadfWPE';

      // sistema informatico
      factura.SistemaInformatico.nombreRazon:='SISTEMAS INFORMATICOS TPV';
      factura.SistemaInformatico.NIF:='00000006Y';
      factura.SistemaInformatico.IdsistemaInformatico:='IDENTIFICADOR AEAT XXXX';
      factura.SistemaInformatico.version:='46.243.1';
      factura.SistemaInformatico.numeroInstalacion:='45';
      factura.SistemaInformatico.TipoUsoSistema:='01';
end;
// Click que genera el archivo XML

Código:
procedure TForm2.Button6Click(Sender: TObject);
var
  xml:TStringList;
  factura:TRegistroFactura;
begin
    xml:=TStringList.Create;

    cabecera(xml, '0.1', 'EMPRESA DE PRUEBA, S.A.','00000006Y');    

    iniciaRegistroAltaFacturas(xml);    <-- inicia la carga de facturas

    // por cada factura:
    
    anadeDatosFactura(factura);  // <-- carga de datos de la factura desde la "BD"
    registroFacturacion(xml, factura);    <-- carga la factura en el XML


    // final    
    finalizaRegistroAltaFacturas(xml);

    xml.SaveToFile('c:\final.xml');
    xml.Free;
end;

Última edición por Neftali [Germán.Estévez] fecha: 10-07-2023 a las 08:25:18. Razón: el codigo lo paso con errores al formatear
Responder Con Cita