' 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