You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
6.4 KiB
183 lines
6.4 KiB
--[[
|
|
{
|
|
"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
|
|
|