--[[ 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", "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" } --]] ---------------------------------------------------------------------- -- Helpers ---------------------------------------------------------------------- local function logErrorAndExit(message) log(message) error(message) end local function is_factura(tipo_comprobante) return string.match(tipo_comprobante, "factura") end local function is_recibo(tipo_comprobante) return string.match(tipo_comprobante, "recibo") end 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 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) -- TODO: Properly handle recibo which has different fields! -- Descripcion : -- Monto: descripcion_selector = "#detalle_descripcion1" precio_selector = "#detalle_precio1" err = waitVisibleByQuerySelector(descripcion_selector) if err then message = "Error waiting for detalle_descripcion1: " .. err log(message) error(message) end err = setTextFieldByQuerySelector(descripcion_selector, descripcion) if err then message = "Error setting detalle_descripcion1: " .. err log(message) error(message) end waitSecs(1) 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 ---------------------------------------------------------------------- -- 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