Cita:
Empezado por seccion_31
Ese enlace es muy amplio yo creo.
Te cuento lo que yo hago.
Utilizo un sistema de records que luego analizo mediante rtti para generar el XML. Ya fue un poco expuesto en el componente que he desarrollado para verifactu (para facturae), pero la version actual soporta el UBL perfecto:
Ejemplo del record de facturaUBL:
Código:
TFacturaUBL = record
ext_UBLExtensions : TUBLExtensions;
cbc_UBLVersionID : TFacturaUBLString;
cbc_CustomizationID : TFacturaUBLString;
cbc_ProfileID : TFacturaUBLString;
cbc_ID : TFacturaUBLString;
cbc_UUID : TFacturaUBLString;
cbc_IssueDate : TFacturaUBLString;
cbc_IssueTime : TFacturaUBLString;
cbc_InvoiceTypeCode : TFacturaUBLString;
cbc_Note : TFacturaUBLString;
cbc_DocumentCurrencyCode : TFacturaUBLString;
cac_AccountingSupplierParty : TPartyAccounting; // emisor (nosotros)
cac_AccountingCustomerParty : TPartyAccounting; // receptor (cliente)
cac_PaymentMeans : TPaymentMeans; // forma de pago
cac_PaymentTerms : array [0..MAXVTOS] of TPaymentTerms;
cac_AllowanceCharge : array [0..MAXTOTALS] of TAllowanceCharge; // importe
cac_TaxTotal : array [0..MAXTOTALS] of TTaxTotal; // impuestos
cac_LegalMonetaryTotal : TLegalMonetaryTotal;
cac_InvoiceLine : array of TInvoiceLine;
_rttiForceNoTocar :array of Byte; // para que el rtti genere estructura
end;
Relleno los records normalmente:
Código:
facturaUBL.cbc_UBLVersionID:='2.1';
facturaUBL.cbc_ID :=alltrim(dbFacturas.fieldbyname('nsernumero').text);
facturaUBL.cbc_IssueDate :=DatefacturaE( dbFacturas.fieldbyname('fecha').asdatetime );
facturaUBL.cbc_InvoiceTypeCode :='380';
facturaUBL.cbc_DocumentCurrencyCode :='EUR';
// datos del emisor
facturaUBL.cac_AccountingSupplierParty.cac_party.cac_PartyIdentification.cbc_ID_SchemeID :=dbEmpresa.FieldByName('cif').Text;
facturaUBL.cac_AccountingSupplierParty.cac_party.cac_PartyName.cbc_Name :=dbEmpresa.FieldByName('firmaco').Text;
facturaUBL.cac_AccountingSupplierParty.cac_party.cac_PartyLegalEntity.cbc_RegistrationName :=dbEmpresa.FieldByName('firmaco').Text;
facturaUBL.cac_AccountingSupplierParty.cac_party.cac_PostalAddress.cbc_StreetName :=dbEmpresa.FieldByName('direccion').Text;
facturaUBL.cac_AccountingSupplierParty.cac_party.cac_PostalAddress.cbc_CityName :=dbEmpresa.FieldByName('poblacion').Text;
facturaUBL.cac_AccountingSupplierParty.cac_party.cac_PostalAddress.cbc_PostalZone :=dbEmpresa.FieldByName('codpostal').text;
facturaUBL.cac_AccountingSupplierParty.cac_party.cac_PostalAddress.cac_Country.cbc_IdentificationCode :='ES';
facturaUBL.cac_AccountingSupplierParty.cac_party.cac_PartyTaxScheme.cbc_CompanyID :=dbEmpresa.FieldByName('cif').Text;
Ajusto algunas opciones:
Código:
// opciones globales del recordToXML
XMLEmptyValues :=false; // sin valores vacios
XMLEmptyNodes :=true; // sin nodos vacios
XMLRemoveSpaces:=true; // sin espacios extras (por izda. o dcha.)
XMLAutoUTF8 :=true; // convierte todos los string a UTF-8 automaticamente
XMLPrefijos_CAC_CBC_EXT:=true; // necesitamos convertir cac_ID a cac:ID
y luego llamo aqui:
Código:
recordToXML('uTipoFacturaUBL.TFacturaUBL',@FacturaUBL,archivo,@UBL_CallBack,'','Invoice');
Y se genera el XML UBL
Probablemente cuando tenga toda la informacion, acabe publicado en el componente de verifactu.
Fijate en los nodos de mi record para darle un vistazo a la documentacion. que pienso pueden ser los esenciales para generar una factura.
|
Gracias, le hecho un vistazo
