unit Cfdi40RadStudio;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ ejemplo de CFDI 4.0 basico }
procedure TForm1.Button1Click(Sender: TObject);
 var
    i: Integer;
    hXml: LongInt;
    hBar: Thandle;

    VXML_NewW                        : function  ( szVersion:PChar ):LongInt; cdecl;
    VXML_SetUserInfoW                : procedure ( hXml:LongInt; szUser:PChar; servidor:PChar ); cdecl;
    VXML_AddCfdiRelacionado_cfdi40W  : procedure ( p:LongInt; UUID:PChar ); cdecl;
    VXML_AddCfdiRelacionados_cfdi40W : procedure ( p:LongInt; TipoRelacion:PChar; UUID1:PChar; UUID2:PChar; UUID3:PChar; UUID4:PChar; UUID5:PChar; UUID6:PChar; UUID7:PChar; UUID8:PChar; UUID9:PChar; UUID10:PChar ); cdecl;
    VXML_SetComprobanteInfo_cfdi40W  : procedure ( p:LongInt; Serie:PChar; Folio:PChar; Fecha:PChar; FormaDePago:PChar; CondicionesDePago:PChar; SubTotal:PChar; Descuento:PChar; Moneda:PChar; TipoCambio:PChar; Total:PChar; TipoDeComprobante:PChar; MetodoDePago:PChar; LugarExpedicion:PChar; Confirmacion:PChar; Exportacion:PChar ); cdecl;
    VXML_SetEmisorInfo_cfdi40W       : procedure ( p:LongInt; RFC:PChar; Nombre:PChar; RegimenFiscal:PChar; FacAtrAdquirente:PChar ); cdecl;
    VXML_SetReceptorInfo_cfdi40W     : procedure ( p:LongInt; RFC:PChar; Nombre:PChar; ResidenciaFiscal:PChar; NumRegIdTrib:PChar; UsoCFDI:PChar; DomicilioFiscalReceptor:PChar; RegimenFiscalReceptor:PChar ); cdecl;
    VXML_AddConcepto_cfdi40W         : procedure ( p:LongInt; ClaveProdServ:PChar; NoIdentificacion:PChar; Cantidad:PChar; ClaveUnidad:PChar; Unidad:PChar; Descripcion:PChar; ValorUnitario:PChar; Importe:PChar; Descuento:PChar; ObjetoImp:PChar ); cdecl;
    VXML_AddConceptoTraslado_cfdi40W : procedure ( p:LongInt; Base:PChar; Impuesto:PChar; Tipofactor:PChar; TasaOCuota:PChar; Importe:PChar ); cdecl;
    VXML_SetImpuestosInfo_cfdi40W    : procedure ( p:LongInt; totalImpuestosTrasladados:PChar; totalImpuestosRetenidos:PChar ); cdecl;
    VXML_AddTraslado_cfdi40W         : procedure ( p:LongInt; Impuesto:PChar; TipoFactor:PChar; TasaOCuota:PChar; Importe:PChar; Base:PChar ); cdecl;
    VXML_ProcesaDocumentoW           : function  ( hXml:LongInt; csd:PChar; key:PChar; keypwd:PChar; outfile:PChar ):LongInt; cdecl;
    VXML_GetValueW                   : function  ( hXml:LongInt; value:LongInt ):PChar; cdecl;
    VXML_FreeW                       : procedure ( p:LongInt ); cdecl;

  begin

    hBar := LoadLibrary( 'VXML_x86.dll' );

    VXML_NewW                        := GetProcAddress (hBar, 'VXML_NewW' );
    VXML_SetUserInfoW                := GetProcAddress (hBar, 'VXML_SetUserInfoW' );
    VXML_AddCfdiRelacionado_cfdi40W  := GetProcAddress (hBar, 'VXML_AddCfdiRelacionado_cfdi40W' );
    VXML_AddCfdiRelacionados_cfdi40W := GetProcAddress (hBar, 'VXML_AddCfdiRelacionados_cfdi40W' );
    VXML_SetComprobanteInfo_cfdi40W  := GetProcAddress (hBar, 'VXML_SetComprobanteInfo_cfdi40W' );
    VXML_SetEmisorInfo_cfdi40W       := GetProcAddress (hBar, 'VXML_SetEmisorInfo_cfdi40W' );
    VXML_SetReceptorInfo_cfdi40W     := GetProcAddress (hBar, 'VXML_SetReceptorInfo_cfdi40W' );
    VXML_AddConcepto_cfdi40W         := GetProcAddress (hBar, 'VXML_AddConcepto_cfdi40W' );
    VXML_AddConceptoTraslado_cfdi40W := GetProcAddress (hBar, 'VXML_AddConceptoTraslado_cfdi40W' );
    VXML_SetImpuestosInfo_cfdi40W    := GetProcAddress (hBar, 'VXML_SetImpuestosInfo_cfdi40W' );
    VXML_AddTraslado_cfdi40W         := GetProcAddress (hBar, 'VXML_AddTraslado_cfdi40W' );
    VXML_ProcesaDocumentoW           := GetProcAddress (hBar, 'VXML_ProcesaDocumentoW' );
    VXML_GetValueW                   := GetProcAddress (hBar, 'VXML_GetValueW' );
    VXML_FreeW                       := GetProcAddress (hBar, 'VXML_FreeW' );

    //* indicamos la nueva version 4.0 */
    //hXml := VXml_NewWithLog("4.0","demoIngresoCFDI40.log")
    hXml := VXML_NewW('4.0');

    //* credenciales de timbrado */
    VXML_SetUserInfoW(hXml,'demo_cibertec','demo');
    //* ejemplos de CFDI relacionados, NO SIEMPRE LOS LLEVA, revise la guia de llenado para mas informacion de estos parametros */
    VXML_AddCfdiRelacionados_cfdi40W(hXml,'01','01000000-0000-0000-0000-000000000001','01000000-0000-0000-0000-000000000002','01000000-0000-0000-0000-000000000003','','','','','','','');
    VXML_AddCfdiRelacionado_cfdi40W(hXml,'01000000-0000-0000-0000-111111111111');
    VXML_AddCfdiRelacionados_cfdi40W(hXml,'02','02000000-0000-0000-0000-000000000001','','','','','','','','','');
    VXML_AddCfdiRelacionado_cfdi40W(hXml,'02000000-0000-0000-0000-222222222222');

    //* Datos generales del comprobante*/
    VXML_SetComprobanteInfo_cfdi40W(hXml,'CJZ','7303','%cb_date','99','CREDITO','6034.48','0.00','MXN','1','7000.00','I','PPD','07270','','01');
    //* datos del emisor */
    VXML_SetEmisorInfo_cfdi40W(hXml,'EKU9003173C9','ESCUELA KEMPER URGATE','601','');
    //* datos del receptor */
    VXML_SetReceptorInfo_cfdi40W(hXml,'CTE940531F58','CIBERNETICA Y TECNOLOGIA','','','G03','53050','601');

    //* agregamos conceptos */
    VXML_AddConcepto_cfdi40W(hXml,'43211500','EQU-0025','1.000','H87','Computadora','COMPUTADORA HP PORTATIL','6034.48','6034.48','0.00','02');
    VXML_AddConceptoTraslado_cfdi40W(hXml,'6034.48','002','Tasa','0.160000','965.52');  // impuestos del concepto

    //* resumen de impuestos */
    VXML_SetImpuestosInfo_cfdi40W(hXml,'965.52','');
    VXML_AddTraslado_cfdi40W(hXml,'002','Tasa','0.160000','965.52','6034.48');

    //* generamos el CFDI */
    i := VXML_ProcesaDocumentoW(hXml,'CSD_EKU9003173C9.cer','CSD_EKU9003173C9.key','12345678a','demoIngresoCFDI40.xml');

    if i = 0 then
      begin
        application.MessageBox(VXML_GetValueW( hXML, 1),'Resultado' );
        application.MessageBox(VXML_GetValueW( hXML, 3),'No. de certificado del emisor' );
        application.MessageBox(VXML_GetValueW( hXML, 4),'Sello digital del emisor');
        application.MessageBox(VXML_GetValueW( hXML, 5),'Cadena original del documento');
        application.MessageBox(VXML_GetValueW( hXML, 6),'No. de certificado del SAT');
        application.MessageBox(VXML_GetValueW( hXML, 7),'Sello digital del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 8),'Cadena original del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 9),'UUID Folio fiscal');
        application.MessageBox(VXML_GetValueW( hXML, 10),'Fecha de generacion del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 11),'Fecha de inicio de vigencia del certificado');
        application.MessageBox(VXML_GetValueW( hXML, 12),'Fecha de terminacion de vigencia del certificado');
        application.MessageBox(VXML_GetValueW( hXML, 13),'ID de operacion VirtualPAC');
        application.MessageBox(VXML_GetValueW( hXML, 14),'Cantidad de timbres disponbiles');
        application.MessageBox(VXML_GetValueW( hXML, 15),'Version de la libreria');
        application.MessageBox(VXML_GetValueW( hXML, 16),'Fecha de emision del XML');
        application.MessageBox(VXML_GetValueW( hXML, 17),'Mensaje del PAC');
        application.MessageBox(VXML_GetValueW( hXML, 18),'PAC que certifico el documento');
        application.MessageBox(VXML_GetValueW( hXML, 19),'No. de revision de la libreria');
        application.MessageBox(VXML_GetValueW( hXML, 20),'RFC del proveedor de certificacion');
        application.MessageBox(VXML_GetValueW( hXML, 21),'Leyenda del PAC');
      end
    else
      application.MessageBox(VXML_GetValueW( hXML, 2),'Descripcion del error');

    VXML_FreeW(hXML);
    FreeLibrary(Hbar);
end;

{ Ejemplo CFDI 4.0 con Complemento de Pagos 2.0 }
procedure TForm1.Button2Click(Sender: TObject);
var
    i: Integer;
    hXml: LongInt;
    hBar: Thandle;

    VXML_NewWithLogW                                : function  ( szVersion:PChar; cNombreLog:PChar ):LongInt; cdecl;
    VXML_SetUserInfoW                               : procedure ( hXml:LongInt; szUser:PChar; servidor:PChar ); cdecl;
    VXML_SetComprobanteInfo_cfdi40W                 : procedure ( p:LongInt; Serie:PChar; Folio:PChar; Fecha:PChar; FormaDePago:PChar; CondicionesDePago:PChar; SubTotal:PChar; Descuento:PChar; Moneda:PChar; TipoCambio:PChar; Total:PChar; TipoDeComprobante:PChar; MetodoDePago:PChar; LugarExpedicion:PChar; Confirmacion:PChar; Exportacion:PChar ); cdecl;
    VXML_SetEmisorInfo_cfdi40W                      : procedure ( p:LongInt; RFC:PChar; Nombre:PChar; RegimenFiscal:PChar; FacAtrAdquirente:PChar ); cdecl;
    VXML_SetReceptorInfo_cfdi40W                    : procedure ( p:LongInt; RFC:PChar; Nombre:PChar; ResidenciaFiscal:PChar; NumRegIdTrib:PChar; UsoCFDI:PChar; DomicilioFiscalReceptor:PChar; RegimenFiscalReceptor:PChar ); cdecl;
    VXML_AddConcepto_cfdi40W                        : procedure ( p:LongInt; ClaveProdServ:PChar; NoIdentificacion:PChar; Cantidad:PChar; ClaveUnidad:PChar; Unidad:PChar; Descripcion:PChar; ValorUnitario:PChar; Importe:PChar; Descuento:PChar; ObjetoImp:PChar ); cdecl;
    VXML_ProcesaDocumentoW                          : function  ( hXml:LongInt; csd:PChar; key:PChar; keypwd:PChar; outfile:PChar ):LongInt; cdecl;
    VXML_GetValueW                                  : function  ( hXml:LongInt; value:LongInt ):PChar; cdecl;
    VXML_FreeW                                      : procedure ( p:LongInt ); cdecl;
    VXML_SetPagos20W                                : procedure ( p:LongInt; TotalRetencionesIVA:PChar; TotalRetencionesISR:PChar; TotalRetencionesIEPS:PChar; TotalTrasladosBaseIVA16:PChar; TotalTrasladosImpuestoIVA16:PChar; TotalTrasladosBaseIVA8:PChar; TotalTrasladosImpuestoIVA8:PChar; TotalTrasladosBaseIVA0:PChar; TotalTrasladosImpuestoIVA0:PChar; TotalTrasladosBaseIVAExento:PChar; MontoTotalPagos:PChar ); cdecl;
    VXML_Pagos20AddPagoW                            : procedure ( p:LongInt; FechaPago:PChar; FormaDePagoP:PChar; MonedaP:PChar; TipoCambioP:PChar; Monto:PChar; NumOperacion:PChar; RfcEmisorCtaOrd:PChar; NomBancoOrdExt:PChar; CtaOrdenante:PChar; RfcEmisorCtaBen:PChar; CtaBeneficiario:PChar; TipoCadPago:PChar; CertPago:PChar; CadPago:PChar; SelloPago:PChar ); cdecl;
    VXML_Pagos20AddPagoDoctoRelacionadoW            : procedure ( p:LongInt; idDocumento:PChar; Serie:PChar; Folio:PChar; MonedadDR:PChar; EquivalenciaDR:PChar; NumParcialidad:PChar; ImpSaldoAnt:PChar; ImpPagado:PChar; ImpSaldoInsoluto:PChar; ObjetoImpDR:PChar ); cdecl;
    VXML_Pagos20AddPagoDoctoRelacionadoTrasladoDRW  : procedure ( p:LongInt; BaseDR:PChar; ImpuestoDR:PChar; TipoFactorDR:PChar; TasaOCuotaDR:PChar; ImporteDR:PChar ); cdecl;
    VXML_Pagos20AddPagoImpuestosPTrasladoPW         : procedure ( p:LongInt; BaseP:PChar; ImpuestoP:PChar; TipoFactorP:PChar; TasaOCuotaP:PChar; ImporteP:PChar ); cdecl;
    VXML_Pagos20AddPagoDoctoRelacionadoRetencionDRW : procedure ( p:LongInt; BaseDR:PChar; ImpuestoDR:PChar; TipoFactorDR:PChar; TasaOCuotaDR:PChar; ImporteDR:PChar ); cdecl;
    VXML_Pagos20AddPagoImpuestosPRetencionPW        : procedure ( p:LongInt; ImpuestoP:PChar; ImporteP:PChar ); cdecl;

  begin

    hBar := LoadLibrary( 'VXML_x86.dll' );

    VXML_NewWithLogW                                := GetProcAddress (hBar, 'VXML_NewWithLogW' );
    VXML_SetUserInfoW                               := GetProcAddress (hBar, 'VXML_SetUserInfoW' );
    VXML_SetComprobanteInfo_cfdi40W                 := GetProcAddress (hBar, 'VXML_SetComprobanteInfo_cfdi40W' );
    VXML_SetEmisorInfo_cfdi40W                      := GetProcAddress (hBar, 'VXML_SetEmisorInfo_cfdi40W' );
    VXML_SetReceptorInfo_cfdi40W                    := GetProcAddress (hBar, 'VXML_SetReceptorInfo_cfdi40W' );
    VXML_AddConcepto_cfdi40W                        := GetProcAddress (hBar, 'VXML_AddConcepto_cfdi40W' );
    VXML_ProcesaDocumentoW                          := GetProcAddress (hBar, 'VXML_ProcesaDocumentoW' );
    VXML_GetValueW                                  := GetProcAddress (hBar, 'VXML_GetValueW' );
    VXML_FreeW                                      := GetProcAddress (hBar, 'VXML_FreeW' );
    VXML_SetPagos20W                                := GetProcAddress (hBar, 'VXML_SetPagos20W' );
    VXML_Pagos20AddPagoW                            := GetProcAddress (hBar, 'VXML_Pagos20AddPagoW' );
    VXML_Pagos20AddPagoDoctoRelacionadoW            := GetProcAddress (hBar, 'VXML_Pagos20AddPagoDoctoRelacionadoW' );
    VXML_Pagos20AddPagoDoctoRelacionadoTrasladoDRW  := GetProcAddress (hBar, 'VXML_Pagos20AddPagoDoctoRelacionadoTrasladoDRW' );
    VXML_Pagos20AddPagoImpuestosPTrasladoPW         := GetProcAddress (hBar, 'VXML_Pagos20AddPagoImpuestosPTrasladoPW' );
    VXML_Pagos20AddPagoDoctoRelacionadoRetencionDRW := GetProcAddress (hBar, 'VXML_Pagos20AddPagoDoctoRelacionadoRetencionDRW' );
    VXML_Pagos20AddPagoImpuestosPRetencionPW        := GetProcAddress (hBar, 'VXML_Pagos20AddPagoImpuestosPRetencionPW' );

    hXml := VXml_NewWithLogW('4.0','demoPagos20Cfdi40.log');

    VXml_SetUserInfoW(hXml,'demo_cibertec','demo');
    VXml_SetComprobanteInfo_cfdi40W(hXml,'','12629','%cb_date','','','0','','XXX','','0','P','','72150','','01');
    VXml_SetEmisorInfo_cfdi40W(hXml,'EKU9003173C9','ESCUELA KEMPER URGATE','601','');
    VXml_SetReceptorInfo_cfdi40W(hXml,'CTE940531F58','CIBERNETICA Y TECNOLOGIA','','','CP01','53050','601');
    VXml_AddConcepto_cfdi40W(hXml,'84111506','','1','ACT','','Pago','0','0','','01');

    //* complemento de pagos 2.0 */

    //* antes de empezar con el complemento debemos tener todos los importes calculados previamente */
    VXml_SetPagos20W(hXml,'4930.51','4622.37','','64844.45','10375.12','','','','','','65666.67');

    { agregamos un pago parcial
      Importe total de la factura original: $15,000.00
                  Importe del pago parcial: $10,000.00 IVA INCLUIDO
                Importe del saldo insoluto: $ 5,000.00 }
    VXml_Pagos20AddPagoW(hXml,'2025-01-10T01:01:01','03','MXN','1','10000.00','0000842','','','','','','','','','');
    //* agregamos un documento relacionado */
    VXml_Pagos20AddPagoDoctoRelacionadoW(hXml,'8ADC78F8-4444-4444-4444-121212121212','Serie','0001','MXN','1','1','15000.00','10000.00','5000.00','02');
    { desglose de impuestos del documento relacionado
      Importe del pago: $10,000 IVA incluido
      Desglose de Impuestos:
                  Base de calculo del IVA: $ 8,620.69 (10,000 / 1.16)
                            IVA aplicable: $ 1,379.31 (10,000 - 8,620.69) }
    VXml_Pagos20AddPagoDoctoRelacionadoTrasladoDRW(hXml,'8620.69','002','Tasa','0.160000','1379.31');
    //* resumen de impuestos de todos los documentos relacionados */
    VXml_Pagos20AddPagoImpuestosPTrasladoPW(hXml,'8620.69','002','Tasa','0.160000','1379.31');

    //---------------------------------------------------------------------------------------
    { agregamos otro pago ahora total
      Importe total de la factura original: $11,600.00
                          Importe del pago: $11,600.00 IVA Incluido
                Importe del saldo insoluto: $0.00 }
    VXml_Pagos20AddPagoW(hXml,'2025-01-01T10:01:01','03','MXN','1','11600.00','0000843','','','','','','','','','');
    VXml_Pagos20AddPagoDoctoRelacionadoW(hXml,'8ADC78F8-4AB4-44FC-34AD-121212121212','Serie','00002','MXN','1','1','11600.00','11600.00','0.00','02');
    { desglose de impuestos del documento relacionado
      Importe del pago: $11,600.00 IVA incluido
      Desglose de impuestos:
                  Base de calculo del IVA: $10,000.00 (11,600 / 1.16)
                            IVA aplicable: $ 1,600.00 (11,600 - 10,000)}
    VXml_Pagos20AddPagoDoctoRelacionadoTrasladoDRW(hXml,'10000.00','002','Tasa','0.160000','1600.00');
    VXml_Pagos20AddPagoImpuestosPTrasladoPW(hXml,'10000.00','002','Tasa','0.160000','1600.00');

    { agregamos otro pago TOTAL con impuestos retenidos, el calculo es mas complejo y se complica mas aún si es un pago parcial. En este caso es un pago total
      Importe total de la factura original: $ 19,066.67
                          Importe del pago: $ 19,066.67 IVA y retenciones incluidas
                Importe del saldo insoluto: $0.00 }
    VXml_Pagos20AddPagoW(hXml,'2025-01-01T10:01:01','03','MXN','1','19066.67','0000844','','','','','','','','','');
    VXml_Pagos20AddPagoDoctoRelacionadoW(hXml,'F1DC78F8-4AB4-44FC-35AF-121212121212','Serie','00003','MXN','1','1','19066.67','19066.67','0.00','02');
    { desglose de los impuestos TRASLADADOS:
      Desglose de impuestos:
                  Base de calculo del IVA: $20,000.00
                            IVA aplicable: $ 3,200.00 }
    VXml_Pagos20AddPagoDoctoRelacionadoTrasladoDRW(hXml,'20000.00','002','Tasa','0.160000','3200.00');
    { desglose de los impuestos RETENIDOS
      Desglose de impuestos:
                  Base para la retencion de impuestos: $20,000.00
                             Retencion del 10% de ISR: $ 2,000.00
                      Retencion de 2/3 partes del IVA: $ 2,133.32  (20,000 * 10.6666...%)}
    VXml_Pagos20AddPagoDoctoRelacionadoRetencionDRW(hXml,'20000.00','001','Tasa','0.100000','2000.00');
    VXml_Pagos20AddPagoDoctoRelacionadoRetencionDRW(hXml,'20000.00','002','Tasa','0.106666','2133.32');
    VXml_Pagos20AddPagoImpuestosPTrasladoPW(hXml,'20000.00','002','Tasa','0.160000','3200.00');
    VXml_Pagos20AddPagoImpuestosPRetencionPW(hXml,'001','2000.00');
    VXml_Pagos20AddPagoImpuestosPRetencionPW(hXml,'002','2133.32');

    { agregamos otro pago PARCIAL con impuestos retenidos, este ejemplo es el mas complejo del complemento de pagos, porque hay que calcular porcentajes sobre los montos
      al aumentar el numero de decimales por culpa de los porcentajes, los calculos se vuelven imprecisos al realizar el redondeo, buena suerte en tus calculos

      La factura original esta calculada de la siguiente manera:

                     Importe de la factura original: $40,000.00
                             + IVA Factura original: $ 6,400.00
                             - Retencion 10% de ISR: $ 4,000.00
                     - Retencion 2/3 partes del IVA: $ 4,266.67
                                              TOTAL: $38,133.33 <---- sobre este importe trabajaremos

      Importe total de la factura original: $ 38,133.33
                          Importe del pago: $ 25,000.00 IVA y retenciones incluidas
                Importe del saldo insoluto: $ 13,133.33

    Hasta aqui la parte fácil *}

    VXml_Pagos20AddPagoW(hXml,'2025-01-01T10:01:01','03','MXN','1','25000.00','0000845','','','','','','','','','');
    VXml_Pagos20AddPagoDoctoRelacionadoW(hXml,'F1DC78F8-4AB4-44FC-35AF-121212121212','Serie','00003','MXN','1','1','38133.33','25000.00','13133.33','02');
    { desglose de los impuestos TRASLADADOS, para definir el importe debemos calcular el % que el pago realizado representa sobre el total y aplicar dicho % a todos los montos: iva trasladado, retenido y el isr
      Asi que aplicacamos una regla de 3 simple:

      $38,133.33 - 100% de la factura
      $25,000.00 - ???% de la factura ---> 65.5594% <-- este porcentaje aplicaremos sobre todas las operaciones

      Desglose de impuestos:
                  Base de calculo del IVA: $26,223.76 ($40,000.00, importe de la factura original antes de impuestos * 0.65594)
                            IVA aplicable: $ 4,195.81 ($26,223.76 * 16%) }
    VXml_Pagos20AddPagoDoctoRelacionadoTrasladoDRW(hXml,'26223.76','002','Tasa','0.160000','4195.81');
    { desglose de los impuestos RETENIDOS
      Desglose de impuestos:
                  Base para la retencion de impuestos: $26,223.76
                             Retencion del 10% de ISR: $ 2,622.37
                      Retencion de 2/3 partes del IVA: $ 2,797.19  ($4,195.81 * 10.6666...%)}
    VXml_Pagos20AddPagoDoctoRelacionadoRetencionDRW(hXml,'26223.76','001','Tasa','0.100000','2622.37');
    VXml_Pagos20AddPagoDoctoRelacionadoRetencionDRW(hXml,'26223.76','002','Tasa','0.106666','2797.19');
    VXml_Pagos20AddPagoImpuestosPTrasladoPW(hXml,'26223.76','002','Tasa','0.160000','4195.81');
    VXml_Pagos20AddPagoImpuestosPRetencionPW(hXml,'001','2622.37');
    VXml_Pagos20AddPagoImpuestosPRetencionPW(hXml,'002','2797.19');

    //* generamos el CFDI */
    i := VXml_ProcesaDocumentoW(hXml,'CSD_EKU9003173C9.cer','CSD_EKU9003173C9.key','12345678a','demoPagos20CFDI40.xml');

    if i = 0 then
      begin
        application.MessageBox(VXML_GetValueW( hXML, 1),'Resultado' );
        application.MessageBox(VXML_GetValueW( hXML, 3),'No. de certificado del emisor' );
        application.MessageBox(VXML_GetValueW( hXML, 4),'Sello digital del emisor');
        application.MessageBox(VXML_GetValueW( hXML, 5),'Cadena original del documento');
        application.MessageBox(VXML_GetValueW( hXML, 6),'No. de certificado del SAT');
        application.MessageBox(VXML_GetValueW( hXML, 7),'Sello digital del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 8),'Cadena original del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 9),'UUID Folio fiscal');
        application.MessageBox(VXML_GetValueW( hXML, 10),'Fecha de generacion del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 11),'Fecha de inicio de vigencia del certificado');
        application.MessageBox(VXML_GetValueW( hXML, 12),'Fecha de terminacion de vigencia del certificado');
        application.MessageBox(VXML_GetValueW( hXML, 13),'ID de operacion VirtualPAC');
        application.MessageBox(VXML_GetValueW( hXML, 14),'Cantidad de timbres disponbiles');
        application.MessageBox(VXML_GetValueW( hXML, 15),'Version de la libreria');
        application.MessageBox(VXML_GetValueW( hXML, 16),'Fecha de emision del XML');
        application.MessageBox(VXML_GetValueW( hXML, 17),'Mensaje del PAC');
        application.MessageBox(VXML_GetValueW( hXML, 18),'PAC que certifico el documento');
        application.MessageBox(VXML_GetValueW( hXML, 19),'No. de revision de la libreria');
        application.MessageBox(VXML_GetValueW( hXML, 20),'RFC del proveedor de certificacion');
        application.MessageBox(VXML_GetValueW( hXML, 21),'Leyenda del PAC');
      end
    else
      application.MessageBox(VXML_GetValueW( hXML, 2),'Descripcion del error');

    VXML_FreeW(hXML);
    FreeLibrary(Hbar);
end;

{ CFDI 4.0 de TRASLADO con Complemento Carta Porte 3.1 }
procedure TForm1.Button3Click(Sender: TObject);
 var
    i: Integer;
    hXml: LongInt;
    hBar: Thandle;

    VXML_NewWithLogW                                 : function  ( szVersion:PChar; cNombreLog:PChar ):LongInt; cdecl;
    VXML_SetUserInfoW                                : procedure ( hXml:LongInt; szUser:PChar; servidor:PChar ); cdecl;
    VXML_SetComprobanteInfo_cfdi40W                  : procedure ( p:LongInt; Serie:PChar; Folio:PChar; Fecha:PChar; FormaDePago:PChar; CondicionesDePago:PChar; SubTotal:PChar; Descuento:PChar; Moneda:PChar; TipoCambio:PChar; Total:PChar; TipoDeComprobante:PChar; MetodoDePago:PChar; LugarExpedicion:PChar; Confirmacion:PChar; Exportacion:PChar ); cdecl;
    VXML_SetEmisorInfo_cfdi40W                       : procedure ( p:LongInt; RFC:PChar; Nombre:PChar; RegimenFiscal:PChar; FacAtrAdquirente:PChar ); cdecl;
    VXML_SetReceptorInfo_cfdi40W                     : procedure ( p:LongInt; RFC:PChar; Nombre:PChar; ResidenciaFiscal:PChar; NumRegIdTrib:PChar; UsoCFDI:PChar; DomicilioFiscalReceptor:PChar; RegimenFiscalReceptor:PChar ); cdecl;
    VXML_AddConcepto_cfdi40W                         : procedure ( p:LongInt; ClaveProdServ:PChar; NoIdentificacion:PChar; Cantidad:PChar; ClaveUnidad:PChar; Unidad:PChar; Descripcion:PChar; ValorUnitario:PChar; Importe:PChar; Descuento:PChar; ObjetoImp:PChar ); cdecl;
    VXML_ProcesaDocumentoW                           : function  ( hXml:LongInt; csd:PChar; key:PChar; keypwd:PChar; outfile:PChar ):LongInt; cdecl;
    VXML_GetValueW                                   : function  ( hXml:LongInt; value:LongInt ):PChar; cdecl;
    VXML_FreeW                                       : procedure ( p:LongInt ); cdecl;
    VXML_SetCartaPorte31W                            : procedure ( p:LongInt; IdCCP:PChar; TranspInternac:PChar; EntradaSalidaMerc:PChar; PaisOrigenDestino:PChar; ViaEntradaSalida:PChar; TotalDistRec:PChar; RegistroITSMO:PChar; UbicacionPoloOrigen:PChar; UbicacionPoloDestino:PChar ); cdecl;
    VXML_CartaPorte31AddUbicacionW                   : procedure ( p:LongInt; TipoUbicacion:PChar; IDUbicacion:PChar; RFCRemitenteDestinatario:PChar; NombreRemitenteDestinatario:PChar; NumRegIdTrib:PChar; ResidenciaFiscal:PChar; NumEstacion:PChar; NombreEstacion:PChar; NavegacionTrafico:PChar; FechaHoraSalidaLlegada:PChar; TipoEstacion:PChar; DistanciaRecorrida:PChar; Calle:PChar; NumeroExterior:PChar; NumeroInterior:PChar; Colonia:PChar; Localidad:PChar; Referencia:PChar; Municipio:PChar; Estado:PChar; Pais:PChar; CodigoPostal:PChar ); cdecl;
    VXML_CartaPorte31SetMercanciasW                  : procedure ( p:LongInt; PesoBrutoTotal:PChar; UnidadPeso:PChar; PesoNetoTotal:PChar; NumTotalMercancias:PChar; CargoPorTasacion:PChar; LogisticaInversaRecoleccionDevolucion:PChar ); cdecl;
    VXML_CartaPorte31AddMercanciaW                   : procedure ( p:LongInt; BienesTransp:PChar; ClaveSTCC:PChar; Descripcion:PChar; Cantidad:PChar; ClaveUnidad:PChar; Unidad:PChar; Dimensiones:PChar; MaterialPeligroso:PChar; CveMaterialPeligroso:PChar; Embalaje:PChar; DescripEmbalaje:PChar; SectorCOFEPRIS:PChar; NombreIngredienteActivo:PChar; NomQuimico:PChar; DenominacionGenericaProd:PChar; DenominacionDistintivaProd:PChar; Fabricante:PChar; FechaCaducidad:PChar; LoteMedicamento:PChar; FormaFarmaceutica:PChar; CondicionesEspTransp:PChar; RegistroSanitarioFolioAutorizacion:PChar; PermisoImportacion:PChar; FolioImpoVUCEM:PChar; NumCAS:PChar; RazonSocialEmpImp:PChar; NumRegSanPlagCOFEPRIS:PChar; DatosFabricante:PChar; DatosFormulador:PChar; DatosMaquilador:PChar; UsoAutorizado:PChar; PesoEnKg:PChar; ValorMercancia:PChar; Moneda:PChar; FraccionArancelaria:PChar; UUIDComercioExt:PChar; TipoMateria:PChar; DescripcionMateria:PChar ); cdecl;
    VXML_CartaPorte31SetMercanciasAutotransporteW    : procedure ( p:LongInt; PermSCT:PChar; NumPermisoSCT:PChar; ConfigVehicular:PChar; PesoBrutoVehicular:PChar; PlacaVM:PChar; AnioModeloVM:PChar; AseguraRespCivil:PChar; PolizaRespCivil:PChar; AseguraMedAmbiente:PChar; PolizaMedAmbiente:PChar; AseguraCarga:PChar; PolizaCarga:PChar; PrimaSeguro:PChar; SubTipoRem1:PChar; Placa1:PChar; SubTipoRem2:PChar; Placa2:PChar ); cdecl;
    VXML_CartaPorte31AddFiguraTransporteTiposFiguraW : procedure ( p:LongInt; TipoFigura:PChar; RFCFigura:PChar; NumLicencia:PChar; NombreFigura:PChar; NumRegIdTribFigura:PChar; ResidenciaFiscalFigura:PChar; ParteTransporte:PChar; Calle:PChar; NumeroExterior:PChar; NumeroInterior:PChar; Colonia:PChar; Localidad:PChar; Referencia:PChar; Municipio:PChar; Estado:PChar; Pais:PChar; CodigoPostal:PChar ); cdecl;

  begin

    hBar := LoadLibrary( 'VXML_x86.dll' );

    VXML_NewWithLogW                                 := GetProcAddress (hBar, 'VXML_NewWithLogW' );
    VXML_SetUserInfoW                                := GetProcAddress (hBar, 'VXML_SetUserInfoW' );
    VXML_SetComprobanteInfo_cfdi40W                  := GetProcAddress (hBar, 'VXML_SetComprobanteInfo_cfdi40W' );
    VXML_SetEmisorInfo_cfdi40W                       := GetProcAddress (hBar, 'VXML_SetEmisorInfo_cfdi40W' );
    VXML_SetReceptorInfo_cfdi40W                     := GetProcAddress (hBar, 'VXML_SetReceptorInfo_cfdi40W' );
    VXML_AddConcepto_cfdi40W                         := GetProcAddress (hBar, 'VXML_AddConcepto_cfdi40W' );
    VXML_ProcesaDocumentoW                           := GetProcAddress (hBar, 'VXML_ProcesaDocumentoW' );
    VXML_GetValueW                                   := GetProcAddress (hBar, 'VXML_GetValueW' );
    VXML_FreeW                                       := GetProcAddress (hBar, 'VXML_FreeW' );
    VXML_SetCartaPorte31W                            := GetProcAddress (hBar, 'VXML_SetCartaPorte31W' );
    VXML_CartaPorte31AddUbicacionW                   := GetProcAddress (hBar, 'VXML_CartaPorte31AddUbicacionW' );
    VXML_CartaPorte31SetMercanciasW                  := GetProcAddress (hBar, 'VXML_CartaPorte31SetMercanciasW' );
    VXML_CartaPorte31AddMercanciaW                   := GetProcAddress (hBar, 'VXML_CartaPorte31AddMercanciaW' );
    VXML_CartaPorte31SetMercanciasAutotransporteW    := GetProcAddress (hBar, 'VXML_CartaPorte31SetMercanciasAutotransporteW' );
    VXML_CartaPorte31AddFiguraTransporteTiposFiguraW := GetProcAddress (hBar, 'VXML_CartaPorte31AddFiguraTransporteTiposFiguraW' );

    //* iniciamos el comprobante esta vez sera un TRASLADO */
    hXml := VXml_NewWithLogW('4.0','demoCartaPorte31TrasladoCfdi40.log');
    VXml_SetUserInfoW(hXml,'demo_cibertec','demo');
    VXml_SetComprobanteInfo_cfdi40W(hXml,'T','3381652892','%cb_date','','','0','','XXX','','0','T','','42051','','01');
    VXml_SetEmisorInfo_cfdi40W(hXml,  'EKU9003173C9','ESCUELA KEMPER URGATE','601','') ;
    VXml_SetReceptorInfo_cfdi40W(hXml,'EKU9003173C9','ESCUELA KEMPER URGATE','','','S01','42501','601');

    //* como es un comprobante de TRASLADO, los conceptos son los bienes que se trasladan y se establecen en valores 0.00 y sin impuestos */
    VXml_AddConcepto_cfdi40W(hXml,'24112902','','1677','XUN','Unidad','Tina Plastica BBU/ Plastic tray. Marca: Orbis Norseman y Hus.','0.00','0.00','','01');
    VXml_AddConcepto_cfdi40W(hXml,'24101508','','120','XUN','Unidad','Base de plastico con rodajas para empaque y transporte/Dollies. Marca: Orbis','0.00','0.00','','01');
    //* inicia complemento de Carta Porte 3.1, */
    VXml_SetCartaPorte31W(hXml,'CCC69ff4-e09f-47bc-ba1e-e8a2e92958da','No','','','','12.71','','','');
    //* establecemos origen y destino del traslado */
    VXml_CartaPorte31AddUbicacionW(hXml, 'Origen', '', 'TEX090814EQ1',  '','','','','','','2025-02-25T11:05:00','','','C. OASYS, CANON DEL PADRE','','','','04','','004','BCN','MEX','22215');
    VXml_CartaPorte31AddUbicacionW(hXml, 'Destino', '', 'BIM011108DJ5', '', '','','','','','2025-02-25T12:00:00','','12.71','Av. Juan Alesio','12490','s/n','1525','04','INDUSTRIAL PACIFICO III TIJUANA BAJA CALIFORNIA','004','BCN','MEX','22643');
    //* datos de las mercancias transportadas */
    VXml_CartaPorte31SetMercanciasW(hXml,'5162','KGM','', '2', '', '');
    VXML_CartaPorte31AddMercanciaW(hXml,'24112902','','Tina Plastica BBU/ Plastic tray. Marca: Orbis Norseman y Hus.','1677','XUN','','','No','','','','','','','','','','','','','','','','','','','','','','','','4411','','','','','','');
    VXML_CartaPorte31AddMercanciaW(hXml,'24101508','','Base de plastico con rodajas para empaque y transporte/Dollies. Marca: Orbis','120','XUN','','','','','','','','','','','','','','','','','','','','','','','','','','','751','','','','','','');
    //* datos del transporte que mueve las mercancias */
    VXml_CartaPorte31SetMercanciasAutoTransporteW(hXml, 'TPAF01', '0203THG15092014133901227','T3S2','12.6','50EN6B','2019','QUALITAS COMPAÑIA DE SEGUROS S.A DE C.V.','540326225','','','','','','CTR007','4KE1943','','');
    //* datos del conductor del transporte */
    VXML_CartaPorte31AddFiguraTransporteTiposFiguraW(hXml,'01', 'VEGD861207ND3','LFD01107519', 'VENEGAS GARCIA DANIEL','','','', 'Prolongacion Callejon Vecinal','524','A','','04','','004','BCN','MEX','22414');
    //* generamos el CFDI */
    i := VXml_ProcesaDocumentoW(hXml,'CSD_EKU9003173C9.cer','CSD_EKU9003173C9.key','12345678a','DemoCartaPorte31TrasladoCfdi40.xml');

    if i = 0 then
      begin
        application.MessageBox(VXML_GetValueW( hXML, 1),'Resultado' );
        application.MessageBox(VXML_GetValueW( hXML, 3),'No. de certificado del emisor' );
        application.MessageBox(VXML_GetValueW( hXML, 4),'Sello digital del emisor');
        application.MessageBox(VXML_GetValueW( hXML, 5),'Cadena original del documento');
        application.MessageBox(VXML_GetValueW( hXML, 6),'No. de certificado del SAT');
        application.MessageBox(VXML_GetValueW( hXML, 7),'Sello digital del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 8),'Cadena original del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 9),'UUID Folio fiscal');
        application.MessageBox(VXML_GetValueW( hXML, 10),'Fecha de generacion del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 11),'Fecha de inicio de vigencia del certificado');
        application.MessageBox(VXML_GetValueW( hXML, 12),'Fecha de terminacion de vigencia del certificado');
        application.MessageBox(VXML_GetValueW( hXML, 13),'ID de operacion VirtualPAC');
        application.MessageBox(VXML_GetValueW( hXML, 14),'Cantidad de timbres disponbiles');
        application.MessageBox(VXML_GetValueW( hXML, 15),'Version de la libreria');
        application.MessageBox(VXML_GetValueW( hXML, 16),'Fecha de emision del XML');
        application.MessageBox(VXML_GetValueW( hXML, 17),'Mensaje del PAC');
        application.MessageBox(VXML_GetValueW( hXML, 18),'PAC que certifico el documento');
        application.MessageBox(VXML_GetValueW( hXML, 19),'No. de revision de la libreria');
        application.MessageBox(VXML_GetValueW( hXML, 20),'RFC del proveedor de certificacion');
        application.MessageBox(VXML_GetValueW( hXML, 21),'Leyenda del PAC');
      end
    else
      application.MessageBox(VXML_GetValueW( hXML, 2),'Descripcion del error');

    VXML_FreeW(hXML);
    FreeLibrary(Hbar);
  end;

{ CFDI 4.0 de Ingreso con Carta Porte 2.0}
procedure TForm1.Button4Click(Sender: TObject);
  var
    i: Integer;
    hXml: LongInt;
    hBar: Thandle;

    VXML_NewWithLogW                                 : function  ( szVersion:PChar; cNombreLog:PChar ):LongInt; cdecl;
    VXML_SetUserInfoW                                : procedure ( hXml:LongInt; szUser:PChar; servidor:PChar ); cdecl;
    VXML_SetComprobanteInfo_cfdi40W                  : procedure ( p:LongInt; Serie:PChar; Folio:PChar; Fecha:PChar; FormaDePago:PChar; CondicionesDePago:PChar; SubTotal:PChar; Descuento:PChar; Moneda:PChar; TipoCambio:PChar; Total:PChar; TipoDeComprobante:PChar; MetodoDePago:PChar; LugarExpedicion:PChar; Confirmacion:PChar; Exportacion:PChar ); cdecl;
    VXML_SetEmisorInfo_cfdi40W                       : procedure ( p:LongInt; RFC:PChar; Nombre:PChar; RegimenFiscal:PChar; FacAtrAdquirente:PChar ); cdecl;
    VXML_SetReceptorInfo_cfdi40W                     : procedure ( p:LongInt; RFC:PChar; Nombre:PChar; ResidenciaFiscal:PChar; NumRegIdTrib:PChar; UsoCFDI:PChar; DomicilioFiscalReceptor:PChar; RegimenFiscalReceptor:PChar ); cdecl;
    VXML_AddConcepto_cfdi40W                         : procedure ( p:LongInt; ClaveProdServ:PChar; NoIdentificacion:PChar; Cantidad:PChar; ClaveUnidad:PChar; Unidad:PChar; Descripcion:PChar; ValorUnitario:PChar; Importe:PChar; Descuento:PChar; ObjetoImp:PChar ); cdecl;
    VXML_AddConceptoTraslado_cfdi40W                 : procedure ( p:LongInt; Base:PChar; Impuesto:PChar; Tipofactor:PChar; TasaOCuota:PChar; Importe:PChar ); cdecl;
    VXML_SetImpuestosInfo_cfdi40W                    : procedure ( p:LongInt; totalImpuestosTrasladados:PChar; totalImpuestosRetenidos:PChar ); cdecl;
    VXML_AddTraslado_cfdi40W                         : procedure ( p:LongInt; Impuesto:PChar; TipoFactor:PChar; TasaOCuota:PChar; Importe:PChar; Base:PChar ); cdecl;
    VXML_ProcesaDocumentoW                           : function  ( hXml:LongInt; csd:PChar; key:PChar; keypwd:PChar; outfile:PChar ):LongInt; cdecl;
    VXML_GetValueW                                   : function  ( hXml:LongInt; value:LongInt ):PChar; cdecl;
    VXML_FreeW                                       : procedure ( p:LongInt ); cdecl;
    VXML_SetCartaPorte31W                            : procedure ( p:LongInt; IdCCP:PChar; TranspInternac:PChar; EntradaSalidaMerc:PChar; PaisOrigenDestino:PChar; ViaEntradaSalida:PChar; TotalDistRec:PChar; RegistroITSMO:PChar; UbicacionPoloOrigen:PChar; UbicacionPoloDestino:PChar ); cdecl;
    VXML_CartaPorte31AddUbicacionW                   : procedure ( p:LongInt; TipoUbicacion:PChar; IDUbicacion:PChar; RFCRemitenteDestinatario:PChar; NombreRemitenteDestinatario:PChar; NumRegIdTrib:PChar; ResidenciaFiscal:PChar; NumEstacion:PChar; NombreEstacion:PChar; NavegacionTrafico:PChar; FechaHoraSalidaLlegada:PChar; TipoEstacion:PChar; DistanciaRecorrida:PChar; Calle:PChar; NumeroExterior:PChar; NumeroInterior:PChar; Colonia:PChar; Localidad:PChar; Referencia:PChar; Municipio:PChar; Estado:PChar; Pais:PChar; CodigoPostal:PChar ); cdecl;
    VXML_CartaPorte31SetMercanciasW                  : procedure ( p:LongInt; PesoBrutoTotal:PChar; UnidadPeso:PChar; PesoNetoTotal:PChar; NumTotalMercancias:PChar; CargoPorTasacion:PChar; LogisticaInversaRecoleccionDevolucion:PChar ); cdecl;
    VXML_CartaPorte31AddMercanciaW                   : procedure ( p:LongInt; BienesTransp:PChar; ClaveSTCC:PChar; Descripcion:PChar; Cantidad:PChar; ClaveUnidad:PChar; Unidad:PChar; Dimensiones:PChar; MaterialPeligroso:PChar; CveMaterialPeligroso:PChar; Embalaje:PChar; DescripEmbalaje:PChar; SectorCOFEPRIS:PChar; NombreIngredienteActivo:PChar; NomQuimico:PChar; DenominacionGenericaProd:PChar; DenominacionDistintivaProd:PChar; Fabricante:PChar; FechaCaducidad:PChar; LoteMedicamento:PChar; FormaFarmaceutica:PChar; CondicionesEspTransp:PChar; RegistroSanitarioFolioAutorizacion:PChar; PermisoImportacion:PChar; FolioImpoVUCEM:PChar; NumCAS:PChar; RazonSocialEmpImp:PChar; NumRegSanPlagCOFEPRIS:PChar; DatosFabricante:PChar; DatosFormulador:PChar; DatosMaquilador:PChar; UsoAutorizado:PChar; PesoEnKg:PChar; ValorMercancia:PChar; Moneda:PChar; FraccionArancelaria:PChar; UUIDComercioExt:PChar; TipoMateria:PChar; DescripcionMateria:PChar ); cdecl;
    VXML_CartaPorte31SetMercanciasAutotransporteW    : procedure ( p:LongInt; PermSCT:PChar; NumPermisoSCT:PChar; ConfigVehicular:PChar; PesoBrutoVehicular:PChar; PlacaVM:PChar; AnioModeloVM:PChar; AseguraRespCivil:PChar; PolizaRespCivil:PChar; AseguraMedAmbiente:PChar; PolizaMedAmbiente:PChar; AseguraCarga:PChar; PolizaCarga:PChar; PrimaSeguro:PChar; SubTipoRem1:PChar; Placa1:PChar; SubTipoRem2:PChar; Placa2:PChar ); cdecl;
    VXML_CartaPorte31AddFiguraTransporteTiposFiguraW : procedure ( p:LongInt; TipoFigura:PChar; RFCFigura:PChar; NumLicencia:PChar; NombreFigura:PChar; NumRegIdTribFigura:PChar; ResidenciaFiscalFigura:PChar; ParteTransporte:PChar; Calle:PChar; NumeroExterior:PChar; NumeroInterior:PChar; Colonia:PChar; Localidad:PChar; Referencia:PChar; Municipio:PChar; Estado:PChar; Pais:PChar; CodigoPostal:PChar ); cdecl;
    VXML_CartaPorte31AddMercanciaCantidadTransportaW : procedure ( p:LongInt; Cantidad:PChar; IDOrigen:PChar; IDDestino:PChar; CvesTransporte:PChar ); cdecl;

  begin

    hBar := LoadLibrary( 'VXML_x86.dll' );

    VXML_NewWithLogW                                 := GetProcAddress (hBar, 'VXML_NewWithLogW' );
    VXML_SetUserInfoW                                := GetProcAddress (hBar, 'VXML_SetUserInfoW' );
    VXML_SetComprobanteInfo_cfdi40W                  := GetProcAddress (hBar, 'VXML_SetComprobanteInfo_cfdi40W' );
    VXML_SetEmisorInfo_cfdi40W                       := GetProcAddress (hBar, 'VXML_SetEmisorInfo_cfdi40W' );
    VXML_SetReceptorInfo_cfdi40W                     := GetProcAddress (hBar, 'VXML_SetReceptorInfo_cfdi40W' );
    VXML_AddConcepto_cfdi40W                         := GetProcAddress (hBar, 'VXML_AddConcepto_cfdi40W' );
    VXML_AddConceptoTraslado_cfdi40W                 := GetProcAddress (hBar, 'VXML_AddConceptoTraslado_cfdi40W' );
    VXML_SetImpuestosInfo_cfdi40W                    := GetProcAddress (hBar, 'VXML_SetImpuestosInfo_cfdi40W' );
    VXML_AddTraslado_cfdi40W                         := GetProcAddress (hBar, 'VXML_AddTraslado_cfdi40W' );
    VXML_ProcesaDocumentoW                           := GetProcAddress (hBar, 'VXML_ProcesaDocumentoW' );
    VXML_GetValueW                                   := GetProcAddress (hBar, 'VXML_GetValueW' );
    VXML_FreeW                                       := GetProcAddress (hBar, 'VXML_FreeW' );
    VXML_SetCartaPorte31W                            := GetProcAddress (hBar, 'VXML_SetCartaPorte31W' );
    VXML_CartaPorte31AddUbicacionW                   := GetProcAddress (hBar, 'VXML_CartaPorte31AddUbicacionW' );
    VXML_CartaPorte31SetMercanciasW                  := GetProcAddress (hBar, 'VXML_CartaPorte31SetMercanciasW' );
    VXML_CartaPorte31AddMercanciaW                   := GetProcAddress (hBar, 'VXML_CartaPorte31AddMercanciaW' );
    VXML_CartaPorte31SetMercanciasAutotransporteW    := GetProcAddress (hBar, 'VXML_CartaPorte31SetMercanciasAutotransporteW' );
    VXML_CartaPorte31AddFiguraTransporteTiposFiguraW := GetProcAddress (hBar, 'VXML_CartaPorte31AddFiguraTransporteTiposFiguraW' );
    VXML_CartaPorte31AddMercanciaCantidadTransportaW := GetProcAddress (hBar, 'VXML_CartaPorte31AddMercanciaCantidadTransportaW' );

    //* iniciamos el comprobante como si fuera de ingreso normal */
    hXml := VXml_NewWithLogW('4.0','demoCartaPorte31IngresoCfdi40.log');
    VXml_SetUserInfoW(hXml,'demo_cibertec','demo');
    VXml_SetComprobanteInfo_cfdi40W(hXml,'T','746','%cb_date','99','credito 15 dias','21000.00','','MXN','1','24360.00','I','PPD','72150','','01');
    VXml_SetEmisorInfo_cfdi40W(hXml,'EKU9003173C9','ESCUELA KEMPER URGATE','601','');
    VXml_SetReceptorInfo_cfdi40W(hXml,'LERJ970506QN8','JESUS ELIEZER LEIJA RAMIREZ','','','G03','88200','626');

    //* como es un comprobante de INGRESO entonces un transportista esta cobrando un flete de mercancia que pertenece a un cliente y se factura como un concepto normal */
    VXml_AddConcepto_cfdi40W(hXml,'78101802','001','1','E48','SERVICIO','SERVICIOS TRANSPORTE DE CARGA POR CARRETERA (EN CAMION) A NIVEL REGIONAL Y NACIONAL','21000.00','21000.00','','02');
    VXml_AddConceptoTraslado_cfdi40W(hXml,'21000.00','002','Tasa','0.160000','3360.00');  // impuestos del concepto, tenga en cuenta que algunas veces los fletes llevan también retenciones.

    //* resumen de impuestos */
    VXml_SetImpuestosInfo_cfdi40W(hXml,'3360.00','');
    VXml_AddTraslado_cfdi40W(hXml,'002','Tasa','0.160000','3360.00','21000.00');

    //* inicia complemento de Carta Porte 3.1, si necesita saber como obtener un UUID para su CFDI de Carta Porte, revise la función HB_GenUUID() */
    VXml_SetCartaPorte31W(hXml,'CCC6FED9-1CDA-4955-B3FC-8E692AB44900','No','','','','1200','','','');
    //* establecemos origen y destino del flete */
    VXml_CartaPorte31AddUbicacionW(hXml, 'Origen', 'OR000001','LERJ970506QN8', 'TRANSPORTES GALS','','','','','','2025-02-24T12:00:00','','','EUGENIO AGUIRRE','10','','0920','06','','027','TAM','MEX','88284');
    VXml_CartaPorte31AddUbicacionW(hXml, 'Destino', 'DE000001', 'LERJ970506QN8', 'PETROQUIMIA DEL GOLFO', '','','','','','2025-02-25T12:00:00','','1200','ANTONIE LAVOISIER','31','','6511','04','','121','MEX','MEX','54730');
    //* datos de las mercancias transportadas */
    VXml_CartaPorte31SetMercanciasW(hXml,'15656.00','KGM','15656.00', '1', '', 'Sí');
    VXML_CartaPorte31AddMercanciaW(hXml,'13101902','','RESINA DE POLIESTER','80.000','X4G','BULTOS','','','','','','','','','','','','','','','','','','','','','','','','','','15656.000','','','','','','');
    VXml_CartaPorte31AddMercanciaCantidadTransportaW(hXml,'80.000', 'OR000001', 'DE000001','');
    //* datos del transporte que mueve las mercancias */
    VXml_CartaPorte31SetMercanciasAutoTransporteW(hXml, 'TPAF01', '1522TMG02052019021001009','T3S2S2','7000','91AS9E','2014','BBVA','782B0502FD','','','','','','CTR007','CY3748','','');
    //* datos del conductor del transporte */
    VXML_CartaPorte31AddFiguraTransporteTiposFiguraW(hXml,'01', 'NAVM740828IQ3','DF00231807', 'MIGUEL ANGEL NANDO VELEZ','','','', 'VERACRUZ','7','','3846','','','036','MEX','MEX','55679');

    //* generamos el CFDI */
    i := VXml_ProcesaDocumentoW(hXml,'CSD_EKU9003173C9.cer','CSD_EKU9003173C9.key','12345678a','DemoCartaPorte31IngresosCfdi40.xml');

    if i = 0 then
      begin
        application.MessageBox(VXML_GetValueW( hXML, 1),'Resultado' );
        application.MessageBox(VXML_GetValueW( hXML, 3),'No. de certificado del emisor' );
        application.MessageBox(VXML_GetValueW( hXML, 4),'Sello digital del emisor');
        application.MessageBox(VXML_GetValueW( hXML, 5),'Cadena original del documento');
        application.MessageBox(VXML_GetValueW( hXML, 6),'No. de certificado del SAT');
        application.MessageBox(VXML_GetValueW( hXML, 7),'Sello digital del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 8),'Cadena original del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 9),'UUID Folio fiscal');
        application.MessageBox(VXML_GetValueW( hXML, 10),'Fecha de generacion del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 11),'Fecha de inicio de vigencia del certificado');
        application.MessageBox(VXML_GetValueW( hXML, 12),'Fecha de terminacion de vigencia del certificado');
        application.MessageBox(VXML_GetValueW( hXML, 13),'ID de operacion VirtualPAC');
        application.MessageBox(VXML_GetValueW( hXML, 14),'Cantidad de timbres disponbiles');
        application.MessageBox(VXML_GetValueW( hXML, 15),'Version de la libreria');
        application.MessageBox(VXML_GetValueW( hXML, 16),'Fecha de emision del XML');
        application.MessageBox(VXML_GetValueW( hXML, 17),'Mensaje del PAC');
        application.MessageBox(VXML_GetValueW( hXML, 18),'PAC que certifico el documento');
        application.MessageBox(VXML_GetValueW( hXML, 19),'No. de revision de la libreria');
        application.MessageBox(VXML_GetValueW( hXML, 20),'RFC del proveedor de certificacion');
        application.MessageBox(VXML_GetValueW( hXML, 21),'Leyenda del PAC');
      end
    else
      application.MessageBox(VXML_GetValueW( hXML, 2),'Descripcion del error');

    VXML_FreeW(hXML);
    FreeLibrary(Hbar);
end;

{ CFDI 4.0 Con Nomina 1.2}
procedure TForm1.Button5Click(Sender: TObject);
 var
    i: Integer;
    hXml: LongInt;
    hBar: Thandle;

    VXML_NewWithLogW                 : function  ( szVersion:PChar; cNombreLog:PChar ):LongInt; cdecl;
    VXML_SetUserInfoW                : procedure ( hXml:LongInt; szUser:PChar; servidor:PChar ); cdecl;
    VXML_SetComprobanteInfo_cfdi40W  : procedure ( p:LongInt; Serie:PChar; Folio:PChar; Fecha:PChar; FormaDePago:PChar; CondicionesDePago:PChar; SubTotal:PChar; Descuento:PChar; Moneda:PChar; TipoCambio:PChar; Total:PChar; TipoDeComprobante:PChar; MetodoDePago:PChar; LugarExpedicion:PChar; Confirmacion:PChar; Exportacion:PChar ); cdecl;
    VXML_SetEmisorInfo_cfdi40W       : procedure ( p:LongInt; RFC:PChar; Nombre:PChar; RegimenFiscal:PChar; FacAtrAdquirente:PChar ); cdecl;
    VXML_SetReceptorInfo_cfdi40W     : procedure ( p:LongInt; RFC:PChar; Nombre:PChar; ResidenciaFiscal:PChar; NumRegIdTrib:PChar; UsoCFDI:PChar; DomicilioFiscalReceptor:PChar; RegimenFiscalReceptor:PChar ); cdecl;
    VXML_AddConcepto_cfdi40W         : procedure ( p:LongInt; ClaveProdServ:PChar; NoIdentificacion:PChar; Cantidad:PChar; ClaveUnidad:PChar; Unidad:PChar; Descripcion:PChar; ValorUnitario:PChar; Importe:PChar; Descuento:PChar; ObjetoImp:PChar ); cdecl;
    VXML_ProcesaDocumentoW           : function  ( hXml:LongInt; csd:PChar; key:PChar; keypwd:PChar; outfile:PChar ):LongInt; cdecl;
    VXML_GetValueW                   : function  ( hXml:LongInt; value:LongInt ):PChar; cdecl;
    VXML_FreeW                       : procedure ( p:LongInt ); cdecl;
    VXML_SetNomina12W                : procedure ( p:LongInt; TipoNomina:PChar; FechaPago:PChar; FechaInicialPago:PChar; FechaFinalPago:PChar; NumDiasPagados:PChar; TotalPercepciones:PChar; TotalDeduciones:PChar; TotalOtrosPagos:PChar ); cdecl;
    VXML_Nomina12SetEmisorW          : procedure ( p:LongInt; Curp:PChar; RegistroPatronal:PChar; RfcPatronOrigen:PChar; OrigenRecurso:PChar; MontoRecursoPropio:PChar ); cdecl;
    VXML_Nomina12SetReceptorW        : procedure ( p:LongInt; Curp:PChar; NumSeguridadSocial:PChar; FechaInicioRelLaboral:PChar; Antiguedad:PChar; TipoContrato:PChar; Sindicalizado:PChar; TipoJornada:PChar; TipoRegimen:PChar; NumEmpleado:PChar; Departamento:PChar; Puesto:PChar; RiesgoPuesto:PChar; PeriodicidadPago:PChar; Banco:PChar; CuentaBancaria:PChar; SalarioBaseCotApor:PChar; SalarioDiarioIntegrado:PChar; ClaveEntFec:PChar ); cdecl;
    VXML_Nomina12SetPercepcionesW    : procedure ( p:LongInt; TotalSueldos:PChar; TotalSeparacionIndeminizacion:PChar; TotalJubilacionPensionRetiro:PChar; TotalGravado:PChar; TotalExento:PChar ); cdecl;
    VXML_Nomina12AddPercepcionW      : procedure ( p:LongInt; TipoPercepcion:PChar; Clave:PChar; Concepto:PChar; ImporteGravado:PChar; ImporteExento:PChar; Dias:PChar; TipoHoras:PChar; HorasExtra:PChar; ImportePagado:PChar; ValorMercado:PChar; PrecioAlOtorgarse:PChar ); cdecl;
    VXML_Nomina12SetDeduccionesW     : procedure ( p:LongInt; TotalOtrasDeducciones:PChar; TotalImpuestosRetenidos:PChar ); cdecl;
    VXML_Nomina12AddDeduccionW       : procedure ( p:LongInt; TipoDeduccion:PChar; Clave:PChar; Concepto:PChar; Importe:PChar ); cdecl;
    VXML_Nomina12AddOtroPagoW        : procedure ( p:LongInt; TipoOtroPago:PChar; Clave:PChar; Concepto:PChar; Importe:PChar; SubsidioCausado:PChar; SaldoAFavor:PChar; Year:PChar; RemanenteSalFav:PChar ); cdecl;

  begin

    hBar := LoadLibrary( 'VXML_x86.dll' );

    VXML_NewWithLogW                 := GetProcAddress (hBar, 'VXML_NewWithLogW' );
    VXML_SetUserInfoW                := GetProcAddress (hBar, 'VXML_SetUserInfoW' );
    VXML_SetComprobanteInfo_cfdi40W  := GetProcAddress (hBar, 'VXML_SetComprobanteInfo_cfdi40W' );
    VXML_SetEmisorInfo_cfdi40W       := GetProcAddress (hBar, 'VXML_SetEmisorInfo_cfdi40W' );
    VXML_SetReceptorInfo_cfdi40W     := GetProcAddress (hBar, 'VXML_SetReceptorInfo_cfdi40W' );
    VXML_AddConcepto_cfdi40W         := GetProcAddress (hBar, 'VXML_AddConcepto_cfdi40W' );
    VXML_ProcesaDocumentoW           := GetProcAddress (hBar, 'VXML_ProcesaDocumentoW' );
    VXML_GetValueW                   := GetProcAddress (hBar, 'VXML_GetValueW' );
    VXML_FreeW                       := GetProcAddress (hBar, 'VXML_FreeW' );
    VXML_SetNomina12W                := GetProcAddress (hBar, 'VXML_SetNomina12W' );
    VXML_Nomina12SetEmisorW          := GetProcAddress (hBar, 'VXML_Nomina12SetEmisorW' );
    VXML_Nomina12SetReceptorW        := GetProcAddress (hBar, 'VXML_Nomina12SetReceptorW' );
    VXML_Nomina12SetPercepcionesW    := GetProcAddress (hBar, 'VXML_Nomina12SetPercepcionesW' );
    VXML_Nomina12AddPercepcionW      := GetProcAddress (hBar, 'VXML_Nomina12AddPercepcionW' );
    VXML_Nomina12SetDeduccionesW     := GetProcAddress (hBar, 'VXML_Nomina12SetDeduccionesW' );
    VXML_Nomina12AddDeduccionW       := GetProcAddress (hBar, 'VXML_Nomina12AddDeduccionW' );
    VXML_Nomina12AddOtroPagoW        := GetProcAddress (hBar, 'VXML_Nomina12AddOtroPagoW' );

    hXml := VXml_NewWithLogW('4.0','DemoCfdi40Nomina12.log');

    //* credenciales de timbrado */
    VXml_SetUserInfoW(hXml,'demo_cibertec','demo');

    //* Datos generales del comprobante*/
    VXml_SetComprobanteInfo_cfdi40W(hXml,'NOM','1234','%cb_date','','','8628.40','2315.83','MXN','','6312.57','N','PUE','07270','','01');

    //* datos del emisor */
    VXml_SetEmisorInfo_cfdi40W(hXml,'EKU9003173C9','ESCUELA KEMPER URGATE','601','');

    //* datos del receptor, uso del CFDI = CN01, Regimen del receptor = 605 */
    VXml_SetReceptorInfo_cfdi40W(hXml,'FOSM380609Q76','MARTIN FLORES SOLORZANO','','','CN01','53050','605');

    //* concepto similar al concepto de Nomina 1.2, solo agregar 01 en objeto de impuestos */
    VXml_AddConcepto_cfdi40W(hXml,'84111505','','1','ACT','','Pago de nómina','8628.40','8628.40','2315.83','01');

    //* complemento de nomina se elabora similiar a como se hace en la version anterior */
    VXml_SetNomina12W(hXml,'O','2022-01-01','2022-01-15','2022-01-15','15','8628.40','2315.83','0.00');
    VXml_Nomina12SetEmisorW(hXml,'','20035','','','');
    VXml_Nomina12SetReceptorW(hXml,'FOSM380609HDFLLR08','01186258','2022-01-01','P15D','01','','01','02','164','UNIDAD DE APOYO ADMINISTRATIVA','Director','1','04','012','2785594979','8302.95','546.00','MEX');
    VXml_Nomina12SetPercepcionesW(hXml,'8628.40','0.00','0.00','8210.40','418.00');
    VXml_Nomina12AddPercepcionW(hXml,'001','001','SUELDO BASE','5560.80','0.00','','','','','','');
    VXml_Nomina12AddPercepcionW(hXml,'002','002','GRATIFICACION','1581.15','0.00','','','','','','');
    VXml_Nomina12AddPercepcionW(hXml,'038','016','COMPENSACION POR RETABULACION','1068.45','0.00','','','','','','');
    VXml_Nomina12AddPercepcionW(hXml,'029','029','DESPENSA','0.00','418.00','','','','','','');
    VXml_Nomina12SetDeduccionesW(hXml,'1116.65', '1199.18');
    VXml_Nomina12AddDeduccionW(hXml,'001','001','CUOTAS DE SERVICIO DE SALUD','349.65');
    VXml_Nomina12AddDeduccionW(hXml,'001','001','CUOTAS AL SISTEMA SOLIDARIO DE REPARTO','461.16');
    VXml_Nomina12AddDeduccionW(hXml,'001','001','CUOTAS AL SISTEMA DE CAPITALIZACION INDIVIDUAL','105.84');
    VXml_Nomina12AddDeduccionW(hXml,'002','002','ISR','1199.18');
    VXml_Nomina12AddDeduccionW(hXml,'004','004','AHORRO VOLUNTARIO','200.00');
    VXml_Nomina12AddOtroPagoW(hXml,'002','CredSal','Credito al Salario','0.00','','','','0.00');

    //* generamos el CFDI */
    i := VXml_ProcesaDocumentoW(hXml,'CSD_EKU9003173C9.cer','CSD_EKU9003173C9.key','12345678a','DemoCfdi40Nomina12.xml');

    if i = 0 then
      begin
        application.MessageBox(VXML_GetValueW( hXML, 1),'Resultado' );
        application.MessageBox(VXML_GetValueW( hXML, 3),'No. de certificado del emisor' );
        application.MessageBox(VXML_GetValueW( hXML, 4),'Sello digital del emisor');
        application.MessageBox(VXML_GetValueW( hXML, 5),'Cadena original del documento');
        application.MessageBox(VXML_GetValueW( hXML, 6),'No. de certificado del SAT');
        application.MessageBox(VXML_GetValueW( hXML, 7),'Sello digital del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 8),'Cadena original del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 9),'UUID Folio fiscal');
        application.MessageBox(VXML_GetValueW( hXML, 10),'Fecha de generacion del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 11),'Fecha de inicio de vigencia del certificado');
        application.MessageBox(VXML_GetValueW( hXML, 12),'Fecha de terminacion de vigencia del certificado');
        application.MessageBox(VXML_GetValueW( hXML, 13),'ID de operacion VirtualPAC');
        application.MessageBox(VXML_GetValueW( hXML, 14),'Cantidad de timbres disponbiles');
        application.MessageBox(VXML_GetValueW( hXML, 15),'Version de la libreria');
        application.MessageBox(VXML_GetValueW( hXML, 16),'Fecha de emision del XML');
        application.MessageBox(VXML_GetValueW( hXML, 17),'Mensaje del PAC');
        application.MessageBox(VXML_GetValueW( hXML, 18),'PAC que certifico el documento');
        application.MessageBox(VXML_GetValueW( hXML, 19),'No. de revision de la libreria');
        application.MessageBox(VXML_GetValueW( hXML, 20),'RFC del proveedor de certificacion');
        application.MessageBox(VXML_GetValueW( hXML, 21),'Leyenda del PAC');
      end
    else
      application.MessageBox(VXML_GetValueW( hXML, 2),'Descripcion del error');

    VXML_FreeW(hXML);
    FreeLibrary(Hbar);

end;

{ CFDI 4.0 por Ventas del dia}
procedure TForm1.Button6Click(Sender: TObject);
  var
    i: Integer;
    hXml: LongInt;
    hBar: Thandle;

    VXML_NewW                         : function  ( szVersion:PChar ):LongInt; cdecl;
    VXML_SetUserInfoW                 : procedure ( hXml:LongInt; szUser:PChar; servidor:PChar ); cdecl;
    VXML_SetComprobanteInfo_cfdi40W   : procedure ( p:LongInt; Serie:PChar; Folio:PChar; Fecha:PChar; FormaDePago:PChar; CondicionesDePago:PChar; SubTotal:PChar; Descuento:PChar; Moneda:PChar; TipoCambio:PChar; Total:PChar; TipoDeComprobante:PChar; MetodoDePago:PChar; LugarExpedicion:PChar; Confirmacion:PChar; Exportacion:PChar ); cdecl;
    VXML_SetEmisorInfo_cfdi40W        : procedure ( p:LongInt; RFC:PChar; Nombre:PChar; RegimenFiscal:PChar; FacAtrAdquirente:PChar ); cdecl;
    VXML_SetReceptorInfo_cfdi40W      : procedure ( p:LongInt; RFC:PChar; Nombre:PChar; ResidenciaFiscal:PChar; NumRegIdTrib:PChar; UsoCFDI:PChar; DomicilioFiscalReceptor:PChar; RegimenFiscalReceptor:PChar ); cdecl;
    VXML_AddConcepto_cfdi40W          : procedure ( p:LongInt; ClaveProdServ:PChar; NoIdentificacion:PChar; Cantidad:PChar; ClaveUnidad:PChar; Unidad:PChar; Descripcion:PChar; ValorUnitario:PChar; Importe:PChar; Descuento:PChar; ObjetoImp:PChar ); cdecl;
    VXML_AddConceptoTraslado_cfdi40W  : procedure ( p:LongInt; Base:PChar; Impuesto:PChar; Tipofactor:PChar; TasaOCuota:PChar; Importe:PChar ); cdecl;
    VXML_SetImpuestosInfo_cfdi40W     : procedure ( p:LongInt; totalImpuestosTrasladados:PChar; totalImpuestosRetenidos:PChar ); cdecl;
    VXML_AddTraslado_cfdi40W          : procedure ( p:LongInt; Impuesto:PChar; TipoFactor:PChar; TasaOCuota:PChar; Importe:PChar; Base:PChar ); cdecl;
    VXML_ProcesaDocumentoW            : function  ( hXml:LongInt; csd:PChar; key:PChar; keypwd:PChar; outfile:PChar ):LongInt; cdecl;
    VXML_GetValueW                    : function  ( hXml:LongInt; value:LongInt ):PChar; cdecl;
    VXML_FreeW                        : procedure ( p:LongInt ); cdecl;
    VXML_SetLogFileW                  : procedure ( p:LongInt; NombreLog:PChar ); cdecl;
    VXML_SetInformacionGlobal_cfdi40W : procedure ( p:LongInt; Periodicidad:PChar; Meses:PChar; Year:PChar ); cdecl;

  begin

    hBar := LoadLibrary( 'VXML_x86.dll' );

    VXML_NewW                         := GetProcAddress (hBar, 'VXML_NewW' );
    VXML_SetUserInfoW                 := GetProcAddress (hBar, 'VXML_SetUserInfoW' );
    VXML_SetComprobanteInfo_cfdi40W   := GetProcAddress (hBar, 'VXML_SetComprobanteInfo_cfdi40W' );
    VXML_SetEmisorInfo_cfdi40W        := GetProcAddress (hBar, 'VXML_SetEmisorInfo_cfdi40W' );
    VXML_SetReceptorInfo_cfdi40W      := GetProcAddress (hBar, 'VXML_SetReceptorInfo_cfdi40W' );
    VXML_AddConcepto_cfdi40W          := GetProcAddress (hBar, 'VXML_AddConcepto_cfdi40W' );
    VXML_AddConceptoTraslado_cfdi40W  := GetProcAddress (hBar, 'VXML_AddConceptoTraslado_cfdi40W' );
    VXML_SetImpuestosInfo_cfdi40W     := GetProcAddress (hBar, 'VXML_SetImpuestosInfo_cfdi40W' );
    VXML_AddTraslado_cfdi40W          := GetProcAddress (hBar, 'VXML_AddTraslado_cfdi40W' );
    VXML_ProcesaDocumentoW            := GetProcAddress (hBar, 'VXML_ProcesaDocumentoW' );
    VXML_GetValueW                    := GetProcAddress (hBar, 'VXML_GetValueW' );
    VXML_FreeW                        := GetProcAddress (hBar, 'VXML_FreeW' );
    VXML_SetLogFileW                  := GetProcAddress (hBar, 'VXML_SetLogFileW' );
    VXML_SetInformacionGlobal_cfdi40W := GetProcAddress (hBar, 'VXML_SetInformacionGlobal_cfdi40W' );

    hXml := VXml_NewW('4.0');

    VXml_SetLogFileW(hXml, 'DemoIngresoCfdi40VentasDiarias.log');

    //* credenciales de timbrado */
    VXml_SetUserInfoW(hXml,'demo_cibertec','demo');

    //* Datos generales del comprobante*/
    VXml_SetComprobanteInfo_cfdi40W(hXml,'CJZ','7303','%cb_date','99','CREDITO','11500.00','0.00','MXN','1','13340.00','I','PPD','07270','','01');

    //* Añadir nodo de informacion global, esto solo es necesario cuando se trate de VENTAS DEL DIAS */
    VXml_SetInformacionGlobal_cfdi40W(hXml,'01','01','2022');

    //* datos del emisor */
    VXml_SetEmisorInfo_cfdi40W(hXml,'EKU9003173C9','ESCUELA KEMPER URGATE','601','');

    //* datos del receptor, se debe usar el RFC: XAXX010101000, nombre: 'PUBLICO EN GENERAL' uso cfdi: 'S01' y el mismo CP que emision del CFDI   */
    VXml_SetReceptorInfo_cfdi40W(hXml,'XAXX010101000','PUBLICO EN GENERAL','','','S01','07270','616');

    //* agregamos conceptos */
    VXml_AddConcepto_cfdi40W(hXml,'01010101','TKT-001','1','ACT','','Venta','1000.00','1000.00','0.00','02');
    VXml_AddConceptoTraslado_cfdi40W(hXml,'1000.00','002','Tasa','0.160000','160.00');  // impuestos del concepto
    VXml_AddConcepto_cfdi40W(hXml,'01010101','TKT-002','1','ACT','','Venta','500.00','500.00','0.00','02');
    VXml_AddConceptoTraslado_cfdi40W(hXml,'500.00','002','Tasa','0.160000','80.00');  // impuestos del concepto
    VXml_AddConcepto_cfdi40W(hXml,'01010101','TKT-003','1','ACT','','Venta','10000.00','10000.00','0.00','02');
    VXml_AddConceptoTraslado_cfdi40W(hXml,'10000.00','002','Tasa','0.160000','1600.00');  // impuestos del concepto

    //* resumen de impuestos */
    VXml_SetImpuestosInfo_cfdi40W(hXml,'1840.00','');
    VXml_AddTraslado_cfdi40W(hXml,'002','Tasa','0.160000','1840.00','11500.00');

    //* generamos el CFDI */
    i := VXml_ProcesaDocumentoW(hXml,'CSD_EKU9003173C9.cer','CSD_EKU9003173C9.key','12345678a','DemoIngresoCfdi40VentasDiarias.xml');

    if i = 0 then
      begin
        application.MessageBox(VXML_GetValueW( hXML, 1),'Resultado' );
        application.MessageBox(VXML_GetValueW( hXML, 3),'No. de certificado del emisor' );
        application.MessageBox(VXML_GetValueW( hXML, 4),'Sello digital del emisor');
        application.MessageBox(VXML_GetValueW( hXML, 5),'Cadena original del documento');
        application.MessageBox(VXML_GetValueW( hXML, 6),'No. de certificado del SAT');
        application.MessageBox(VXML_GetValueW( hXML, 7),'Sello digital del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 8),'Cadena original del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 9),'UUID Folio fiscal');
        application.MessageBox(VXML_GetValueW( hXML, 10),'Fecha de generacion del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 11),'Fecha de inicio de vigencia del certificado');
        application.MessageBox(VXML_GetValueW( hXML, 12),'Fecha de terminacion de vigencia del certificado');
        application.MessageBox(VXML_GetValueW( hXML, 13),'ID de operacion VirtualPAC');
        application.MessageBox(VXML_GetValueW( hXML, 14),'Cantidad de timbres disponbiles');
        application.MessageBox(VXML_GetValueW( hXML, 15),'Version de la libreria');
        application.MessageBox(VXML_GetValueW( hXML, 16),'Fecha de emision del XML');
        application.MessageBox(VXML_GetValueW( hXML, 17),'Mensaje del PAC');
        application.MessageBox(VXML_GetValueW( hXML, 18),'PAC que certifico el documento');
        application.MessageBox(VXML_GetValueW( hXML, 19),'No. de revision de la libreria');
        application.MessageBox(VXML_GetValueW( hXML, 20),'RFC del proveedor de certificacion');
        application.MessageBox(VXML_GetValueW( hXML, 21),'Leyenda del PAC');
      end
    else
      application.MessageBox(VXML_GetValueW( hXML, 2),'Descripcion del error');

    VXML_FreeW(hXML);
    FreeLibrary(Hbar);

end;

{ CFDI 4.0 Ventas al publico en general (venta de mostrador) }
procedure TForm1.Button7Click(Sender: TObject);
 var
    i: Integer;
    hXml: LongInt;
    hBar: Thandle;

    VXML_NewWithLogW                  : function  ( szVersion:PChar; cNombreLog:PChar ):LongInt; cdecl;
    VXML_SetUserInfoW                 : procedure ( hXml:LongInt; szUser:PChar; servidor:PChar ); cdecl;
    VXML_SetComprobanteInfo_cfdi40W   : procedure ( p:LongInt; Serie:PChar; Folio:PChar; Fecha:PChar; FormaDePago:PChar; CondicionesDePago:PChar; SubTotal:PChar; Descuento:PChar; Moneda:PChar; TipoCambio:PChar; Total:PChar; TipoDeComprobante:PChar; MetodoDePago:PChar; LugarExpedicion:PChar; Confirmacion:PChar; Exportacion:PChar ); cdecl;
    VXML_SetEmisorInfo_cfdi40W        : procedure ( p:LongInt; RFC:PChar; Nombre:PChar; RegimenFiscal:PChar; FacAtrAdquirente:PChar ); cdecl;
    VXML_SetReceptorInfo_cfdi40W      : procedure ( p:LongInt; RFC:PChar; Nombre:PChar; ResidenciaFiscal:PChar; NumRegIdTrib:PChar; UsoCFDI:PChar; DomicilioFiscalReceptor:PChar; RegimenFiscalReceptor:PChar ); cdecl;
    VXML_AddConcepto_cfdi40W          : procedure ( p:LongInt; ClaveProdServ:PChar; NoIdentificacion:PChar; Cantidad:PChar; ClaveUnidad:PChar; Unidad:PChar; Descripcion:PChar; ValorUnitario:PChar; Importe:PChar; Descuento:PChar; ObjetoImp:PChar ); cdecl;
    VXML_AddConceptoTraslado_cfdi40W  : procedure ( p:LongInt; Base:PChar; Impuesto:PChar; Tipofactor:PChar; TasaOCuota:PChar; Importe:PChar ); cdecl;
    VXML_SetImpuestosInfo_cfdi40W     : procedure ( p:LongInt; totalImpuestosTrasladados:PChar; totalImpuestosRetenidos:PChar ); cdecl;
    VXML_AddTraslado_cfdi40W          : procedure ( p:LongInt; Impuesto:PChar; TipoFactor:PChar; TasaOCuota:PChar; Importe:PChar; Base:PChar ); cdecl;
    VXML_ProcesaDocumentoW            : function  ( hXml:LongInt; csd:PChar; key:PChar; keypwd:PChar; outfile:PChar ):LongInt; cdecl;
    VXML_GetValueW                    : function  ( hXml:LongInt; value:LongInt ):PChar; cdecl;
    VXML_FreeW                        : procedure ( p:LongInt ); cdecl;

  begin

    hBar := LoadLibrary( 'VXML_x86.dll' );

    VXML_NewWithLogW                  := GetProcAddress (hBar, 'VXML_NewWithLogW' );
    VXML_SetUserInfoW                 := GetProcAddress (hBar, 'VXML_SetUserInfoW' );
    VXML_SetComprobanteInfo_cfdi40W   := GetProcAddress (hBar, 'VXML_SetComprobanteInfo_cfdi40W' );
    VXML_SetEmisorInfo_cfdi40W        := GetProcAddress (hBar, 'VXML_SetEmisorInfo_cfdi40W' );
    VXML_SetReceptorInfo_cfdi40W      := GetProcAddress (hBar, 'VXML_SetReceptorInfo_cfdi40W' );
    VXML_AddConcepto_cfdi40W          := GetProcAddress (hBar, 'VXML_AddConcepto_cfdi40W' );
    VXML_AddConceptoTraslado_cfdi40W  := GetProcAddress (hBar, 'VXML_AddConceptoTraslado_cfdi40W' );
    VXML_SetImpuestosInfo_cfdi40W     := GetProcAddress (hBar, 'VXML_SetImpuestosInfo_cfdi40W' );
    VXML_AddTraslado_cfdi40W          := GetProcAddress (hBar, 'VXML_AddTraslado_cfdi40W' );
    VXML_ProcesaDocumentoW            := GetProcAddress (hBar, 'VXML_ProcesaDocumentoW' );
    VXML_GetValueW                    := GetProcAddress (hBar, 'VXML_GetValueW' );
    VXML_FreeW                        := GetProcAddress (hBar, 'VXML_FreeW' );

    //* indicamos la nueva version 4.0 */
    hXml := VXml_NewWithLogW('4.0','demoIngresoCfdi40PublicoGeneral.log');

    //* credenciales de timbrado */
    VXml_SetUserInfoW(hXml,'demo_cibertec','demo');

    //* Datos generales del comprobante*/
    VXml_SetComprobanteInfo_cfdi40W(hXml,'CJZ','7303','%cb_date','99','CREDITO','6034.48','0.00','MXN','1','7000.00','I','PPD','07270','','01');
    //* datos del emisor */
    VXml_SetEmisorInfo_cfdi40W(hXml,'EKU9003173C9','ESCUELA KEMPER URGATE','601','');

    //* datos del receptor, para publico en general RFC: XAXX010101000, cualquier nombre QUE NO SEA 'PUBLICO EN GENERAL' uso cfdi: 'S01' y el mismo CP que emision del CFDI   */
    //* recuerda que el nombre PUBLICO EN GENERAL solo se puede usar para las VENTAS DEL DIA, las ventas de mostrador deben llevar cualquier otro nombre */
    VXml_SetReceptorInfo_cfdi40W(hXml,'XAXX010101000','PONER CUALQUIER NOMBRE AQUI','','','S01','07270','616');

    //* agregamos conceptos */
    VXml_AddConcepto_cfdi40W(hXml,'43211500','EQU-0025','1.000','H87','Computadora','COMPUTADORA HP PORTATIL','6034.48','6034.48','0.00','02');
    VXml_AddConceptoTraslado_cfdi40W(hXml,'6034.48','002','Tasa','0.160000','965.52');  // impuestos del concepto

    //* resumen de impuestos */
    VXml_SetImpuestosInfo_cfdi40W(hXml,'965.52','');
    VXml_AddTraslado_cfdi40W(hXml,'002','Tasa','0.160000','965.52','6034.48');

    //* generamos el CFDI */
    i := VXml_ProcesaDocumentoW(hXml,'CSD_EKU9003173C9.cer','CSD_EKU9003173C9.key','12345678a','DemoIngresoCfdi40PublicoGeneral.xml');

    if i = 0 then
      begin
        application.MessageBox(VXML_GetValueW( hXML, 1),'Resultado' );
        application.MessageBox(VXML_GetValueW( hXML, 3),'No. de certificado del emisor' );
        application.MessageBox(VXML_GetValueW( hXML, 4),'Sello digital del emisor');
        application.MessageBox(VXML_GetValueW( hXML, 5),'Cadena original del documento');
        application.MessageBox(VXML_GetValueW( hXML, 6),'No. de certificado del SAT');
        application.MessageBox(VXML_GetValueW( hXML, 7),'Sello digital del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 8),'Cadena original del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 9),'UUID Folio fiscal');
        application.MessageBox(VXML_GetValueW( hXML, 10),'Fecha de generacion del timbre');
        application.MessageBox(VXML_GetValueW( hXML, 11),'Fecha de inicio de vigencia del certificado');
        application.MessageBox(VXML_GetValueW( hXML, 12),'Fecha de terminacion de vigencia del certificado');
        application.MessageBox(VXML_GetValueW( hXML, 13),'ID de operacion VirtualPAC');
        application.MessageBox(VXML_GetValueW( hXML, 14),'Cantidad de timbres disponbiles');
        application.MessageBox(VXML_GetValueW( hXML, 15),'Version de la libreria');
        application.MessageBox(VXML_GetValueW( hXML, 16),'Fecha de emision del XML');
        application.MessageBox(VXML_GetValueW( hXML, 17),'Mensaje del PAC');
        application.MessageBox(VXML_GetValueW( hXML, 18),'PAC que certifico el documento');
        application.MessageBox(VXML_GetValueW( hXML, 19),'No. de revision de la libreria');
        application.MessageBox(VXML_GetValueW( hXML, 20),'RFC del proveedor de certificacion');
        application.MessageBox(VXML_GetValueW( hXML, 21),'Leyenda del PAC');
      end
    else
      application.MessageBox(VXML_GetValueW( hXML, 2),'Descripcion del error');

    VXML_FreeW(hXML);
    FreeLibrary(Hbar);
end;

end.


