diff --git a/afip_ingresar_datos_emision.lua b/afip_ingresar_datos_emision.lua
index e444f30..05976cc 100644
--- a/afip_ingresar_datos_emision.lua
+++ b/afip_ingresar_datos_emision.lua
@@ -1,4 +1,11 @@
--[[
+Se ignresan los siguientes datos de la operacion en AFIP:
+- Bienes o Servicios o "Bienes y Servicios"
+- Fecha del comprobante
+- Fecha de servicio desde y hasta (en caso de corresponder)
+- Vencimiento de pago
+- Referencia
+
{
"uid": "53935f27-5cf0-4281-9a29-a68f100ee981",
"execution_status": "Borrador",
@@ -28,6 +35,10 @@ local function logErrorAndExit(message)
error(message)
end
+local function is_recibo(tipo)
+ return tipo == "recibo"
+end
+
local function is_servicios(tipo_concepto)
if tipo_concepto == "servicios" or tipo_concepto == "servicio" then
return true
@@ -108,6 +119,12 @@ local function main()
logErrorAndExit("afip_ingresar_datos_emision: tipo_concepto value not recognized: " .. tostring(tipoConceptoTexto))
end
+ local tipoComprobanteRaw = payload["tipo_comprobante"]
+
+ if not tipoComprobanteRaw or tipoComprobanteRaw == "" then
+ logErrorAndExit("afip_ingresar_datos_emision: tipo_comprobante is missing in payload")
+ end
+
--------------------------------------------------------------------
-- 1) Fecha de comprobante y concepto (ids: fc, idconcepto)
--------------------------------------------------------------------
@@ -119,9 +136,14 @@ local function main()
logErrorAndExit("afip_ingresar_datos_emision: setTextFieldById for fechaComprobante failed: " .. err)
end
- err = setTextFieldById(conceptoId, tostring(conceptoValue))
- if err then
- logErrorAndExit("afip_ingresar_datos_emision: setTextFieldById for concepto failed: " .. err)
+ -- TODO: Un recibo no tiene un select para tipo de concepto!! a mi me sale directamente como servicios
+ if is_recibo(tipoComprobanteRaw) then
+ log("afip_ingresar_datos_emision: tipo_comprobante is 'recibo', skipping setting concepto")
+ else
+ err = setTextFieldById(conceptoId, tostring(conceptoValue))
+ if err then
+ logErrorAndExit("afip_ingresar_datos_emision: setTextFieldById for concepto failed: " .. err)
+ end
end
--------------------------------------------------------------------
diff --git a/afip_ingresar_datos_operacion.lua b/afip_ingresar_datos_operacion.lua
index f065f19..6240b69 100644
--- a/afip_ingresar_datos_operacion.lua
+++ b/afip_ingresar_datos_operacion.lua
@@ -1,4 +1,6 @@
--[[
+Ingresa los datos de la operacion en la pagina de AFIP, es la parte de la tabla donde se agregan los items, monto unitario y descripcion.
+Recibe un JSON con los datos de la operacion, por ejemplo:
{
"uid": "53935f27-5cf0-4281-9a29-a68f100ee981",
"execution_status": "Borrador",
@@ -18,70 +20,123 @@
}
--]]
-
-log("Inicio afip_ingresar_datos_operacion from LUA!!")
-local err
-local json = require("json")
--- Parse the JSON string
-local obj, err = json.decode(json_payload)
-if err then
- message = "Error parsing JSON: " .. err
+----------------------------------------------------------------------
+-- Helpers
+----------------------------------------------------------------------
+local function logErrorAndExit(message)
log(message)
error(message)
end
-local error_on_page
+local function is_factura(tipo_comprobante)
+ return string.match(tipo_comprobante, "factura")
+end
-descripcion = obj["descripcion"]
-monto_unitario = obj["monto_unitario"]
-tipo_comprobante = obj["tipo_comprobante"]
+local function is_recibo(tipo_comprobante)
+ return string.match(tipo_comprobante, "recibo")
+end
---[[
-if string.match(tipo_comprobante, "factura") then
- log("Setting tipo_comprobante to factura")
- tipo_comprobante = "factura"
-else
- log("Setting tipo_comprobante to ")
- tipo_comprobante = "recibo"
+local function input_recibo_data(descripcion, monto_unitario, tipo_comprobante)
+ --[[
+
+ --]]
+ log("afip_ingresar_datos_operacion.input_recibo_data Descripcion: " .. descripcion .. " Monto: " .. monto_unitario .. " Tipo: " .. tipo_comprobante)
+ descripcion_selector = "#detalle_descripcion"
+ err = setTextFieldByQuerySelector(descripcion_selector, descripcion)
+ if err then
+ message = "Error setting detalle_descripcion: " .. err
+ logErrorAndExit(message)
+ end
+
+ --[[
+
+ --]]
+ precio_selector = "#detalle_precio"
+ err = setTextFieldByQuerySelector(precio_selector, monto_unitario)
+ if err then
+ message = "Error setting detalle_precio: " .. err
+ logErrorAndExit(message)
+ end
end
---]]
--- TODO: handle factura AND recibo!
-log("Descripcion: " .. descripcion .. " Monto: " .. monto_unitario .. " Tipo: " .. tipo_comprobante)
+local function input_factura_data(descripcion, monto_unitario, tipo_comprobante)
+ log("afip_ingresar_datos_operacion.input_factura_data Descripcion: " .. descripcion .. " Monto: " .. monto_unitario .. " Tipo: " .. tipo_comprobante)
-descripcion_selector = "#detalle_descripcion1"
-precio_selector = "#detalle_precio1"
+ -- TODO: Properly handle recibo which has different fields!
+ -- Descripcion :
+ -- Monto:
-err = waitVisibleByQuerySelector(descripcion_selector)
-if err then
- message = "Error waiting for detalle_descripcion1: " .. err
- log(message)
- error(message)
-end
+ descripcion_selector = "#detalle_descripcion1"
+ precio_selector = "#detalle_precio1"
-err = setTextFieldByQuerySelector(descripcion_selector, descripcion)
-if err then
- message = "Error setting detalle_descripcion1: " .. err
- log(message)
- error(message)
-end
+ err = waitVisibleByQuerySelector(descripcion_selector)
+ if err then
+ message = "Error waiting for detalle_descripcion1: " .. err
+ log(message)
+ error(message)
+ end
-waitSecs(1)
+ err = setTextFieldByQuerySelector(descripcion_selector, descripcion)
+ if err then
+ message = "Error setting detalle_descripcion1: " .. err
+ log(message)
+ error(message)
+ end
-err = waitVisibleByQuerySelector(precio_selector)
-if err then
- message = "Error waiting for detalle_precio1: " .. err
- log(message)
- error(message)
-end
+ waitSecs(1)
-err = setTextFieldByQuerySelector(precio_selector, monto_unitario)
-if err then
- message = "Error setting detalle_precio1: " .. err
- log(message)
- error(message)
+ err = waitVisibleByQuerySelector(precio_selector)
+ if err then
+ message = "Error waiting for detalle_precio1: " .. err
+ log(message)
+ error(message)
+ end
+
+ err = setTextFieldByQuerySelector(precio_selector, monto_unitario)
+ if err then
+ message = "Error setting detalle_precio1: " .. err
+ log(message)
+ error(message)
+ end
+
+ waitSecs(1)
end
-waitSecs(1)
-log("Finishing afip_ingresar_datos_operacion from LUA!!")
+----------------------------------------------------------------------
+-- Main logic
+----------------------------------------------------------------------
+local function main()
+ log("Inicio afip_ingresar_datos_operacion from LUA!!")
+ local err
+ local json = require("json")
+ -- Parse the JSON string
+ local obj, err = json.decode(json_payload)
+ if err then
+ message = "Error parsing JSON: " .. err
+ log(message)
+ error(message)
+ end
+
+ local error_on_page
+
+ descripcion = obj["descripcion"]
+ monto_unitario = obj["monto_unitario"]
+ tipo_comprobante = obj["tipo_comprobante"]
+
+ if is_factura(tipo_comprobante) then
+ input_factura_data(descripcion, monto_unitario, tipo_comprobante)
+ elseif is_recibo(tipo_comprobante) then
+ input_recibo_data(descripcion, monto_unitario, tipo_comprobante)
+ else
+ message = "Tipo de comprobante no soportado en afip_ingresar_datos_operacion: " .. tostring(tipo_comprobante)
+ logErrorAndExit(message)
+ end
+ log("Finishing afip_ingresar_datos_operacion")
+end
+
+local ok, err = pcall(main)
+if not ok then
+ -- Let Go see this as a Lua error so it can fall back to legacy datosDeEmision
+ logErrorAndExit("afip_ingresar_datos_operacion failed: " .. tostring(err))
+end
diff --git a/afip_ingresar_datos_receptor.lua b/afip_ingresar_datos_receptor.lua
index 8900c28..7238dbc 100644
--- a/afip_ingresar_datos_receptor.lua
+++ b/afip_ingresar_datos_receptor.lua
@@ -1,4 +1,8 @@
--[[
+Se ingresa la informacion del receptor:
+- Tipo IVA del receptor (responsable inscripto, consumidor final, monotributo, etc)
+- CUIT del receptor (si corresponde)
+- Forma de pago (contado, tarjeta de credito, cuenta corriente, etc)
{
"uid": "53935f27-5cf0-4281-9a29-a68f100ee981",
"execution_status": "Borrador",
diff --git a/afip_ingresar_generacion_comprobantes.lua b/afip_ingresar_generacion_comprobantes.lua
index c6bfa81..ef23bdb 100644
--- a/afip_ingresar_generacion_comprobantes.lua
+++ b/afip_ingresar_generacion_comprobantes.lua
@@ -1,3 +1,24 @@
+--[[
+Desde el menu principal de AFIP se ingresa a la funcionalidad de Generacion de Comprobantes.
+
+{
+ "uid": "53935f27-5cf0-4281-9a29-a68f100ee981",
+ "execution_status": "Borrador",
+ "tipo_comprobante": "factura c",
+ "fecha_comprobante": "13/11/2025",
+ "tipo_concepto": "servicios",
+ "servicio_fecha_desde": "01/10/2025",
+ "servicio_fecha_hasta": "01/10/2025",
+ "servicio_fecha_vencimiento_pago": "13/11/2025",
+ "referencia": "",
+ "tipo_iva_receptor": "consumidor final",
+ "cuit_receptor": "",
+ "forma_pago": "contado",
+ "monto_unitario": "10000",
+ "cantidad": "1",
+ "descripcion": "Clase de apoyo"
+}
+--]]
local json = require("json")
----------------------------------------------------------------------
diff --git a/afip_ingresar_punto_venta_y_comprobante.lua b/afip_ingresar_punto_venta_y_comprobante.lua
index 10dbbd3..408881d 100644
--- a/afip_ingresar_punto_venta_y_comprobante.lua
+++ b/afip_ingresar_punto_venta_y_comprobante.lua
@@ -1,6 +1,9 @@
--- TODO GENERAL: El json del comprobante no contiene el punto de venta, esto es algo que es atributo del cliente!
-
+-- TODO GENERAL: Completar la generacion de factura A y B (hoy solo esta C de monotributo)
--[[
+
+Se ingresa:
+- Punto de venta (dropdown con los elementos)
+- El tipo de comprobante a generar (factura A, B, C, recibo, nota de debito, nota de credito, etc)
{
"uid": "53935f27-5cf0-4281-9a29-a68f100ee981",
"execution_status": "Borrador",
@@ -117,7 +120,7 @@ local function mapTipoComprobante(tipo)
return "7" -- TODO: Check real value
end
- return tipo or ""
+ return ""
end
----------------------------------------------------------------------
@@ -192,6 +195,18 @@ local function main()
--------------------------------------------------------------------
local tipoComprobanteId = "universocomprobante"
+ --[[
+
+ ]]--
+ -- ERROR: 2026/01/19 23:57:13 Error running script: :45: afip_ingresar_punto_venta_y_comprobante failed: :45: afip_ingresar_punto_venta_y_comprobante: setTextFieldById for tipo_comprobante failed: could not set value on node 65
err = setTextFieldById(tipoComprobanteId, tostring(tipoComprobanteValor))
if err then
logErrorAndExit(