Attribute VB_Name = "libfacturista" ' libfacturista.bas - 2013 07 25 ' Ejemplo de uso de la dll libfacturista para timbrar CFDI (factura electronica) en Visual Basic '* Ariel Medina - 2013 - facturista.com Declare Function libfacturista_version Lib "_libfacturista.dll" Alias "__libfacturista_version@0" () As String Declare Function cfdi_crear Lib "_libfacturista.dll" Alias "__cfdi_crear@0" () As Long Declare Function cfdi_destruir Lib "_libfacturista.dll" Alias "__cfdi_destruir@4" (ByVal h As Long) As Long Declare Function cfdi_comprobante_ex Lib "_libfacturista.dll" Alias "__cfdi_comprobante_ex@72" (ByVal h As Long, ByVal version As String, ByVal serie As String, ByVal folio As String, ByVal fecha As String, _ ByVal formaDePago As String, ByVal subTotal As String, ByVal TipoCambio As String, ByVal Moneda As String, ByVal total As String, _ ByVal metodoDePago As String, ByVal tipoDeComprobante As String, ByVal LugarExpedicion As String, ByVal NumCtaPago As String, _ ByVal condicionesDePago As String, ByVal descuento As String, ByVal motivoDescuento As String, ByVal atributosExtra As String) As Long Declare Function cfdi_comprobante Lib "_libfacturista.dll" Alias "__cfdi_comprobante@68" (ByVal version As String, ByVal serie As String, ByVal folio As String, ByVal fecha As String, _ ByVal formaDePago As String, ByVal subTotal As String, ByVal TipoCambio As String, ByVal Moneda As String, ByVal total As String, _ ByVal metodoDePago As String, ByVal tipoDeComprobante As String, ByVal LugarExpedicion As String, ByVal NumCtaPago As String, _ ByVal FolioFiscalOrig As String, ByVal SerieFolioFiscalOrig As String, ByVal FechaFolioFiscalOrig As String, ByVal MontoFolioFiscalOrig As String) As Long Declare Function cfdi_emisor Lib "_libfacturista.dll" Alias "__cfdi_emisor@12" (ByVal pcfdi As Long, ByVal rfc As String, ByVal nombre As String) As Long Declare Function cfdi_emisor_regimen Lib "_libfacturista.dll" Alias "__cfdi_emisor_regimen@8" (ByVal pcfdi As Long, ByVal Regimen As String) As Long Declare Function cfdi_emisor_domicilio Lib "_libfacturista.dll" Alias "__cfdi_emisor_domicilio@44" (ByVal pcfdi As Long, ByVal calle As String, ByVal noExterior As String, ByVal noInterior As String, _ ByVal colonia As String, ByVal localidad As String, ByVal municipio As String, ByVal estado As String, ByVal pais As String, ByVal codigoPostal As String, ByVal referencia As String) As Long Declare Function cfdi_emisor_expedido_en Lib "_libfacturista.dll" Alias "__cfdi_emisor_expedido_en@44" (ByVal pcfdi As Long, ByVal calle As String, ByVal noExterior As String, ByVal noInterior As String, _ ByVal colonia As String, ByVal localidad As String, ByVal municipio As String, ByVal estado As String, ByVal pais As String, ByVal codigoPostal As String, ByVal referencia As String) As Long Declare Function cfdi_receptor Lib "_libfacturista.dll" Alias "__cfdi_receptor@12" (ByVal pcfdi As Long, ByVal rfc As String, ByVal nombre As String) As Long Declare Function cfdi_receptor_domicilio Lib "_libfacturista.dll" Alias "__cfdi_receptor_domicilio@44" (ByVal pcfdi As Long, ByVal calle As String, ByVal noExterior As String, ByVal noInterior As String, _ ByVal colonia As String, ByVal localidad As String, ByVal municipio As String, ByVal estado As String, ByVal pais As String, ByVal codigoPostal As String, ByVal referencia As String) As Long Declare Function cfdi_impuestos Lib "_libfacturista.dll" Alias "__cfdi_impuestos@12" (ByVal pcfdi As Long, ByVal totalImpuestosRetenidos As String, ByVal totalImpuestosTrasladados As String) As Long Declare Function cfdi_impuestos_retencion Lib "_libfacturista.dll" Alias "__cfdi_impuestos_retencion@12" (ByVal pcfdi As Long, ByVal impuesto As String, ByVal importe As String) As Long Declare Function cfdi_impuestos_traslado Lib "_libfacturista.dll" Alias "__cfdi_impuestos_traslado@16" (ByVal pcfdi As Long, ByVal impuesto As String, ByVal importe As String, ByVal tasa As String) As Long Declare Function cfdi_concepto Lib "_libfacturista.dll" Alias "__cfdi_concepto@28" (ByVal pcfdi As Long, ByVal cantidad As String, ByVal unidad As String, ByVal noIdentificacion As String, _ ByVal descripcion As String, ByVal valorUnitario As String, ByVal importe As String) As Long Declare Function cfdi_concepto_informacionaduanera Lib "_libfacturista.dll" Alias "__cfdi_concepto_informacionaduanera@16" (ByVal hc As Long, ByVal numero As String, ByVal fecha As String, ByVal aduana As String) As Long Declare Function cfdi_concepto_cuentapredial Lib "_libfacturista.dll" Alias "__cfdi_concepto_cuentapredial@8" (ByVal hc As Long, ByVal numero As String) As Long Declare Function cfdi_concepto_parte Lib "_libfacturista.dll" Alias "__cfdi_concepto_parte@28" (ByVal hc As Long, ByVal cantidad As String, ByVal unidad As String, ByVal noIdentificacion As String, _ ByVal descripcion As String, ByVal valorUnitario As String, ByVal importe As String) As Long Declare Function cfdi_concepto_ComplementoConcepto Lib "_libfacturista.dll" Alias "__cfdi_concepto_ComplementoConcepto@4" (ByVal hc As Long) As Long Declare Function cfdi_xml_cargar Lib "_libfacturista.dll" Alias "__cfdi_xml_cargar@8" (ByVal h As Long, ByVal rutaFuente As String) As Long Declare Function cfdi_xml_guardar Lib "_libfacturista.dll" Alias "__cfdi_xml_guardar@12" (ByVal h As Long, ByVal rutaDestino As String, ByVal decorar As Long) As Long Declare Function cfdi_xml_validar Lib "_libfacturista.dll" Alias "__cfdi_xml_validar@16" (ByVal h As Long, ByVal archivoXML As String, ByVal archivoXSD As String, ByVal parametros As String) As Long Declare Function cfdi_sellar_pkcs8 Lib "_libfacturista.dll" Alias "__cfdi_sellar_pkcs8@24" (ByVal h As Long, ByVal rutaLlavePrivada As String, ByVal contrasena As String, ByVal rutaCertificado As String, ByVal rutaDestino As String, ByVal decorar As Long) As Long Declare Function cfdi_sellar_pem Lib "_libfacturista.dll" Alias "__cfdi_sellar_pem@24" (ByVal h As Long, ByVal rutaLlavePrivada As String, ByVal contrasena As String, ByVal rutaCertificado As String, ByVal rutaDestino As String, ByVal decorar As Long) As Long Declare Function cfdi_sellar Lib "_libfacturista.dll" Alias "__cfdi_sellar@20" (ByVal h As Long, ByVal rutaLlavePrivada As String, ByVal rutaCertificado As String, ByVal rutaDestino As String, ByVal decorar As Long) As Long Declare Function cfdi_timbrar Lib "_libfacturista.dll" Alias "__cfdi_timbrar@20" (ByVal h As Long, ByVal rutaFuente As String, ByVal rutaDestino As String, ByVal numeroPAC As Long, ByVal parametros As String) As Long Declare Function cfdi_cancelar Lib "_libfacturista.dll" Alias "__cfdi_cancelar@12" (ByVal h As Long, ByVal numeroPAC As Long, ByVal parametros As String) As Long Declare Function cfdi_recuperar Lib "_libfacturista.dll" Alias "__cfdi_recuperar@16" (ByVal h As Long, ByVal rutaDestino As String, ByVal numeroPAC As Long, ByVal parametros As String) As Long Declare Function cfdi_estado_cuenta Lib "_libfacturista.dll" Alias "__cfdi_estado_cuenta@12" (ByVal h As Long, ByVal numeroPAC As Long, ByVal parametros As String) As String Declare Function cfdi_error Lib "_libfacturista.dll" Alias "__cfdi_error@4" (ByVal h As Long) As String Declare Function cfdi_resultado Lib "_libfacturista.dll" Alias "__cfdi_resultado@4" (ByVal h As Long) As String Declare Function cfdi_xml_atributo Lib "_libfacturista.dll" Alias "__cfdi_xml_atributo@12" (ByVal h As Long, ByVal ruta As String, ByVal nombre As String) As String Declare Function cfdi_xml_atributo_agregar Lib "_libfacturista.dll" Alias "__cfdi_xml_atributo_agregar@16" (ByVal h As Long, ByVal ruta As String, ByVal nombre As String, ByVal valor As String) As Long Declare Function cfdi_xml_atributo_borrar Lib "_libfacturista.dll" Alias "__cfdi_xml_atributo_borrar@12" (ByVal h As Long, ByVal ruta As String, ByVal nombre As String) As Long Declare Function cfdi_cadena_original Lib "_libfacturista.dll" Alias "__cfdi_cadena_original@4" (ByVal h As Long) As String Declare Function cfdi_cadena_original_sat Lib "_libfacturista.dll" Alias "__cfdi_cadena_original_sat@4" (ByVal h As Long) As String Declare Function cfdi_uuid Lib "_libfacturista.dll" Alias "__cfdi_uuid@4" (ByVal h As Long) As String Declare Function cfdi_fecha_timbrado Lib "_libfacturista.dll" Alias "__cfdi_fecha_timbrado@4" (ByVal h As Long) As String Declare Function cfdi_numero_certificado_sat Lib "_libfacturista.dll" Alias "__cfdi_numero_certificado_sat@4" (ByVal h As Long) As String Declare Function cfdi_sello_cfd Lib "_libfacturista.dll" Alias "__cfdi_sello_cfd@4" (ByVal h As Long) As String Declare Function cfdi_sello_sat Lib "_libfacturista.dll" Alias "__cfdi_sello_sat@4" (ByVal h As Long) As String Declare Function cfdi_sello Lib "_libfacturista.dll" Alias "__cfdi_sello@4" (ByVal h As Long) As String Declare Function cfdi_fecha Lib "_libfacturista.dll" Alias "__cfdi_fecha@4" (ByVal h As Long) As String Declare Function cfdi_numero_certificado Lib "_libfacturista.dll" Alias "__cfdi_numero_certificado@8" (ByVal h As Long, ByVal rutaCertificado As String) As String Declare Function xml_caller_charset Lib "_libfacturista.dll" Alias "__xml_caller_charset@8" (ByVal h As Long, ByVal charset As String) As Long Declare Function xml_node Lib "_libfacturista.dll" Alias "__xml_node@8" (ByVal h As Long, ByVal path As String) As Long Declare Function xml_node_children_number Lib "_libfacturista.dll" Alias "__xml_node_children_number@4" (ByVal h As Long) As Long Declare Function xml_node_by_index Lib "_libfacturista.dll" Alias "__xml_node_by_index@8" (ByVal h As Long, ByVal index As Long) As Long Declare Function xml_node_name Lib "_libfacturista.dll" Alias "__xml_node_name@4" (ByVal h As Long) As String Declare Function xml_node_by_name Lib "_libfacturista.dll" Alias "__xml_node_by_name@8" (ByVal h As Long, ByVal name As String) As Long Declare Function xml_node_attribute Lib "_libfacturista.dll" Alias "__xml_node_attribute@8" (ByVal h As Long, ByVal name As String) As String Declare Function xml_serialize Lib "_libfacturista.dll" Alias "__xml_serialize@8" (ByVal h As Long, Byval decorate As Long) As String Declare Function xml_insert Lib "_libfacturista.dll" Alias "__xml_insert@20" (ByVal h As Long, ByVal path As String, ByVal XMLstring As String, ByVal indexFather As Long, ByVal indexChildren As Long) As Long Declare Function cfdi_timbrar_lote Lib "_libfacturista.dll" Alias "__cfdi_timbrar_lote@24" (ByVal h As Long, ByVal rutaFuente As String, ByVal rutaDestino As String, ByVal parametrosLote As String, ByVal numeroPAC As Long, ByVal parametrosPAC As String) As Long Declare Function cfdi_validar Lib "_libfacturista.dll" Alias "__cfdi_validar@12" (ByVal h As Long, Byval archivoXML As String, Byval parametros As String) As Long Declare Function set_mt Lib "_libfacturista.dll" Alias "__set_mt@4" (ByVal h As Long) As Long Declare Function cfdi_raiz Lib "_libfacturista.dll" Alias "__cfdi_raiz@4" (ByVal h As Long) As Long Declare Function cfdis_activos Lib "_libfacturista.dll" Alias "__cfdis_activos@0"() As Long ' Complemento Nomina CFDI Declare Function cfdi_nomina Lib "_libfacturista.dll" Alias "__cfdi_nomina@96" (ByVal h As Long, ByVal Version As String, ByVal RegistroPatronal As String, ByVal NumEmpleado As String, ByVal CURP As String, ByVal TipoRegimen As String, ByVal NumSeguridadSocial As String, ByVal FechaPago As String, ByVal FechaInicialPago As String, ByVal FechaFinalPago As String, ByVal NumDiasPagados As String, ByVal Departamento As String, ByVal CLABE As String, ByVal Banco As String, ByVal FechaInicioRelLaboral As String, ByVal Antiguedad As String, ByVal Puesto As String, ByVal TipoContrato As String, ByVal TipoJornada As String, ByVal PeriodicidadPago As String, ByVal SalarioBaseCotApor As String, ByVal RiesgoPuesto As String, ByVal SalarioDiarioIntegrado As String, ByVal atributosExtra As String) As Long Declare Function cfdi_nomina_percepciones Lib "_libfacturista.dll" Alias "__cfdi_nomina_percepciones@16" (ByVal h As Long, ByVal TotalGravado As String, ByVal TotalExento As String, ByVal atributosExtra As String) As Long Declare Function cfdi_nomina_percepcion Lib "_libfacturista.dll" Alias "__cfdi_nomina_percepcion@28" (ByVal h As Long, ByVal TipoPercepcion As String, ByVal Clave As String, ByVal Concepto As String, ByVal ImporteGravado As String, ByVal ImporteExento As String, ByVal atributosExtra As String) As Long Declare Function cfdi_nomina_deducciones Lib "_libfacturista.dll" Alias "__cfdi_nomina_deducciones@16" (ByVal h As Long, ByVal TotalGravado As String, ByVal TotalExento As String, ByVal atributosExtra As String) As Long Declare Function cfdi_nomina_deduccion Lib "_libfacturista.dll" Alias "__cfdi_nomina_deduccion@28" (ByVal h As Long, ByVal TipoDeduccion As String, ByVal Clave As String, ByVal Concepto As String, ByVal ImporteGravado As String, ByVal ImporteExento As String, ByVal atributosExtra As String) As Long Declare Function cfdi_nomina_incapacidad Lib "_libfacturista.dll" Alias "__cfdi_nomina_incapacidad@20" (ByVal h As Long, ByVal DiasIncapacidad As String, ByVal TipoIncapacidad As String, ByVal Descuento As String, ByVal atributosExtra As String) As Long Declare Function cfdi_nomina_horas_extra Lib "_libfacturista.dll" Alias "__cfdi_nomina_horas_extra@24" (ByVal h As Long, ByVal Dias As String, ByVal TipoHoras As String, ByVal HorasExtra As String, ByVal ImportePagado As String, ByVal atributosExtra As String) As Long Declare Function set_gc Lib "_libfacturista.dll" Alias "__set_gc@4" (ByVal enable As Long) As Long ' Complemento iedu (Instituciones Educativas) Declare Function cfdi_iedu Lib "_libfacturista.dll" Alias "__cfdi_iedu@32" (ByVal h As Long, ByVal version As String, ByVal nombreAlumno As String, ByVal CURP As String, ByVal nivelEducativo As String, ByVal autRVOE As String, ByVal rfcPago As String, ByVal atributosExtra As String) As Long ' Funcion para fijar la administracion de memoria de las cadenas devueltas ' En VB es IMPORTANTE llamar esta funcion con "bstr" antes de usar las demas funciones de la dll, ej. ' rsmm = set_rsmm("bstr") ' Basta con llamarla una vez, En el ejemplo la llamamos en Form_Initialize() (inicializacion del formulario) Declare Function set_rsmm Lib "_libfacturista.dll" Alias "__set_rsmm@4" (Byval rsmm As String) As Long ' Esta funcion timbra el XML de ejemplo Function timbrar() as Boolean xml1="cfdi_ejemplo.xml" xml2="cfdi_timbrado.xml" h = cfdi_crear() if cfdi_timbrar(h,xml1,xml2,1,"RFC=AAA010101AAA;TransaccionID=456;Servidor=pruebas.ecodex.com.mx;Puerto=2044;Sellar=1")=0 then MsgBox(cfdi_error(0)) timbrar=False else timbrar=True h=cfdi_xml_cargar(h,xml2) if h<>0 then MsgBox( xml1 & " ha sido timbrado (" & xml2 &"), folio fiscal " & cfdi_xml_atributo(h,"cfdi:Comprobante/cfdi:Complemento/tfd:TimbreFiscalDigital","UUID")) else MsgBox (xml1 & " ha sido timbrado (" & xml2 & ") pero no se pudo cargar el archivo destino $xml2. " & cfdi_error(h)) end if end if cfdi_destruir(h) end Function ' Esta funcion construye el XML, lo sella y timbra ' Necesita que en el directorio esten aaa010101aaa__csd_01.key y aaa010101aaa__csd_01.cer ' El archivo timbrado será cfdi_timbrado_vb.xml Function sellar() as Boolean Dim h, he, hr, hc, hi, res as Integer Dim rutaLlavePrivada, contrasena, rutaCertificado, rutaDestino, xmlTimbrado, version, estadoCuenta as String sellar = False rutaLlavePrivada="./aaa010101aaa__csd_01.key" contrasena="12345678a" rutaCertificado="./aaa010101aaa__csd_01.cer" rutaDestino="./cfdi_sellado.xml" xmlTimbrado="./cfdi_timbrado_vb.xml" ' En versiones >= 1.01.05 se sugiere usar el siguiente par de funciones en vez de solo cfdi_comprobante() h = cfdi_crear() h = cfdi_comprobante_ex(h,"3.2", "A", "1234", "2013-09-06T18:43:11", "Pago en una sola exhibicion", "6172.50", "12.34", "USD", "7124.75", "Efectivo", "ingreso", "Campeche, Campeche", "3849", "venta a credito", "10.50", "descuento por pronto pago", "") ' Los caracteres están en UTF8, pero si los vamos a mostrar al usuario en controles de Windows, ' y nuestro Windows no soporta el UTF8 ' debemos decirle a libfacturista que convierta las cadenas a ACP ( ANSI Code Page) ' antes de devolverlas ' En la version 1.01.04 ya no es necesario llamarla, Ansi es predeterminado en Windows ' Preferible llamar a set_client_charset() en caso necesario ' res = xml_caller_charset(h,"acp") he=cfdi_emisor(h,"AAA010101AAA","facturista.com") if he = 0 Then MsgBox ( cfdi_error(h) ) return End if res = 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 res = cfdi_emisor_expedido_en(he,"39", "8", "Depto. 25", "Col. Jalisco", "San Nicolas de los Garza", "Monterrey", "Nuevo Leon", "Mexico", "74000", "Cerca de Telmex") res = cfdi_emisor_regimen(he,"Regimen 1") res = cfdi_emisor_regimen(he,"Regimen 2") ' el RFC de los clientes no debe contener guiones o espacios hr=cfdi_receptor(h,"X&XX010101AAA","nombre_tu_cliente") ' los clientes deben tener desglosada su direccion para poder llenar los campos del receptor res = 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=cfdi_concepto(h,"10", "PZA", "1", "Memoria USB", "123.45", "1234.50") res = cfdi_concepto_informacionaduanera(hc,"12345", "2011-01-01","Aduana nogales") hc=cfdi_concepto(h,"10", "PZA", "2", "Memoria USB", "123.45", "1234.50") res = cfdi_concepto_cuentapredial(hc,"3836463729385495") hc=cfdi_concepto(h,"10", "PZA", "3", "Memoria USB", "123.45", "1234.50") res = cfdi_concepto_parte(h,"10", "PZA", "3", "Parte 1", "123.45", "1234.50") res = cfdi_concepto_parte(h,"10", "PZA", "3", "Parte 2", "123.45", "1234.50") hc=cfdi_concepto(h,"10", "PZA", "4", "Memoria USB", "123.45", "1234.50") hc=cfdi_concepto(h,"10", "PZA", "5", "Memoria USB", "123.45", "1234.50") ' Probamos el complemento iedu hc=cfdi_concepto(h,"1", "NA", "6", "Pago de educacion, mes de octubre", "123.45", "1234.50") hc=cfdi_iedu( h, "1.0" , "Nombre Del Alumno" , "MEVA780922HCCDZR00", "Bachillerato o su equivalente", "04DPRO452V", "MEVA7809229CA" , "") hi=cfdi_impuestos(h,"35.35","987.60") res = cfdi_impuestos_retencion(hi,"ISR","12.12") res = cfdi_impuestos_retencion(hi,"IVA","23.23") res = cfdi_impuestos_traslado(hi,"IVA", "987.60", "16.00") res = cfdi_impuestos_traslado(hi,"IEPS", "0.00", "0.00") MsgBox ("Cadena original:" & 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 cfdi_sellar_pkcs8(h, rutaLlavePrivada, contrasena, rutaCertificado, rutaDestino,1) <> 0 Then ' poniendo el manejador en el primer parametro y la cadena vacia en el segundo, se timbra lo que hay en memoria if cfdi_timbrar(h, "", xmlTimbrado, 1, "RFC=AAA010101AAA;TransaccionID=456;Servidor=pruebas.ecodex.com.mx;Puerto=2044;Sellar=1" ) <> 0 Then sellar = True MsgBox( xmlTimbrado & " es el nuevo CFDI sellado y timbrado" ) estadoCuenta = cfdi_estado_cuenta(h, 1, "RFC=AAA010101AAA;TransaccionID=456;Servidor=pruebas.ecodex.com.mx;Puerto=2044") MsgBox(estadoCuenta) else MsgBox("Error al timbrar: " & cfdi_error(h) ) End if else MsgBox("Error al sellar: " & cfdi_error(h) ) End if cfdi_destruir(h) end Function