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.

202 lines
6.7 KiB

-- TODO GENERAL: El json del comprobante no contiene el punto de venta, esto es algo que es atributo del cliente!
--[[
{
"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",
"request": {
"request_uid": "f976aa76-8d49-4564-8e44-2100819bae77",
"execution_status": "Fallido",
"user_uid": "bc31ddeb-b8c7-48e1-b569-20bbd8e7ec12",
"options": {
"automatic_confirmation_flag": false
},
"csv_data": "factura c,16/11/2025,servicios,01/10/2025,01/10/2025,16/11/2025,,monotributo,27287630412,contado,10000,1,Clase de apoyo\\n",
"credentials": {
"cuit": "20292929092",
"password": "password",
"orden_punto_venta": 1,
"nombre_empresa": "NOMBRE DE EMPRESA"
}
}
}
--]]
local json = require("json")
----------------------------------------------------------------------
-- Helpers
----------------------------------------------------------------------
local function logErrorAndExit(message)
log(message)
error(message)
end
-- Normalizar el input que viene del JSON por si acaso lowercase
local function normalize(s)
if not s then return "" end
s = string.lower(s)
-- s = s:gsub("^%s+", ""):gsub("%s+$", "")
return s
end
-- TODO: Factura A o B
local function is_factura_a(tipo)
return tipo == "factura a" or tipo == "a"
end
local function is_factura_b(tipo)
return tipo == "factura b" or tipo == "b"
end
local function is_factura_c(tipo)
return tipo == "factura c" or tipo == "c"
end
local function is_nota_debito(tipo)
return tipo == "nota de debito" or tipo == "debito"
end
local function is_nota_credito(tipo)
return tipo == "nota de credito" or tipo == "credito"
end
local function is_recibo(tipo)
return tipo == "recibo"
end
--[[
Valores que corresponden al value del select
TipoComprobanteInvalido = 0
TipoComprobanteFacturaC = 2
TipoComprobanteNotaDebito = 3
TipoComprobanteNotaCredito = 4
TipoComprobanteRecibo = 5
]]--
local function mapTipoComprobante(tipo)
local t = normalize(tipo)
if is_factura_c(t) then
return "2"
elseif is_nota_debito(t) then
return "3"
elseif is_nota_credito(t) then
return "4"
elseif is_recibo(t) then
return "5"
elseif is_factura_a(t) then
return "6" -- TODO: Check real value
elseif is_factura_b(t) then
return "7" -- TODO: Check real value
end
return tipo or ""
end
----------------------------------------------------------------------
-- Main logic
----------------------------------------------------------------------
local function main()
log("afip_ingresar_punto_venta_y_comprobante: starting")
--------------------------------------------------------------------
-- Decode payload
--------------------------------------------------------------------
local payload, err = json.decode(json_payload)
log("afip_ingresar_punto_venta_y_comprobante: decoded payload: " .. json.encode(payload))
if err then
logErrorAndExit("afip_ingresar_punto_venta_y_comprobante: error decoding payload: " .. err)
end
--------------------------------------------------------------------
-- Extract fields from payload
--------------------------------------------------------------------
-- Punto de venta: should correspond to comprobante.PuntoDeVenta
-- as used in Go (selectDropdownItemByPosition second argument).
local puntoDeVenta = nil
if payload["request"] and payload["request"]["credentials"] and payload["request"]["credentials"]["orden_punto_venta"] then
puntoDeVenta = payload["request"]["credentials"]["orden_punto_venta"]
else
logErrorAndExit("afip_ingresar_punto_venta_y_comprobante: punto_de_venta is missing in payload")
end
-- Tipo de comprobante: we can receive textual or numeric.
local tipoComprobanteRaw = payload["tipo_comprobante"]
if not tipoComprobanteRaw or tipoComprobanteRaw == "" then
logErrorAndExit("afip_ingresar_punto_venta_y_comprobante: tipo_comprobante is missing in payload")
end
-- Ensure punto de venta is numeric
local puntoDeVentaNum = tonumber(puntoDeVenta)
if not puntoDeVentaNum then
logErrorAndExit(
"afip_ingresar_punto_venta_y_comprobante: punto_de_venta must be numeric, got: " .. tostring(puntoDeVenta)
)
end
local tipoComprobanteValor = mapTipoComprobante(tipoComprobanteRaw)
if tipoComprobanteValor == "" then
logErrorAndExit(
"afip_ingresar_punto_venta_y_comprobante: tipo_comprobante could not be mapped: " ..
tostring(tipoComprobanteRaw)
)
end
log("afip_ingresar_punto_venta_y_comprobante: punto_de_venta=", tostring(puntoDeVentaNum),
" tipo_comprobante_valor=", tostring(tipoComprobanteValor))
--------------------------------------------------------------------
-- 1) Seleccionar punto de venta (select#puntodeventa)
--------------------------------------------------------------------
local puntoVentaId = "puntodeventa"
-- Uses the binding selectDropdownItemByPosition(id, position)
err = selectDropdownItemByPosition(puntoVentaId, puntoDeVentaNum)
if err then
logErrorAndExit(
"afip_ingresar_punto_venta_y_comprobante: selectDropdownItemByPosition failed for punto_de_venta: " ..
tostring(err)
)
end
log("afip_ingresar_punto_venta_y_comprobante: punto_de_venta selected OK")
--------------------------------------------------------------------
-- 2) Seleccionar tipo de comprobante (select#universocomprobante)
--------------------------------------------------------------------
local tipoComprobanteId = "universocomprobante"
err = setTextFieldById(tipoComprobanteId, tostring(tipoComprobanteValor))
if err then
logErrorAndExit(
"afip_ingresar_punto_venta_y_comprobante: setTextFieldById for tipo_comprobante failed: " ..
tostring(err)
)
end
log("afip_ingresar_punto_venta_y_comprobante: tipo_comprobante selected OK")
--------------------------------------------------------------------
-- Done
--------------------------------------------------------------------
log("afip_ingresar_punto_venta_y_comprobante: 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
logErrorAndExit("afip_ingresar_punto_venta_y_comprobante failed: " .. tostring(err))
end