' 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