paperclip-plugin-autopilot-ops 0.1.29 → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/manifest.js +1 -1
- package/dist/ui/index.js +1 -1
- package/dist/worker.js +33 -28
- package/migrations/006_minutos_revisados.sql +13 -0
- package/package.json +1 -1
package/dist/manifest.js
CHANGED
package/dist/ui/index.js
CHANGED
package/dist/worker.js
CHANGED
|
@@ -39932,7 +39932,7 @@ function startWorkerRpcHost(options) {
|
|
|
39932
39932
|
|
|
39933
39933
|
// src/manifest.ts
|
|
39934
39934
|
var PLUGIN_ID = "alephoo.autopilot-ops";
|
|
39935
|
-
var PLUGIN_VERSION = "0.1.
|
|
39935
|
+
var PLUGIN_VERSION = "0.1.30";
|
|
39936
39936
|
var DB_NAMESPACE_SLUG = "autopilot_ops";
|
|
39937
39937
|
var PAGE_ROUTE = "autopilot";
|
|
39938
39938
|
var TOOL_NAMES = {
|
|
@@ -41053,18 +41053,18 @@ function leerRegla(v) {
|
|
|
41053
41053
|
return { id: rid, prof: prof === null ? null : redondear2(prof), inst: inst === null ? null : redondear2(inst) };
|
|
41054
41054
|
}
|
|
41055
41055
|
function honorarioDe(input2) {
|
|
41056
|
-
const { regla, monto, cantidad } = input2;
|
|
41056
|
+
const { regla, monto, cantidad: cantidad2 } = input2;
|
|
41057
41057
|
if (!regla) return 0;
|
|
41058
|
-
if (regla.prof !== null) return redondear2(regla.prof *
|
|
41059
|
-
return redondear2(monto *
|
|
41058
|
+
if (regla.prof !== null) return redondear2(regla.prof * cantidad2);
|
|
41059
|
+
return redondear2(monto * cantidad2 * ((regla.inst ?? 0) / 100));
|
|
41060
41060
|
}
|
|
41061
41061
|
function motivoCero(regla, honorario, delHis = false) {
|
|
41062
41062
|
if (honorario > 0) return null;
|
|
41063
41063
|
if (delHis) return "segun_his";
|
|
41064
41064
|
return regla ? "regla_sin_valor" : "sin_regla";
|
|
41065
41065
|
}
|
|
41066
|
-
function honorarioLeido(r, regla, monto,
|
|
41067
|
-
if (r.honorario === void 0 || r.honorario === null || r.honorario === "") return { honorario: honorarioDe({ regla, monto, cantidad }), delHis: false };
|
|
41066
|
+
function honorarioLeido(r, regla, monto, cantidad2) {
|
|
41067
|
+
if (r.honorario === void 0 || r.honorario === null || r.honorario === "") return { honorario: honorarioDe({ regla, monto, cantidad: cantidad2 }), delHis: false };
|
|
41068
41068
|
const h = num3(r.honorario);
|
|
41069
41069
|
return h === null || h < 0 ? null : { honorario: redondear2(h), delHis: true };
|
|
41070
41070
|
}
|
|
@@ -41078,12 +41078,12 @@ function leerPrestaciones(v) {
|
|
|
41078
41078
|
const bono = id2(r.bono_id);
|
|
41079
41079
|
const f = dia(r.fecha);
|
|
41080
41080
|
const monto = num3(r.monto);
|
|
41081
|
-
const
|
|
41081
|
+
const cantidad2 = num3(r.cantidad) ?? 1;
|
|
41082
41082
|
if (!item || !bono || !f || monto === null) return { error: `prestaciones[${i}]: faltan item_id, bono_id, fecha o monto` };
|
|
41083
41083
|
if (r.regla !== null && r.regla !== void 0 && !leerRegla(r.regla)) return { error: `prestaciones[${i}].regla: tiene que ser {id, prof, inst} o null` };
|
|
41084
|
-
const h = honorarioLeido(r, leerRegla(r.regla), monto,
|
|
41084
|
+
const h = honorarioLeido(r, leerRegla(r.regla), monto, cantidad2 > 0 ? cantidad2 : 1);
|
|
41085
41085
|
if (!h) return { error: `prestaciones[${i}].honorario: tiene que ser un n\xFAmero mayor o igual a 0` };
|
|
41086
|
-
out.push({ item_id: item, bono_id: bono, fecha: f, prestacion: texto2(r.prestacion)?.slice(0, 160) ?? "Prestaci\xF3n", obra_social: texto2(r.obra_social)?.slice(0, 120) ?? null, monto: redondear2(monto), cantidad:
|
|
41086
|
+
out.push({ item_id: item, bono_id: bono, fecha: f, prestacion: texto2(r.prestacion)?.slice(0, 160) ?? "Prestaci\xF3n", obra_social: texto2(r.obra_social)?.slice(0, 120) ?? null, monto: redondear2(monto), cantidad: cantidad2 > 0 ? cantidad2 : 1, a_liquidar: verdad2(r.a_liquidar), liquidada: verdad2(r.liquidada), regla: leerRegla(r.regla), honorario_his: h.delHis ? h.honorario : null });
|
|
41087
41087
|
}
|
|
41088
41088
|
return { prestaciones: out };
|
|
41089
41089
|
}
|
|
@@ -41122,13 +41122,13 @@ function leerDebitos(v) {
|
|
|
41122
41122
|
const ncId = nc ? id2(nc.id) : null;
|
|
41123
41123
|
if (!item || !bono || monto === null || !ncId) return { error: `debitos[${i}]: faltan item_id, bono_id, monto_debitado o nota_credito.id` };
|
|
41124
41124
|
const montoItem = num3(r.monto) ?? 0;
|
|
41125
|
-
const
|
|
41125
|
+
const cantidad2 = num3(r.cantidad) ?? 1;
|
|
41126
41126
|
const regla = leerRegla(r.regla);
|
|
41127
41127
|
const liquidada = verdad2(r.liquidada);
|
|
41128
|
-
const hl = honorarioLeido(r, regla, montoItem,
|
|
41128
|
+
const hl = honorarioLeido(r, regla, montoItem, cantidad2);
|
|
41129
41129
|
if (!hl) return { error: `debitos[${i}].honorario: tiene que ser un n\xFAmero mayor o igual a 0` };
|
|
41130
41130
|
const hon = liquidada ? hl.honorario : null;
|
|
41131
|
-
const imp = liquidada ? redondear2(montoItem *
|
|
41131
|
+
const imp = liquidada ? redondear2(montoItem * cantidad2) : null;
|
|
41132
41132
|
out.push({
|
|
41133
41133
|
item_id: item,
|
|
41134
41134
|
bono_id: bono,
|
|
@@ -41139,7 +41139,7 @@ function leerDebitos(v) {
|
|
|
41139
41139
|
monto_debitado: redondear2(Math.abs(monto)),
|
|
41140
41140
|
liquidada,
|
|
41141
41141
|
monto: redondear2(montoItem),
|
|
41142
|
-
cantidad:
|
|
41142
|
+
cantidad: cantidad2 > 0 ? cantidad2 : 1,
|
|
41143
41143
|
regla,
|
|
41144
41144
|
liquidado: hon !== null && imp !== null ? { honorario: hon, importe: imp } : null,
|
|
41145
41145
|
ya_trasladado: redondear2(Math.abs(num3(r.ya_trasladado) ?? 0))
|
|
@@ -41172,12 +41172,12 @@ function leerLineasLiquidacion(v) {
|
|
|
41172
41172
|
for (const it of r.items) {
|
|
41173
41173
|
const x = it && typeof it === "object" ? it : {};
|
|
41174
41174
|
const monto = num3(x.monto) ?? 0;
|
|
41175
|
-
const
|
|
41175
|
+
const cantidad2 = num3(x.cantidad) ?? 1;
|
|
41176
41176
|
const regla = leerRegla(x.regla);
|
|
41177
|
-
const hl = honorarioLeido(x, regla, monto,
|
|
41177
|
+
const hl = honorarioLeido(x, regla, monto, cantidad2);
|
|
41178
41178
|
if (!hl) return { error: `lineas[${i}].items: honorario tiene que ser un n\xFAmero mayor o igual a 0` };
|
|
41179
41179
|
const h = hl.honorario;
|
|
41180
|
-
importe += monto *
|
|
41180
|
+
importe += monto * cantidad2;
|
|
41181
41181
|
honorario += h;
|
|
41182
41182
|
if (h <= 0) enCero += 1;
|
|
41183
41183
|
}
|
|
@@ -41382,6 +41382,7 @@ var RESPUESTAS_FINANCIADOR = ["paga", "observa", "no_responde"];
|
|
|
41382
41382
|
// src/workflows.ts
|
|
41383
41383
|
var MODOS = ["corte", "observa", "propone", "ejecuta", "autonomo"];
|
|
41384
41384
|
var MODO_POR_DEFECTO = "propone";
|
|
41385
|
+
var cantidad = (v) => Array.isArray(v) ? v.length : 0;
|
|
41385
41386
|
function num5(v) {
|
|
41386
41387
|
if (typeof v === "number" && Number.isFinite(v)) return v;
|
|
41387
41388
|
if (typeof v === "string" && v.trim() !== "" && Number.isFinite(Number(v))) return Number(v);
|
|
@@ -41416,7 +41417,7 @@ var actualizacionArancel = {
|
|
|
41416
41417
|
],
|
|
41417
41418
|
finalesOk: ["verificado"],
|
|
41418
41419
|
finalesNoOk: ["rechazado", "cancelado"],
|
|
41419
|
-
minutosAbsorbidos:
|
|
41420
|
+
minutosAbsorbidos: 8,
|
|
41420
41421
|
transiciones: [
|
|
41421
41422
|
{
|
|
41422
41423
|
via: "proponer",
|
|
@@ -41669,7 +41670,7 @@ var recuperoTurno = {
|
|
|
41669
41670
|
],
|
|
41670
41671
|
finalesOk: ["verificado"],
|
|
41671
41672
|
finalesNoOk: ["sin_candidato", "rechazado", "cancelado"],
|
|
41672
|
-
minutosAbsorbidos:
|
|
41673
|
+
minutosAbsorbidos: 12,
|
|
41673
41674
|
transiciones: [
|
|
41674
41675
|
{
|
|
41675
41676
|
via: "proponer",
|
|
@@ -41910,7 +41911,7 @@ var cuentaCompleta = {
|
|
|
41910
41911
|
estados: ["detectado", "para_completar", "completado", "con_faltantes", "completa", "facturado_incompleto", "no_corresponde", "descartado"],
|
|
41911
41912
|
finalesOk: ["completa"],
|
|
41912
41913
|
finalesNoOk: ["facturado_incompleto", "no_corresponde", "descartado"],
|
|
41913
|
-
minutosAbsorbidos:
|
|
41914
|
+
minutosAbsorbidos: 4,
|
|
41914
41915
|
transiciones: [
|
|
41915
41916
|
{
|
|
41916
41917
|
via: "observar",
|
|
@@ -42010,7 +42011,7 @@ var facturacionPendiente = {
|
|
|
42010
42011
|
estados: ["detectado", "por_presentar", "en_prefactura", "presentado", "facturada", "no_corresponde", "descartado"],
|
|
42011
42012
|
finalesOk: ["facturada"],
|
|
42012
42013
|
finalesNoOk: ["no_corresponde", "descartado"],
|
|
42013
|
-
minutosAbsorbidos:
|
|
42014
|
+
minutosAbsorbidos: 3,
|
|
42014
42015
|
transiciones: [
|
|
42015
42016
|
{
|
|
42016
42017
|
via: "observar",
|
|
@@ -42119,7 +42120,7 @@ var credencialProfesional = {
|
|
|
42119
42120
|
estados: ["detectado", "vigente", "observada", "corregida", "no_corresponde", "descartado"],
|
|
42120
42121
|
finalesOk: ["vigente"],
|
|
42121
42122
|
finalesNoOk: ["no_corresponde", "descartado"],
|
|
42122
|
-
minutosAbsorbidos:
|
|
42123
|
+
minutosAbsorbidos: 5,
|
|
42123
42124
|
transiciones: [
|
|
42124
42125
|
{
|
|
42125
42126
|
via: "verificar",
|
|
@@ -42222,7 +42223,7 @@ var demandaPendiente = {
|
|
|
42222
42223
|
],
|
|
42223
42224
|
finalesOk: ["turno_agendado", "realizado"],
|
|
42224
42225
|
finalesNoOk: ["no_quiere", "cerrado_sin_turno", "no_corresponde", "descartado"],
|
|
42225
|
-
minutosAbsorbidos:
|
|
42226
|
+
minutosAbsorbidos: 6,
|
|
42226
42227
|
transiciones: [
|
|
42227
42228
|
{
|
|
42228
42229
|
via: "contactar",
|
|
@@ -42332,7 +42333,9 @@ var circularAranceles = {
|
|
|
42332
42333
|
estados: ["recibida", "extraida", "pendiente_aprobacion", "aprobada", "aplicada", "verificada", "con_diferencias", "rechazada", "cancelada"],
|
|
42333
42334
|
finalesOk: ["verificada"],
|
|
42334
42335
|
finalesNoOk: ["rechazada", "cancelada"],
|
|
42335
|
-
minutosAbsorbidos:
|
|
42336
|
+
minutosAbsorbidos: 30,
|
|
42337
|
+
// Base de lectura y armado, más el cruce y la comprobación de cada valor (tope: una jornada).
|
|
42338
|
+
minutosSegun: (caso) => Math.min(480, 30 + 3 * cantidad(caso.datos.items)),
|
|
42336
42339
|
transiciones: [
|
|
42337
42340
|
{
|
|
42338
42341
|
via: "extraer",
|
|
@@ -42488,7 +42491,9 @@ var cobranzaFinanciador = {
|
|
|
42488
42491
|
estados: ["detectado", "pendiente_aprobacion", "aprobado", "reclamado", "comprometido", "escalado", "cobrado", "cerrado", "rechazado", "descartado"],
|
|
42489
42492
|
finalesOk: ["cobrado"],
|
|
42490
42493
|
finalesNoOk: ["cerrado", "rechazado", "descartado"],
|
|
42491
|
-
minutosAbsorbidos:
|
|
42494
|
+
minutosAbsorbidos: 20,
|
|
42495
|
+
// Base del reclamo y su seguimiento, más el armado de cada factura reclamada.
|
|
42496
|
+
minutosSegun: (caso) => Math.min(180, 20 + 2 * cantidad(caso.datos.items)),
|
|
42492
42497
|
transiciones: [
|
|
42493
42498
|
{
|
|
42494
42499
|
via: "proponer",
|
|
@@ -42660,7 +42665,7 @@ var internacionAlDia = {
|
|
|
42660
42665
|
estados: ["detectado", "al_dia", "con_pendientes", "completado", "egresada", "descartado"],
|
|
42661
42666
|
finalesOk: ["egresada"],
|
|
42662
42667
|
finalesNoOk: ["descartado"],
|
|
42663
|
-
minutosAbsorbidos:
|
|
42668
|
+
minutosAbsorbidos: 6,
|
|
42664
42669
|
transiciones: [
|
|
42665
42670
|
{
|
|
42666
42671
|
via: "observar",
|
|
@@ -42719,7 +42724,7 @@ var honorarioEnCero = {
|
|
|
42719
42724
|
estados: ["detectado", "para_cargar", "completado", "resuelto", "no_corresponde", "descartado"],
|
|
42720
42725
|
finalesOk: ["resuelto"],
|
|
42721
42726
|
finalesNoOk: ["no_corresponde", "descartado"],
|
|
42722
|
-
minutosAbsorbidos:
|
|
42727
|
+
minutosAbsorbidos: 10,
|
|
42723
42728
|
transiciones: [
|
|
42724
42729
|
{
|
|
42725
42730
|
via: "observar",
|
|
@@ -42889,7 +42894,7 @@ var liquidacionProfesional = {
|
|
|
42889
42894
|
estados: ["detectado", "pendiente_aprobacion", "aprobado", "enviada", "rechazado", "descartado"],
|
|
42890
42895
|
finalesOk: ["enviada"],
|
|
42891
42896
|
finalesNoOk: ["rechazado", "descartado"],
|
|
42892
|
-
minutosAbsorbidos:
|
|
42897
|
+
minutosAbsorbidos: 15,
|
|
42893
42898
|
transiciones: [
|
|
42894
42899
|
{
|
|
42895
42900
|
via: "preparar",
|
|
@@ -43021,7 +43026,7 @@ function evaluarTransicion(input2) {
|
|
|
43021
43026
|
a,
|
|
43022
43027
|
via,
|
|
43023
43028
|
validaciones,
|
|
43024
|
-
minutosAbsorbidos: esFinalOk ? wf.minutosAbsorbidos : 0,
|
|
43029
|
+
minutosAbsorbidos: esFinalOk ? wf.minutosSegun ? wf.minutosSegun(caso) : wf.minutosAbsorbidos : 0,
|
|
43025
43030
|
esFinal: esFinalOk || wf.finalesNoOk.includes(a),
|
|
43026
43031
|
autoaprobado
|
|
43027
43032
|
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
-- Minutos de trabajo humano revisados el 17/10/2026 (ver docs/ESTIMACION-MINUTOS.md): se corrigen los casos ya cerrados
|
|
2
|
+
-- que contaron minutos, para que el histórico y lo nuevo se midan igual. Los casos que no contaron (0) no cambian.
|
|
3
|
+
UPDATE plugin_autopilot_ops_1a68482ede.caso SET minutos_absorbidos = 8 WHERE workflow = 'actualizacion_arancel' AND minutos_absorbidos > 0;
|
|
4
|
+
UPDATE plugin_autopilot_ops_1a68482ede.caso SET minutos_absorbidos = 12 WHERE workflow = 'recupero_turno' AND minutos_absorbidos > 0;
|
|
5
|
+
UPDATE plugin_autopilot_ops_1a68482ede.caso SET minutos_absorbidos = 4 WHERE workflow = 'cuenta_completa' AND minutos_absorbidos > 0;
|
|
6
|
+
UPDATE plugin_autopilot_ops_1a68482ede.caso SET minutos_absorbidos = 3 WHERE workflow = 'facturacion_pendiente' AND minutos_absorbidos > 0;
|
|
7
|
+
UPDATE plugin_autopilot_ops_1a68482ede.caso SET minutos_absorbidos = 5 WHERE workflow = 'credencial_profesional' AND minutos_absorbidos > 0;
|
|
8
|
+
UPDATE plugin_autopilot_ops_1a68482ede.caso SET minutos_absorbidos = 6 WHERE workflow = 'demanda_pendiente' AND minutos_absorbidos > 0;
|
|
9
|
+
UPDATE plugin_autopilot_ops_1a68482ede.caso SET minutos_absorbidos = LEAST(480, 30 + 3 * jsonb_array_length(CASE WHEN jsonb_typeof(datos->'items') = 'array' THEN datos->'items' ELSE '[]'::jsonb END)) WHERE workflow = 'circular_aranceles' AND minutos_absorbidos > 0;
|
|
10
|
+
UPDATE plugin_autopilot_ops_1a68482ede.caso SET minutos_absorbidos = LEAST(180, 20 + 2 * jsonb_array_length(CASE WHEN jsonb_typeof(datos->'items') = 'array' THEN datos->'items' ELSE '[]'::jsonb END)) WHERE workflow = 'cobranza_financiador' AND minutos_absorbidos > 0;
|
|
11
|
+
UPDATE plugin_autopilot_ops_1a68482ede.caso SET minutos_absorbidos = 6 WHERE workflow = 'internacion_al_dia' AND minutos_absorbidos > 0;
|
|
12
|
+
UPDATE plugin_autopilot_ops_1a68482ede.caso SET minutos_absorbidos = 10 WHERE workflow = 'honorario_en_cero' AND minutos_absorbidos > 0;
|
|
13
|
+
UPDATE plugin_autopilot_ops_1a68482ede.caso SET minutos_absorbidos = 15 WHERE workflow = 'liquidacion_profesional' AND minutos_absorbidos > 0;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "paperclip-plugin-autopilot-ops",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.30",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Autopilot Care · operación autónoma gobernada para instituciones de salud: workflows determinísticos, validaciones, registro de negocio, políticas (observa/propone/ejecuta/corte) y tablero del director, como plugin de Paperclip.",
|
|
6
6
|
"files": [
|