ACTUALIZACION: Librería para CFDI 4.0 GRATIS (C# y VB.NET)
ACTUALIZACION: La librería en C# sella el XML listo para timbrar CFDi 3.3
ACTUALIZACION: Ya dispongo de versión JAVA
ACTUALIZACION: Ya dispongo de versión VB.NET
Hola amigos, hoy les quiero mostrar un poco de mi nueva librería para CFDi 3.3 de la factura electrónica en Mexico; Esta librería en lo personal es la más fácil de usar y mantener de las varias librerías para CFDi que he hecho hasta el momento.
NOTAS:
- Cabe destacar que la librería esta a la venta, para mayores informes dejen su comentario y su correo electrónico para contactarlos
- Para agregar complementos al final del artículo
A continuación les muestro la forma de llenar la estructura básica de una factura usando todos los campos de los nodos, cabe aclarar que evidentemente no es una factura válida, es solo una demostración del uso de la librería.
Ejemplo C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
// Comprobante Comprobante cfdi = new Comprobante(); // CfdiRelacionados cfdi.CfdiRelacionados["TipoRelacion"] = "01"; cfdi.CfdiRelacionados[0]["UUID"] = "9FB6ED1A-5F37-4FEF-980A-7F8C83B51894"; // Datos de la Factura cfdi["Serie"] = "F"; cfdi["Folio"] = "123"; cfdi["Fecha"] = DateTime.Now.ToString("s"); cfdi["FormaPago"] = "01"; cfdi["CondicionesDePago"] = "En una sola exhibición"; cfdi["SubTotal"] = "123.45"; cfdi["Descuento"] = "0.00"; cfdi["Moneda"] = "MXN"; cfdi["TipoCambio"] = "1.00"; cfdi["Total"] = "123.45"; cfdi["TipoDeComprobante"] = "I"; cfdi["MetodoPago"] = "PUE"; cfdi["LugarExpedicion"] = "27000"; cfdi["Confirmacion"] = "12345"; // Emisor cfdi.Emisor["Rfc"] = "AAA010101AAA"; cfdi.Emisor["Nombre"] = "Accem Servicios Empresariales"; cfdi.Emisor["RegimenFiscal"] = "601"; // Receptor cfdi.Receptor["Rfc"] = "XAXX010101000"; cfdi.Receptor["Nombre"] = "Público en General"; cfdi.Receptor["UsoCFDI"] = "G01"; // Concepto Normal cfdi.Conceptos[0]["ClaveProdServ"] = "01010101"; cfdi.Conceptos[0]["NoIdentificacion"] = "COD01"; cfdi.Conceptos[0]["Cantidad"] = "1.00"; cfdi.Conceptos[0]["ClaveUnidad"] = "C81"; cfdi.Conceptos[0]["Unidad"] = "Pieza"; cfdi.Conceptos[0]["Descripcion"] = "Producto de prueba 1"; cfdi.Conceptos[0]["ValorUnitario"] = "100.00"; // Concpetos con Impuestos cfdi.Conceptos[1]["ClaveProdServ"] = "01010101"; cfdi.Conceptos[1]["NoIdentificacion"] = "COD02"; cfdi.Conceptos[1]["Cantidad"] = "1.00"; cfdi.Conceptos[1]["ClaveUnidad"] = "C81"; cfdi.Conceptos[1]["Unidad"] = "Pieza"; cfdi.Conceptos[1]["Descripcion"] = "Producto de prueba 2"; cfdi.Conceptos[1]["ValorUnitario"] = "100.00"; cfdi.Conceptos[1].Impuestos.Traslados[0]["Base"] = "1.00"; cfdi.Conceptos[1].Impuestos.Traslados[0]["Impuesto"] = "IVA"; cfdi.Conceptos[1].Impuestos.Traslados[0]["TipoFactor"] = "Tasa"; cfdi.Conceptos[1].Impuestos.Traslados[0]["TasaOCuota"] = "0.000000"; cfdi.Conceptos[1].Impuestos.Traslados[0]["Importe"] = "0.00"; cfdi.Conceptos[1].Impuestos.Retenciones[0]["Base"] = "1.00"; cfdi.Conceptos[1].Impuestos.Retenciones[0]["Impuesto"] = "IVA"; cfdi.Conceptos[1].Impuestos.Retenciones[0]["TipoFactor"] = "Tasa"; cfdi.Conceptos[1].Impuestos.Retenciones[0]["TasaOCuota"] = "0.000000"; cfdi.Conceptos[1].Impuestos.Retenciones[0]["Importe"] = "0.00"; // Conceptos con Información Aduanera cfdi.Conceptos[2]["ClaveProdServ"] = "01010101"; cfdi.Conceptos[2]["NoIdentificacion"] = "COD03"; cfdi.Conceptos[2]["Cantidad"] = "1.00"; cfdi.Conceptos[2]["ClaveUnidad"] = "C81"; cfdi.Conceptos[2]["Unidad"] = "Pieza"; cfdi.Conceptos[2]["Descripcion"] = "Producto de prueba 3"; cfdi.Conceptos[2]["ValorUnitario"] = "100.00"; cfdi.Conceptos[2].InformacionAduanera[0]["NumeroPedimento"] = "0987654321"; cfdi.Conceptos[2].InformacionAduanera[1]["NumeroPedimento"] = "7896541230"; // Conceptos con Cuenta Predial cfdi.Conceptos[3]["ClaveProdServ"] = "01010101"; cfdi.Conceptos[3]["NoIdentificacion"] = "COD04"; cfdi.Conceptos[3]["Cantidad"] = "1.00"; cfdi.Conceptos[3]["ClaveUnidad"] = "C81"; cfdi.Conceptos[3]["Unidad"] = "Pieza"; cfdi.Conceptos[3]["Descripcion"] = "Producto de prueba 4"; cfdi.Conceptos[3]["ValorUnitario"] = "100.00"; cfdi.Conceptos[3].CuentaPredial["Numero"] = "1234567890"; // Conceptos con Parte cfdi.Conceptos[4]["ClaveProdServ"] = "01010101"; cfdi.Conceptos[4]["NoIdentificacion"] = "COD05"; cfdi.Conceptos[4]["Cantidad"] = "1.00"; cfdi.Conceptos[4]["ClaveUnidad"] = "C81"; cfdi.Conceptos[4]["Unidad"] = "Pieza"; cfdi.Conceptos[4]["Descripcion"] = "Producto de prueba 5"; cfdi.Conceptos[4]["ValorUnitario"] = "100.00"; cfdi.Conceptos[4].Parte[0]["ClaveProdServ"] = "0101010101"; cfdi.Conceptos[4].Parte[0]["NoIdentificacion"] = "COD05"; cfdi.Conceptos[4].Parte[0]["Cantidad"] = "1.00"; cfdi.Conceptos[4].Parte[0]["Unidad"] = "Pieza"; cfdi.Conceptos[4].Parte[0]["Descripcion"] = "Parte 1"; cfdi.Conceptos[4].Parte[0]["ValorUnitario"] = "100.00"; cfdi.Conceptos[4].Parte[0]["Importe"] = "100.00"; cfdi.Conceptos[4].Parte[0].InformacionAduanera[0]["NumeroPedimento"] = "1234567890"; // Impuestos cfdi.Impuestos["TotalImpuestosRetenidos"] = "0.00"; cfdi.Impuestos["TotalImpuestosTrasladados"] = "16.00"; // Retenciones cfdi.Impuestos.Retenciones[0]["Impuesto"] = "ISR"; cfdi.Impuestos.Retenciones[0]["Importe"] = "0.00"; // Traslados cfdi.Impuestos.Traslados[0]["Impuesto"] = "ISR"; cfdi.Impuestos.Traslados[0]["Importe"] = "0.00"; cfdi.Impuestos.Traslados[0]["TasaOCuota"] = "0.160000"; cfdi.Impuestos.Traslados[0]["TipoFactor"] = "Tasa"; // Sellar XML cfdi.Sellar("rutaXSLT", "Ruta archivo KEY", "Ruta archivo CER", "Clave Certificados"); // Se guarda el XML cfdi.Documento.Save("cfdi33.xml"); |
Ejemplo VB.NET
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
' Comprobante Dim cfdi As New Comprobante() ' CfdiRelacionados cfdi.CfdiRelacionados("TipoRelacion") = "01" cfdi.CfdiRelacionados.CfdiRelacionado(0)("UUID") = "9FB6ED1A-5F37-4FEF-980A-7F8C83B51894" ' Datos de la Factura cfdi("Serie") = "F" cfdi("Folio") = "123" cfdi("Fecha") = DateTime.Now.ToString("s") cfdi("FormaPago") = "01" cfdi("CondicionesDePago") = "En una sola exhibición" cfdi("SubTotal") = "123.45" cfdi("Descuento") = "0.00" cfdi("Moneda") = "MXN" cfdi("TipoCambio") = "1.00" cfdi("Total") = "123.45" cfdi("TipoDeComprobante") = "I" cfdi("MetodoPago") = "PUE" cfdi("LugarExpedicion") = "01000" cfdi("Confirmacion") = "12345" ' Emisor cfdi.Emisor("Rfc") = "AAA010101AAA" cfdi.Emisor("Nombre") = "ACCEM SERVICIOS EMPRESARIALES SC" cfdi.Emisor("RegimenFiscal") = "601" ' Receptor cfdi.Receptor("Rfc") = "XAXX010101000" cfdi.Receptor("Nombre") = "Público en General" cfdi.Receptor("UsoCFDI") = "G01" ' Concepto Normal cfdi.Conceptos(0)("ClaveProdServ") = "01010101" cfdi.Conceptos(0)("NoIdentificacion") = "COD01" cfdi.Conceptos(0)("Cantidad") = "1.00" cfdi.Conceptos(0)("ClaveUnidad") = "C81" cfdi.Conceptos(0)("Unidad") = "Pieza" cfdi.Conceptos(0)("Descripcion") = "Producto de prueba 1" cfdi.Conceptos(0)("ValorUnitario") = "123.45" cfdi.Conceptos(0)("Importe") = "123.45" cfdi.Conceptos(0)("Descuento") = "0.00" ' Concpetos con Impuestos cfdi.Conceptos(1)("ClaveProdServ") = "01010101" cfdi.Conceptos(1)("NoIdentificacion") = "COD02" cfdi.Conceptos(1)("Cantidad") = "1.00" cfdi.Conceptos(1)("ClaveUnidad") = "C81" cfdi.Conceptos(1)("Unidad") = "Pieza" cfdi.Conceptos(1)("Descripcion") = "Producto de prueba 2" cfdi.Conceptos(1)("ValorUnitario") = "100.00" cfdi.Conceptos(1)("Importe") = "123.45" cfdi.Conceptos(1)("Descuento") = "0.00" cfdi.Conceptos(1).Impuestos.Traslados(0)("Base") = "1.00" cfdi.Conceptos(1).Impuestos.Traslados(0)("Impuesto") = "IVA" cfdi.Conceptos(1).Impuestos.Traslados(0)("TipoFactor") = "Tasa" cfdi.Conceptos(1).Impuestos.Traslados(0)("TasaOCuota") = "0.000000" cfdi.Conceptos(1).Impuestos.Traslados(0)("Importe") = "0.00" cfdi.Conceptos(1).Impuestos.Retenciones(0)("Base") = "1.00" cfdi.Conceptos(1).Impuestos.Retenciones(0)("Impuesto") = "IVA" cfdi.Conceptos(1).Impuestos.Retenciones(0)("TipoFactor") = "Tasa" cfdi.Conceptos(1).Impuestos.Retenciones(0)("TasaOCuota") = "0.000000" cfdi.Conceptos(1).Impuestos.Retenciones(0)("Importe") = "0.00" ' Conceptos con Información Aduanera cfdi.Conceptos(2)("ClaveProdServ") = "01010101" cfdi.Conceptos(2)("NoIdentificacion") = "COD03" cfdi.Conceptos(2)("Cantidad") = "1.00" cfdi.Conceptos(2)("ClaveUnidad") = "C81" cfdi.Conceptos(2)("Unidad") = "Pieza" cfdi.Conceptos(2)("Descripcion") = "Producto de prueba 3" cfdi.Conceptos(2)("ValorUnitario") = "100.00" cfdi.Conceptos(2)("Importe") = "123.45" cfdi.Conceptos(2)("Descuento") = "0.00" cfdi.Conceptos(2).InformacionAduanera(0)("NumeroPedimento") = "0987654321" cfdi.Conceptos(2).InformacionAduanera(1)("NumeroPedimento") = "7896541230" ' Conceptos con Cuenta Predial cfdi.Conceptos(3)("ClaveProdServ") = "01010101" cfdi.Conceptos(3)("NoIdentificacion") = "COD04" cfdi.Conceptos(3)("Cantidad") = "1.00" cfdi.Conceptos(3)("ClaveUnidad") = "C81" cfdi.Conceptos(3)("Unidad") = "Pieza" cfdi.Conceptos(3)("Descripcion") = "Producto de prueba 4" cfdi.Conceptos(3)("ValorUnitario") = "100.00" cfdi.Conceptos(3)("Importe") = "123.45" cfdi.Conceptos(3)("Descuento") = "0.00" cfdi.Conceptos(3).CuentaPredial("Numero") = "1234567890" ' Conceptos con Parte cfdi.Conceptos(4)("ClaveProdServ") = "01010101" cfdi.Conceptos(4)("NoIdentificacion") = "COD05" cfdi.Conceptos(4)("Cantidad") = "1.00" cfdi.Conceptos(4)("ClaveUnidad") = "C81" cfdi.Conceptos(4)("Unidad") = "Pieza" cfdi.Conceptos(4)("Descripcion") = "Producto de prueba 5" cfdi.Conceptos(4)("ValorUnitario") = "100.00" cfdi.Conceptos(4)("Importe") = "123.45" cfdi.Conceptos(4)("Descuento") = "0.00" cfdi.Conceptos(4).Parte(0)("ClaveProdServ") = "0101010101" cfdi.Conceptos(4).Parte(0)("NoIdentificacion") = "COD05" cfdi.Conceptos(4).Parte(0)("Cantidad") = "1.00" cfdi.Conceptos(4).Parte(0)("Unidad") = "Pieza" cfdi.Conceptos(4).Parte(0)("Descripcion") = "Parte 1" cfdi.Conceptos(4).Parte(0)("ValorUnitario") = "100.00" cfdi.Conceptos(4).Parte(0)("Importe") = "100.00" cfdi.Conceptos(4).Parte(0).InformacionAduanera(0)("NumeroPedimento") = "1234567890" ' Se Lee el XML del complemento a Agregar Dim complemento As New XmlDocument() complemento.Load("ruta_xml_complemento.xml") cfdi.Conceptos(5).AgregaComplemento(complemento) ' Impuestos cfdi.Impuestos("TotalImpuestosRetenidos") = "0.00" cfdi.Impuestos("TotalImpuestosTrasladados") = "16.00" ' Retenciones cfdi.Impuestos.Retenciones(0)("Impuesto") = "ISR" cfdi.Impuestos.Retenciones(0)("Importe") = "0.00" ' Traslados cfdi.Impuestos.Traslados(0)("Impuesto") = "001" cfdi.Impuestos.Traslados(0)("Importe") = "16.00" cfdi.Impuestos.Traslados(0)("TasaOCuota") = "0.160000" cfdi.Impuestos.Traslados(0)("TipoFactor") = "Tasa" ' Sellar XML cfdi.Sellar("rutaXSLT", "Ruta archivo KEY", "Ruta archivo CER", "Clave Certificados") ' Se guarda el XML cfdi.Documento.Save("cfdi33.xml") |
Ejemplo JAVA
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
public static void main(String[] args) throws Exception { // Ruta de XSLT para Cadena Original String xslt = "C:\\Users\\IsaRoGaMX\\Documents\\FE\\cadenaoriginal_3_3.xslt"; // Ruta de archivo CER String pcer = "C:\\Users\\IsaRoGaMX\\Desktop\\certificadopruebas33\\CertificadoPruebas\\CSD010_AAA010101AAA.cer"; // Ruta de archivo KEY String pkey = "C:\\Users\\IsaRoGaMX\\Desktop\\certificadopruebas33\\CertificadoPruebas\\CSD010_AAA010101AAA.key"; // Contraseña de archivo KEY String pass = "12345678a"; // Comprobante Comprobante cfdi = new Comprobante(); cfdi.setAtributo("Serie", "F"); cfdi.setAtributo("Folio", "123"); cfdi.setAtributo("Fecha", "2017-05-05T20:12:58"); cfdi.setAtributo("FormaPago", "99"); cfdi.setAtributo("CondicionesDePago", "En una sola exhibición"); cfdi.setAtributo("SubTotal", "500.05"); cfdi.setAtributo("Descuento", "0.00"); cfdi.setAtributo("Moneda", "MXN"); cfdi.setAtributo("TipoCambio", "1"); cfdi.setAtributo("Total", "500.05"); cfdi.setAtributo("TipoDeComprobante", "I"); cfdi.setAtributo("MetodoPago", "PUE"); cfdi.setAtributo("LugarExpedicion", "01000"); // Emisor cfdi.Emisor().setAtributo("Rfc", "AAA010101AAA"); cfdi.Emisor().setAtributo("Nombre", "ACCEM SERVICIOS EMPRESARIALES SC"); cfdi.Emisor().setAtributo("RegimenFiscal", "601"); // Receptor cfdi.Receptor().setAtributo("Rfc", "XAXX010101000"); cfdi.Receptor().setAtributo("Nombre", "Público en General"); cfdi.Receptor().setAtributo("UsoCFDI", "G01"); // Concepto Normal cfdi.Conceptos().Concepto(0).setAtributo("ClaveProdServ", "01010101"); cfdi.Conceptos().Concepto(0).setAtributo("Cantidad", "1.00"); cfdi.Conceptos().Concepto(0).setAtributo("ClaveUnidad", "C81"); cfdi.Conceptos().Concepto(0).setAtributo("Descripcion", "Producto de prueba"); cfdi.Conceptos().Concepto(0).setAtributo("ValorUnitario", "500.05"); cfdi.Conceptos().Concepto(0).setAtributo("Importe", "500.05"); // Complemento Leyendas Fiscales Complemento leyendasFiscales = new Complemento(NSXml.creaInstancia("leyendasFisc", "http://www.sat.gob.mx/leyendasFiscales", "http://www.sat.gob.mx/sitio_internet/cfd/leyendasFiscales/leyendasFisc.xsd")); NodoComplemento nodoLeyendas = new NodoComplemento("LeyendasFiscales"); nodoLeyendas.setAtributo("Version", "1.0"); leyendasFiscales.AgregaNodo(nodoLeyendas); NodoComplemento nodoLeyenda = new NodoComplemento("Leyenda"); nodoLeyenda.setAtributo("disposicionFiscal", "LISR 2014"); nodoLeyenda.setAtributo("norma", "Sección I, Capítulo II, Título IV"); nodoLeyenda.setAtributo("textoLeyenda", "DE LAS PERSONAS FÍSICAS CON ACTIVIDADES EMPRESARIALES Y PROFESIONALES"); nodoLeyendas.AgregaNodo(nodoLeyenda); // Se agrega complemento (SIEMPRE ANTES DE SELLAR) cfdi.AgregarComplemento(leyendasFiscales.Documento()); // Se sella el Comprobante cfdi.SellarCFDI(pcer, pkey, pass, xslt); // Se guarda el XML cfdi.Guardar("C:\\Users\\IsaRoGaMX\\workspace\\CFDi33\\cfdi33.xml"); } |
En seguida les muestro el XML generado por la librería
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
<?xml version="1.0" encoding="utf-8"?> <cfdi:Comprobante Version="3.3" Serie="F" Folio="123" Fecha="2017-03-04T10:27:49" FormaPago="01" CondicionesDePago="En una sola exhibición" SubTotal="123.45" Descuento="0.00" Moneda="MXN" TipoCambio="1.00" Total="123.45" TipoDeComprobante="I" MetodoPago="PUE" LugarExpedicion="27000" Confirmacion="12345" xmlns:cfdi="http://www.sat.gob.mx/cfd/3"> <cfdi:CfdiRelacionados TipoRelacion="01"> <cfdi:CfdiRelacionado UUID="9FB6ED1A-5F37-4FEF-980A-7F8C83B51894" /> </cfdi:CfdiRelacionados> <cfdi:Emisor Rfc="AAA010101AAA" Nombre="Accem Servicios Empresariales" RegimenFiscal="601" /> <cfdi:Receptor Rfc="XAXX010101000" Nombre="Público en General" UsoCFDI="G01" /> <cfdi:Conceptos> <cfdi:Concepto ClaveProdServ="01010101" NoIdentificacion="COD01" Cantidad="1.00" ClaveUnidad="C81" Unidad="Pieza" Descripcion="Producto de prueba 1" ValorUnitario="100.00" /> <cfdi:Concepto ClaveProdServ="01010101" NoIdentificacion="COD02" Cantidad="1.00" ClaveUnidad="C81" Unidad="Pieza" Descripcion="Producto de prueba 2" ValorUnitario="100.00"> <cfdi:Impuestos> <cfdi:Traslados> <cfdi:Traslado Base="1.00" Impuesto="IVA" TipoFactor="Tasa" TasaOCuota="0.000000" Importe="0.00" /> </cfdi:Traslados> <cfdi:Retenciones> <cfdi:Retencion Base="1.00" Impuesto="IVA" TipoFactor="Tasa" TasaOCuota="0.000000" Importe="0.00" /> </cfdi:Retenciones> </cfdi:Impuestos> </cfdi:Concepto> <cfdi:Concepto ClaveProdServ="01010101" NoIdentificacion="COD03" Cantidad="1.00" ClaveUnidad="C81" Unidad="Pieza" Descripcion="Producto de prueba 3" ValorUnitario="100.00"> <cfdi:InformacionAduanera NumeroPedimento="0987654321" /> <cfdi:InformacionAduanera NumeroPedimento="7896541230" /> </cfdi:Concepto> <cfdi:Concepto ClaveProdServ="01010101" NoIdentificacion="COD04" Cantidad="1.00" ClaveUnidad="C81" Unidad="Pieza" Descripcion="Producto de prueba 4" ValorUnitario="100.00"> <cfdi:CuentaPredial Numero="1234567890" /> </cfdi:Concepto> <cfdi:Concepto ClaveProdServ="01010101" NoIdentificacion="COD05" Cantidad="1.00" ClaveUnidad="C81" Unidad="Pieza" Descripcion="Producto de prueba 5" ValorUnitario="100.00"> <cfdi:Parte ClaveProdServ="0101010101" NoIdentificacion="COD05" Cantidad="1.00" Unidad="Pieza" Descripcion="Parte 1" ValorUnitario="100.00" Importe="100.00" /> </cfdi:Concepto> </cfdi:Conceptos> <cfdi:Impuestos TotalImpuestosRetenidos="0.00" TotalImpuestosTrasladados="16.00"> <cfdi:Retenciones> <cfdi:Retencion Impuesto="ISR" Importe="0.00" /> </cfdi:Retenciones> <cfdi:Traslados> <cfdi:Traslado Impuesto="ISR" Importe="0.00" TasaOCuota="0.160000" TipoFactor="Tasa" /> </cfdi:Traslados> </cfdi:Impuestos> </cfdi:Comprobante> |
Agregar un Complemento
Existen dos formas de agregar complementos al CFDi, generar el XML del complemento de forma manual (concatenando un string o utilizando las clases de .NET de XML) o utilizar la librería ComplementoCFDi para generar el XML del complemento. No importa cual método utilices siempre que guardes dicho XML en algun archivo para leerlo desde ahí e importarlo al CFDi de la siguiente forma:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// Se Lee el XML del complemento a Agregar XmlDocument complemento = new XmlDocument(); complemento.Load(@"C:\Users\IsaRoGaMX\Documents\complemento.xml"); // Se agrega el complemento al CFDi cfdi.AgregarComplemento(complemento); // Sellado cfdi.Sellar(@"C:\Users\IsaRoGaMX\Documents\FE\cadenaoriginal_3_3.xslt", @"C:\Users\IsaRoGaMX\Desktop\CertificadoPruebas\CSD010_AAA010101AAA.key", @"C:\Users\IsaRoGaMX\Desktop\CertificadoPruebas\CSD010_AAA010101AAA.cer", "12345678a" ); // Se guarda el XML cfdi.Documento.Save("cfdi33.xml"); |
Consideraciones:
- El complemento se debe agregar ANTES de sellar el CFDi.
- En el archivo XSLT que genera la cadena original se deben importar los XSLT de los complementos que deseamos utilizar en nuestros CFDi, en este caso en el archivo cadenaoriginal_3_3.xslt.