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 CHANGED
@@ -1,6 +1,6 @@
1
1
  // src/manifest.ts
2
2
  var PLUGIN_ID = "alephoo.autopilot-ops";
3
- var PLUGIN_VERSION = "0.1.29";
3
+ var PLUGIN_VERSION = "0.1.30";
4
4
  var DB_NAMESPACE_SLUG = "autopilot_ops";
5
5
  var PAGE_ROUTE = "autopilot";
6
6
  var TOOL_NAMES = {
package/dist/ui/index.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
 
9
9
  // src/manifest.ts
10
10
  var PLUGIN_ID = "alephoo.autopilot-ops";
11
- var PLUGIN_VERSION = "0.1.29";
11
+ var PLUGIN_VERSION = "0.1.30";
12
12
  var DB_NAMESPACE_SLUG = "autopilot_ops";
13
13
  var PAGE_ROUTE = "autopilot";
14
14
  var TOOL_NAMES = {
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.29";
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 * cantidad);
41059
- return redondear2(monto * cantidad * ((regla.inst ?? 0) / 100));
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, cantidad) {
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 cantidad = num3(r.cantidad) ?? 1;
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, cantidad > 0 ? cantidad : 1);
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: cantidad > 0 ? cantidad : 1, a_liquidar: verdad2(r.a_liquidar), liquidada: verdad2(r.liquidada), regla: leerRegla(r.regla), honorario_his: h.delHis ? h.honorario : null });
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 cantidad = num3(r.cantidad) ?? 1;
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, cantidad);
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 * cantidad) : null;
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: cantidad > 0 ? cantidad : 1,
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 cantidad = num3(x.cantidad) ?? 1;
41175
+ const cantidad2 = num3(x.cantidad) ?? 1;
41176
41176
  const regla = leerRegla(x.regla);
41177
- const hl = honorarioLeido(x, regla, monto, cantidad);
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 * cantidad;
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: 25,
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: 15,
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: 10,
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: 10,
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: 8,
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: 12,
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: 180,
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: 45,
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: 15,
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: 15,
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: 10,
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.29",
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": [