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.

216 lines
7.5 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: Analizar la posta, los tipos de comprobantes dependen del punto de venta, en el caso de un monotributo salen estos
asi que ver como hacer con el caso de un consumidor final y otros. Quizas buscar por el texto y en funcion de eso elegir el valor? (como se hace con el punto de venta?)
<select name="universoComprobante" onchange="actualizarDescripcionTC(this.selectedIndex);" id="universocomprobante">
<option value="2">Factura C</option>
<option value="3">Nota de Débito C</option>
<option value="4">Nota de Crédito C</option>
<option value="5">Recibo C</option>
<option value="120">Factura de Crédito Electrónica MiPyMEs (FCE) C</option>
<option value="121">Nota de Débito Electrónica MiPyMEs (FCE) C</option>
<option value="122">Nota de Crédito Electrónica MiPyMEs (FCE) C</option>
</select>
]]--
-- 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