paperclip-plugin-autopilot-ops 0.1.9 → 0.1.11
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 +4 -4
- package/dist/ui/index.js +4 -4
- package/dist/worker.js +240 -13
- package/package.json +1 -1
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.
|
|
3
|
+
var PLUGIN_VERSION = "0.1.11";
|
|
4
4
|
var DB_NAMESPACE_SLUG = "autopilot_ops";
|
|
5
5
|
var PAGE_ROUTE = "autopilot";
|
|
6
6
|
var TOOL_NAMES = {
|
|
@@ -34,7 +34,7 @@ var manifest = {
|
|
|
34
34
|
apiVersion: 1,
|
|
35
35
|
version: PLUGIN_VERSION,
|
|
36
36
|
displayName: "Autopilot Care",
|
|
37
|
-
description: "Operaci\xF3n aut\xF3noma gobernada para instituciones de salud: workflows determin\xEDsticos por puesto, validaciones, registro de negocio con evidencia, pol\xEDticas (observa / propone / ejecuta / aut\xF3nomo / corte), carga manual del equipo del hospital con comprobaci\xF3n del agente, recupero de turnos liberados desde la lista de espera, control de cuenta completa antes de facturar, tableros de gesti\xF3n publicados por agentes y panel del director.",
|
|
37
|
+
description: "Operaci\xF3n aut\xF3noma gobernada para instituciones de salud: workflows determin\xEDsticos por puesto, validaciones, registro de negocio con evidencia, pol\xEDticas (observa / propone / ejecuta / aut\xF3nomo / corte), carga manual del equipo del hospital con comprobaci\xF3n del agente, recupero de turnos liberados desde la lista de espera, control de cuenta completa antes de facturar, prestaciones sin facturar con su plazo de presentaci\xF3n, credenciales del profesional verificadas contra el registro nacional, tableros de gesti\xF3n publicados por agentes y panel del director.",
|
|
38
38
|
author: "Alephoo",
|
|
39
39
|
categories: ["automation", "ui"],
|
|
40
40
|
capabilities: [
|
|
@@ -84,7 +84,7 @@ var manifest = {
|
|
|
84
84
|
{
|
|
85
85
|
name: TOOL_NAMES.abrirCaso,
|
|
86
86
|
displayName: "Abrir caso",
|
|
87
|
-
description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `actualizacion_arancel`, `tarea_operativa`, `recupero_turno` (datos: fecha AAAA-MM-DD, hora HH:MM, profesional, especialidad del turno libre; referencia "AAAA-MM-DD HH:MM \xB7 Profesional"), `cuenta_completa` (una prestaci\xF3n pendiente de facturar con faltantes; referencia obligatoria "bono:<n\xFAmero>", datos: bono_id, bono_numero, obra_social, plan, prestacion, fecha_prestacion AAAA-MM-DD, monto_pesos). `referencia` identifica el objeto real (convenio, cuenta, turno) y evita duplicados: si ya existe un caso abierto con la misma referencia, se devuelve ese. Pasar `idempotencyKey` para reintentos seguros.',
|
|
87
|
+
description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `actualizacion_arancel`, `tarea_operativa`, `recupero_turno` (datos: fecha AAAA-MM-DD, hora HH:MM, profesional, especialidad del turno libre; referencia "AAAA-MM-DD HH:MM \xB7 Profesional"), `cuenta_completa` (una prestaci\xF3n pendiente de facturar con faltantes; referencia obligatoria "bono:<n\xFAmero>", datos: bono_id, bono_numero, obra_social, plan, prestacion, fecha_prestacion AAAA-MM-DD, monto_pesos), `facturacion_pendiente` (una prestaci\xF3n sin facturar; misma referencia `bono:<n\xFAmero>` y mismos datos; el plugin calcula plazo_dias, vence_el y plazo_confirmado con los plazos por obra social de la instituci\xF3n), `credencial_profesional` (un profesional con agenda; referencia obligatoria `profesional:<id>`; datos: profesional_id, profesional (apellido y nombre, es personal del hospital), matricula_nacional, matricula_provincial, codigo_provincia, especialidades). `referencia` identifica el objeto real (convenio, cuenta, turno) y evita duplicados: si ya existe un caso abierto con la misma referencia, se devuelve ese. Pasar `idempotencyKey` para reintentos seguros.',
|
|
88
88
|
parametersSchema: {
|
|
89
89
|
type: "object",
|
|
90
90
|
properties: {
|
|
@@ -101,7 +101,7 @@ var manifest = {
|
|
|
101
101
|
{
|
|
102
102
|
name: TOOL_NAMES.transicionar,
|
|
103
103
|
displayName: "Transicionar caso",
|
|
104
|
-
description: 'Aplica una transici\xF3n del workflow al caso (p. ej. `proponer`, `aplicar`, `verificar`). El plugin valida contra la tabla de transiciones, la pol\xEDtica vigente (observa / propone / ejecuta / corte) y las reglas de negocio; si algo falla, el caso no cambia y se devuelve el motivo. Las transiciones humanas (aprobar, rechazar, corregir) no est\xE1n disponibles para agentes. Cuando una persona del hospital carga a mano lo aprobado, el caso queda en `aplicado`: el agente lo comprueba releyendo el sistema y llamando `verificar` con `datos.valor_leido`. En `recupero_turno`: `proponer` con solicitud_id, solicitud_estado, solicitud_especialidad, cola (la lista de espera pendiente de esa especialidad tal como se vio: [{solicitud_id, prioridad, alta}]; el plugin la ordena y exige justificaci\xF3n para no elegir la primera) y fuente; si la instituci\xF3n pide consulta previa (ops_leer_caso lo dice), `ofrecer` con canal y esperar `aceptar`/`no_acepta`; **antes de escribir en el sistema, `autorizar`** (sin esa autorizaci\xF3n no se escribe); despu\xE9s de escribir, `asignar` con accion_id; `verificar` con leido_fecha, leido_hora, leido_profesional y leido_solicitud_id; `sin_candidato` y `descartar` con motivo. En `cuenta_completa` el agente solo lee: `observar` con bono_id, bono_estado (no_confirmado, confirmado o prefacturado), faltantes [{regla, detalle, item?}] con reglas del cat\xE1logo (autorizacion_faltante, validacion_faltante, afiliado_faltante, orden_faltante, prestacion_sin_valor, epicrisis_faltante), lectura_id (la lectura registrada con ops_registrar_accion, conector "base") y fuente; `comprobar` con faltantes_leidos (lista vac\xEDa si ya est\xE1 completo), bono_estado_leido y lectura_id; `descartar` con motivo si el bono se elimin\xF3 o anul\xF3.',
|
|
104
|
+
description: 'Aplica una transici\xF3n del workflow al caso (p. ej. `proponer`, `aplicar`, `verificar`). El plugin valida contra la tabla de transiciones, la pol\xEDtica vigente (observa / propone / ejecuta / corte) y las reglas de negocio; si algo falla, el caso no cambia y se devuelve el motivo. Las transiciones humanas (aprobar, rechazar, corregir) no est\xE1n disponibles para agentes. Cuando una persona del hospital carga a mano lo aprobado, el caso queda en `aplicado`: el agente lo comprueba releyendo el sistema y llamando `verificar` con `datos.valor_leido`. En `recupero_turno`: `proponer` con solicitud_id, solicitud_estado, solicitud_especialidad, cola (la lista de espera pendiente de esa especialidad tal como se vio: [{solicitud_id, prioridad, alta}]; el plugin la ordena y exige justificaci\xF3n para no elegir la primera) y fuente; si la instituci\xF3n pide consulta previa (ops_leer_caso lo dice), `ofrecer` con canal y esperar `aceptar`/`no_acepta`; **antes de escribir en el sistema, `autorizar`** (sin esa autorizaci\xF3n no se escribe); despu\xE9s de escribir, `asignar` con accion_id; `verificar` con leido_fecha, leido_hora, leido_profesional y leido_solicitud_id; `sin_candidato` y `descartar` con motivo. En `cuenta_completa` el agente solo lee: `observar` con bono_id, bono_estado (no_confirmado, confirmado o prefacturado), faltantes [{regla, detalle, item?}] con reglas del cat\xE1logo (autorizacion_faltante, validacion_faltante, afiliado_faltante, orden_faltante, prestacion_sin_valor, epicrisis_faltante), lectura_id (la lectura registrada con ops_registrar_accion, conector "base") y fuente; `comprobar` con faltantes_leidos (lista vac\xEDa si ya est\xE1 completo), bono_estado_leido y lectura_id; `descartar` con motivo si el bono se elimin\xF3 o anul\xF3. En `facturacion_pendiente` (solo lee): `observar` con bono_id, bono_estado, fecha_prestacion, obra_social, lectura_id (conector "base") y fuente; `comprobar` con bono_estado_leido y lectura_id (facturado/refacturado \u2192 facturada; prefacturado \u2192 en prefactura; si no, sigue por presentar); `descartar` con motivo. En `credencial_profesional` (solo lee): `verificar` con profesional_id, matricula y tipo_matricula (nacional|provincial) si hay matr\xEDcula, resultado = el objeto que devuelve verificar-matriculas.mjs tal cual ({sin_matricula, encontrada, coincide_nombre, situacion, sancion, profesion, provincia, emisor}), lectura_id (conector "api", la consulta al registro) y fuente; el plugin decide vigente u observada y fija la observaci\xF3n (sin_matricula, no_figura, otra_persona, inhabilitada, sancion); `descartar` con motivo si el profesional ya no est\xE1 activo.',
|
|
105
105
|
parametersSchema: {
|
|
106
106
|
type: "object",
|
|
107
107
|
properties: {
|
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.
|
|
11
|
+
var PLUGIN_VERSION = "0.1.11";
|
|
12
12
|
var DB_NAMESPACE_SLUG = "autopilot_ops";
|
|
13
13
|
var PAGE_ROUTE = "autopilot";
|
|
14
14
|
var TOOL_NAMES = {
|
|
@@ -42,7 +42,7 @@ var manifest = {
|
|
|
42
42
|
apiVersion: 1,
|
|
43
43
|
version: PLUGIN_VERSION,
|
|
44
44
|
displayName: "Autopilot Care",
|
|
45
|
-
description: "Operaci\xF3n aut\xF3noma gobernada para instituciones de salud: workflows determin\xEDsticos por puesto, validaciones, registro de negocio con evidencia, pol\xEDticas (observa / propone / ejecuta / aut\xF3nomo / corte), carga manual del equipo del hospital con comprobaci\xF3n del agente, recupero de turnos liberados desde la lista de espera, control de cuenta completa antes de facturar, tableros de gesti\xF3n publicados por agentes y panel del director.",
|
|
45
|
+
description: "Operaci\xF3n aut\xF3noma gobernada para instituciones de salud: workflows determin\xEDsticos por puesto, validaciones, registro de negocio con evidencia, pol\xEDticas (observa / propone / ejecuta / aut\xF3nomo / corte), carga manual del equipo del hospital con comprobaci\xF3n del agente, recupero de turnos liberados desde la lista de espera, control de cuenta completa antes de facturar, prestaciones sin facturar con su plazo de presentaci\xF3n, credenciales del profesional verificadas contra el registro nacional, tableros de gesti\xF3n publicados por agentes y panel del director.",
|
|
46
46
|
author: "Alephoo",
|
|
47
47
|
categories: ["automation", "ui"],
|
|
48
48
|
capabilities: [
|
|
@@ -92,7 +92,7 @@ var manifest = {
|
|
|
92
92
|
{
|
|
93
93
|
name: TOOL_NAMES.abrirCaso,
|
|
94
94
|
displayName: "Abrir caso",
|
|
95
|
-
description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `actualizacion_arancel`, `tarea_operativa`, `recupero_turno` (datos: fecha AAAA-MM-DD, hora HH:MM, profesional, especialidad del turno libre; referencia "AAAA-MM-DD HH:MM \xB7 Profesional"), `cuenta_completa` (una prestaci\xF3n pendiente de facturar con faltantes; referencia obligatoria "bono:<n\xFAmero>", datos: bono_id, bono_numero, obra_social, plan, prestacion, fecha_prestacion AAAA-MM-DD, monto_pesos). `referencia` identifica el objeto real (convenio, cuenta, turno) y evita duplicados: si ya existe un caso abierto con la misma referencia, se devuelve ese. Pasar `idempotencyKey` para reintentos seguros.',
|
|
95
|
+
description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `actualizacion_arancel`, `tarea_operativa`, `recupero_turno` (datos: fecha AAAA-MM-DD, hora HH:MM, profesional, especialidad del turno libre; referencia "AAAA-MM-DD HH:MM \xB7 Profesional"), `cuenta_completa` (una prestaci\xF3n pendiente de facturar con faltantes; referencia obligatoria "bono:<n\xFAmero>", datos: bono_id, bono_numero, obra_social, plan, prestacion, fecha_prestacion AAAA-MM-DD, monto_pesos), `facturacion_pendiente` (una prestaci\xF3n sin facturar; misma referencia `bono:<n\xFAmero>` y mismos datos; el plugin calcula plazo_dias, vence_el y plazo_confirmado con los plazos por obra social de la instituci\xF3n), `credencial_profesional` (un profesional con agenda; referencia obligatoria `profesional:<id>`; datos: profesional_id, profesional (apellido y nombre, es personal del hospital), matricula_nacional, matricula_provincial, codigo_provincia, especialidades). `referencia` identifica el objeto real (convenio, cuenta, turno) y evita duplicados: si ya existe un caso abierto con la misma referencia, se devuelve ese. Pasar `idempotencyKey` para reintentos seguros.',
|
|
96
96
|
parametersSchema: {
|
|
97
97
|
type: "object",
|
|
98
98
|
properties: {
|
|
@@ -109,7 +109,7 @@ var manifest = {
|
|
|
109
109
|
{
|
|
110
110
|
name: TOOL_NAMES.transicionar,
|
|
111
111
|
displayName: "Transicionar caso",
|
|
112
|
-
description: 'Aplica una transici\xF3n del workflow al caso (p. ej. `proponer`, `aplicar`, `verificar`). El plugin valida contra la tabla de transiciones, la pol\xEDtica vigente (observa / propone / ejecuta / corte) y las reglas de negocio; si algo falla, el caso no cambia y se devuelve el motivo. Las transiciones humanas (aprobar, rechazar, corregir) no est\xE1n disponibles para agentes. Cuando una persona del hospital carga a mano lo aprobado, el caso queda en `aplicado`: el agente lo comprueba releyendo el sistema y llamando `verificar` con `datos.valor_leido`. En `recupero_turno`: `proponer` con solicitud_id, solicitud_estado, solicitud_especialidad, cola (la lista de espera pendiente de esa especialidad tal como se vio: [{solicitud_id, prioridad, alta}]; el plugin la ordena y exige justificaci\xF3n para no elegir la primera) y fuente; si la instituci\xF3n pide consulta previa (ops_leer_caso lo dice), `ofrecer` con canal y esperar `aceptar`/`no_acepta`; **antes de escribir en el sistema, `autorizar`** (sin esa autorizaci\xF3n no se escribe); despu\xE9s de escribir, `asignar` con accion_id; `verificar` con leido_fecha, leido_hora, leido_profesional y leido_solicitud_id; `sin_candidato` y `descartar` con motivo. En `cuenta_completa` el agente solo lee: `observar` con bono_id, bono_estado (no_confirmado, confirmado o prefacturado), faltantes [{regla, detalle, item?}] con reglas del cat\xE1logo (autorizacion_faltante, validacion_faltante, afiliado_faltante, orden_faltante, prestacion_sin_valor, epicrisis_faltante), lectura_id (la lectura registrada con ops_registrar_accion, conector "base") y fuente; `comprobar` con faltantes_leidos (lista vac\xEDa si ya est\xE1 completo), bono_estado_leido y lectura_id; `descartar` con motivo si el bono se elimin\xF3 o anul\xF3.',
|
|
112
|
+
description: 'Aplica una transici\xF3n del workflow al caso (p. ej. `proponer`, `aplicar`, `verificar`). El plugin valida contra la tabla de transiciones, la pol\xEDtica vigente (observa / propone / ejecuta / corte) y las reglas de negocio; si algo falla, el caso no cambia y se devuelve el motivo. Las transiciones humanas (aprobar, rechazar, corregir) no est\xE1n disponibles para agentes. Cuando una persona del hospital carga a mano lo aprobado, el caso queda en `aplicado`: el agente lo comprueba releyendo el sistema y llamando `verificar` con `datos.valor_leido`. En `recupero_turno`: `proponer` con solicitud_id, solicitud_estado, solicitud_especialidad, cola (la lista de espera pendiente de esa especialidad tal como se vio: [{solicitud_id, prioridad, alta}]; el plugin la ordena y exige justificaci\xF3n para no elegir la primera) y fuente; si la instituci\xF3n pide consulta previa (ops_leer_caso lo dice), `ofrecer` con canal y esperar `aceptar`/`no_acepta`; **antes de escribir en el sistema, `autorizar`** (sin esa autorizaci\xF3n no se escribe); despu\xE9s de escribir, `asignar` con accion_id; `verificar` con leido_fecha, leido_hora, leido_profesional y leido_solicitud_id; `sin_candidato` y `descartar` con motivo. En `cuenta_completa` el agente solo lee: `observar` con bono_id, bono_estado (no_confirmado, confirmado o prefacturado), faltantes [{regla, detalle, item?}] con reglas del cat\xE1logo (autorizacion_faltante, validacion_faltante, afiliado_faltante, orden_faltante, prestacion_sin_valor, epicrisis_faltante), lectura_id (la lectura registrada con ops_registrar_accion, conector "base") y fuente; `comprobar` con faltantes_leidos (lista vac\xEDa si ya est\xE1 completo), bono_estado_leido y lectura_id; `descartar` con motivo si el bono se elimin\xF3 o anul\xF3. En `facturacion_pendiente` (solo lee): `observar` con bono_id, bono_estado, fecha_prestacion, obra_social, lectura_id (conector "base") y fuente; `comprobar` con bono_estado_leido y lectura_id (facturado/refacturado \u2192 facturada; prefacturado \u2192 en prefactura; si no, sigue por presentar); `descartar` con motivo. En `credencial_profesional` (solo lee): `verificar` con profesional_id, matricula y tipo_matricula (nacional|provincial) si hay matr\xEDcula, resultado = el objeto que devuelve verificar-matriculas.mjs tal cual ({sin_matricula, encontrada, coincide_nombre, situacion, sancion, profesion, provincia, emisor}), lectura_id (conector "api", la consulta al registro) y fuente; el plugin decide vigente u observada y fija la observaci\xF3n (sin_matricula, no_figura, otra_persona, inhabilitada, sancion); `descartar` con motivo si el profesional ya no est\xE1 activo.',
|
|
113
113
|
parametersSchema: {
|
|
114
114
|
type: "object",
|
|
115
115
|
properties: {
|
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.11";
|
|
39936
39936
|
var DB_NAMESPACE_SLUG = "autopilot_ops";
|
|
39937
39937
|
var PAGE_ROUTE = "autopilot";
|
|
39938
39938
|
var TOOL_NAMES = {
|
|
@@ -39966,7 +39966,7 @@ var manifest = {
|
|
|
39966
39966
|
apiVersion: 1,
|
|
39967
39967
|
version: PLUGIN_VERSION,
|
|
39968
39968
|
displayName: "Autopilot Care",
|
|
39969
|
-
description: "Operaci\xF3n aut\xF3noma gobernada para instituciones de salud: workflows determin\xEDsticos por puesto, validaciones, registro de negocio con evidencia, pol\xEDticas (observa / propone / ejecuta / aut\xF3nomo / corte), carga manual del equipo del hospital con comprobaci\xF3n del agente, recupero de turnos liberados desde la lista de espera, control de cuenta completa antes de facturar, tableros de gesti\xF3n publicados por agentes y panel del director.",
|
|
39969
|
+
description: "Operaci\xF3n aut\xF3noma gobernada para instituciones de salud: workflows determin\xEDsticos por puesto, validaciones, registro de negocio con evidencia, pol\xEDticas (observa / propone / ejecuta / aut\xF3nomo / corte), carga manual del equipo del hospital con comprobaci\xF3n del agente, recupero de turnos liberados desde la lista de espera, control de cuenta completa antes de facturar, prestaciones sin facturar con su plazo de presentaci\xF3n, credenciales del profesional verificadas contra el registro nacional, tableros de gesti\xF3n publicados por agentes y panel del director.",
|
|
39970
39970
|
author: "Alephoo",
|
|
39971
39971
|
categories: ["automation", "ui"],
|
|
39972
39972
|
capabilities: [
|
|
@@ -40016,7 +40016,7 @@ var manifest = {
|
|
|
40016
40016
|
{
|
|
40017
40017
|
name: TOOL_NAMES.abrirCaso,
|
|
40018
40018
|
displayName: "Abrir caso",
|
|
40019
|
-
description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `actualizacion_arancel`, `tarea_operativa`, `recupero_turno` (datos: fecha AAAA-MM-DD, hora HH:MM, profesional, especialidad del turno libre; referencia "AAAA-MM-DD HH:MM \xB7 Profesional"), `cuenta_completa` (una prestaci\xF3n pendiente de facturar con faltantes; referencia obligatoria "bono:<n\xFAmero>", datos: bono_id, bono_numero, obra_social, plan, prestacion, fecha_prestacion AAAA-MM-DD, monto_pesos). `referencia` identifica el objeto real (convenio, cuenta, turno) y evita duplicados: si ya existe un caso abierto con la misma referencia, se devuelve ese. Pasar `idempotencyKey` para reintentos seguros.',
|
|
40019
|
+
description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `actualizacion_arancel`, `tarea_operativa`, `recupero_turno` (datos: fecha AAAA-MM-DD, hora HH:MM, profesional, especialidad del turno libre; referencia "AAAA-MM-DD HH:MM \xB7 Profesional"), `cuenta_completa` (una prestaci\xF3n pendiente de facturar con faltantes; referencia obligatoria "bono:<n\xFAmero>", datos: bono_id, bono_numero, obra_social, plan, prestacion, fecha_prestacion AAAA-MM-DD, monto_pesos), `facturacion_pendiente` (una prestaci\xF3n sin facturar; misma referencia `bono:<n\xFAmero>` y mismos datos; el plugin calcula plazo_dias, vence_el y plazo_confirmado con los plazos por obra social de la instituci\xF3n), `credencial_profesional` (un profesional con agenda; referencia obligatoria `profesional:<id>`; datos: profesional_id, profesional (apellido y nombre, es personal del hospital), matricula_nacional, matricula_provincial, codigo_provincia, especialidades). `referencia` identifica el objeto real (convenio, cuenta, turno) y evita duplicados: si ya existe un caso abierto con la misma referencia, se devuelve ese. Pasar `idempotencyKey` para reintentos seguros.',
|
|
40020
40020
|
parametersSchema: {
|
|
40021
40021
|
type: "object",
|
|
40022
40022
|
properties: {
|
|
@@ -40033,7 +40033,7 @@ var manifest = {
|
|
|
40033
40033
|
{
|
|
40034
40034
|
name: TOOL_NAMES.transicionar,
|
|
40035
40035
|
displayName: "Transicionar caso",
|
|
40036
|
-
description: 'Aplica una transici\xF3n del workflow al caso (p. ej. `proponer`, `aplicar`, `verificar`). El plugin valida contra la tabla de transiciones, la pol\xEDtica vigente (observa / propone / ejecuta / corte) y las reglas de negocio; si algo falla, el caso no cambia y se devuelve el motivo. Las transiciones humanas (aprobar, rechazar, corregir) no est\xE1n disponibles para agentes. Cuando una persona del hospital carga a mano lo aprobado, el caso queda en `aplicado`: el agente lo comprueba releyendo el sistema y llamando `verificar` con `datos.valor_leido`. En `recupero_turno`: `proponer` con solicitud_id, solicitud_estado, solicitud_especialidad, cola (la lista de espera pendiente de esa especialidad tal como se vio: [{solicitud_id, prioridad, alta}]; el plugin la ordena y exige justificaci\xF3n para no elegir la primera) y fuente; si la instituci\xF3n pide consulta previa (ops_leer_caso lo dice), `ofrecer` con canal y esperar `aceptar`/`no_acepta`; **antes de escribir en el sistema, `autorizar`** (sin esa autorizaci\xF3n no se escribe); despu\xE9s de escribir, `asignar` con accion_id; `verificar` con leido_fecha, leido_hora, leido_profesional y leido_solicitud_id; `sin_candidato` y `descartar` con motivo. En `cuenta_completa` el agente solo lee: `observar` con bono_id, bono_estado (no_confirmado, confirmado o prefacturado), faltantes [{regla, detalle, item?}] con reglas del cat\xE1logo (autorizacion_faltante, validacion_faltante, afiliado_faltante, orden_faltante, prestacion_sin_valor, epicrisis_faltante), lectura_id (la lectura registrada con ops_registrar_accion, conector "base") y fuente; `comprobar` con faltantes_leidos (lista vac\xEDa si ya est\xE1 completo), bono_estado_leido y lectura_id; `descartar` con motivo si el bono se elimin\xF3 o anul\xF3.',
|
|
40036
|
+
description: 'Aplica una transici\xF3n del workflow al caso (p. ej. `proponer`, `aplicar`, `verificar`). El plugin valida contra la tabla de transiciones, la pol\xEDtica vigente (observa / propone / ejecuta / corte) y las reglas de negocio; si algo falla, el caso no cambia y se devuelve el motivo. Las transiciones humanas (aprobar, rechazar, corregir) no est\xE1n disponibles para agentes. Cuando una persona del hospital carga a mano lo aprobado, el caso queda en `aplicado`: el agente lo comprueba releyendo el sistema y llamando `verificar` con `datos.valor_leido`. En `recupero_turno`: `proponer` con solicitud_id, solicitud_estado, solicitud_especialidad, cola (la lista de espera pendiente de esa especialidad tal como se vio: [{solicitud_id, prioridad, alta}]; el plugin la ordena y exige justificaci\xF3n para no elegir la primera) y fuente; si la instituci\xF3n pide consulta previa (ops_leer_caso lo dice), `ofrecer` con canal y esperar `aceptar`/`no_acepta`; **antes de escribir en el sistema, `autorizar`** (sin esa autorizaci\xF3n no se escribe); despu\xE9s de escribir, `asignar` con accion_id; `verificar` con leido_fecha, leido_hora, leido_profesional y leido_solicitud_id; `sin_candidato` y `descartar` con motivo. En `cuenta_completa` el agente solo lee: `observar` con bono_id, bono_estado (no_confirmado, confirmado o prefacturado), faltantes [{regla, detalle, item?}] con reglas del cat\xE1logo (autorizacion_faltante, validacion_faltante, afiliado_faltante, orden_faltante, prestacion_sin_valor, epicrisis_faltante), lectura_id (la lectura registrada con ops_registrar_accion, conector "base") y fuente; `comprobar` con faltantes_leidos (lista vac\xEDa si ya est\xE1 completo), bono_estado_leido y lectura_id; `descartar` con motivo si el bono se elimin\xF3 o anul\xF3. En `facturacion_pendiente` (solo lee): `observar` con bono_id, bono_estado, fecha_prestacion, obra_social, lectura_id (conector "base") y fuente; `comprobar` con bono_estado_leido y lectura_id (facturado/refacturado \u2192 facturada; prefacturado \u2192 en prefactura; si no, sigue por presentar); `descartar` con motivo. En `credencial_profesional` (solo lee): `verificar` con profesional_id, matricula y tipo_matricula (nacional|provincial) si hay matr\xEDcula, resultado = el objeto que devuelve verificar-matriculas.mjs tal cual ({sin_matricula, encontrada, coincide_nombre, situacion, sancion, profesion, provincia, emisor}), lectura_id (conector "api", la consulta al registro) y fuente; el plugin decide vigente u observada y fija la observaci\xF3n (sin_matricula, no_figura, otra_persona, inhabilitada, sancion); `descartar` con motivo si el profesional ya no est\xE1 activo.',
|
|
40037
40037
|
parametersSchema: {
|
|
40038
40038
|
type: "object",
|
|
40039
40039
|
properties: {
|
|
@@ -40858,11 +40858,199 @@ var cuentaCompleta = {
|
|
|
40858
40858
|
}
|
|
40859
40859
|
]
|
|
40860
40860
|
};
|
|
40861
|
+
var PLAZO_PRESENTACION_POR_DEFECTO = 60;
|
|
40862
|
+
function sumarDias(fecha, dias) {
|
|
40863
|
+
const d = /* @__PURE__ */ new Date(`${fecha}T00:00:00Z`);
|
|
40864
|
+
d.setUTCDate(d.getUTCDate() + dias);
|
|
40865
|
+
return d.toISOString().slice(0, 10);
|
|
40866
|
+
}
|
|
40867
|
+
function calcularVencimiento(fechaPrestacion, obraSocial, contexto) {
|
|
40868
|
+
const nombre = normalizarNombre(obraSocial);
|
|
40869
|
+
const fijado = nombre ? Object.entries(contexto.plazosPresentacion ?? {}).find(([k]) => normalizarNombre(k) === nombre)?.[1] : void 0;
|
|
40870
|
+
const plazo = typeof fijado === "number" && Number.isInteger(fijado) && fijado > 0 && fijado <= 730 ? fijado : PLAZO_PRESENTACION_POR_DEFECTO;
|
|
40871
|
+
return { plazo_dias: plazo, vence_el: sumarDias(fechaPrestacion, plazo), plazo_confirmado: typeof fijado === "number" };
|
|
40872
|
+
}
|
|
40873
|
+
var facturacionPendiente = {
|
|
40874
|
+
clave: "facturacion_pendiente",
|
|
40875
|
+
nombre: "Prestaciones sin facturar",
|
|
40876
|
+
puesto: "Admisi\xF3n y cuenta",
|
|
40877
|
+
descripcion: "Lee en el sistema del hospital las prestaciones (bonos) que todav\xEDa no se facturaron, calcula cu\xE1ndo vence el plazo de presentaci\xF3n al financiador y avisa al equipo, primero lo que vence antes. El equipo las presenta y el puesto lo comprueba volviendo a leer. El puesto no escribe en el sistema.",
|
|
40878
|
+
inicial: "detectado",
|
|
40879
|
+
estados: ["detectado", "por_presentar", "en_prefactura", "presentado", "facturada", "no_corresponde", "descartado"],
|
|
40880
|
+
finalesOk: ["facturada"],
|
|
40881
|
+
finalesNoOk: ["no_corresponde", "descartado"],
|
|
40882
|
+
minutosAbsorbidos: 10,
|
|
40883
|
+
transiciones: [
|
|
40884
|
+
{
|
|
40885
|
+
via: "observar",
|
|
40886
|
+
de: ["detectado"],
|
|
40887
|
+
a: (_caso, datos) => estadoBono(datos.bono_estado) === "prefacturado" ? "en_prefactura" : "por_presentar",
|
|
40888
|
+
actor: ["agente", "humano"],
|
|
40889
|
+
nivelRequerido: "observa",
|
|
40890
|
+
descripcion: "Informar una prestaci\xF3n sin facturar con su fecha y obra social; el plugin calcula el plazo y el vencimiento con los plazos de la instituci\xF3n.",
|
|
40891
|
+
validar: (caso, datos, contexto) => {
|
|
40892
|
+
const l = { ...caso.datos, ...datos };
|
|
40893
|
+
const estado = estadoBono(datos.bono_estado);
|
|
40894
|
+
const fecha = fechaISO(l.fecha_prestacion) ? String(l.fecha_prestacion) : null;
|
|
40895
|
+
return [
|
|
40896
|
+
refExterna(l.bono_id) ? ok("bono_presente") : falla("bono_presente", "observar requiere bono_id: el n\xFAmero de bono en el sistema del hospital"),
|
|
40897
|
+
estado && BONO_POR_FACTURAR.includes(estado) ? ok("bono_sin_facturar", estado) : falla("bono_sin_facturar", `el bono tiene que estar sin facturar (${BONO_POR_FACTURAR.join(", ")}); est\xE1: ${texto(datos.bono_estado) ?? "sin informar"}`),
|
|
40898
|
+
fecha && (!contexto.hoy || fecha <= contexto.hoy) ? ok("fecha_prestacion_valida", fecha) : falla("fecha_prestacion_valida", "fecha_prestacion (AAAA-MM-DD) es obligatoria y no puede ser futura"),
|
|
40899
|
+
texto(l.obra_social) ? ok("obra_social_presente") : falla("obra_social_presente", "obra_social es obligatoria: con ella se busca el plazo de presentaci\xF3n"),
|
|
40900
|
+
texto(datos.lectura_id) ? ok("lectura_registrada") : falla("lectura_registrada", "observar requiere lectura_id: la lectura de la base registrada con ops_registrar_accion"),
|
|
40901
|
+
texto(datos.fuente) ? ok("fuente_presente") : falla("fuente_presente", "fuente (base y consulta de donde sale la prestaci\xF3n) es obligatoria")
|
|
40902
|
+
];
|
|
40903
|
+
}
|
|
40904
|
+
},
|
|
40905
|
+
{
|
|
40906
|
+
via: "presentar",
|
|
40907
|
+
de: ["por_presentar", "en_prefactura"],
|
|
40908
|
+
a: "presentado",
|
|
40909
|
+
actor: ["humano"],
|
|
40910
|
+
cargaManual: true,
|
|
40911
|
+
descripcion: "Una persona del hospital present\xF3 la prestaci\xF3n (la prefactur\xF3 y factur\xF3). El puesto lo comprueba volviendo a leer.",
|
|
40912
|
+
validar: (_caso, datos) => [
|
|
40913
|
+
texto(datos.accion_id) ? ok("accion_registrada") : falla("accion_registrada", "presentar requiere accion_id de la carga registrada")
|
|
40914
|
+
]
|
|
40915
|
+
},
|
|
40916
|
+
{
|
|
40917
|
+
// Lo decide el plugin con lo que se volvió a leer: facturada, todavía en una prefactura, o sigue sin presentar.
|
|
40918
|
+
via: "comprobar",
|
|
40919
|
+
de: ["por_presentar", "en_prefactura", "presentado"],
|
|
40920
|
+
a: (_caso, datos) => {
|
|
40921
|
+
const estado = estadoBono(datos.bono_estado_leido) ?? "";
|
|
40922
|
+
if (BONO_FACTURADO.includes(estado)) return "facturada";
|
|
40923
|
+
return estado === "prefacturado" ? "en_prefactura" : "por_presentar";
|
|
40924
|
+
},
|
|
40925
|
+
actor: ["agente", "humano", "sistema"],
|
|
40926
|
+
nivelRequerido: "observa",
|
|
40927
|
+
descripcion: "Volver a leer el bono en el sistema e informar su estado. El plugin decide: facturada, en una prefactura o todav\xEDa por presentar.",
|
|
40928
|
+
validar: (_caso, datos) => {
|
|
40929
|
+
const estado = estadoBono(datos.bono_estado_leido);
|
|
40930
|
+
return [
|
|
40931
|
+
estado && [...BONO_POR_FACTURAR, ...BONO_FACTURADO].includes(estado) ? ok("estado_leido", estado) : falla("estado_leido", `bono_estado_leido tiene que ser uno de: ${[...BONO_POR_FACTURAR, ...BONO_FACTURADO].join(", ")} (si el bono se elimin\xF3 o se anul\xF3, descartar)`),
|
|
40932
|
+
texto(datos.lectura_id) ? ok("lectura_registrada") : falla("lectura_registrada", "comprobar requiere lectura_id: la lectura de la base registrada con ops_registrar_accion")
|
|
40933
|
+
];
|
|
40934
|
+
}
|
|
40935
|
+
},
|
|
40936
|
+
{
|
|
40937
|
+
via: "no_corresponde",
|
|
40938
|
+
de: ["por_presentar", "en_prefactura", "presentado"],
|
|
40939
|
+
a: "no_corresponde",
|
|
40940
|
+
actor: ["humano"],
|
|
40941
|
+
descripcion: "El equipo indica que esta prestaci\xF3n no se presenta al financiador (por ejemplo, la pag\xF3 el paciente o no es facturable). Queda registrado con el motivo.",
|
|
40942
|
+
validar: (_caso, datos) => [texto(datos.motivo) ? ok("motivo_presente") : falla("motivo_presente", "no_corresponde requiere motivo")]
|
|
40943
|
+
},
|
|
40944
|
+
{
|
|
40945
|
+
via: "descartar",
|
|
40946
|
+
de: ["detectado", "por_presentar", "en_prefactura", "presentado"],
|
|
40947
|
+
a: "descartado",
|
|
40948
|
+
actor: ["agente", "humano"],
|
|
40949
|
+
nivelRequerido: "observa",
|
|
40950
|
+
descripcion: "El bono se elimin\xF3, se anul\xF3 o qued\xF3 como no cobrable: ya no hay nada que presentar.",
|
|
40951
|
+
validar: (_caso, datos) => [texto(datos.motivo) ? ok("motivo_presente") : falla("motivo_presente", "descartar requiere motivo")]
|
|
40952
|
+
}
|
|
40953
|
+
]
|
|
40954
|
+
};
|
|
40955
|
+
var TIPOS_MATRICULA = ["nacional", "provincial"];
|
|
40956
|
+
function leerResultadoRegistro(v) {
|
|
40957
|
+
if (!v || typeof v !== "object" || Array.isArray(v)) return null;
|
|
40958
|
+
const r = v;
|
|
40959
|
+
const sinMatricula = r.sin_matricula === true;
|
|
40960
|
+
const situacion = typeof r.situacion === "string" ? r.situacion.toLowerCase() : "desconocida";
|
|
40961
|
+
if (!sinMatricula && typeof r.encontrada !== "boolean") return null;
|
|
40962
|
+
if (!["habilitado", "inhabilitado", "desconocida"].includes(situacion)) return null;
|
|
40963
|
+
return {
|
|
40964
|
+
sin_matricula: sinMatricula,
|
|
40965
|
+
encontrada: !sinMatricula && r.encontrada === true,
|
|
40966
|
+
coincide_nombre: typeof r.coincide_nombre === "boolean" ? r.coincide_nombre : null,
|
|
40967
|
+
situacion,
|
|
40968
|
+
sancion: r.sancion === true,
|
|
40969
|
+
profesion: texto(r.profesion),
|
|
40970
|
+
provincia: texto(r.provincia),
|
|
40971
|
+
emisor: texto(r.emisor)
|
|
40972
|
+
};
|
|
40973
|
+
}
|
|
40974
|
+
function observacionDe(r) {
|
|
40975
|
+
if (r.sin_matricula) return "sin_matricula";
|
|
40976
|
+
if (!r.encontrada) return "no_figura";
|
|
40977
|
+
if (r.coincide_nombre === false) return "otra_persona";
|
|
40978
|
+
if (r.sancion) return "sancion";
|
|
40979
|
+
if (r.situacion !== "habilitado") return "inhabilitada";
|
|
40980
|
+
return null;
|
|
40981
|
+
}
|
|
40982
|
+
var credencialProfesional = {
|
|
40983
|
+
clave: "credencial_profesional",
|
|
40984
|
+
nombre: "Credenciales del profesional",
|
|
40985
|
+
puesto: "Personal y profesionales",
|
|
40986
|
+
descripcion: "Lee en el sistema del hospital la matr\xEDcula de cada profesional con agenda y la verifica contra el registro nacional de profesionales de la salud (REFEPS). Si no figura, est\xE1 a nombre de otra persona, est\xE1 inhabilitada o falta cargarla, avisa al equipo con d\xF3nde se corrige. El puesto no escribe en el sistema.",
|
|
40987
|
+
inicial: "detectado",
|
|
40988
|
+
estados: ["detectado", "vigente", "observada", "corregida", "no_corresponde", "descartado"],
|
|
40989
|
+
finalesOk: ["vigente"],
|
|
40990
|
+
finalesNoOk: ["no_corresponde", "descartado"],
|
|
40991
|
+
minutosAbsorbidos: 8,
|
|
40992
|
+
transiciones: [
|
|
40993
|
+
{
|
|
40994
|
+
via: "verificar",
|
|
40995
|
+
de: ["detectado", "corregida"],
|
|
40996
|
+
a: (_caso, datos) => {
|
|
40997
|
+
const r = leerResultadoRegistro(datos.resultado);
|
|
40998
|
+
return r && observacionDe(r) === null ? "vigente" : "observada";
|
|
40999
|
+
},
|
|
41000
|
+
actor: ["agente", "humano", "sistema"],
|
|
41001
|
+
nivelRequerido: "observa",
|
|
41002
|
+
descripcion: "Informar lo que dijo el registro nacional sobre la matr\xEDcula del profesional; el plugin decide si est\xE1 vigente o qu\xE9 observaci\xF3n lleva.",
|
|
41003
|
+
validar: (caso, datos) => {
|
|
41004
|
+
const l = { ...caso.datos, ...datos };
|
|
41005
|
+
const r = leerResultadoRegistro(datos.resultado);
|
|
41006
|
+
const tipo = texto(datos.tipo_matricula);
|
|
41007
|
+
return [
|
|
41008
|
+
refExterna(l.profesional_id) ? ok("profesional_presente") : falla("profesional_presente", "verificar requiere profesional_id: el id del profesional en el sistema del hospital"),
|
|
41009
|
+
r ? ok("resultado_valido", r.sin_matricula ? "sin matr\xEDcula cargada" : r.encontrada ? `encontrada \xB7 ${r.situacion}` : "no encontrada") : falla("resultado_valido", "resultado tiene que ser el objeto que devuelve verificar-matriculas.mjs: {sin_matricula, encontrada, coincide_nombre, situacion, sancion, profesion, provincia, emisor}"),
|
|
41010
|
+
r && !r.sin_matricula && !(refExterna(datos.matricula) && tipo && TIPOS_MATRICULA.includes(tipo)) ? falla("matricula_consultada", `con matr\xEDcula cargada hacen falta matricula y tipo_matricula (${TIPOS_MATRICULA.join(" o ")})`) : ok("matricula_consultada"),
|
|
41011
|
+
texto(datos.lectura_id) ? ok("lectura_registrada") : falla("lectura_registrada", "verificar requiere lectura_id: la consulta al registro registrada con ops_registrar_accion"),
|
|
41012
|
+
texto(datos.fuente) ? ok("fuente_presente") : falla("fuente_presente", "fuente (registro consultado y fecha) es obligatoria")
|
|
41013
|
+
];
|
|
41014
|
+
}
|
|
41015
|
+
},
|
|
41016
|
+
{
|
|
41017
|
+
via: "corregir",
|
|
41018
|
+
de: ["observada"],
|
|
41019
|
+
a: "corregida",
|
|
41020
|
+
actor: ["humano"],
|
|
41021
|
+
cargaManual: true,
|
|
41022
|
+
descripcion: "Una persona del hospital corrigi\xF3 la ficha del profesional en el sistema. El puesto vuelve a verificar.",
|
|
41023
|
+
validar: (_caso, datos) => [
|
|
41024
|
+
texto(datos.accion_id) ? ok("accion_registrada") : falla("accion_registrada", "corregir requiere accion_id de la carga registrada")
|
|
41025
|
+
]
|
|
41026
|
+
},
|
|
41027
|
+
{
|
|
41028
|
+
via: "no_corresponde",
|
|
41029
|
+
de: ["observada"],
|
|
41030
|
+
a: "no_corresponde",
|
|
41031
|
+
actor: ["humano"],
|
|
41032
|
+
descripcion: "El equipo indica que la observaci\xF3n no aplica (por ejemplo, personal no matriculado o matr\xEDcula provincial confirmada con el colegio). Queda registrado con el motivo.",
|
|
41033
|
+
validar: (_caso, datos) => [texto(datos.motivo) ? ok("motivo_presente") : falla("motivo_presente", "no_corresponde requiere motivo")]
|
|
41034
|
+
},
|
|
41035
|
+
{
|
|
41036
|
+
via: "descartar",
|
|
41037
|
+
de: ["detectado", "observada", "corregida"],
|
|
41038
|
+
a: "descartado",
|
|
41039
|
+
actor: ["agente", "humano"],
|
|
41040
|
+
nivelRequerido: "observa",
|
|
41041
|
+
descripcion: "El profesional ya no est\xE1 activo en el sistema o no tiene agenda: no hay nada que verificar.",
|
|
41042
|
+
validar: (_caso, datos) => [texto(datos.motivo) ? ok("motivo_presente") : falla("motivo_presente", "descartar requiere motivo")]
|
|
41043
|
+
}
|
|
41044
|
+
]
|
|
41045
|
+
};
|
|
41046
|
+
var WORKFLOWS_SOLO_LECTURA = /* @__PURE__ */ new Set([cuentaCompleta.clave, facturacionPendiente.clave, credencialProfesional.clave]);
|
|
40861
41047
|
var WORKFLOWS = {
|
|
40862
41048
|
[actualizacionArancel.clave]: actualizacionArancel,
|
|
40863
41049
|
[tareaOperativa.clave]: tareaOperativa,
|
|
40864
41050
|
[recuperoTurno.clave]: recuperoTurno,
|
|
40865
|
-
[cuentaCompleta.clave]: cuentaCompleta
|
|
41051
|
+
[cuentaCompleta.clave]: cuentaCompleta,
|
|
41052
|
+
[facturacionPendiente.clave]: facturacionPendiente,
|
|
41053
|
+
[credencialProfesional.clave]: credencialProfesional
|
|
40866
41054
|
};
|
|
40867
41055
|
function getWorkflow(clave) {
|
|
40868
41056
|
return WORKFLOWS[clave] ?? null;
|
|
@@ -41075,14 +41263,30 @@ async function listarPoliticas(ctx, companyId) {
|
|
|
41075
41263
|
function describirOpciones(antes, despues) {
|
|
41076
41264
|
const partes = [];
|
|
41077
41265
|
if (Boolean(antes.ofrecer_primero) !== Boolean(despues.ofrecer_primero)) partes.push(`consultar al paciente antes de asignar: ${despues.ofrecer_primero ? "s\xED" : "no"}`);
|
|
41266
|
+
const plazosAntes = JSON.stringify(leerPlazos(antes.plazos));
|
|
41267
|
+
const plazosDespues = leerPlazos(despues.plazos);
|
|
41268
|
+
if (plazosAntes !== JSON.stringify(plazosDespues)) {
|
|
41269
|
+
const lista = Object.entries(plazosDespues).map(([os, d]) => `${os} ${d} d\xEDas`);
|
|
41270
|
+
partes.push(`plazos de presentaci\xF3n: ${lista.length ? lista.join(", ") : "ninguno fijado (se usa el habitual)"}`);
|
|
41271
|
+
}
|
|
41078
41272
|
return partes.length ? partes.join(" \xB7 ") : null;
|
|
41079
41273
|
}
|
|
41274
|
+
function leerPlazos(v) {
|
|
41275
|
+
if (!v || typeof v !== "object" || Array.isArray(v)) return {};
|
|
41276
|
+
const out = {};
|
|
41277
|
+
for (const [k, d] of Object.entries(v)) {
|
|
41278
|
+
const dias = typeof d === "number" ? d : typeof d === "string" ? Number(d) : NaN;
|
|
41279
|
+
if (k.trim() && Number.isInteger(dias) && dias > 0 && dias <= 730) out[k.trim().slice(0, 80)] = dias;
|
|
41280
|
+
}
|
|
41281
|
+
return out;
|
|
41282
|
+
}
|
|
41080
41283
|
async function cambiarPolitica(ctx, input2) {
|
|
41081
41284
|
if (!getWorkflow(input2.workflow)) throw new OpsError("workflow_desconocido", `workflow desconocido: ${input2.workflow}`);
|
|
41082
41285
|
if (input2.actor.tipo !== "humano") throw new OpsError("actor_no_permitido", "solo un humano puede cambiar la pol\xEDtica de un workflow");
|
|
41083
41286
|
const anterior = await obtenerModo(ctx, input2.companyId, input2.workflow);
|
|
41084
41287
|
const opcionesAntes = await obtenerOpciones(ctx, input2.companyId, input2.workflow);
|
|
41085
41288
|
const opciones = { ...opcionesAntes, ...input2.opciones ?? {} };
|
|
41289
|
+
if (opciones.plazos !== void 0) opciones.plazos = leerPlazos(opciones.plazos);
|
|
41086
41290
|
const cambioOpciones = describirOpciones(opcionesAntes, opciones);
|
|
41087
41291
|
const motivo = [input2.motivo ?? null, cambioOpciones].filter(Boolean).join(" \xB7 ") || null;
|
|
41088
41292
|
const existe = await ctx.db.query(
|
|
@@ -41182,11 +41386,16 @@ async function abrirCaso(ctx, input2) {
|
|
|
41182
41386
|
if (prev[0]) return { caso: mapCaso(prev[0]), creado: false };
|
|
41183
41387
|
}
|
|
41184
41388
|
const referencia = str(input2.referencia);
|
|
41185
|
-
if (wf.clave === "cuenta_completa") {
|
|
41389
|
+
if (wf.clave === "cuenta_completa" || wf.clave === "facturacion_pendiente") {
|
|
41186
41390
|
const bono = refExterna(input2.datos?.bono_id);
|
|
41187
|
-
if (!referencia || !/^bono:\S+$/.test(referencia)) throw new OpsError("referencia_requerida",
|
|
41391
|
+
if (!referencia || !/^bono:\S+$/.test(referencia)) throw new OpsError("referencia_requerida", `en ${wf.clave} la referencia es obligatoria: bono:<n\xFAmero de bono>`);
|
|
41188
41392
|
if (bono && referencia !== `bono:${bono}`) throw new OpsError("referencia_requerida", `la referencia ${referencia} no coincide con el bono_id ${bono}`);
|
|
41189
41393
|
}
|
|
41394
|
+
if (wf.clave === "credencial_profesional") {
|
|
41395
|
+
const prof = refExterna(input2.datos?.profesional_id);
|
|
41396
|
+
if (!referencia || !/^profesional:\S+$/.test(referencia)) throw new OpsError("referencia_requerida", "en credencial_profesional la referencia es obligatoria: profesional:<id del profesional>");
|
|
41397
|
+
if (prof && referencia !== `profesional:${prof}`) throw new OpsError("referencia_requerida", `la referencia ${referencia} no coincide con el profesional_id ${prof}`);
|
|
41398
|
+
}
|
|
41190
41399
|
if (referencia) {
|
|
41191
41400
|
const abiertos = await ctx.db.query(
|
|
41192
41401
|
`SELECT ${CASO_COLS} FROM ${t(ctx, "caso")} WHERE company_id = $1 AND workflow = $2 AND referencia = $3 AND cerrado_at IS NULL ORDER BY created_at DESC LIMIT 1`,
|
|
@@ -41232,6 +41441,10 @@ function ahoraEnHospital(ahora = /* @__PURE__ */ new Date()) {
|
|
|
41232
41441
|
async function contextoDe(ctx, companyId, caso, via, datos) {
|
|
41233
41442
|
const { hoy, hora, inicioDelDia } = ahoraEnHospital();
|
|
41234
41443
|
const contexto = { hoy, horaActual: hora };
|
|
41444
|
+
if (caso.workflow === "facturacion_pendiente") {
|
|
41445
|
+
contexto.plazosPresentacion = leerPlazos((await obtenerOpciones(ctx, companyId, caso.workflow)).plazos);
|
|
41446
|
+
return contexto;
|
|
41447
|
+
}
|
|
41235
41448
|
if (caso.workflow !== "recupero_turno") return contexto;
|
|
41236
41449
|
contexto.ofrecerPrimero = (await obtenerOpciones(ctx, companyId, caso.workflow)).ofrecer_primero === true;
|
|
41237
41450
|
if (via !== "proponer") return contexto;
|
|
@@ -41310,6 +41523,18 @@ async function transicionar(ctx, input2) {
|
|
|
41310
41523
|
datos.faltantes = leerFaltantes(datos.faltantes_leidos) ?? [];
|
|
41311
41524
|
delete datos.faltantes_leidos;
|
|
41312
41525
|
}
|
|
41526
|
+
if (caso.workflow === "credencial_profesional" && resultado.via === "verificar") {
|
|
41527
|
+
const r = leerResultadoRegistro(datos.resultado);
|
|
41528
|
+
if (r) {
|
|
41529
|
+
datos.resultado = r;
|
|
41530
|
+
datos.observacion = observacionDe(r);
|
|
41531
|
+
datos.verificada_el = contexto.hoy ?? null;
|
|
41532
|
+
}
|
|
41533
|
+
}
|
|
41534
|
+
if (caso.workflow === "facturacion_pendiente" && resultado.via === "observar") {
|
|
41535
|
+
const fecha = String(datos.fecha_prestacion ?? caso.datos.fecha_prestacion ?? "");
|
|
41536
|
+
Object.assign(datos, calcularVencimiento(fecha, datos.obra_social ?? caso.datos.obra_social, contexto));
|
|
41537
|
+
}
|
|
41313
41538
|
if (caso.workflow === "recupero_turno" && resultado.via === "no_acepta") {
|
|
41314
41539
|
const previas = Array.isArray(caso.datos.declinaron) ? caso.datos.declinaron.map((v) => refExterna(v)).filter((v) => v !== null) : [];
|
|
41315
41540
|
const esta = refExterna(caso.datos.solicitud_id);
|
|
@@ -41375,8 +41600,8 @@ async function registrarAccion(ctx, input2) {
|
|
|
41375
41600
|
if (!RESULTADOS_ACCION.includes(input2.resultado)) throw new OpsError("resultado_invalido", `resultado debe ser: ${RESULTADOS_ACCION.join(", ")}`);
|
|
41376
41601
|
const objetivo = str(input2.objetivo);
|
|
41377
41602
|
if (!objetivo) throw new OpsError("objetivo_requerido", "objetivo es obligatorio (qu\xE9 pantalla, endpoint o archivo se toc\xF3)");
|
|
41378
|
-
if (caso.workflow
|
|
41379
|
-
throw new OpsError("politica",
|
|
41603
|
+
if (WORKFLOWS_SOLO_LECTURA.has(caso.workflow) && input2.tipo === "escritura" && input2.actor.tipo === "agente") {
|
|
41604
|
+
throw new OpsError("politica", `en ${caso.workflow} el puesto solo lee: no registra escrituras sobre el sistema del hospital; eso lo hace el equipo`);
|
|
41380
41605
|
}
|
|
41381
41606
|
if (input2.tipo === "escritura" && input2.actor.tipo === "agente") {
|
|
41382
41607
|
const modo = await obtenerModo(ctx, input2.companyId, caso.workflow);
|
|
@@ -41465,6 +41690,8 @@ async function registrarCargaManual(ctx, input2) {
|
|
|
41465
41690
|
...caso.datos.valor_nuevo !== void 0 ? { valor_aprobado: caso.datos.valor_nuevo } : {},
|
|
41466
41691
|
...caso.datos.vigencia_desde !== void 0 ? { vigencia_desde: caso.datos.vigencia_desde } : {},
|
|
41467
41692
|
...caso.workflow === "cuenta_completa" ? { faltantes_que_completo: caso.datos.faltantes ?? [] } : {},
|
|
41693
|
+
...caso.workflow === "facturacion_pendiente" ? { bono: caso.datos.bono_numero ?? caso.datos.bono_id, vence_el: caso.datos.vence_el } : {},
|
|
41694
|
+
...caso.workflow === "credencial_profesional" ? { profesional: caso.datos.profesional ?? caso.datos.profesional_id, observacion_que_corrigio: caso.datos.observacion ?? null } : {},
|
|
41468
41695
|
...comentario ? { nota: comentario } : {}
|
|
41469
41696
|
},
|
|
41470
41697
|
detalle: comentario,
|
|
@@ -41678,13 +41905,13 @@ function errorParaAgente(err) {
|
|
|
41678
41905
|
}
|
|
41679
41906
|
|
|
41680
41907
|
// src/metricas.ts
|
|
41681
|
-
var CATALOGO_VERSION = "2026-10-15.
|
|
41908
|
+
var CATALOGO_VERSION = "2026-10-15.2";
|
|
41682
41909
|
var METRICAS = [
|
|
41683
41910
|
{ id: "turnos_dados", version: 1, estado: "validada", nombre: "Turnos dados", unidad: "turnos", definicion: "Turnos agendados en el per\xEDodo que no fueron cancelados ni bloqueados (incluye atendidos, ausentes y los que siguen pendientes)." },
|
|
41684
41911
|
{ id: "turnos_atendidos", version: 1, estado: "validada", nombre: "Turnos atendidos", unidad: "turnos", definicion: "Turnos en los que hubo atenci\xF3n: en atenci\xF3n, atendido o revisado por el profesional." },
|
|
41685
41912
|
{ id: "ausencias", version: 1, estado: "validada", nombre: "Ausencias", unidad: "turnos", definicion: "Turnos marcados como \xABno asisti\xF3\xBB." },
|
|
41686
41913
|
{ id: "ausentismo", version: 1, estado: "validada", nombre: "Ausentismo", unidad: "%", definicion: "Ausencias sobre turnos dados. Las cancelaciones no cuentan como ausencia. Los turnos que nadie cerr\xF3 no figuran como ausencia, as\xED que con muchos turnos sin cerrar el ausentismo real es mayor." },
|
|
41687
|
-
{ id: "turnos_sin_cerrar", version: 1, estado: "
|
|
41914
|
+
{ id: "turnos_sin_cerrar", version: 1, estado: "validada", nombre: "Turnos sin cerrar", unidad: "turnos", definicion: "Turnos con fecha ya pasada que siguen en \xABpendiente\xBB o \xABanunciado\xBB: nadie los cerr\xF3 como atendidos ni como ausentes." },
|
|
41688
41915
|
{ id: "cancelaciones", version: 1, estado: "validada", nombre: "Cancelaciones", unidad: "turnos", definicion: "Turnos cancelados del per\xEDodo." },
|
|
41689
41916
|
{ id: "cancelaciones_mismo_dia", version: 1, estado: "validada", nombre: "Cancelaciones del mismo d\xEDa", unidad: "turnos", definicion: "Turnos cancelados el mismo d\xEDa del turno (el cupo ya casi no se puede reutilizar). Es una aproximaci\xF3n: Alephoo no guarda la fecha de cancelaci\xF3n y se usa la \xFAltima modificaci\xF3n del turno." },
|
|
41690
41917
|
{ id: "tasa_cancelacion", version: 1, estado: "validada", nombre: "Tasa de cancelaci\xF3n", unidad: "%", definicion: "Cancelaciones sobre lo agendado (turnos dados m\xE1s cancelados)." },
|
|
@@ -41697,7 +41924,7 @@ var METRICAS = [
|
|
|
41697
41924
|
{ id: "deuda_pendiente", version: 1, estado: "validada", nombre: "Deuda pendiente", unidad: "$", definicion: "Saldo sin cobrar de las facturas emitidas en el per\xEDodo que siguen pendientes (facturado menos notas de cr\xE9dito, m\xE1s notas de d\xE9bito, menos lo cobrado)." },
|
|
41698
41925
|
{ id: "bonos_pendientes_de_facturar", version: 1, estado: "validada", nombre: "Bonos pendientes de facturar", unidad: "bonos", definicion: "Prestaciones (bonos) del per\xEDodo todav\xEDa no confirmadas o confirmadas y sin prefacturar ni facturar." },
|
|
41699
41926
|
{ id: "monto_pendiente_de_facturar", version: 1, estado: "validada", nombre: "Monto pendiente de facturar", unidad: "$", definicion: "Importe de los bonos pendientes de facturar del per\xEDodo, por fecha de la prestaci\xF3n." },
|
|
41700
|
-
{ id: "debitos_financiador", version: 1, estado: "a_definir", nombre: "D\xE9bitos de financiadores", unidad: "$", definicion: "
|
|
41927
|
+
{ id: "debitos_financiador", version: 1, estado: "a_definir", nombre: "D\xE9bitos de financiadores", unidad: "$", definicion: "No se puede calcular desde Alephoo: una nota de cr\xE9dito puede responder a un d\xE9bito del financiador o a un error de facturaci\xF3n, y Alephoo no guarda cu\xE1l es (Federico Calle, 15/10/2026). Los tableros muestran \xABnotas de cr\xE9dito\xBB, que s\xED es certificada; este n\xFAmero no se publica como oficial." }
|
|
41701
41928
|
];
|
|
41702
41929
|
function metricaPorId(id) {
|
|
41703
41930
|
return METRICAS.find((m) => m.id === id) ?? null;
|
|
@@ -42227,7 +42454,7 @@ async function manejarApi(ctx, input2) {
|
|
|
42227
42454
|
return respuesta(200, await transicionar(ctx, { companyId, casoId: input2.params.casoId ?? "", via: "no_corresponde", motivo: motivoConPersona(str2(body.motivo)), datos: conPersona(obj(body.datos)), idempotencyKey: str2(body.idempotencyKey), actor }));
|
|
42228
42455
|
}
|
|
42229
42456
|
case "version":
|
|
42230
|
-
return respuesta(200, { version: manifest_default.version, capacidades: ["carga-manual", "recupero-turnos", "ofrecer-primero", "cuenta-completa", "metricas-certificadas"], workflows: listarWorkflows().map((w) => w.clave) });
|
|
42457
|
+
return respuesta(200, { version: manifest_default.version, capacidades: ["carga-manual", "recupero-turnos", "ofrecer-primero", "cuenta-completa", "metricas-certificadas", "facturacion-pendiente", "credenciales"], workflows: listarWorkflows().map((w) => w.clave) });
|
|
42231
42458
|
case "politicas":
|
|
42232
42459
|
return respuesta(200, { politicas: await listarPoliticas(ctx, companyId) });
|
|
42233
42460
|
case "serie":
|
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.11",
|
|
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": [
|