Hace tiempo estoy investigando este tema y a principios de año, desarrollé mi primera aplicación que emite facturas electrónicas en HMG.
Lo hice con un componente comercial, que si bien me dio los resultados esperados, a medida que me fui metiendo más en el tema, me di cuenta que tiene algunas limitaciones.
Empecé a investigar alternativas y me encontré con el proyecto AFIP SDK. Una librería escrita en PHP y con licencia MIT.
En principio, al estar escrita en PHP, pensé que no era útil para mis aplicaciones desarrolladas en HMG, peeeeroooo... siempre hay algo más, cuando uno lo piensa bien
Entonces instalé XAMPP, corrí el demo localmente y funcionó.
El paso siguiente, sería correr el script que genera la factura desde HMG usando HBTIP.
Antes de intentar hacerlo, la idea dejó de gustarme, por ser demasiado compleja, entonces, recordé, que PHP puede correr scripts directamente desde la línea de comando de Windows.
Bajé la versión portable de PHP (la que viene en un zip) y la reduje solo a los componentes necesarios para correr mi script, configuré las extensiones requeridas (openssl y soap) e hice la prueba:
Code: Select all
php myscript.php
Para usarlo desde HMG, puede hacerse con EXECUTE... WAIT
Para obtener los resultados del comando (CAE, Nro. de Factura y vencimiento) deberíamos redireccionar la salida del comando a un archivo:
Code: Select all
php myscript.php > respuesta.txt
Otra alternativa sería generar el script desde nuestra aplicación, conteniendo los datos requeridos para cada factura.
El archivo adjunto, contiene todo lo necesario (solo 3.5 MB).
Para probarlo deben reemplazar los archivos src/Afip_res/cert y src/Afip_res/key por su clave y certificado de homologación (para probar).
En los demos, el CUIT emisor, debe reemplazarse por el que corresponda.
Existen infinidad de tutoriales que explican como obtener la clave y el certificado de homologación.
Publico esto como retribución, a todos los que me han ayudado y orientado aquí con este tema.
Muchas Gracias.
Espero que les sea de utilidad.
https://github.com/afipsdk/afip.php
https://www.php.net/
EDIT: Descubrí que php.exe no solo puede interpretar scripts, sino que incluye un servidor web, que podríamos invocar (por ejemplo) de esta forma:
Code: Select all
php -S 127.0.0.1:60123
Por lo tanto, ahora, desde nuestro navegador, podríamos ejecutar un script (en este caso, uno que genera una factura A) de la siguiente forma:
Code: Select all
http://127.0.0.1:60123/factura_a.php
Desde nuestro programa en HMG, podríamos hacer lo siguiente:
Code: Select all
oHttp := TIPClientHTTP():new( "http://127.0.0.1:60123/factura_a.php" )
IF ! oHttp:open()
msgstop( "error:" + oHttp:lastErrorMessage())
RETURN
ENDIF
cRes := oHttp:readAll()
oHttp:close()
msginfo( cRes )
Las dos soluciones (ejecutar PHP como programa externo o esta) son muy rápidas (no se percibe ninguna diferencia en la velocidad de ejecución) pero, seguramente, esta es más elegante