FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
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; 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 |
#2
|
||||
|
||||
Utiliza etiquetas de código cuando añadas trozos de código a los mensajes.
Para los códigos que llevan caracteres especiales se puede usar la etiqueta [ CODE ] en lugar de la de [ delphi ]
__________________
Germán Estévez => Web/Blog Guía de estilo, Guía alternativa Utiliza TAG's en tus mensajes. Contactar con el Clubdelphi P.D: Más tiempo dedicado a la pregunta=Mejores respuestas. |
#3
|
|||
|
|||
hola de nuevo
(a riesgo de parecer ya un poco absurdo, ya me disculpareis) Segun lo que he visto tenemos: 1 RegistroAltafacturas 1 Cabecera xx registro(s) de facturacion (sobre los que hay que calcular la huella) 1 control Si estoy equivocado corregidme por favor. ¿Tengo dudas si el nodo de Control, esta dentro o fuera del registro de facturacion? si el nodo de control esta fuera, entonces La huella se calcula sobre todos los registros de facturacion. si el nodo de control esta dentro del registro de facturacion, se calcula la huella sobre cada uno de los registros de facturacion. Para obtener el calculo de la huella, ¿es con los valores del registro de facturacion, ¿ó debe incluir los literales de identificacion de cada nodo XML? Saludos cordiales |
#4
|
|||
|
|||
He modificado el ejemplo de codigo anterior (cuando salgamos de dudas lo publico completo), para obtener la huella de los valores del registro(s) de Facturacion.
En nuestro caso del ejemplo, si tomo los valores del registro de facturacion: 20223T00000006Y84.2.1.256631/07/2022F231/07/2022VENTA MINORISTA01S14.001.000.041.0400000006Y84.2.1.256531/07/20229yYI6U89U3IUIQE345EUGWEBsd7EKFCBP9trtYUJSD0JFFKJKrtthAuysfadfWPESISTEMAS INFORMATICOS TPV00000006YIDENTIFICADOR AEAT XXXX46.243.14501 tengo un sha256 de: 45b36c6aa8b2068545c11a236f257f22754bb0392c87786a62985abcd43541c6 Comprobado en Delphi, y en varias herramientas online. Sin embargo con el mismo contenido del ejemplo de ermendalenda, tenemos: 005948F5A441A56ABF584804036409719AB89892608FD708BAB8AE5088C896AD desconozco si el ejemplo tenia bien calculada la huella, o me estoy equivocando en algo. |
#5
|
|||
|
|||
me respondo yo mismo:
El control diria que va fuera del "registro de facturacion", por tanto comprendera toda las facturas dentro de esos nodos. El calculo del sah256 se supone que es con los codigos "<" incluidos ">" Vease el link del mensaje #529: https://www.clubdelphi.com/foros/sho...&postcount=529 Me falta saber como firmar y enviar el XML. (sobre todo enviar) ¿se pueden hacer pruebas de envio ahora mismo? Si lo veis bien, puedo ir publicando el codigo. Saludos |
#6
|
|||
|
|||
Cita:
Que yo sepa, aún no están definidas las firmas ni los envios, no puedes hacer esas pruebas. El hash efectivamente es sobre el nodo de registros... con la etiqueta (de dicho nodo) de inicio y fin incluidas |
#7
|
|||
|
|||
Buenos dias !
Ya tengo el codigo para firmar el xml, utilizando el comando de linea de autofirma que funciona perfecto. solo me quedaria saber como enviarlo, aunque no este definida todavia la url, y ya publico el codigo un poco como guia creo que puede ser interesante. (en el codigo anterior hay un fallo, en usohorario (falta la h) husohorario) x favor ¿alguien puede ayudarme con el envío del XML? (y guardar la respuesta) gracias ! |
#8
|
|||
|
|||
Cita:
a ver si encuentro ayuda para enviar el xml. saludos ! |
#9
|
|||
|
|||
Cita:
Donde has conseguido los parámetros de la firma que hay que aplicar a los xmls y si es cades xades...? Sabes si la firma va con Timestamp de un organismo verificado? Última edición por ermendalenda fecha: 07-07-2023 a las 16:36:38. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Hijo de Informáticos | gluglu | Humor | 3 | 13-03-2007 11:05:35 |
Adictos informaticos ... | Trigger | Humor | 2 | 11-10-2004 12:18:32 |
Nosotros los Informáticos | Trigger | Humor | 1 | 10-10-2004 14:58:09 |
Patrón de los Informáticos. | obiwuan | Varios | 20 | 10-09-2003 14:44:54 |
Chistes Informaticos | jhonny | Humor | 2 | 11-08-2003 21:59:09 |
|