// Program.cs // Ejemplo en C# (c sharp) para usar libfacturista // una biblioteca (dll o libreria) para generar, sellar y timbrar CFDI 3.2 (XML) // Ariel Medina - 2013 - facturista.com using System; using lfApi=libfacturista.utf16Api; // libfacturista_cs.dll //using lfApi=libfacturista.ansiApi; // libfacturista_cs.dll using System.Runtime.InteropServices; namespace libfacturista_cs { class Program { string gcnombrePrograma="facturista.com::libfacturista"; // Funcion para realizar el timbrado, parametros: // xml - archivoFuente // xmltim - archivoDestino // pruebas - true si queremos servidor de pruebas // solotimbrado - true si queremos servicio de Solo Timbrado // h - manejador del XML, si es diferente de 0, lo consideramos como el XML fuente e ignoramos el primer parametro static bool timbrar(string xml, string xmltim, bool pruebas, bool solotimbrado, int h) { string timbre, paramsPAC, rfc, uuid; // Los nombres de archivo no deberian estar vacios if((h==0 && xml.Length<1) || xmltim.Length<1) { Console.WriteLine("Nombre de archivo fuente o destino no es valido"); return false; } if(h==0) { // Solo se carga si la estructura XML es correcta h=lfApi.cfdi_xml_cargar(0,xml); } if(h!=0) { // Aprovechamos para verificar si tiene timbre timbre = lfApi.cfdi_xml_atributo(h, "cfdi:Comprobante/cfdi:Complemento/tfd:TimbreFiscalDigital", "UUID"); if(timbre.Length>0) { Console.WriteLine("El archivo ya tiene timbre: "+timbre); return false; } // Obtenemos el RFC del emisor rfc = lfApi.cfdi_xml_atributo(h, "cfdi:Comprobante/cfdi:Emisor", "rfc"); if(rfc.Length==0) { Console.WriteLine("No se pudo determinar el RFC"); return false; } // Parametro TransaccionID para el PAC paramsPAC="TransaccionID=1234567890"; // Si se trata de pruebas, ponemos el servidor y puerto adecuado en los parametros if(pruebas) paramsPAC=paramsPAC+";RFC=AAA010101AAA;Servidor=pruebas.ecodex.com.mx;Puerto=2044"; else paramsPAC=paramsPAC+";RFC="+rfc; // Si no quiere solo timbrado, entonces indicamos al PAC que (re)selle if(!solotimbrado) paramsPAC=paramsPAC+";Sellar=1"; // Intentamos timbrar if (lfApi.cfdi_timbrar(h, xml, xmltim, 1, paramsPAC) > 0) { h = lfApi.cfdi_xml_cargar(h, xmltim); if (h!=0) { uuid = lfApi.cfdi_xml_atributo(h, "cfdi:Comprobante/cfdi:Complemento/tfd:TimbreFiscalDigital", "UUID"); Console.WriteLine("Folio fiscal : "+uuid+"; archivo: "+xmltim); return true; } else Console.WriteLine("La factura fue timbrada pero no se pudo cargar; archivo "+xmltim); } else Console.WriteLine("Ha fallado el timbrado, " + lfApi.cfdi_error(h)); } else Console.WriteLine(lfApi.cfdi_error(0)); return false; } static int Main(string[] args) { lfApi.init(); // Descomente la siguiente seccion si desea timbrar el archivo de ejemplo /* if (timbrar("cfdi_ejemplo.xml", "cfdi_timbrado_csharp.xml", true, false)) { int h = 0; string estadoCuenta = lfApi.cfdi_estado_cuenta(h, 1, "RFC=AAA010101AAA;TransaccionID=456;Servidor=pruebas.ecodex.com.mx;Puerto=2044"); Console.WriteLine(estadoCuenta); string version = lfApi.libfacturista_version(); Console.WriteLine(version); return 0; } else return -2; */ int h, he, hr, hc, hi; string rutaLlavePrivada, contrasena, rutaCertificado, rutaDestino, xmlTimbrado, version, estadoCuenta; rutaLlavePrivada="./aaa010101aaa__csd_01.key"; contrasena="12345678a"; rutaCertificado="./aaa010101aaa__csd_01.cer"; rutaDestino="./cfdi_sellado.xml"; xmlTimbrado="./cfdi_timbrado_csharp.xml"; h=lfApi.cfdi_comprobante("3.2", "A", "1234", "2013-06-27T18:43:11", "Pago en una sola exhibicion", "6172.50", "12.34", "USD", "7124.75", "Efectivo", "ingreso", "Campeche, Campeche", "3849", "", "", "", ""); he=lfApi.cfdi_emisor(h,"AAA010101AAA","facturista.com"); if (he==0) { Console.WriteLine( lfApi.cfdi_error(h) ); return -1; } lfApi.cfdi_emisor_domicilio(he,"31", "7", "Piso 3A", "Col. Mexico", "Campeche", "Municipio de Campeche", "Campeche", "Mexico", "24000", "Por la CFE"); // En caso de ser una sucursal, agregamos su direccion lfApi.cfdi_emisor_expedido_en(he,"39", "8", "Depto. 25", "Col. Jalisco", "San Nicolas de los Garza", "Monterrey", "Nuevo Leon", "Mexico", "74000", "Cerca de Telmex"); lfApi.cfdi_emisor_regimen(he,"Regimen 1"); lfApi.cfdi_emisor_regimen(he,"Regimen 2"); // el RFC de los clientes no debe contener guiones o espacios hr=lfApi.cfdi_receptor(h,"X&XX010101AAA","nombre_tu_cliente"); // los clientes deben tener desglosada su direccion para poder llenar los campos del receptor lfApi.cfdi_receptor_domicilio(hr,"Paseo de Montejo", "1234", "456", "Col. Europea", "Ciudad gotica", "Municipio de Merida", "Yucatan", "Mexico", "38294", "Por la cascada"); // aqui ponemos el detalle de la factura, en vez de los conceptos del ejemplo // deberia poner información de su BD hc=lfApi.cfdi_concepto(h,"10", "PZA", "1", "Memoria USB", "123.45", "1234.50"); lfApi.cfdi_concepto_informacionaduanera(hc,"12345", "2011-01-01","Aduana nogales"); hc=lfApi.cfdi_concepto(h,"10", "PZA", "2", "Memoria USB", "123.45", "1234.50"); lfApi.cfdi_concepto_cuentapredial(hc,"3836463729385495"); hc=lfApi.cfdi_concepto(h,"10", "PZA", "3", "Memoria USB", "123.45", "1234.50"); lfApi.cfdi_concepto_parte(h,"10", "PZA", "3", "Parte 1", "123.45", "1234.50"); lfApi.cfdi_concepto_parte(h,"10", "PZA", "3", "Parte 2", "123.45", "1234.50"); hc=lfApi.cfdi_concepto(h,"10", "PZA", "4", "Memoria USB", "123.45", "1234.50"); hc=lfApi.cfdi_concepto(h,"10", "PZA", "5", "Memoria USB", "123.45", "1234.50"); // Probamos el complemento iedu (Instituciones Educativas) hc=lfApi.cfdi_concepto(h,"1", "NA", "6", "Pago de educacion, mes de septiembre", "123.45", "1234.50"); lfApi.cfdi_iedu( h, "1.0" , "Nombre Del Alumno" , "XIZW840214HYFHJW15", "Bachillerato o su equivalente", "04DPRO452V", "AAA010101AAA" , ""); hi=lfApi.cfdi_impuestos(h,"35.35","987.60"); lfApi.cfdi_impuestos_retencion(hi,"ISR","12.12"); lfApi.cfdi_impuestos_retencion(hi,"IVA","23.23"); lfApi.cfdi_impuestos_traslado(hi,"IVA", "987.60", "16.00"); lfApi.cfdi_impuestos_traslado(hi,"IEPS", "0.00", "0.00"); Console.WriteLine("Cadena original:" + lfApi.cfdi_cadena_original(h) ); // Si es DLL demo, no se guarda en un archivo el XML sellado, pero se queda en memoria // para poder timbrarlo; al final obtenemos el XML timbrado en un archivo if ( lfApi.cfdi_sellar_pkcs8(h, rutaLlavePrivada, contrasena, rutaCertificado, rutaDestino,1) != 0 ) { // Se ha comentado la siguiente llamada a funcion, que es más elaborada, pero puede confundir al principio //if(timbrar("cfdi_ejemplo.xml",xmlTimbrado,true,false,0)) //if(timbrar("",xmlTimbrado,true,false,h)) // Parametros para el PAC 1 (Ecodex) string paramsPAC = "TransaccionID=1234567890;RFC=AAA010101AAA;Servidor=pruebas.ecodex.com.mx;Puerto=2044;Sellar=1"; // poniendo la cadena vacia en el segundo parametro, se timbra lo que hay en memoria if (lfApi.cfdi_timbrar(h, "", xmlTimbrado, 1, paramsPAC) > 0) { estadoCuenta = lfApi.cfdi_estado_cuenta(h, 1, "RFC=AAA010101AAA;TransaccionID=456;Servidor=pruebas.ecodex.com.mx;Puerto=2044"); Console.WriteLine(estadoCuenta); } else Console.WriteLine("Error al timbrar: " + lfApi.cfdi_error(h) ); } else Console.WriteLine("Error al sellar: " + lfApi.cfdi_error(h) ); version = lfApi.libfacturista_version(); Console.WriteLine(version); return 0; } } }