* 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