* Ejemplo de uso de libfacturista.dll en Visual FoxPro (vfp)
* Ariel Medina - 2013 - facturista.com

public gcnombrePrograma
gcnombrePrograma="facturista.com::timbrado"

local lcxml

set proc to libfacturista additive

init_libfacturista()

lcxml=getfile('xml')
if not empty(lcxml)
	timbrar(lcxml,'cfdi_timbrado.xml',.T.,.T.)
endif

clear dlls

* Funcion para realizar el timbrado, parametros:
* lcxml - archivoFuente
* lcxmltim - archivoDestino
* llpruebas - .T. si queremos servidor de pruebas
* llsoloTimbrado - .T. si queremos servicio de Solo Timbrado
function timbrar(lcxml, lcxmltim, llpruebas, llsoloTimbrado)
local h, lcTimbre, lcparams, lcrfc

	* Los nombres de archivo no deberian estar vacios
	if len(lcxml)<1 or len(lcxmltim)<1
		messagebox("Nombre de archivo fuente o destino no es valido",0,gcnombrePrograma)
		return .F.
	endif


	* Solo se carga si la estructura XML es correcta
	h=cfdi_xml_cargar(0,lcxml)
	if h>0
		* Aprovechamos para verificar si tiene timbre
		lcTimbre=cfdi_xml_atributo(h,"cfdi:Comprobante/cfdi:Complemento/tfd:TimbreFiscalDigital","UUID")
		if len(lcTimbre)>0
			messagebox("El archivo ya tiene timbre: "+lcTimbre,0,gcnombrePrograma)
			return .F.
		endif

		* Obtenemos el RFC del emisor
		lcrfc=cfdi_xml_atributo(h,"cfdi:Comprobante/cfdi:Emisor","rfc")
		if len(lcrfc)<1
			messagebox("No se pudo determinar el RFC",0,gcnombrePrograma)
			return .F.
		endif
		
		* Parametro TransaccionID para el PAC
		lcparams="TransaccionID=123456789"
		
		* Si se trata de pruebas, ponemos el servidor y puerto adecuado en los parametros
		if llpruebas
			lcparams=lcparams+";RFC=AAA010101AAA;Servidor=pruebas.ecodex.com.mx;Puerto=2044"
		else
			lcparams=lcparams+";RFC="+lcrfc
		endif

		* Si no quiere solo timbrado, entonces indicamos al PAC que (re)selle
		if !llsolotimbrado
			lcparams=lcparams+";Sellar=1"
		endif
		
		* Intentamos timbrar
		if cfdi_timbrar(h,lcxml,lcxmltim,1,lcparams)>0
			*msnpopup("La factura ha sido timbrada")
			h=cfdi_xml_cargar(h,lcxmltim)
			if h>0
				lcuuid=cfdi_xml_atributo(h,"cfdi:Comprobante/cfdi:Complemento/tfd:TimbreFiscalDigital","UUID")
				messagebox("Folio fiscal : "+lcuuid+"; archivo: "+lcxmltim,0,gcnombrePrograma)
				return .T.
			else
				messagebox("La factura fue timbrada pero no se pudo cargar; archivo "+lcxmltim,0,gcnombrePrograma)
			endif
		else
				messagebox("Ha fallado el timbrado, "+cfdi_error(h),0,gcnombrePrograma)
		endif
	endif

	return .F.

endfunc
* facturista.com - Archivo de inclusion para FoxPro

#define hcfdi INTEGER
#define scfdi STRING
#define cfdires INTEGER
#define hconcepto INTEGER
#define himpuesto INTEGER
#define hnode INTEGER


function init_libfacturista()

declare;
string libfacturista_version in libfacturista

declare;
hcfdi cfdi_comprobante in libfacturista scfdi version, scfdi serie, scfdi folio, scfdi fecha,;
scfdi formaDePago, scfdi subTotal, scfdi TipoCambio, scfdi Moneda, scfdi total,;
scfdi metodoDePago, scfdi tipoDeComprobante, scfdi LugarExpedicion, scfdi NumCtaPago,;
scfdi FolioFiscalOrig, scfdi SerieFolioFiscalOrig, scfdi FechaFolioFiscalOrig, scfdi MontoFolioFiscalOrig

declare;
hcfdi cfdi_emisor in libfacturista hcfdi pcfdi, scfdi rfc, scfdi nombre

declare;
cfdires cfdi_emisor_regimen in libfacturista hcfdi pcfdi, scfdi Regimen

declare;
cfdires cfdi_emisor_domicilio in libfacturista hcfdi pcfdi, scfdi calle, scfdi noExterior, scfdi noInterior,;
scfdi colonia, scfdi localidad, scfdi municipio, scfdi estado, scfdi pais, scfdi codigoPostal, scfdi referencia

declare;
cfdires cfdi_emisor_expedido_en in libfacturista hcfdi pcfdi, scfdi calle, scfdi noExterior, scfdi noInterior,;
scfdi colonia, scfdi localidad, scfdi municipio, scfdi estado, scfdi pais, scfdi codigoPostal, scfdi referencia

declare;
hcfdi cfdi_receptor in libfacturista hcfdi pcfdi, scfdi rfc, scfdi nombre

declare;
cfdires cfdi_receptor_domicilio in libfacturista hcfdi pcfdi, scfdi calle, scfdi noExterior, scfdi noInterior,;
scfdi colonia, scfdi localidad, scfdi municipio, scfdi estado, scfdi pais, scfdi codigoPostal, scfdi referencia

declare;
himpuesto cfdi_impuestos in libfacturista hcfdi pcfdi, scfdi totalImpuestosRetenidos, scfdi totalImpuestosTrasladados

declare;
cfdires cfdi_impuestos_retencion in libfacturista hcfdi pcfdi, scfdi impuesto, scfdi importe

declare;
cfdires cfdi_impuestos_traslado in libfacturista hcfdi pcfdi, scfdi impuesto, scfdi importe, scfdi tasa

declare;
hconcepto cfdi_concepto in libfacturista hcfdi pcfdi, scfdi cantidad, scfdi unidad, scfdi noIdentificacion,;
scfdi descripcion, scfdi valorUnitario, scfdi importe

declare;
cfdires cfdi_concepto_informacionaduanera in libfacturista hconcepto hc, scfdi numero, scfdi fecha, scfdi aduana

declare;
cfdires cfdi_concepto_cuentapredial in libfacturista hconcepto hc, scfdi numero

declare;
cfdires cfdi_concepto_parte in libfacturista hconcepto hc, scfdi cantidad, scfdi unidad, scfdi noIdentificacion,;
scfdi descripcion, scfdi valorUnitario, scfdi importe

declare;
cfdires cfdi_concepto_ComplementoConcepto in libfacturista hconcepto hc


declare;
hcfdi cfdi_xml_cargar in libfacturista hcfdi h, scfdi rutaFuente

declare;
integer cfdi_xml_guardar in libfacturista hcfdi h, scfdi rutaDestino, integer decorar

declare;
integer cfdi_xml_validar in libfacturista hcfdi h, scfdi archivoXML, scfdi archivoXSD, scfdi parametros

declare;
integer cfdi_sellar_pkcs8 in libfacturista hcfdi h, scfdi rutaLlavePrivada, scfdi contrasena, scfdi rutaCertificado, scfdi rutaDestino, integer decorar

declare;
integer cfdi_sellar_pem in libfacturista hcfdi h, scfdi rutaLlavePrivada, scfdi contrasena, scfdi rutaCertificado, scfdi rutaDestino, integer decorar

declare;
integer cfdi_sellar in libfacturista hcfdi h, scfdi rutaLlavePrivada, scfdi rutaCertificado, scfdi rutaDestino, integer decorar

declare;
integer cfdi_timbrar in libfacturista hcfdi h, scfdi rutaFuente, scfdi rutaDestino, integer numeroPAC, scfdi parametros

declare;
integer cfdi_cancelar in libfacturista hcfdi h, integer numeroPAC, scfdi parametros

declare;
integer cfdi_recuperar in libfacturista hcfdi h, scfdi rutaDestino, integer numeroPAC, scfdi parametros

declare;
string cfdi_estado_cuenta in libfacturista hcfdi h, integer numeroPAC, scfdi parametros

declare;
STRING cfdi_error in libfacturista hcfdi h

declare;
STRING cfdi_resultado in libfacturista hcfdi h


declare;
STRING cfdi_xml_atributo in libfacturista hcfdi h, scfdi ruta, scfdi nombre

declare;
integer cfdi_xml_atributo_agregar in libfacturista hcfdi h, scfdi ruta, scfdi nombre, scfdi valor

declare;
integer cfdi_xml_atributo_borrar in libfacturista hcfdi h, scfdi ruta, scfdi nombre

declare;
STRING cfdi_cadena_original in libfacturista hcfdi h

declare;
STRING cfdi_cadena_original_sat in libfacturista hcfdi h

declare;
STRING cfdi_uuid in libfacturista hcfdi h

declare;
STRING cfdi_fecha_timbrado in libfacturista hcfdi h

declare;
STRING cfdi_numero_certificado_sat in libfacturista hcfdi h

declare;
STRING cfdi_sello_cfd in libfacturista hcfdi h

declare;
STRING cfdi_sello_sat in libfacturista hcfdi h

declare;
STRING cfdi_sello in libfacturista hcfdi h

declare;
STRING cfdi_fecha in libfacturista hcfdi h

declare;
STRING cfdi_numero_certificado in libfacturista hcfdi h, scfdi rutaCertificado

*// Call with root node and "acp" for windows programs not handling utf8
declare;
integer xml_caller_charset in libfacturista hnode h, scfdi charset

*// Return the node handler for the path specified, if h==0 it will return the root node
declare;
hnode xml_node in libfacturista hnode h, scfdi path

*// Return the number of children nodes
declare;
integer xml_node_children_number in libfacturista hnode h

*// Return a node handler for the index-th child, it is 1-based
declare;
hnode xml_node_by_index in libfacturista hnode h, integer index

*// Return the node name
declare;
string xml_node_name in libfacturista hnode h

*// Return a node handler for the child with the asked name
declare;
hnode xml_node_by_name in libfacturista hnode h, scfdi name

*// Return the value of the asked attribute, empty if it does not exist
declare;
string xml_node_attribute in libfacturista hnode h, scfdi name

declare;
integer cfdi_timbrar_lote in libfacturista hcfdi h, scfdi rutaFuente, scfdi rutaDestino, scfdi parametrosLote, integer numeroPAC, scfdi parametrosPAC

declare;
integer xml_insert in libfacturista integer h, string path, string XMLstring, integer indexFather, integer indexChildren

declare;
string xml_serialize in libfacturista integer h, integer decorate

declare;
integer cfdi_validar in libfacturista hcfdi h, scfdi archivoXML, scfdi parametros

return .T.

endfunc

* Extendemos las funciones, usando el acceso a los nodos XML

function cfdi_tfd_version(hcfdi)
local lcruta
lcruta="cfdi:Comprobante/cfdi:Complemento/tfd:TimbreFiscalDigital"

return cfdi_xml_atributo(hcfdi,lcruta,"version")
endfunc

function cfdi_tfd_uuid(hcfdi)
local lcruta
lcruta="cfdi:Comprobante/cfdi:Complemento/tfd:TimbreFiscalDigital"

return cfdi_xml_atributo(hcfdi,lcruta,"UUID")
endfunc

function cfdi_tfd_fecha(hcfdi)
local lcruta
lcruta="cfdi:Comprobante/cfdi:Complemento/tfd:TimbreFiscalDigital"

return cfdi_xml_atributo(hcfdi,lcruta,"FechaTimbrado")
endfunc

function cfdi_tfd_sellocfd(hcfdi)
local lcruta
lcruta="cfdi:Comprobante/cfdi:Complemento/tfd:TimbreFiscalDigital"

return cfdi_xml_atributo(hcfdi,lcruta,"selloCFD")
endfunc

function cfdi_tfd_nocertificadosat(hcfdi)
local lcruta
lcruta="cfdi:Comprobante/cfdi:Complemento/tfd:TimbreFiscalDigital"

return cfdi_xml_atributo(hcfdi,lcruta,"noCertificadoSAT")
endfunc