using System.Runtime.InteropServices;

namespace VXmlCSharp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /* CFDI 4.0 de Ingreso Basico */
        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr hXml;
            IntPtr nResultado;

            /* indicamos la nueva version 4.0 */
            // también podemos hacer hXml = wrappers.VXML_NewWithLog("4.0","demoIngresoCFDI40.log")

            hXml = wrappers.VXML_New("4.0");

            /* credenciales de timbrado */
            wrappers.VXML_SetUserInfo(hXml, "demo_cibertec", "demo");

            /* ejemplos de CFDI relacionados, NO SIEMPRE LOS LLEVA, revise la guia de llenado para mas informacion de estos parametros */
            wrappers.VXML_AddCfdiRelacionados_cfdi40(hXml, "01", "01000000-0000-0000-0000-000000000001", "01000000-0000-0000-0000-000000000002", "01000000-0000-0000-0000-000000000003", "", "", "", "", "", "", "");
            wrappers.VXML_AddCfdiRelacionado_cfdi40(hXml, "01000000-0000-0000-0000-111111111111");
            wrappers.VXML_AddCfdiRelacionados_cfdi40(hXml, "02", "02000000-0000-0000-0000-000000000001", "", "", "", "", "", "", "", "", "");
            wrappers.VXML_AddCfdiRelacionado_cfdi40(hXml, "02000000-0000-0000-0000-222222222222");

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

            /* agregamos conceptos */
            wrappers.VXML_AddConcepto_cfdi40(hXml, "43211500", "EQU-0025", "1.000", "H87", "Computadora", "COMPUTADORA HP PORTATIL", "6034.48", "6034.48", "0.00", "02");
            wrappers.VXML_AddConceptoTraslado_cfdi40(hXml, "6034.48", "002", "Tasa", "0.160000", "965.52");  // impuestos del concepto

            /* resumen de impuestos */
            wrappers.VXML_SetImpuestosInfo_cfdi40(hXml, "965.52", "");
            wrappers.VXML_AddTraslado_cfdi40(hXml, "002", "Tasa", "0.160000", "965.52", "6034.48");

            // generamos el CFDI
            nResultado = wrappers.VXML_ProcesaDocumento(hXml, "CSD_EKU9003173C9.cer", "CSD_EKU9003173C9.key", "12345678a", "demoIngresoCFDI40.xml");

            if (nResultado == 0)
            {
                for (int i = 1; i <= 21; i++)
                {
                    string getValue = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, i));
                    MessageBox.Show(getValue, $"GetValue [{i}]", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                string errorCode = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, 1));
                string error = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, 2));
                MessageBox.Show($"Error en el CFDI: {error}", errorCode, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            wrappers.VXML_Free(hXml);
        }

        /* CFDI 4.0 con Complemento de Pagos 2.0 */
        private void button2_Click(object sender, EventArgs e)
        {
            IntPtr hXml;
            IntPtr nResultado;

            hXml = wrappers.VXML_NewWithLog("4.0", "demoPagos20Cfdi40.log");

            wrappers.VXML_SetUserInfo(hXml, "demo_cibertec", "demo");
            wrappers.VXML_SetComprobanteInfo_cfdi40(hXml, "", "12629", "%cb_date", "", "", "0", "", "XXX", "", "0", "P", "", "72150", "", "01");
            wrappers.VXML_SetEmisorInfo_cfdi40(hXml, "EKU9003173C9", "ESCUELA KEMPER URGATE", "601", "");
            wrappers.VXML_SetReceptorInfo_cfdi40(hXml, "CTE940531F58", "CIBERNETICA Y TECNOLOGIA", "", "", "CP01", "53050", "601");
            wrappers.VXML_AddConcepto_cfdi40(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 */
            wrappers.VXML_SetPagos20(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*/
            wrappers.VXML_Pagos20AddPago(hXml, "2025-01-10T01:01:01", "03", "MXN", "1", "10000.00", "0000842", "", "", "", "", "", "", "", "", "");
            /* agregamos un documento relacionado */
            wrappers.VXML_Pagos20AddPagoDoctoRelacionado(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) */
            wrappers.VXML_Pagos20AddPagoDoctoRelacionadoTrasladoDR(hXml, "8620.69", "002", "Tasa", "0.160000", "1379.31");
            /* resumen de impuestos de todos los documentos relacionados */
            wrappers.VXML_Pagos20AddPagoImpuestosPTrasladoP(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 */
            wrappers.VXML_Pagos20AddPago(hXml, "2025-01-01T10:01:01", "03", "MXN", "1", "11600.00", "0000843", "", "", "", "", "", "", "", "", "");
            wrappers.VXML_Pagos20AddPagoDoctoRelacionado(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)*/
            wrappers.VXML_Pagos20AddPagoDoctoRelacionadoTrasladoDR(hXml, "10000.00", "002", "Tasa", "0.160000", "1600.00");
            wrappers.VXML_Pagos20AddPagoImpuestosPTrasladoP(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 */
            wrappers.VXML_Pagos20AddPago(hXml, "2025-01-01T10:01:01", "03", "MXN", "1", "19066.67", "0000844", "", "", "", "", "", "", "", "", "");
            wrappers.VXML_Pagos20AddPagoDoctoRelacionado(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 */
            wrappers.VXML_Pagos20AddPagoDoctoRelacionadoTrasladoDR(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...%)*/
            wrappers.VXML_Pagos20AddPagoDoctoRelacionadoRetencionDR(hXml, "20000.00", "001", "Tasa", "0.100000", "2000.00");
            wrappers.VXML_Pagos20AddPagoDoctoRelacionadoRetencionDR(hXml, "20000.00", "002", "Tasa", "0.106666", "2133.32");
            wrappers.VXML_Pagos20AddPagoImpuestosPTrasladoP(hXml, "20000.00", "002", "Tasa", "0.160000", "3200.00");
            wrappers.VXML_Pagos20AddPagoImpuestosPRetencionP(hXml, "001", "2000.00");
            wrappers.VXML_Pagos20AddPagoImpuestosPRetencionP(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 */

            wrappers.VXML_Pagos20AddPago(hXml, "2025-01-01T10:01:01", "03", "MXN", "1", "25000.00", "0000845", "", "", "", "", "", "", "", "", "");
            wrappers.VXML_Pagos20AddPagoDoctoRelacionado(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%) */
            wrappers.VXML_Pagos20AddPagoDoctoRelacionadoTrasladoDR(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...%)*/
            wrappers.VXML_Pagos20AddPagoDoctoRelacionadoRetencionDR(hXml, "26223.76", "001", "Tasa", "0.100000", "2622.37");
            wrappers.VXML_Pagos20AddPagoDoctoRelacionadoRetencionDR(hXml, "26223.76", "002", "Tasa", "0.106666", "2797.19");
            wrappers.VXML_Pagos20AddPagoImpuestosPTrasladoP(hXml, "26223.76", "002", "Tasa", "0.160000", "4195.81");
            wrappers.VXML_Pagos20AddPagoImpuestosPRetencionP(hXml, "001", "2622.37");
            wrappers.VXML_Pagos20AddPagoImpuestosPRetencionP(hXml, "002", "2797.19");

            // generamos el CFDI
            nResultado = wrappers.VXML_ProcesaDocumento(hXml, "CSD_EKU9003173C9.cer", "CSD_EKU9003173C9.key", "12345678a", "demoPagos20Cfdi40.xml");

            if (nResultado == 0)
            {
                for (int i = 1; i <= 21; i++)
                {
                    string getValue = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, i));
                    MessageBox.Show(getValue, $"GetValue [{i}]", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                string errorCode = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, 1));
                string error = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, 2));
                MessageBox.Show($"Error en el CFDI: {error}", errorCode, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            wrappers.VXML_Free(hXml);
        }

        /* CFDI 4.0 de Traslado con Carta Porte 3.1 */
        private void button3_Click(object sender, EventArgs e)
        {
            IntPtr hXml;
            IntPtr nResultado;

            /* iniciamos el comprobante esta vez sera un TRASLADO */
            hXml = wrappers.VXML_NewWithLog("4.0", "demoCartaPorte31TrasladoCfdi40.log");
            wrappers.VXML_SetUserInfo(hXml, "demo_cibertec", "demo");
            wrappers.VXML_SetComprobanteInfo_cfdi40(hXml, "T", "3381652892", "%cb_date", "", "", "0", "", "XXX", "", "0", "T", "", "42051", "", "01");
            wrappers.VXML_SetEmisorInfo_cfdi40(hXml, "EKU9003173C9", "ESCUELA KEMPER URGATE", "601", "");
            wrappers.VXML_SetReceptorInfo_cfdi40(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 */
            wrappers.VXML_AddConcepto_cfdi40(hXml, "24112902", "", "1677", "XUN", "Unidad", "Tina Plastica BBU/ Plastic tray. Marca: Orbis Norseman y Hus.", "0.00", "0.00", "", "01");
            wrappers.VXML_AddConcepto_cfdi40(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, si necesita saber como obtener un UUID para su CFDI de Carta Porte, revise la función HB_GenUUID() */
            wrappers.VXML_SetCartaPorte31(hXml, "CCC69ff4-e09f-47bc-ba1e-e8a2e92958da", "No", "", "", "", "12.71", "", "", "");
            /* establecemos origen y destino del traslado */
            wrappers.VXML_CartaPorte31AddUbicacion(hXml, "Origen", "", "TEX090814EQ1", "", "", "", "", "", "", "2025-02-25T11:05:00", "", "", "C. OASYS, CANON DEL PADRE", "", "", "", "04", "", "004", "BCN", "MEX", "22215");
            wrappers.VXML_CartaPorte31AddUbicacion(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 */
            wrappers.VXML_CartaPorte31SetMercancias(hXml, "5162", "KGM", "", "2", "", "");
            wrappers.VXML_CartaPorte31AddMercancia(hXml, "24112902", "", "Tina Plastica BBU/ Plastic tray. Marca: Orbis Norseman y Hus.", "1677", "XUN", "", "", "No", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "4411", "", "", "", "", "", "");
            wrappers.VXML_CartaPorte31AddMercancia(hXml, "24101508", "", "Base de plastico con rodajas para empaque y transporte/Dollies. Marca: Orbis", "120", "XUN", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "751", "", "", "", "", "", "");
            /* datos del transporte que mueve las mercancias */
            wrappers.VXML_CartaPorte31SetMercanciasAutotransporte(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 */
            wrappers.VXML_CartaPorte31AddFiguraTransporteTiposFigura(hXml, "01", "VEGD861207ND3", "LFD01107519", "VENEGAS GARCIA DANIEL", "", "", "", "Prolongacion Callejon Vecinal", "524", "A", "", "04", "", "004", "BCN", "MEX", "22414");

            // generamos el CFDI
            nResultado = wrappers.VXML_ProcesaDocumento(hXml, "CSD_EKU9003173C9.cer", "CSD_EKU9003173C9.key", "12345678a", "demoCartaPorte31TrasladoCfdi40.xml");

            if (nResultado == 0)
            {
                for (int i = 1; i <= 21; i++)
                {
                    string getValue = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, i));
                    MessageBox.Show(getValue, $"GetValue [{i}]", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                string errorCode = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, 1));
                string error = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, 2));
                MessageBox.Show($"Error en el CFDI: {error}", errorCode, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            wrappers.VXML_Free(hXml);
        }

        /* CFDI 4.0 de Ingreso con Carta Porte 3.1 */
        private void button4_Click(object sender, EventArgs e)
        {
            IntPtr hXml;
            IntPtr nResultado;

            /* iniciamos el comprobante como si fuera de ingreso normal */
            hXml = wrappers.VXML_NewWithLog("4.0", "demoCartaPorte31IngresoCfdi40.log");
            wrappers.VXML_SetUserInfo(hXml, "demo_cibertec", "demo");
            wrappers.VXML_SetComprobanteInfo_cfdi40(hXml, "T", "746", "%cb_date", "99", "credito 15 dias", "21000.00", "", "MXN", "1", "24360.00", "I", "PPD", "72150", "", "01");
            wrappers.VXML_SetEmisorInfo_cfdi40(hXml, "EKU9003173C9", "ESCUELA KEMPER URGATE", "601", "");
            wrappers.VXML_SetReceptorInfo_cfdi40(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 */
            wrappers.VXML_AddConcepto_cfdi40(hXml, "78101802", "001", "1", "E48", "SERVICIO", "SERVICIOS TRANSPORTE DE CARGA POR CARRETERA (EN CAMION) A NIVEL REGIONAL Y NACIONAL", "21000.00", "21000.00", "", "02");
            wrappers.VXML_AddConceptoTraslado_cfdi40(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 */
            wrappers.VXML_SetImpuestosInfo_cfdi40(hXml, "3360.00", "");
            wrappers.VXML_AddTraslado_cfdi40(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() */
            wrappers.VXML_SetCartaPorte31(hXml, "CCC6FED9-1CDA-4955-B3FC-8E692AB44900", "No", "", "", "", "1200", "", "", "");
            /* establecemos origen y destino del flete */
            wrappers.VXML_CartaPorte31AddUbicacion(hXml, "Origen", "OR000001", "LERJ970506QN8", "TRANSPORTES GALS", "", "", "", "", "", "2025-02-24T12:00:00", "", "", "EUGENIO AGUIRRE", "10", "", "0920", "06", "", "027", "TAM", "MEX", "88284");
            wrappers.VXML_CartaPorte31AddUbicacion(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 */
            wrappers.VXML_CartaPorte31SetMercancias(hXml, "15656.00", "KGM", "15656.00", "1", "", "Sí");
            wrappers.VXML_CartaPorte31AddMercancia(hXml, "13101902", "", "RESINA DE POLIESTER", "80.000", "X4G", "BULTOS", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "15656.000", "", "", "", "", "", "");
            wrappers.VXML_CartaPorte31AddMercanciaCantidadTransporta(hXml, "80.000", "OR000001", "DE000001", "");
            /* datos del transporte que mueve las mercancias */
            wrappers.VXML_CartaPorte31SetMercanciasAutotransporte(hXml, "TPAF01", "1522TMG02052019021001009", "T3S2S2", "7000", "91AS9E", "2014", "BBVA", "782B0502FD", "", "", "", "", "", "CTR007", "CY3748", "", "");
            /* datos del conductor del transporte */
            wrappers.VXML_CartaPorte31AddFiguraTransporteTiposFigura(hXml, "01", "NAVM740828IQ3", "DF00231807", "MIGUEL ANGEL NANDO VELEZ", "", "", "", "VERACRUZ", "7", "", "3846", "", "", "036", "MEX", "MEX", "55679");

            // generamos el CFDI
            nResultado = wrappers.VXML_ProcesaDocumento(hXml, "CSD_EKU9003173C9.cer", "CSD_EKU9003173C9.key", "12345678a", "demoCartaPorte31IngresoCfdi40.xml");

            if (nResultado == 0)
            {
                for (int i = 1; i <= 21; i++)
                {
                    string getValue = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, i));
                    MessageBox.Show(getValue, $"GetValue [{i}]", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                string errorCode = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, 1));
                string error = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, 2));
                MessageBox.Show($"Error en el CFDI: {error}", errorCode, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            wrappers.VXML_Free(hXml);
        }

        /* CFDI 4.0 con Complemento de Nomina 1.2 */
        private void button5_Click(object sender, EventArgs e)
        {
            IntPtr hXml;
            IntPtr nResultado;

            hXml = wrappers.VXML_NewWithLog("4.0", "DemoCfdi40Nomina12.log");

            /* credenciales de timbrado */
            wrappers.VXML_SetUserInfo(hXml, "demo_cibertec", "demo");

            /* Datos generales del comprobante*/
            wrappers.VXML_SetComprobanteInfo_cfdi40(hXml, "NOM", "1234", "%cb_date", "", "", "8628.40", "2315.83", "MXN", "", "6312.57", "N", "PUE", "07270", "", "01");

            /* datos del emisor */
            wrappers.VXML_SetEmisorInfo_cfdi40(hXml, "EKU9003173C9", "ESCUELA KEMPER URGATE", "601", "");

            /* datos del receptor, uso del CFDI = CN01, Regimen del receptor = 605 */
            wrappers.VXML_SetReceptorInfo_cfdi40(hXml, "FOSM380609Q76", "MARTIN FLORES SOLORZANO", "", "", "CN01", "53050", "605");

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

            /* complmento de nomina se elabora similiar a como se hace en la version anterior */
            wrappers.VXML_SetNomina12(hXml, "O", "2022-01-01", "2022-01-15", "2022-01-15", "15", "8628.40", "2315.83", "0.00");
            wrappers.VXML_Nomina12SetEmisor(hXml, "", "20035", "", "", "");
            wrappers.VXML_Nomina12SetReceptor(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");
            wrappers.VXML_Nomina12SetPercepciones(hXml, "8628.40", "0.00", "0.00", "8210.40", "418.00");
            wrappers.VXML_Nomina12AddPercepcion(hXml, "001", "001", "SUELDO BASE", "5560.80", "0.00", "", "", "", "", "", "");
            wrappers.VXML_Nomina12AddPercepcion(hXml, "002", "002", "GRATIFICACION", "1581.15", "0.00", "", "", "", "", "", "");
            wrappers.VXML_Nomina12AddPercepcion(hXml, "038", "016", "COMPENSACION POR RETABULACION", "1068.45", "0.00", "", "", "", "", "", "");
            wrappers.VXML_Nomina12AddPercepcion(hXml, "029", "029", "DESPENSA", "0.00", "418.00", "", "", "", "", "", "");
            wrappers.VXML_Nomina12SetDeducciones(hXml, "1116.65", "1199.18");
            wrappers.VXML_Nomina12AddDeduccion(hXml, "001", "001", "CUOTAS DE SERVICIO DE SALUD", "349.65");
            wrappers.VXML_Nomina12AddDeduccion(hXml, "001", "001", "CUOTAS AL SISTEMA SOLIDARIO DE REPARTO", "461.16");
            wrappers.VXML_Nomina12AddDeduccion(hXml, "001", "001", "CUOTAS AL SISTEMA DE CAPITALIZACION INDIVIDUAL", "105.84");
            wrappers.VXML_Nomina12AddDeduccion(hXml, "002", "002", "ISR", "1199.18");
            wrappers.VXML_Nomina12AddDeduccion(hXml, "004", "004", "AHORRO VOLUNTARIO", "200.00");
            wrappers.VXML_Nomina12AddOtroPago(hXml, "002", "CredSal", "Credito al Salario", "0.00", "", "", "", "0.00");

            // generamos el CFDI
            nResultado = wrappers.VXML_ProcesaDocumento(hXml, "CSD_EKU9003173C9.cer", "CSD_EKU9003173C9.key", "12345678a", "DemoCfdi40Nomina12.xml");

            if (nResultado == 0)
            {
                for (int i = 1; i <= 21; i++)
                {
                    string getValue = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, i));
                    MessageBox.Show(getValue, $"GetValue [{i}]", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                string errorCode = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, 1));
                string error = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, 2));
                MessageBox.Show($"Error en el CFDI: {error}", errorCode, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            wrappers.VXML_Free(hXml);
        }

        /* CFDI 4.0 por Ventas del Día */
        private void button6_Click(object sender, EventArgs e)
        {
            IntPtr hXml;
            IntPtr nResultado;

            /* indicamos la nueva version 4.0 */
            hXml = wrappers.VXML_New("4.0");
            wrappers.VXML_SetLogFile(hXml, "DemoIngresoCfdi40VentasDiarias.log");

            /* credenciales de timbrado */
            wrappers.VXML_SetUserInfo(hXml, "demo_cibertec", "demo");

            /* Datos generales del comprobante*/
            wrappers.VXML_SetComprobanteInfo_cfdi40(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 */
            wrappers.VXML_SetInformacionGlobal_cfdi40(hXml, "01", "01", "2022");

            /* datos del emisor */
            wrappers.VXML_SetEmisorInfo_cfdi40(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   */
            wrappers.VXML_SetReceptorInfo_cfdi40(hXml, "XAXX010101000", "PUBLICO EN GENERAL", "", "", "S01", "07270", "616");

            /* agregamos conceptos */
            wrappers.VXML_AddConcepto_cfdi40(hXml, "01010101", "TKT-001", "1", "ACT", "", "Venta", "1000.00", "1000.00", "0.00", "02");
            wrappers.VXML_AddConceptoTraslado_cfdi40(hXml, "1000.00", "002", "Tasa", "0.160000", "160.00");  // impuestos del concepto
            wrappers.VXML_AddConcepto_cfdi40(hXml, "01010101", "TKT-002", "1", "ACT", "", "Venta", "500.00", "500.00", "0.00", "02");
            wrappers.VXML_AddConceptoTraslado_cfdi40(hXml, "500.00", "002", "Tasa", "0.160000", "80.00");  // impuestos del concepto
            wrappers.VXML_AddConcepto_cfdi40(hXml, "01010101", "TKT-003", "1", "ACT", "", "Venta", "10000.00", "10000.00", "0.00", "02");
            wrappers.VXML_AddConceptoTraslado_cfdi40(hXml, "10000.00", "002", "Tasa", "0.160000", "1600.00");  // impuestos del concepto

            /* resumen de impuestos */
            wrappers.VXML_SetImpuestosInfo_cfdi40(hXml, "1840.00", "");
            wrappers.VXML_AddTraslado_cfdi40(hXml, "002", "Tasa", "0.160000", "1840.00", "11500.00");

            // generamos el CFDI
            nResultado = wrappers.VXML_ProcesaDocumento(hXml, "CSD_EKU9003173C9.cer", "CSD_EKU9003173C9.key", "12345678a", "DemoIngresoCfdi40VentasDiarias.xml");

            if (nResultado == 0)
            {
                for (int i = 1; i <= 21; i++)
                {
                    string getValue = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, i));
                    MessageBox.Show(getValue, $"GetValue [{i}]", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                string errorCode = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, 1));
                string error = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, 2));
                MessageBox.Show($"Error en el CFDI: {error}", errorCode, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            wrappers.VXML_Free(hXml);
        }

        private void button7_Click(object sender, EventArgs e)
        {
            IntPtr hXml;
            IntPtr nResultado;
        
            /* indicamos la nueva version 4.0 */
            hXml = wrappers.VXML_NewWithLog("4.0", "demoIngresoCfdi40PublicoGeneral.log");

           /* credenciales de timbrado */
           wrappers.VXML_SetUserInfo(hXml, "demo_cibertec", "demo");

            /* Datos generales del comprobante*/
            wrappers.VXML_SetComprobanteInfo_cfdi40(hXml, "CJZ", "7303", "%cb_date", "99", "CREDITO", "6034.48", "0.00", "MXN", "1", "7000.00", "I", "PPD", "07270", "", "01");
            /* datos del emisor */
            wrappers.VXML_SetEmisorInfo_cfdi40(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 */
            wrappers.VXML_SetReceptorInfo_cfdi40(hXml, "XAXX010101000", "PONER CUALQUIER NOMBRE AQUI", "", "", "S01", "07270", "616");

            /* agregamos conceptos */
            wrappers.VXML_AddConcepto_cfdi40(hXml, "43211500", "EQU-0025", "1.000", "H87", "Computadora", "COMPUTADORA HP PORTATIL", "6034.48", "6034.48", "0.00", "02");
            wrappers.VXML_AddConceptoTraslado_cfdi40(hXml, "6034.48", "002", "Tasa", "0.160000", "965.52");  // impuestos del concepto

            /* resumen de impuestos */
            wrappers.VXML_SetImpuestosInfo_cfdi40(hXml, "965.52", "");
            wrappers.VXML_AddTraslado_cfdi40(hXml, "002", "Tasa", "0.160000", "965.52", "6034.48");

            // generamos el CFDI
            nResultado = wrappers.VXML_ProcesaDocumento(hXml, "CSD_EKU9003173C9.cer", "CSD_EKU9003173C9.key", "12345678a", "demoIngresoCfdi40PublicoGeneral.xml");

            if (nResultado == 0)
            {
                for (int i = 1; i <= 21; i++)
                {
                    string getValue = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, i));
                    MessageBox.Show(getValue, $"GetValue [{i}]", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            else
            {
                string errorCode = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, 1));
                string error = Marshal.PtrToStringUni(wrappers.VXML_GetValue(hXml, 2));
                MessageBox.Show($"Error en el CFDI: {error}", errorCode, MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            wrappers.VXML_Free(hXml);
        }
    }
}
