1 changed files with 183 additions and 0 deletions
@ -0,0 +1,183 @@ |
|||||
|
--[[ |
||||
|
{ |
||||
|
"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") |
||||
|
|
||||
|
---------------------------------------------------------------------- |
||||
|
-- Helpers |
||||
|
---------------------------------------------------------------------- |
||||
|
local function logErrorAndExit(message) |
||||
|
log(message) |
||||
|
error(message) |
||||
|
end |
||||
|
|
||||
|
local function is_servicios(tipo_concepto) |
||||
|
if tipo_concepto == "servicios" or tipo_concepto == "servicio" then |
||||
|
return true |
||||
|
end |
||||
|
return false |
||||
|
end |
||||
|
|
||||
|
local function is_productos_y_servicios(tipo_concepto) |
||||
|
if tipo_concepto == "productos y servicios" or tipo_concepto == "productos servicios" then |
||||
|
return true |
||||
|
end |
||||
|
return false |
||||
|
end |
||||
|
|
||||
|
local function is_productos(tipo_concepto) |
||||
|
if tipo_concepto == "productos" or tipo_concepto == "producto" then |
||||
|
return true |
||||
|
end |
||||
|
return false |
||||
|
end |
||||
|
|
||||
|
-- Map "tipo_concepto" (as text) to the numeric value expected by AFIP in |
||||
|
-- the "idconcepto" select. |
||||
|
-- Mirrors TipoConceptoFromString in Go (internal/robot/tipos.go). |
||||
|
local function mapTipoConcepto(tipo) |
||||
|
if is_productos(tipo) then |
||||
|
return "1" -- TipoConceptoProductos |
||||
|
end |
||||
|
if is_servicios(tipo) then |
||||
|
return "2" -- TipoConceptoServicios |
||||
|
end |
||||
|
if is_productos_y_servicios(tipo) then |
||||
|
return "3" -- TipoConceptoProductosYServicios |
||||
|
end |
||||
|
|
||||
|
return "" |
||||
|
end |
||||
|
|
||||
|
local function conceptoRequierePeriodoServicio(tipo) |
||||
|
if is_servicios(tipo) or is_productos_y_servicios(tipo) then |
||||
|
return true |
||||
|
end |
||||
|
|
||||
|
return false |
||||
|
end |
||||
|
|
||||
|
---------------------------------------------------------------------- |
||||
|
-- Main logic |
||||
|
---------------------------------------------------------------------- |
||||
|
|
||||
|
local function main() |
||||
|
log("afip_ingresar_datos_emision: starting") |
||||
|
|
||||
|
local payload, err = json.decode(json_payload) |
||||
|
log("afip_ingresar_datos_emision: decoded payload: " .. json.encode(payload)) |
||||
|
if err then |
||||
|
logErrorAndExit("afip_ingresar_datos_emision: error decoding payload: " .. err) |
||||
|
end |
||||
|
|
||||
|
-------------------------------------------------------------------- |
||||
|
-- Extract fields from payload |
||||
|
-------------------------------------------------------------------- |
||||
|
local fechaComprobante = payload["fecha_comprobante"] or "" |
||||
|
local tipoConceptoTexto = payload["tipo_concepto"] or "" |
||||
|
local servicioFechaDesde = payload["servicio_fecha_desde"] or "" |
||||
|
local servicioFechaHasta = payload["servicio_fecha_hasta"] or "" |
||||
|
local servicioFechaVencimiento= payload["servicio_fecha_vencimiento_pago"] or "" |
||||
|
local referencia = payload["referencia"] or "" |
||||
|
|
||||
|
if fechaComprobante == "" then |
||||
|
logErrorAndExit("afip_ingresar_datos_emision: fecha_comprobante is empty") |
||||
|
end |
||||
|
if tipoConceptoTexto == "" then |
||||
|
logErrorAndExit("afip_ingresar_datos_emision: tipo_concepto is empty") |
||||
|
end |
||||
|
|
||||
|
local conceptoValue = mapTipoConcepto(tipoConceptoTexto) |
||||
|
if conceptoValue == "" then |
||||
|
logErrorAndExit("afip_ingresar_datos_emision: tipo_concepto value not recognized: " .. tostring(tipoConceptoTexto)) |
||||
|
end |
||||
|
|
||||
|
-------------------------------------------------------------------- |
||||
|
-- 1) Fecha de comprobante y concepto (ids: fc, idconcepto) |
||||
|
-------------------------------------------------------------------- |
||||
|
local fechaComprobanteId = "fc" |
||||
|
local conceptoId = "idconcepto" |
||||
|
|
||||
|
err = setTextFieldById(fechaComprobanteId, tostring(fechaComprobante)) |
||||
|
if err then |
||||
|
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) |
||||
|
end |
||||
|
|
||||
|
-------------------------------------------------------------------- |
||||
|
-- 2) Periodo de servicio y vencimiento de pago (solo servicios o |
||||
|
-- productos y servicios) |
||||
|
-------------------------------------------------------------------- |
||||
|
if conceptoRequierePeriodoServicio(tipoConceptoTexto) then |
||||
|
log("afip_ingresar_datos_emision: setting service period and due date") |
||||
|
|
||||
|
if servicioFechaDesde == "" or servicioFechaHasta == "" or servicioFechaVencimiento == "" then |
||||
|
logErrorAndExit("afip_ingresar_datos_emision: service period dates are required when tipo_concepto is 'servicios' or 'productos y servicios'") |
||||
|
end |
||||
|
|
||||
|
local fechaDesdeId = "fsd" |
||||
|
local fechaHastaId = "fsh" |
||||
|
local fechaVencimientoPagoId = "vencimientopago" |
||||
|
|
||||
|
err = setTextFieldById(fechaDesdeId, tostring(servicioFechaDesde)) |
||||
|
if err then |
||||
|
logErrorAndExit("afip_ingresar_datos_emision: setTextFieldById for fechaDesde failed: " .. err) |
||||
|
end |
||||
|
|
||||
|
err = setTextFieldById(fechaHastaId, tostring(servicioFechaHasta)) |
||||
|
if err then |
||||
|
logErrorAndExit("afip_ingresar_datos_emision: setTextFieldById for fechaHasta failed: " .. err) |
||||
|
end |
||||
|
|
||||
|
err = setTextFieldById(fechaVencimientoPagoId, tostring(servicioFechaVencimiento)) |
||||
|
if err then |
||||
|
logErrorAndExit("afip_ingresar_datos_emision: setTextFieldById for fechaVencimientoPago failed: " .. err) |
||||
|
end |
||||
|
else |
||||
|
log("afip_ingresar_datos_emision: tipo_concepto does not require service period: " .. tostring(tipoConceptoTexto)) |
||||
|
end |
||||
|
|
||||
|
-------------------------------------------------------------------- |
||||
|
-- 3) Referencia (id: refComEmisor) |
||||
|
-------------------------------------------------------------------- |
||||
|
local referenciaId = "refComEmisor" |
||||
|
|
||||
|
-- Even if referencia is empty, setting the field should be harmless and |
||||
|
-- mirrors the Go behavior that always calls SetValue. |
||||
|
err = setTextFieldById(referenciaId, tostring(referencia)) |
||||
|
if err then |
||||
|
logErrorAndExit("afip_ingresar_datos_emision: setTextFieldById for referencia failed: " .. err) |
||||
|
end |
||||
|
|
||||
|
-------------------------------------------------------------------- |
||||
|
-- Done |
||||
|
-------------------------------------------------------------------- |
||||
|
log("afip_ingresar_datos_emision: completed successfully") |
||||
|
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_emision failed: " .. tostring(err)) |
||||
|
end |
||||
Loading…
Reference in new issue