' ejemplo_vbnet.vb ' Ejemplo de uso de libfacturista.dll en VB .net (Visual Basic) ' Ariel Medina - 2013 - facturista.com ' Debera agregar a su proyecto de VBnet la referencia a libfacturista_cs.dll Imports System Imports libfacturista 'libfacturista_cs.dll Imports System.Runtime.InteropServices Module module1 '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 Function timbrar(Byval xml as string, Byval xmltim as string, Byval pruebas As boolean, Byval solotimbrado As boolean, Byval h As Integer) As boolean Dim timbre, paramsPAC, rfc, uuid as string ' Los nombres de archivo no deberian estar vacios If ( (h=0 and xml.Length<1) Or xmltim.Length<1) Console.WriteLine("Nombre de archivo fuente o destino no es valido") return false End If If h=0 ' Solo se carga si la estructura XML es correcta h = ansiApi.cfdi_xml_cargar(0, xml) End If if(h<>0) ' Aprovechamos para verificar si tiene timbre timbre = ansiApi.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 End If ' Obtenemos el RFC del emisor rfc = ansiApi.cfdi_xml_atributo(h, "cfdi:Comprobante/cfdi:Emisor", "rfc") if(rfc.Length=0) Console.WriteLine("No se pudo determinar el RFC") return false End If ' 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 End If ' Si no quiere solo timbrado, entonces indicamos al PAC que (re)selle if(Not solotimbrado) paramsPAC=paramsPAC+";Sellar=1" End If ' Intentamos timbrar If (ansiApi.cfdi_timbrar(h, xml, xmltim, 1, paramsPAC) <> 0) Then h = ansiApi.cfdi_xml_cargar(h, xmltim) If (h <> 0) Then uuid = ansiApi.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) End If Else Console.WriteLine("Ha fallado el timbrado, " + ansiApi.cfdi_error(h)) End If End If return false End Function Sub Main Dim h, he, hr, hc, hi As Integer Dim rutaLlavePrivada, contrasena, rutaCertificado, rutaDestino, xml2, version, estadocuenta As string rutaLlavePrivada="./aaa010101aaa__csd_01.key" contrasena="12345678a" rutaCertificado="./aaa010101aaa__csd_01.cer" rutaDestino="./cfdi_sellado.xml" xml2="./cfdi_timbrado.xml" ansiApi.init() h = ansiApi.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", "", "", "", "") ' Los caracteres están en UTF8, pero si los vamos a mostrar al usuario en controles de Windows, ' debemos decirle a libfacturista que convierta las cadenas a ACP ( ANSI Code Page) ' antes de devolverlas ansiApi.xml_caller_charset(h, "acp") he = ansiApi.cfdi_emisor(h, "AAA010101AAA", "facturista.com") if he=0 MsgBox(ansiApi.cfdi_error(h)) return '-1 End if ansiApi.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 ansiApi.cfdi_emisor_expedido_en(he, "39", "8", "Depto. 25", "Col. Jalisco", "San Nicolas de los Garza", "Monterrey", "Nuevo Leon", "Mexico", "74000", "Cerca de Telmex") ansiApi.cfdi_emisor_regimen(he, "Regimen 1") ansiApi.cfdi_emisor_regimen(he, "Regimen 2") ' el RFC de los clientes no debe contener guiones o espacios hr = ansiApi.cfdi_receptor(h, "X&XX010101AAA", "nombre_tu_cliente") ' los clientes deben tener desglosada su direccion para poder llenar los campos del receptor ansiApi.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 = ansiApi.cfdi_concepto(h, "10", "PZA", "1", "Memoria USB", "123.45", "1234.50") ansiApi.cfdi_concepto_informacionaduanera(hc, "12345", "2011-01-01", "Aduana nogales") hc = ansiApi.cfdi_concepto(h, "10", "PZA", "2", "Memoria USB", "123.45", "1234.50") ansiApi.cfdi_concepto_cuentapredial(hc, "3836463729385495") hc = ansiApi.cfdi_concepto(h, "10", "PZA", "3", "Memoria USB", "123.45", "1234.50") ansiApi.cfdi_concepto_parte(h, "10", "PZA", "3", "Parte 1", "123.45", "1234.50") ansiApi.cfdi_concepto_parte(h, "10", "PZA", "3", "Parte 2", "123.45", "1234.50") hc = ansiApi.cfdi_concepto(h, "10", "PZA", "4", "Memoria USB", "123.45", "1234.50") hc = ansiApi.cfdi_concepto(h, "10", "PZA", "5", "Memoria USB", "123.45", "1234.50") hi = ansiApi.cfdi_impuestos(h, "35.35", "987.60") ansiApi.cfdi_impuestos_retencion(hi, "ISR", "12.12") ansiApi.cfdi_impuestos_retencion(hi, "IVA", "23.23") ansiApi.cfdi_impuestos_traslado(hi, "IVA", "987.60", "16.00") ansiApi.cfdi_impuestos_traslado(hi, "IEPS", "0.00", "0.00") MsgBox("Cadena original:" + ansiApi.cfdi_cadena_original(h)) ' Si es DLL demo, no se guarda en un archivo el XML, pero se queda en memoria ' para poder timbrarlo If ansiApi.cfdi_sellar_pkcs8(h, rutaLlavePrivada, contrasena, rutaCertificado, rutaDestino, 1) <> 0 Then 'if(timbrar("cfdi_ejemplo.xml","cfdi_timbrado_vbnet.xml",true,false,0)) ' poniendo la cadena vacia y el manejador en el ultimo parametro, se timbra lo que hay en memoria If (timbrar("", "cfdi_timbrado_vbnet.xml", True, False, h)) Then estadocuenta = ansiApi.cfdi_estado_cuenta(h, 1, "RFC=AAA010101AAA;TransaccionID=456;Servidor=pruebas.ecodex.com.mx;Puerto=2044") Console.WriteLine(estadocuenta) Else MsgBox("Error al timbrar: " + ansiApi.cfdi_error(h)) End If Else MsgBox("Error al sellar: " + ansiApi.cfdi_error(h)) End If version = ansiApi.libfacturista_version() Console.WriteLine(version) End Sub End Module