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