Visual FoxPro y FacturaSend

Publicado el 20 de mayo de 2025

Marcos Jara

¿Cómo integrar FacturaSend con Visual FoxPro: Guía práctica para desarrolladores exigentes?

¿Es posible integrar un sistema moderno con una tecnología clásica?

Aunque Visual FoxPro es una tecnología veterana, todavía es muy utilizada por muchas empresas en Paraguay y Latinoamérica, especialmente en sistemas internos estables y confiables. Pero con la llegada obligatoria de la Facturación Electrónica, surge la gran duda:

¿Se puede integrar una API moderna como FacturaSend con Visual FoxPro?

La buena noticia es: sí, se puede. Y en este artículo te mostramos cómo hacerlo de manera práctica, rápida y con ejemplos reales de código.

Entendiendo el desafío: Facturación Electrónica en VFP

Visual FoxPro no fue diseñado para conectarse directamente a servicios web modernos como las APIs REST. Sin embargo, con algunas herramientas intermedias y lógica bien estructurada, se puede lograr una comunicación fluida con los servicios de FacturaSend.

Los puntos clave a considerar:

  • Enviar documentos en formato JSON desde VFP.
  • Hacer peticiones HTTP seguras (POST, GET).
  • Procesar las respuestas para obtener el estado del documento.
  • Controlar reintentos y validaciones desde código propio.

Herramientas necesarias para la integración

Para conectar tu sistema VFP con FacturaSend, podés apoyarte en herramientas externas y librerías como:

  • WinHttp.WinHttpRequest.5.1 para realizar peticiones HTTP.
  • MSXML2.ServerXMLHTTP en versiones más antiguas.
  • Scripts intermedios en Python o PowerShell (si querés desacoplar la lógica).
  • Un manejador de errores que permita interpretar el estado asincrónico de SIFEN.

Estructura básica del código

Este es un ejemplo simplificado del código que encontrarás en nuestro repositorio GitHub:

SET PROCEDURE TO .\fsClass\de, .\fsClass\cliente, .\fsClass\usuario, .\fsClass\factura, .\fsClass\item, .\fsClass\condicion, .\fsClass\entrega, .\nfJson\nfJsonCreate, .\nfJson\nfJsonRead

data = CREATEOBJECT("de")
data.tipo_documento = 1

data.establecimiento = 2
data.punto = 1
data.numero = 1007094

data.fecha = '2023-01-23T10:00:00'

data.tipo_impuesto = 1

** Cliente
data.cliente = CREATEOBJECT("cliente")
data.cliente.contribuyente = .t.
data.cliente.tipo_contribuyente = 1
data.cliente.tipo_operacion = 1
data.cliente.ruc = '80069563-1'
data.cliente.razon_social = 'TIPS S.A. - TECNOLOGIA Y SERVICIOS'
data.cliente.pais = 'PRI'
data.cliente.codigo = 'CLI001'

** Usuario
data.usuario = CREATEOBJECT("usuario")
data.usuario.documento_tipo = 1
data.usuario.documento_numero = '2005001'
data.usuario.nombre = 'MARCOS JARA'
data.usuario.cargo = 'Cajero'

**Factura
data.factura = CREATEOBJECT("factura")
data.factura.presencia = 1

** Items
DIMENSION data.items(2)

data.items(1) = CREATEOBJECT("item")
data.items(1).codigo = 1050
data.items(1).descripcion = 'Pilsen Litro '
data.items(1).observacion = 'no beberla caliente'
data.items(1).cantidad = 2
data.items(1).precio_unitario = 7500
data.items(1).iva_tipo = 1
data.items(1).iva_base = 100
data.items(1).iva = 10

data.items(2) = CREATEOBJECT("item")
data.items(2).codigo = 1060
data.items(2).descripcion = 'Dorada Premium'
data.items(2).observacion = 'Tomarla bien helada'
data.items(2).cantidad = 3
data.items(2).precio_unitario = 8754
data.items(2).iva_tipo = 1
data.items(2).iva_base = 100
data.items(2).iva = 10

** Condicion
data.condicion = CREATEOBJECT("condicion")
data.condicion.tipo = 1
DIMENSION data.condicion.entregas(1)
data.condicion.entregas(1) = CREATEOBJECT("entrega")
data.condicion.entregas(1).tipo = 1
data.condicion.entregas(1).monto = 1450000
data.condicion.entregas(1).moneda = 'PYG'


cData = nfJsonCreate(data, .t., .f.)

SET ALTERNATE TO json.txt ADDITIVE
SET ALTERNATE ON
? "[" + cData + "]"
SET ALTERNATE OFF

* Envio a FacturaSend
oHTTP = CREATEOBJECT('Msxml2.ServerXMLHTTP.6.0')
oHTTP.OPEN("POST","https://api.facturasend.com.py/empresa0/lote/create", .f.)
oHTTP.setRequestHeader("User-Agent", "FacturaSend from VFP 9")
oHTTP.setRequestHeader("Content-Type", "application/json;charset=utf-8")
           
lcBasicAuth = "Bearer " + "api_key_9FFC28EB-5376-4392-B757-86E372FBB398a"
oHTTP.setRequestHeader("Authorization", lcBasicAuth)

** Aqui radica la diferencia entre el Sincrono y el Asincrono.
oHTTP.SEND("[" + cData + "]")

** Para enviar varios, utilizar este formato
**oHTTP.SEND("[" + cData + ", " + cData1 +  ", " + cData2 + ", " + cDataN + "]")

? "Status Response: " + STR(oHTTP.Status)
cRespuesta = oHTTP.ResponseText
? cRespuesta

* Convertir respuesta de la API en formato JSON-STRING a OBJETO VFP
vfpJsonObject = nfJsonRead(cRespuesta, .f.)
? vfpJsonObject.success

IF ( ! vfpJsonObject.success)
	? vfpJsonObject.error
ENDIF  

Este bloque permite enviar un documento y obtener la respuesta de FacturaSend. Luego podés utilizar el CDC recibido para consultar el estado de aprobación en SIFEN (recordá que es asincrónico).

Accedé al ejemplo completo en GitHub

Hemos preparado un repositorio abierto con un ejemplo funcional, para que puedas probar la integración directamente desde tu entorno de Visual FoxPro.

📎 Repositorio GitHub oficial:
🔗 https://github.com/TIPS-SA/facturacionelectronicapy-vfp9-client-example

Incluye:

  • Código fuente VFP9.
  • Ejemplo de petición HTTP.
  • Consulta de estado de documentos.
  • Documentación paso a paso.

Otras soluciones para integración con VFP

El código presentado en la sección superior contiene ejemplos de invocación de llamadas a la API de FacturaSend desde VFP. Hay que tener en cuenta que el ejemplo en GitHub no es una solución completa, sino solamente una demostración. El interesado puede descargar el código de Git y completar las clases SCX con los campos faltantes, para integrarla con su sistema.

Pero si desea una solución más completa y profesional, que incluya las llamadas a la API desde VFP y además de eso los formularios donde se visualizan los documentos electrónicos y desde donde se puedan realizar operaciones de forma visual, FacturaSend recomienda utilizar la Solución de Ever, la cual se describe en el siguiente artículo.

Soporte y acompañamiento técnico personalizado

Sabemos que trabajar con tecnologías mixtas puede ser desafiante. Por eso, en FacturaSend ofrecemos acompañamiento técnico para desarrolladores, especialmente para integraciones en lenguajes como VFP.

¿Tenés dudas? Escribinos por WhatsApp y te ayudamos a iniciar con una cuenta gratuita.

Conclusión

Integrar FacturaSend con Visual FoxPro no sólo es posible, sino que puede ser el puente para modernizar tu sistema sin tener que reescribirlo desde cero. Con la documentación abierta y nuestra comunidad de soporte, podés cumplir con SIFEN y mantener la agilidad de tu desarrollo.

Facturá electrónicamente desde Visual FoxPro con confianza. Usá FacturaSend.

Solicita un presupuesto ahora mismo para facturar electronicamente en tu empresa.

Contactanos →