paperclip-plugin-autopilot-ops 0.1.62 → 0.1.63

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.62";
3
+ var PLUGIN_VERSION = "0.1.63";
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.62";
11
+ var PLUGIN_VERSION = "0.1.63";
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.62";
39935
+ var PLUGIN_VERSION = "0.1.63";
39936
39936
  var DB_NAMESPACE_SLUG = "autopilot_ops";
39937
39937
  var PAGE_ROUTE = "autopilot";
39938
39938
  var TOOL_NAMES = {
@@ -44453,7 +44453,7 @@ function dia3(v) {
44453
44453
  var LIQUIDACIONES_MINIMAS = 3;
44454
44454
  var INSUMOS_CAUSA_PCT = 10;
44455
44455
  var PLANES_SIN_VALOR_PCT = 10;
44456
- function honorarioDeRegla(regla, valor) {
44456
+ function honorarioDeRegla(regla, valor, rutina = "nueva") {
44457
44457
  const pct = (n2) => `${n2.toLocaleString("es-AR", { maximumFractionDigits: 2 })} %`;
44458
44458
  const importe = regla.importe ?? null;
44459
44459
  if (importe !== null && importe > 0) {
@@ -44461,6 +44461,7 @@ function honorarioDeRegla(regla, valor) {
44461
44461
  if (regla.inst !== null) return { honorario: redondear5(importe * (1 - regla.inst / 100)), fuente: "importe", detalle: `honorario ${pesos4(importe)} menos ${pct(regla.inst)} de la instituci\xF3n` };
44462
44462
  return { honorario: importe, fuente: "importe", detalle: `honorario fijo ${pesos4(importe)}` };
44463
44463
  }
44464
+ if (rutina === "mensual" && (regla.prof !== null || regla.inst !== null)) return { honorario: 0, fuente: "importe", detalle: "la liquidaci\xF3n mensual por obra social del HIS liquida en $ 0 una regla sin honorario base" };
44464
44465
  if (regla.prof !== null) return { honorario: regla.prof, fuente: "monto_fijo", detalle: `\xABprof\xBB ${regla.prof.toLocaleString("es-AR", { maximumFractionDigits: 2 })} sin honorario base: el HIS liquida ${pesos4(regla.prof)} fijos` };
44465
44466
  if (regla.inst !== null) return { honorario: redondear5(valor * regla.inst / 100), fuente: "porcentaje", detalle: `${pct(regla.inst)} de lo que paga el convenio` };
44466
44467
  return null;
@@ -44469,7 +44470,6 @@ var HONORARIO_MINIMO_PCT = 1;
44469
44470
  var HONORARIO_FIJO_MINIMO_PCT = 10;
44470
44471
  var INSUMOS_A_VERIFICAR_PCT = 50;
44471
44472
  function noEsPractica(l) {
44472
- if (l.honorarios.length > 0) return false;
44473
44473
  return /medicament|descartable|insumo|material|farmac|internaci|hoteler/i.test(l.tipo ?? "") || /(comprimid|ampolla|frasco|sachet|cateter|catéter|guantes?\b|jeringa|gasas?\b|capsula|cápsula|\d\s*(mg|mcg|ml|ui)\b|d[ií]as? (en )?cama|d[ií]a de internaci|pensi[oó]n|habitaci[oó]n)/i.test(l.nombre);
44474
44474
  }
44475
44475
  function leerLecturaRentabilidad(v) {
@@ -44624,7 +44624,7 @@ function evaluarRentabilidad(input2) {
44624
44624
  if (l.honorarios.length === 0) faltas.push("sin_profesional");
44625
44625
  for (const h of l.honorarios) {
44626
44626
  const nombre = h.profesional ?? h.profesional_id;
44627
- const deRegla = h.regla ? honorarioDeRegla(h.regla, valor) : null;
44627
+ const deRegla = h.regla ? honorarioDeRegla(h.regla, valor, input2.rutina ?? "nueva") : null;
44628
44628
  let hon;
44629
44629
  const pocasLiquidaciones = Boolean(h.liquidado && deRegla && typeof h.liquidado.muestra === "number" && h.liquidado.muestra < LIQUIDACIONES_MINIMAS);
44630
44630
  const reglaProporcional = deRegla?.fuente === "porcentaje";
@@ -44674,6 +44674,7 @@ function evaluarRentabilidad(input2) {
44674
44674
  const descuento = redondear5(valor * descuentoPct / 100);
44675
44675
  const ind = indirectosDe(l, valor, input2.indirectos ?? [], input2.bases ?? null);
44676
44676
  for (const a of ind.avisos) if (!avisos.includes(a)) avisos.push(a);
44677
+ if (l.minutos_estimados && (input2.indirectos ?? []).some((c) => c.activo !== false && c.reparto === "minuto")) avisos.push("duracion_estimada");
44677
44678
  const medidoCon = input2.medirCon === "total" && input2.bases ? "total" : "directo";
44678
44679
  const indUsado = medidoCon === "total" ? ind.total : 0;
44679
44680
  const margen = honorarioBase !== null && valor > 0 ? redondear5(valor - descuento - insumos - honorarioBase) : null;
@@ -45213,7 +45214,8 @@ function opcionesRentabilidad(op) {
45213
45214
  perdidaMenor: enteroEntre(op.perdida_menor, 0, 1e7) ?? PERDIDA_MENOR_POR_DEFECTO,
45214
45215
  sinInsumos: Array.isArray(op.practicas_sin_insumos) ? op.practicas_sin_insumos.map(String).slice(0, 5e3) : [],
45215
45216
  descuento: porcentajeDescuento(op.descuento_cobro) ?? 0,
45216
- descuentoPorFinanciador: leerDescuentos(op.descuentos_financiador)
45217
+ descuentoPorFinanciador: leerDescuentos(op.descuentos_financiador),
45218
+ rutina: op.rutina_liquidacion === "mensual" ? "mensual" : "nueva"
45217
45219
  };
45218
45220
  }
45219
45221
  async function leerBases(ctx, companyId) {
@@ -45678,6 +45680,7 @@ function describirOpciones(antes, despues) {
45678
45680
  if (antes.meses_precio !== despues.meses_precio && despues.meses_precio !== void 0) partes.push(`meses para avisar un precio de insumo viejo: ${String(despues.meses_precio)}`);
45679
45681
  if (antes.medir_con !== despues.medir_con && despues.medir_con !== void 0) partes.push(despues.medir_con === "total" ? "mide con el margen total (despu\xE9s de los costos indirectos)" : "mide con el margen directo (antes de los costos indirectos)");
45680
45682
  if (antes.perdida_menor !== despues.perdida_menor && despues.perdida_menor !== void 0) partes.push(`p\xE9rdida menor por mes: $ ${Number(despues.perdida_menor).toLocaleString("es-AR")}`);
45683
+ if (antes.rutina_liquidacion !== despues.rutina_liquidacion && despues.rutina_liquidacion !== void 0) partes.push(despues.rutina_liquidacion === "mensual" ? "honorarios con la liquidaci\xF3n mensual por obra social del HIS" : "honorarios con la liquidaci\xF3n nueva del HIS");
45681
45684
  if (antes.descuento_cobro !== despues.descuento_cobro && despues.descuento_cobro !== void 0) partes.push(`se pierde al cobrar: ${Number(despues.descuento_cobro).toLocaleString("es-AR")} % de lo facturado`);
45682
45685
  if (JSON.stringify(antes.descuentos_financiador ?? {}) !== JSON.stringify(despues.descuentos_financiador ?? {}) && despues.descuentos_financiador !== void 0) {
45683
45686
  const d = Object.entries(despues.descuentos_financiador ?? {});
@@ -45741,11 +45744,16 @@ function imputarMinutos(lecturas) {
45741
45744
  const o = [...xs].sort((a, b) => a - b);
45742
45745
  return o.length ? o[Math.floor(o.length / 2)] : null;
45743
45746
  };
45744
- const conDuracion = lecturas.filter((l) => l.minutos !== null);
45745
- const general = mediana2(conDuracion.map((l) => l.minutos));
45746
45747
  const porTipo = /* @__PURE__ */ new Map();
45747
- for (const l of conDuracion) porTipo.set(l.tipo ?? "", [...porTipo.get(l.tipo ?? "") ?? [], l.minutos]);
45748
- for (const l of lecturas) if (l.minutos === null) l.minutos = mediana2(porTipo.get(l.tipo ?? "") ?? []) ?? general;
45748
+ for (const l of lecturas) if (l.minutos !== null && l.tipo) porTipo.set(l.tipo, [...porTipo.get(l.tipo) ?? [], l.minutos]);
45749
+ for (const l of lecturas) {
45750
+ if (l.minutos !== null || !l.tipo) continue;
45751
+ const m = mediana2(porTipo.get(l.tipo) ?? []);
45752
+ if (m !== null) {
45753
+ l.minutos = m;
45754
+ l.minutos_estimados = true;
45755
+ }
45756
+ }
45749
45757
  }
45750
45758
  function resultadoPedido(d, e) {
45751
45759
  const accion = str2(d.accion) ?? "pedir_aumento";
@@ -45762,7 +45770,7 @@ function resultadoPedido(d, e) {
45762
45770
  return { accion, pedido: null, ahora: null, cumple: e.clase === "rentable" ? true : null };
45763
45771
  }
45764
45772
  function evaluarConOpciones(l, hoy, op, bases) {
45765
- return evaluarRentabilidad({ lectura: l, hoy, umbral: op.umbral, mesesPrecio: op.mesesPrecio, indirectos: op.indirectos, bases, medirCon: op.medirCon, perdidaMenor: op.perdidaMenor, sinInsumos: op.sinInsumos.includes(normalizarCodigo(l.codigo) ?? ""), descuento: descuentoDe(op, l.financiador) });
45773
+ return evaluarRentabilidad({ lectura: l, hoy, umbral: op.umbral, mesesPrecio: op.mesesPrecio, indirectos: op.indirectos, bases, medirCon: op.medirCon, perdidaMenor: op.perdidaMenor, sinInsumos: op.sinInsumos.includes(normalizarCodigo(l.codigo) ?? ""), descuento: descuentoDe(op, l.financiador), rutina: op.rutina });
45766
45774
  }
45767
45775
  async function evaluarRentabilidades(ctx, companyId, lecturas) {
45768
45776
  if (!Array.isArray(lecturas)) throw new OpsError("validacion", "lecturas: tiene que ser una lista");
@@ -45912,6 +45920,7 @@ async function cambiarPolitica(ctx, input2) {
45912
45920
  if (v === null) throw new OpsError("validacion", "descuento_cobro: tiene que ser un porcentaje entre 0 y 60");
45913
45921
  opciones.descuento_cobro = v;
45914
45922
  }
45923
+ if (opciones.rutina_liquidacion !== void 0 && opciones.rutina_liquidacion !== "nueva" && opciones.rutina_liquidacion !== "mensual") throw new OpsError("validacion", "rutina_liquidacion: tiene que ser \xABnueva\xBB o \xABmensual\xBB");
45915
45924
  if (opciones.descuentos_financiador !== void 0) opciones.descuentos_financiador = leerDescuentos(opciones.descuentos_financiador);
45916
45925
  if (opciones.practicas_sin_insumos !== void 0) {
45917
45926
  if (!Array.isArray(opciones.practicas_sin_insumos)) throw new OpsError("validacion", "practicas_sin_insumos: tiene que ser una lista de c\xF3digos");
@@ -46217,7 +46226,13 @@ async function contextoDe(ctx, companyId, caso, via, datos) {
46217
46226
  if (via === "evaluar" || via === "comprobar") {
46218
46227
  const op = opcionesRentabilidad(await obtenerOpciones(ctx, companyId, caso.workflow));
46219
46228
  const l = leerLecturaRentabilidad(datos.lectura);
46220
- if (!("error" in l)) conInsumosDeOpera(l.lectura, await insumosPorCodigo(ctx, companyId));
46229
+ if (!("error" in l)) {
46230
+ conInsumosDeOpera(l.lectura, await insumosPorCodigo(ctx, companyId));
46231
+ if (l.lectura.minutos === null) {
46232
+ const guardada = (await listarMediciones(ctx, companyId)).find((m) => m.referencia === `rentabilidad:${l.lectura.prestacion_id}:${l.lectura.financiador_id}`);
46233
+ if (guardada?.minutos) Object.assign(l.lectura, { minutos: guardada.minutos, minutos_estimados: true });
46234
+ }
46235
+ }
46221
46236
  contexto.rentabilidad = "error" in l ? { error: l.error } : { clave: `${l.lectura.prestacion_id}:${l.lectura.financiador_id}`, evaluacion: evaluarConOpciones(l.lectura, hoy, op, await leerBases(ctx, companyId)) };
46222
46237
  }
46223
46238
  return contexto;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "paperclip-plugin-autopilot-ops",
3
- "version": "0.1.62",
3
+ "version": "0.1.63",
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": [