paperclip-plugin-autopilot-ops 0.1.16 → 0.1.18
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 +8 -8
- package/dist/ui/index.js +9 -9
- package/dist/worker.js +122 -36
- 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.18";
|
|
4
4
|
var DB_NAMESPACE_SLUG = "autopilot_ops";
|
|
5
5
|
var PAGE_ROUTE = "autopilot";
|
|
6
6
|
var TOOL_NAMES = {
|
|
@@ -76,7 +76,7 @@ var manifest = {
|
|
|
76
76
|
{
|
|
77
77
|
name: TOOL_NAMES.listarReglas,
|
|
78
78
|
displayName: "Listar reglas",
|
|
79
|
-
description: "Lista las reglas que
|
|
79
|
+
description: "Lista las reglas que la instituci\xF3n arm\xF3 para un puesto (demanda_pendiente): tipo, par\xE1metros, contacto (canal, intentos, horario), cierre, estado y versi\xF3n. Filtro opcional: estado (activa). Solo lectura: las reglas las crea y activa la instituci\xF3n desde el portal.",
|
|
80
80
|
parametersSchema: {
|
|
81
81
|
type: "object",
|
|
82
82
|
properties: {
|
|
@@ -88,7 +88,7 @@ var manifest = {
|
|
|
88
88
|
{
|
|
89
89
|
name: TOOL_NAMES.informarPruebaRegla,
|
|
90
90
|
displayName: "Informar prueba de regla",
|
|
91
|
-
description: "Informa el resultado de probar una regla sobre los datos reales: a cu\xE1ntos pacientes alcanza hoy (alcanza) y hasta 10 referencias de muestra (orden:<id>, solicitud:<id>, control:<persona>:<regla>; nunca datos personales). Sin esta prueba de la versi\xF3n vigente,
|
|
91
|
+
description: "Informa el resultado de probar una regla sobre los datos reales: a cu\xE1ntos pacientes alcanza hoy (alcanza) y hasta 10 referencias de muestra (orden:<id>, solicitud:<id>, control:<persona>:<regla>; nunca datos personales). Sin esta prueba de la versi\xF3n vigente, la instituci\xF3n no puede activar la regla.",
|
|
92
92
|
parametersSchema: {
|
|
93
93
|
type: "object",
|
|
94
94
|
properties: {
|
|
@@ -113,7 +113,7 @@ var manifest = {
|
|
|
113
113
|
{
|
|
114
114
|
name: TOOL_NAMES.abrirCaso,
|
|
115
115
|
displayName: "Abrir caso",
|
|
116
|
-
description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `demanda_pendiente` (referencia obligatoria `orden:<id>`, `solicitud:<id>` o `control:<persona_id>:<regla_id>`; datos: regla_id obligatorio y la regla tiene que estar activa, persona_id, tipo de origen, estudio o especialidad o prestacion, fecha_origen AAAA-MM-DD, dias; el plugin fija regla_version, canal, intentos, vence_el; nunca nombre, documento ni tel\xE9fono del paciente),`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
|
|
116
|
+
description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `demanda_pendiente` (referencia obligatoria `orden:<id>`, `solicitud:<id>` o `control:<persona_id>:<regla_id>`; datos: regla_id obligatorio y la regla tiene que estar activa, persona_id, tipo de origen, estudio o especialidad o prestacion, fecha_origen AAAA-MM-DD, dias; el plugin fija regla_version, canal, intentos, vence_el; nunca nombre, documento ni tel\xE9fono del paciente),`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 de la instituci\xF3n), 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.',
|
|
117
117
|
parametersSchema: {
|
|
118
118
|
type: "object",
|
|
119
119
|
properties: {
|
|
@@ -130,7 +130,7 @@ var manifest = {
|
|
|
130
130
|
{
|
|
131
131
|
name: TOOL_NAMES.transicionar,
|
|
132
132
|
displayName: "Transicionar caso",
|
|
133
|
-
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
|
|
133
|
+
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 de la instituci\xF3n 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 `demanda_pendiente`: `contactar` (nivel ejecuta; datos: canal igual al de la regla y accion_id de la escritura registrada; el plugin controla regla activa, intentos, espera entre intentos y horario), `responder` (respuesta: acepta|rechaza|no_contesta), `comprobar` (lectura_id de la relectura del HIS, turno_id y turno_estado del turno encontrado), `cerrar` (motivo; solo con los intentos agotados o el plazo vencido), `descartar` (motivo). `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.',
|
|
134
134
|
parametersSchema: {
|
|
135
135
|
type: "object",
|
|
136
136
|
properties: {
|
|
@@ -146,13 +146,13 @@ var manifest = {
|
|
|
146
146
|
{
|
|
147
147
|
name: TOOL_NAMES.registrarAccion,
|
|
148
148
|
displayName: "Registrar acci\xF3n",
|
|
149
|
-
description: "Registra una acci\xF3n ejecutada sobre un sistema externo (lectura, escritura o verificaci\xF3n) con su evidencia. Toda acci\xF3n sobre el
|
|
149
|
+
description: "Registra una acci\xF3n ejecutada sobre un sistema externo (lectura, escritura o verificaci\xF3n) con su evidencia. Toda acci\xF3n sobre el HIS debe quedar registrada ac\xE1.",
|
|
150
150
|
parametersSchema: {
|
|
151
151
|
type: "object",
|
|
152
152
|
properties: {
|
|
153
153
|
casoId: { type: "string" },
|
|
154
154
|
tipo: { type: "string", enum: ["lectura", "escritura", "verificacion"] },
|
|
155
|
-
conector: { type: "string", enum: ["api", "base", "archivo", "pantalla", "manual"], description: "Por d\xF3nde se ley\xF3 o escribi\xF3: api, base (lectura de la base de datos del
|
|
155
|
+
conector: { type: "string", enum: ["api", "base", "archivo", "pantalla", "manual"], description: "Por d\xF3nde se ley\xF3 o escribi\xF3: api, base (lectura de la base de datos del HIS), archivo, pantalla o manual." },
|
|
156
156
|
objetivo: { type: "string" },
|
|
157
157
|
resultado: { type: "string", enum: ["ok", "error", "pendiente"] },
|
|
158
158
|
evidencia: { type: "object" },
|
|
@@ -178,7 +178,7 @@ var manifest = {
|
|
|
178
178
|
{
|
|
179
179
|
name: TOOL_NAMES.publicarTablero,
|
|
180
180
|
displayName: "Publicar tablero",
|
|
181
|
-
description: "Publica o actualiza un tablero de gesti\xF3n para la direcci\xF3n
|
|
181
|
+
description: "Publica o actualiza un tablero de gesti\xF3n para la direcci\xF3n de la instituci\xF3n, armado sobre datos reales del HIS (turnos, facturaci\xF3n, internaci\xF3n, producci\xF3n). `clave` identifica el tablero de forma estable (min\xFAsculas y guiones; volver a publicar con la misma clave lo actualiza en el lugar). `widgets` es la lista de piezas que se muestran, en orden: {tipo:'indicador', etiqueta, valor, unidad?, contexto?, tono?: neutro|ambar|senal|corte} \xB7 {tipo:'barras', titulo, unidad?, series:[{etiqueta, valor}]} \xB7 {tipo:'linea', titulo, unidad?, puntos:[{x, y}]} \xB7 {tipo:'tabla', titulo, columnas:[\u2026], filas:[[\u2026]]} \xB7 {tipo:'texto', titulo?, texto}. Cada widget admite `ancho` 1, 2 o 3 (columnas de 3). **N\xFAmeros oficiales:** cada indicador, barras, l\xEDnea o tabla calculado con calcular.mjs lleva `calculo` = el bloque `calculo` que devuelve calcular.mjs, tal cual (cat\xE1logo, m\xE9tricas con versi\xF3n, par\xE1metros, huella, consulta); el plugin lo valida contra el cat\xE1logo de m\xE9tricas y marca el widget como certificado, propuesta (m\xE9trica sin aprobar) o exploratorio (sin `calculo`). Controles que frenan la publicaci\xF3n: una tabla con fila \xABTOTAL\xBB tiene que sumar ese total en cada columna num\xE9rica (las filas \xABSubtotal \u2026\xBB no suman); un desglose con `calculo` y `por` lleva la fila TOTAL; un porcentaje (`unidad` '%' o columna con '%') va de 0 a 100 salvo que el t\xEDtulo diga variaci\xF3n, diferencia o cumplimiento de meta. `fuentes` lista qu\xE9 se consult\xF3 (p. ej. 'Alephoo \xB7 base \xB7 semantica_turnos \xB7 turnos 01/09\u201330/09'). Si el pedido vino de una tarea, pasar `issueId`.",
|
|
182
182
|
parametersSchema: {
|
|
183
183
|
type: "object",
|
|
184
184
|
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.18";
|
|
12
12
|
var DB_NAMESPACE_SLUG = "autopilot_ops";
|
|
13
13
|
var PAGE_ROUTE = "autopilot";
|
|
14
14
|
var TOOL_NAMES = {
|
|
@@ -84,7 +84,7 @@ var manifest = {
|
|
|
84
84
|
{
|
|
85
85
|
name: TOOL_NAMES.listarReglas,
|
|
86
86
|
displayName: "Listar reglas",
|
|
87
|
-
description: "Lista las reglas que
|
|
87
|
+
description: "Lista las reglas que la instituci\xF3n arm\xF3 para un puesto (demanda_pendiente): tipo, par\xE1metros, contacto (canal, intentos, horario), cierre, estado y versi\xF3n. Filtro opcional: estado (activa). Solo lectura: las reglas las crea y activa la instituci\xF3n desde el portal.",
|
|
88
88
|
parametersSchema: {
|
|
89
89
|
type: "object",
|
|
90
90
|
properties: {
|
|
@@ -96,7 +96,7 @@ var manifest = {
|
|
|
96
96
|
{
|
|
97
97
|
name: TOOL_NAMES.informarPruebaRegla,
|
|
98
98
|
displayName: "Informar prueba de regla",
|
|
99
|
-
description: "Informa el resultado de probar una regla sobre los datos reales: a cu\xE1ntos pacientes alcanza hoy (alcanza) y hasta 10 referencias de muestra (orden:<id>, solicitud:<id>, control:<persona>:<regla>; nunca datos personales). Sin esta prueba de la versi\xF3n vigente,
|
|
99
|
+
description: "Informa el resultado de probar una regla sobre los datos reales: a cu\xE1ntos pacientes alcanza hoy (alcanza) y hasta 10 referencias de muestra (orden:<id>, solicitud:<id>, control:<persona>:<regla>; nunca datos personales). Sin esta prueba de la versi\xF3n vigente, la instituci\xF3n no puede activar la regla.",
|
|
100
100
|
parametersSchema: {
|
|
101
101
|
type: "object",
|
|
102
102
|
properties: {
|
|
@@ -121,7 +121,7 @@ var manifest = {
|
|
|
121
121
|
{
|
|
122
122
|
name: TOOL_NAMES.abrirCaso,
|
|
123
123
|
displayName: "Abrir caso",
|
|
124
|
-
description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `demanda_pendiente` (referencia obligatoria `orden:<id>`, `solicitud:<id>` o `control:<persona_id>:<regla_id>`; datos: regla_id obligatorio y la regla tiene que estar activa, persona_id, tipo de origen, estudio o especialidad o prestacion, fecha_origen AAAA-MM-DD, dias; el plugin fija regla_version, canal, intentos, vence_el; nunca nombre, documento ni tel\xE9fono del paciente),`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
|
|
124
|
+
description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `demanda_pendiente` (referencia obligatoria `orden:<id>`, `solicitud:<id>` o `control:<persona_id>:<regla_id>`; datos: regla_id obligatorio y la regla tiene que estar activa, persona_id, tipo de origen, estudio o especialidad o prestacion, fecha_origen AAAA-MM-DD, dias; el plugin fija regla_version, canal, intentos, vence_el; nunca nombre, documento ni tel\xE9fono del paciente),`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 de la instituci\xF3n), 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.',
|
|
125
125
|
parametersSchema: {
|
|
126
126
|
type: "object",
|
|
127
127
|
properties: {
|
|
@@ -138,7 +138,7 @@ var manifest = {
|
|
|
138
138
|
{
|
|
139
139
|
name: TOOL_NAMES.transicionar,
|
|
140
140
|
displayName: "Transicionar caso",
|
|
141
|
-
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
|
|
141
|
+
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 de la instituci\xF3n 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 `demanda_pendiente`: `contactar` (nivel ejecuta; datos: canal igual al de la regla y accion_id de la escritura registrada; el plugin controla regla activa, intentos, espera entre intentos y horario), `responder` (respuesta: acepta|rechaza|no_contesta), `comprobar` (lectura_id de la relectura del HIS, turno_id y turno_estado del turno encontrado), `cerrar` (motivo; solo con los intentos agotados o el plazo vencido), `descartar` (motivo). `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.',
|
|
142
142
|
parametersSchema: {
|
|
143
143
|
type: "object",
|
|
144
144
|
properties: {
|
|
@@ -154,13 +154,13 @@ var manifest = {
|
|
|
154
154
|
{
|
|
155
155
|
name: TOOL_NAMES.registrarAccion,
|
|
156
156
|
displayName: "Registrar acci\xF3n",
|
|
157
|
-
description: "Registra una acci\xF3n ejecutada sobre un sistema externo (lectura, escritura o verificaci\xF3n) con su evidencia. Toda acci\xF3n sobre el
|
|
157
|
+
description: "Registra una acci\xF3n ejecutada sobre un sistema externo (lectura, escritura o verificaci\xF3n) con su evidencia. Toda acci\xF3n sobre el HIS debe quedar registrada ac\xE1.",
|
|
158
158
|
parametersSchema: {
|
|
159
159
|
type: "object",
|
|
160
160
|
properties: {
|
|
161
161
|
casoId: { type: "string" },
|
|
162
162
|
tipo: { type: "string", enum: ["lectura", "escritura", "verificacion"] },
|
|
163
|
-
conector: { type: "string", enum: ["api", "base", "archivo", "pantalla", "manual"], description: "Por d\xF3nde se ley\xF3 o escribi\xF3: api, base (lectura de la base de datos del
|
|
163
|
+
conector: { type: "string", enum: ["api", "base", "archivo", "pantalla", "manual"], description: "Por d\xF3nde se ley\xF3 o escribi\xF3: api, base (lectura de la base de datos del HIS), archivo, pantalla o manual." },
|
|
164
164
|
objetivo: { type: "string" },
|
|
165
165
|
resultado: { type: "string", enum: ["ok", "error", "pendiente"] },
|
|
166
166
|
evidencia: { type: "object" },
|
|
@@ -186,7 +186,7 @@ var manifest = {
|
|
|
186
186
|
{
|
|
187
187
|
name: TOOL_NAMES.publicarTablero,
|
|
188
188
|
displayName: "Publicar tablero",
|
|
189
|
-
description: "Publica o actualiza un tablero de gesti\xF3n para la direcci\xF3n
|
|
189
|
+
description: "Publica o actualiza un tablero de gesti\xF3n para la direcci\xF3n de la instituci\xF3n, armado sobre datos reales del HIS (turnos, facturaci\xF3n, internaci\xF3n, producci\xF3n). `clave` identifica el tablero de forma estable (min\xFAsculas y guiones; volver a publicar con la misma clave lo actualiza en el lugar). `widgets` es la lista de piezas que se muestran, en orden: {tipo:'indicador', etiqueta, valor, unidad?, contexto?, tono?: neutro|ambar|senal|corte} \xB7 {tipo:'barras', titulo, unidad?, series:[{etiqueta, valor}]} \xB7 {tipo:'linea', titulo, unidad?, puntos:[{x, y}]} \xB7 {tipo:'tabla', titulo, columnas:[\u2026], filas:[[\u2026]]} \xB7 {tipo:'texto', titulo?, texto}. Cada widget admite `ancho` 1, 2 o 3 (columnas de 3). **N\xFAmeros oficiales:** cada indicador, barras, l\xEDnea o tabla calculado con calcular.mjs lleva `calculo` = el bloque `calculo` que devuelve calcular.mjs, tal cual (cat\xE1logo, m\xE9tricas con versi\xF3n, par\xE1metros, huella, consulta); el plugin lo valida contra el cat\xE1logo de m\xE9tricas y marca el widget como certificado, propuesta (m\xE9trica sin aprobar) o exploratorio (sin `calculo`). Controles que frenan la publicaci\xF3n: una tabla con fila \xABTOTAL\xBB tiene que sumar ese total en cada columna num\xE9rica (las filas \xABSubtotal \u2026\xBB no suman); un desglose con `calculo` y `por` lleva la fila TOTAL; un porcentaje (`unidad` '%' o columna con '%') va de 0 a 100 salvo que el t\xEDtulo diga variaci\xF3n, diferencia o cumplimiento de meta. `fuentes` lista qu\xE9 se consult\xF3 (p. ej. 'Alephoo \xB7 base \xB7 semantica_turnos \xB7 turnos 01/09\u201330/09'). Si el pedido vino de una tarea, pasar `issueId`.",
|
|
190
190
|
parametersSchema: {
|
|
191
191
|
type: "object",
|
|
192
192
|
properties: {
|
|
@@ -413,7 +413,7 @@ var MODOS = [
|
|
|
413
413
|
{ valor: "corte", etiqueta: "Corte", ayuda: "Los agentes no pueden abrir ni mover casos." },
|
|
414
414
|
{ valor: "observa", etiqueta: "Observa", ayuda: "Los agentes leen, registran y verifican; no proponen." },
|
|
415
415
|
{ valor: "propone", etiqueta: "Propone", ayuda: "Los agentes proponen; un humano aprueba y aplica." },
|
|
416
|
-
{ valor: "ejecuta", etiqueta: "Ejecuta", ayuda: "Los agentes aplican lo aprobado en el
|
|
416
|
+
{ valor: "ejecuta", etiqueta: "Ejecuta", ayuda: "Los agentes aplican lo aprobado en el HIS." },
|
|
417
417
|
{ valor: "autonomo", etiqueta: "Aut\xF3nomo", ayuda: "Aprobaci\xF3n autom\xE1tica salvo excepciones (variaci\xF3n alta, sin valor actual, reintento, baja de valor)." }
|
|
418
418
|
];
|
|
419
419
|
var fuente = 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif';
|
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.18";
|
|
39936
39936
|
var DB_NAMESPACE_SLUG = "autopilot_ops";
|
|
39937
39937
|
var PAGE_ROUTE = "autopilot";
|
|
39938
39938
|
var TOOL_NAMES = {
|
|
@@ -40008,7 +40008,7 @@ var manifest = {
|
|
|
40008
40008
|
{
|
|
40009
40009
|
name: TOOL_NAMES.listarReglas,
|
|
40010
40010
|
displayName: "Listar reglas",
|
|
40011
|
-
description: "Lista las reglas que
|
|
40011
|
+
description: "Lista las reglas que la instituci\xF3n arm\xF3 para un puesto (demanda_pendiente): tipo, par\xE1metros, contacto (canal, intentos, horario), cierre, estado y versi\xF3n. Filtro opcional: estado (activa). Solo lectura: las reglas las crea y activa la instituci\xF3n desde el portal.",
|
|
40012
40012
|
parametersSchema: {
|
|
40013
40013
|
type: "object",
|
|
40014
40014
|
properties: {
|
|
@@ -40020,7 +40020,7 @@ var manifest = {
|
|
|
40020
40020
|
{
|
|
40021
40021
|
name: TOOL_NAMES.informarPruebaRegla,
|
|
40022
40022
|
displayName: "Informar prueba de regla",
|
|
40023
|
-
description: "Informa el resultado de probar una regla sobre los datos reales: a cu\xE1ntos pacientes alcanza hoy (alcanza) y hasta 10 referencias de muestra (orden:<id>, solicitud:<id>, control:<persona>:<regla>; nunca datos personales). Sin esta prueba de la versi\xF3n vigente,
|
|
40023
|
+
description: "Informa el resultado de probar una regla sobre los datos reales: a cu\xE1ntos pacientes alcanza hoy (alcanza) y hasta 10 referencias de muestra (orden:<id>, solicitud:<id>, control:<persona>:<regla>; nunca datos personales). Sin esta prueba de la versi\xF3n vigente, la instituci\xF3n no puede activar la regla.",
|
|
40024
40024
|
parametersSchema: {
|
|
40025
40025
|
type: "object",
|
|
40026
40026
|
properties: {
|
|
@@ -40045,7 +40045,7 @@ var manifest = {
|
|
|
40045
40045
|
{
|
|
40046
40046
|
name: TOOL_NAMES.abrirCaso,
|
|
40047
40047
|
displayName: "Abrir caso",
|
|
40048
|
-
description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `demanda_pendiente` (referencia obligatoria `orden:<id>`, `solicitud:<id>` o `control:<persona_id>:<regla_id>`; datos: regla_id obligatorio y la regla tiene que estar activa, persona_id, tipo de origen, estudio o especialidad o prestacion, fecha_origen AAAA-MM-DD, dias; el plugin fija regla_version, canal, intentos, vence_el; nunca nombre, documento ni tel\xE9fono del paciente),`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
|
|
40048
|
+
description: 'Abre un caso nuevo en un workflow, en su estado inicial. Workflows: `demanda_pendiente` (referencia obligatoria `orden:<id>`, `solicitud:<id>` o `control:<persona_id>:<regla_id>`; datos: regla_id obligatorio y la regla tiene que estar activa, persona_id, tipo de origen, estudio o especialidad o prestacion, fecha_origen AAAA-MM-DD, dias; el plugin fija regla_version, canal, intentos, vence_el; nunca nombre, documento ni tel\xE9fono del paciente),`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 de la instituci\xF3n), 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.',
|
|
40049
40049
|
parametersSchema: {
|
|
40050
40050
|
type: "object",
|
|
40051
40051
|
properties: {
|
|
@@ -40062,7 +40062,7 @@ var manifest = {
|
|
|
40062
40062
|
{
|
|
40063
40063
|
name: TOOL_NAMES.transicionar,
|
|
40064
40064
|
displayName: "Transicionar caso",
|
|
40065
|
-
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
|
|
40065
|
+
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 de la instituci\xF3n 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 `demanda_pendiente`: `contactar` (nivel ejecuta; datos: canal igual al de la regla y accion_id de la escritura registrada; el plugin controla regla activa, intentos, espera entre intentos y horario), `responder` (respuesta: acepta|rechaza|no_contesta), `comprobar` (lectura_id de la relectura del HIS, turno_id y turno_estado del turno encontrado), `cerrar` (motivo; solo con los intentos agotados o el plazo vencido), `descartar` (motivo). `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.',
|
|
40066
40066
|
parametersSchema: {
|
|
40067
40067
|
type: "object",
|
|
40068
40068
|
properties: {
|
|
@@ -40078,13 +40078,13 @@ var manifest = {
|
|
|
40078
40078
|
{
|
|
40079
40079
|
name: TOOL_NAMES.registrarAccion,
|
|
40080
40080
|
displayName: "Registrar acci\xF3n",
|
|
40081
|
-
description: "Registra una acci\xF3n ejecutada sobre un sistema externo (lectura, escritura o verificaci\xF3n) con su evidencia. Toda acci\xF3n sobre el
|
|
40081
|
+
description: "Registra una acci\xF3n ejecutada sobre un sistema externo (lectura, escritura o verificaci\xF3n) con su evidencia. Toda acci\xF3n sobre el HIS debe quedar registrada ac\xE1.",
|
|
40082
40082
|
parametersSchema: {
|
|
40083
40083
|
type: "object",
|
|
40084
40084
|
properties: {
|
|
40085
40085
|
casoId: { type: "string" },
|
|
40086
40086
|
tipo: { type: "string", enum: ["lectura", "escritura", "verificacion"] },
|
|
40087
|
-
conector: { type: "string", enum: ["api", "base", "archivo", "pantalla", "manual"], description: "Por d\xF3nde se ley\xF3 o escribi\xF3: api, base (lectura de la base de datos del
|
|
40087
|
+
conector: { type: "string", enum: ["api", "base", "archivo", "pantalla", "manual"], description: "Por d\xF3nde se ley\xF3 o escribi\xF3: api, base (lectura de la base de datos del HIS), archivo, pantalla o manual." },
|
|
40088
40088
|
objetivo: { type: "string" },
|
|
40089
40089
|
resultado: { type: "string", enum: ["ok", "error", "pendiente"] },
|
|
40090
40090
|
evidencia: { type: "object" },
|
|
@@ -40110,7 +40110,7 @@ var manifest = {
|
|
|
40110
40110
|
{
|
|
40111
40111
|
name: TOOL_NAMES.publicarTablero,
|
|
40112
40112
|
displayName: "Publicar tablero",
|
|
40113
|
-
description: "Publica o actualiza un tablero de gesti\xF3n para la direcci\xF3n
|
|
40113
|
+
description: "Publica o actualiza un tablero de gesti\xF3n para la direcci\xF3n de la instituci\xF3n, armado sobre datos reales del HIS (turnos, facturaci\xF3n, internaci\xF3n, producci\xF3n). `clave` identifica el tablero de forma estable (min\xFAsculas y guiones; volver a publicar con la misma clave lo actualiza en el lugar). `widgets` es la lista de piezas que se muestran, en orden: {tipo:'indicador', etiqueta, valor, unidad?, contexto?, tono?: neutro|ambar|senal|corte} \xB7 {tipo:'barras', titulo, unidad?, series:[{etiqueta, valor}]} \xB7 {tipo:'linea', titulo, unidad?, puntos:[{x, y}]} \xB7 {tipo:'tabla', titulo, columnas:[\u2026], filas:[[\u2026]]} \xB7 {tipo:'texto', titulo?, texto}. Cada widget admite `ancho` 1, 2 o 3 (columnas de 3). **N\xFAmeros oficiales:** cada indicador, barras, l\xEDnea o tabla calculado con calcular.mjs lleva `calculo` = el bloque `calculo` que devuelve calcular.mjs, tal cual (cat\xE1logo, m\xE9tricas con versi\xF3n, par\xE1metros, huella, consulta); el plugin lo valida contra el cat\xE1logo de m\xE9tricas y marca el widget como certificado, propuesta (m\xE9trica sin aprobar) o exploratorio (sin `calculo`). Controles que frenan la publicaci\xF3n: una tabla con fila \xABTOTAL\xBB tiene que sumar ese total en cada columna num\xE9rica (las filas \xABSubtotal \u2026\xBB no suman); un desglose con `calculo` y `por` lleva la fila TOTAL; un porcentaje (`unidad` '%' o columna con '%') va de 0 a 100 salvo que el t\xEDtulo diga variaci\xF3n, diferencia o cumplimiento de meta. `fuentes` lista qu\xE9 se consult\xF3 (p. ej. 'Alephoo \xB7 base \xB7 semantica_turnos \xB7 turnos 01/09\u201330/09'). Si el pedido vino de una tarea, pasar `issueId`.",
|
|
40114
40114
|
parametersSchema: {
|
|
40115
40115
|
type: "object",
|
|
40116
40116
|
properties: {
|
|
@@ -40418,7 +40418,7 @@ var actualizacionArancel = {
|
|
|
40418
40418
|
de: ["pendiente_aprobacion"],
|
|
40419
40419
|
a: "aprobado",
|
|
40420
40420
|
actor: ["humano"],
|
|
40421
|
-
descripcion: "Aprobaci\xF3n del responsable
|
|
40421
|
+
descripcion: "Aprobaci\xF3n del responsable de la instituci\xF3n."
|
|
40422
40422
|
},
|
|
40423
40423
|
{
|
|
40424
40424
|
via: "rechazar",
|
|
@@ -40682,7 +40682,7 @@ var recuperoTurno = {
|
|
|
40682
40682
|
de: ["pendiente_aprobacion"],
|
|
40683
40683
|
a: "aprobado",
|
|
40684
40684
|
actor: ["humano"],
|
|
40685
|
-
descripcion: "Aprobaci\xF3n del responsable
|
|
40685
|
+
descripcion: "Aprobaci\xF3n del responsable de la instituci\xF3n."
|
|
40686
40686
|
},
|
|
40687
40687
|
{
|
|
40688
40688
|
via: "rechazar",
|
|
@@ -40857,7 +40857,7 @@ var cuentaCompleta = {
|
|
|
40857
40857
|
clave: "cuenta_completa",
|
|
40858
40858
|
nombre: "Cuenta completa antes de facturar",
|
|
40859
40859
|
puesto: "Admisi\xF3n y cuenta",
|
|
40860
|
-
descripcion: "Lee en el
|
|
40860
|
+
descripcion: "Lee en el HIS cada prestaci\xF3n pendiente de facturar y marca lo que le falta para facturarse sin d\xE9bito (autorizaci\xF3n, validaci\xF3n, afiliado, orden, valor, epicrisis). El equipo lo completa y el puesto lo comprueba volviendo a leer. El puesto no escribe en el sistema.",
|
|
40861
40861
|
inicial: "detectado",
|
|
40862
40862
|
estados: ["detectado", "para_completar", "completado", "con_faltantes", "completa", "facturado_incompleto", "no_corresponde", "descartado"],
|
|
40863
40863
|
finalesOk: ["completa"],
|
|
@@ -40875,7 +40875,7 @@ var cuentaCompleta = {
|
|
|
40875
40875
|
const l = { ...caso.datos, ...datos };
|
|
40876
40876
|
const estado = estadoBono(datos.bono_estado);
|
|
40877
40877
|
return [
|
|
40878
|
-
refExterna(l.bono_id) ? ok("bono_presente") : falla("bono_presente", "observar requiere bono_id: el n\xFAmero de bono en el
|
|
40878
|
+
refExterna(l.bono_id) ? ok("bono_presente") : falla("bono_presente", "observar requiere bono_id: el n\xFAmero de bono en el HIS"),
|
|
40879
40879
|
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"}`),
|
|
40880
40880
|
validarFaltantes("faltantes", datos.faltantes, true),
|
|
40881
40881
|
texto(datos.lectura_id) ? ok("lectura_registrada") : falla("lectura_registrada", "observar requiere lectura_id: la lectura de la base registrada con ops_registrar_accion"),
|
|
@@ -40889,7 +40889,7 @@ var cuentaCompleta = {
|
|
|
40889
40889
|
a: "completado",
|
|
40890
40890
|
actor: ["humano"],
|
|
40891
40891
|
cargaManual: true,
|
|
40892
|
-
descripcion: "Una persona
|
|
40892
|
+
descripcion: "Una persona de la instituci\xF3n complet\xF3 en el HIS lo que faltaba. El puesto lo comprueba volviendo a leer.",
|
|
40893
40893
|
validar: (_caso, datos) => [
|
|
40894
40894
|
texto(datos.accion_id) ? ok("accion_registrada") : falla("accion_registrada", "completar requiere accion_id de la carga registrada")
|
|
40895
40895
|
]
|
|
@@ -40951,7 +40951,7 @@ var facturacionPendiente = {
|
|
|
40951
40951
|
clave: "facturacion_pendiente",
|
|
40952
40952
|
nombre: "Prestaciones sin facturar",
|
|
40953
40953
|
puesto: "Admisi\xF3n y cuenta",
|
|
40954
|
-
descripcion: "Lee en el
|
|
40954
|
+
descripcion: "Lee en el HIS 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.",
|
|
40955
40955
|
inicial: "detectado",
|
|
40956
40956
|
estados: ["detectado", "por_presentar", "en_prefactura", "presentado", "facturada", "no_corresponde", "descartado"],
|
|
40957
40957
|
finalesOk: ["facturada"],
|
|
@@ -40970,7 +40970,7 @@ var facturacionPendiente = {
|
|
|
40970
40970
|
const estado = estadoBono(datos.bono_estado);
|
|
40971
40971
|
const fecha = fechaISO(l.fecha_prestacion) ? String(l.fecha_prestacion) : null;
|
|
40972
40972
|
return [
|
|
40973
|
-
refExterna(l.bono_id) ? ok("bono_presente") : falla("bono_presente", "observar requiere bono_id: el n\xFAmero de bono en el
|
|
40973
|
+
refExterna(l.bono_id) ? ok("bono_presente") : falla("bono_presente", "observar requiere bono_id: el n\xFAmero de bono en el HIS"),
|
|
40974
40974
|
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"}`),
|
|
40975
40975
|
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"),
|
|
40976
40976
|
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"),
|
|
@@ -40985,7 +40985,7 @@ var facturacionPendiente = {
|
|
|
40985
40985
|
a: "presentado",
|
|
40986
40986
|
actor: ["humano"],
|
|
40987
40987
|
cargaManual: true,
|
|
40988
|
-
descripcion: "Una persona
|
|
40988
|
+
descripcion: "Una persona de la instituci\xF3n present\xF3 la prestaci\xF3n (la prefactur\xF3 y factur\xF3). El puesto lo comprueba volviendo a leer.",
|
|
40989
40989
|
validar: (_caso, datos) => [
|
|
40990
40990
|
texto(datos.accion_id) ? ok("accion_registrada") : falla("accion_registrada", "presentar requiere accion_id de la carga registrada")
|
|
40991
40991
|
]
|
|
@@ -41060,7 +41060,7 @@ var credencialProfesional = {
|
|
|
41060
41060
|
clave: "credencial_profesional",
|
|
41061
41061
|
nombre: "Credenciales del profesional",
|
|
41062
41062
|
puesto: "Personal y profesionales",
|
|
41063
|
-
descripcion: "Lee en el
|
|
41063
|
+
descripcion: "Lee en el HIS 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.",
|
|
41064
41064
|
inicial: "detectado",
|
|
41065
41065
|
estados: ["detectado", "vigente", "observada", "corregida", "no_corresponde", "descartado"],
|
|
41066
41066
|
finalesOk: ["vigente"],
|
|
@@ -41082,7 +41082,7 @@ var credencialProfesional = {
|
|
|
41082
41082
|
const r = leerResultadoRegistro(datos.resultado);
|
|
41083
41083
|
const tipo = texto(datos.tipo_matricula);
|
|
41084
41084
|
return [
|
|
41085
|
-
refExterna(l.profesional_id) ? ok("profesional_presente") : falla("profesional_presente", "verificar requiere profesional_id: el id del profesional en el
|
|
41085
|
+
refExterna(l.profesional_id) ? ok("profesional_presente") : falla("profesional_presente", "verificar requiere profesional_id: el id del profesional en el HIS"),
|
|
41086
41086
|
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}"),
|
|
41087
41087
|
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"),
|
|
41088
41088
|
texto(datos.lectura_id) ? ok("lectura_registrada") : falla("lectura_registrada", "verificar requiere lectura_id: la consulta al registro registrada con ops_registrar_accion"),
|
|
@@ -41096,7 +41096,7 @@ var credencialProfesional = {
|
|
|
41096
41096
|
a: "corregida",
|
|
41097
41097
|
actor: ["humano"],
|
|
41098
41098
|
cargaManual: true,
|
|
41099
|
-
descripcion: "Una persona
|
|
41099
|
+
descripcion: "Una persona de la instituci\xF3n corrigi\xF3 la ficha del profesional en el HIS. El puesto vuelve a verificar.",
|
|
41100
41100
|
validar: (_caso, datos) => [
|
|
41101
41101
|
texto(datos.accion_id) ? ok("accion_registrada") : falla("accion_registrada", "corregir requiere accion_id de la carga registrada")
|
|
41102
41102
|
]
|
|
@@ -41176,7 +41176,7 @@ var demandaPendiente = {
|
|
|
41176
41176
|
a: "contactado",
|
|
41177
41177
|
actor: ["agente", "humano"],
|
|
41178
41178
|
nivelRequerido: "ejecuta",
|
|
41179
|
-
descripcion: "Contactar al paciente por el canal de la regla
|
|
41179
|
+
descripcion: "Contactar al paciente por el canal de la regla: el agente por el CRM del HIS, o una persona del equipo por donde lo haya hecho. Exige que el contacto haya quedado registrado.",
|
|
41180
41180
|
validar: (_caso, datos, contexto) => {
|
|
41181
41181
|
const out = [];
|
|
41182
41182
|
const regla = contexto.regla ?? null;
|
|
@@ -41220,10 +41220,10 @@ var demandaPendiente = {
|
|
|
41220
41220
|
a: (_caso, datos) => TURNO_ATENDIDO.includes(String(datos.turno_estado ?? "").toUpperCase()) ? "realizado" : "turno_agendado",
|
|
41221
41221
|
actor: ["agente", "humano"],
|
|
41222
41222
|
nivelRequerido: "observa",
|
|
41223
|
-
descripcion: "Releer
|
|
41223
|
+
descripcion: "Releer el HIS y encontrar el turno de esa orden, solicitud o control: con el turno, el caso se cierra como movido.",
|
|
41224
41224
|
validar: (_caso, datos) => [
|
|
41225
|
-
texto(datos.lectura_id) ? ok("lectura_registrada") : falla("lectura_registrada", "comprobar requiere lectura_id: la relectura
|
|
41226
|
-
refExterna(datos.turno_id) ? ok("turno_presente") : falla("turno_presente", "comprobar requiere turno_id: el turno encontrado en
|
|
41225
|
+
texto(datos.lectura_id) ? ok("lectura_registrada") : falla("lectura_registrada", "comprobar requiere lectura_id: la relectura del HIS registrada antes"),
|
|
41226
|
+
refExterna(datos.turno_id) ? ok("turno_presente") : falla("turno_presente", "comprobar requiere turno_id: el turno encontrado en el HIS; sin turno no hay nada que comprobar")
|
|
41227
41227
|
]
|
|
41228
41228
|
},
|
|
41229
41229
|
{
|
|
@@ -41260,7 +41260,7 @@ var demandaPendiente = {
|
|
|
41260
41260
|
de: ["detectado", "contactado", "aceptado"],
|
|
41261
41261
|
a: "no_corresponde",
|
|
41262
41262
|
actor: ["humano"],
|
|
41263
|
-
descripcion: "Una persona
|
|
41263
|
+
descripcion: "Una persona de la instituci\xF3n decide que este caso no corresponde a la regla.",
|
|
41264
41264
|
validar: (_caso, datos) => [texto(datos.motivo) ? ok("motivo_presente") : falla("motivo_presente", "no_corresponde requiere motivo")]
|
|
41265
41265
|
}
|
|
41266
41266
|
]
|
|
@@ -41445,6 +41445,90 @@ function poblacion(problemas, p) {
|
|
|
41445
41445
|
}
|
|
41446
41446
|
return out;
|
|
41447
41447
|
}
|
|
41448
|
+
var TODOS = ["orden_sin_turno", "solicitud_pendiente", "control_periodico"];
|
|
41449
|
+
var CAMPOS_CONDICION = {
|
|
41450
|
+
edad: { nombre: "Edad (a\xF1os)", tipo: "numero", operadores: ["mayor_que", "menor_que", "entre"], en: TODOS },
|
|
41451
|
+
sexo: { nombre: "Sexo", tipo: "opcion", operadores: ["es"], opciones: ["F", "M"], en: TODOS },
|
|
41452
|
+
obra_social: { nombre: "Obra social", tipo: "texto", operadores: ["contiene", "no_contiene"], en: ["orden_sin_turno", "control_periodico"] },
|
|
41453
|
+
estudio: { nombre: "Estudio", tipo: "texto", operadores: ["contiene", "no_contiene"], en: ["orden_sin_turno"] },
|
|
41454
|
+
especialidad: { nombre: "Especialidad", tipo: "texto", operadores: ["contiene", "no_contiene"], en: TODOS },
|
|
41455
|
+
profesional: { nombre: "Profesional", tipo: "texto", operadores: ["contiene", "no_contiene"], en: ["orden_sin_turno", "control_periodico"] },
|
|
41456
|
+
prioridad: { nombre: "Prioridad de la solicitud", tipo: "texto", operadores: ["contiene"], en: ["solicitud_pendiente"] },
|
|
41457
|
+
diagnostico: { nombre: "Diagn\xF3stico (CIE-10)", tipo: "codigo", operadores: ["empieza_con"], en: ["orden_sin_turno", "control_periodico"] },
|
|
41458
|
+
dias: { nombre: "D\xEDas pendiente", tipo: "numero", operadores: ["mayor_que", "menor_que", "entre"], en: TODOS }
|
|
41459
|
+
};
|
|
41460
|
+
var MAX_CONDICIONES = 10;
|
|
41461
|
+
function condiciones(problemas, tipo, p) {
|
|
41462
|
+
if (p.condiciones === void 0 || p.condiciones === null) return [];
|
|
41463
|
+
if (!Array.isArray(p.condiciones)) {
|
|
41464
|
+
problemas.push("condiciones: debe ser una lista");
|
|
41465
|
+
return [];
|
|
41466
|
+
}
|
|
41467
|
+
if (p.condiciones.length > MAX_CONDICIONES) problemas.push(`condiciones: como m\xE1ximo ${MAX_CONDICIONES}`);
|
|
41468
|
+
const out = [];
|
|
41469
|
+
p.condiciones.slice(0, MAX_CONDICIONES).forEach((cruda, i) => {
|
|
41470
|
+
const c = jsonb(cruda);
|
|
41471
|
+
const ref = `condiciones[${i + 1}]`;
|
|
41472
|
+
const campo = str(c.campo)?.toLowerCase() ?? "";
|
|
41473
|
+
const def2 = CAMPOS_CONDICION[campo];
|
|
41474
|
+
if (!def2) {
|
|
41475
|
+
problemas.push(`${ref}: campo desconocido \xAB${campo || "(vac\xEDo)"}\xBB; posibles: ${Object.keys(CAMPOS_CONDICION).join(", ")}`);
|
|
41476
|
+
return;
|
|
41477
|
+
}
|
|
41478
|
+
if (tipo && !def2.en.includes(tipo)) {
|
|
41479
|
+
problemas.push(`${ref}: \xAB${def2.nombre}\xBB no existe para el tipo ${tipo}`);
|
|
41480
|
+
return;
|
|
41481
|
+
}
|
|
41482
|
+
const operador = str(c.operador)?.toLowerCase() ?? "";
|
|
41483
|
+
if (!def2.operadores.includes(operador)) {
|
|
41484
|
+
problemas.push(`${ref}: \xAB${def2.nombre}\xBB admite ${def2.operadores.join(", ")}`);
|
|
41485
|
+
return;
|
|
41486
|
+
}
|
|
41487
|
+
if (def2.tipo === "numero") {
|
|
41488
|
+
const v2 = entero(c.valor);
|
|
41489
|
+
if (v2 === null || v2 < 0 || v2 > 3650) {
|
|
41490
|
+
problemas.push(`${ref}: \xAB${def2.nombre}\xBB necesita un n\xFAmero entero entre 0 y 3650`);
|
|
41491
|
+
return;
|
|
41492
|
+
}
|
|
41493
|
+
if (operador === "entre") {
|
|
41494
|
+
const v22 = entero(c.valor2);
|
|
41495
|
+
if (v22 === null || v22 <= v2 || v22 > 3650) {
|
|
41496
|
+
problemas.push(`${ref}: \xAB${def2.nombre}\xBB entre necesita un segundo valor mayor que ${v2}`);
|
|
41497
|
+
return;
|
|
41498
|
+
}
|
|
41499
|
+
out.push({ campo, operador: "entre", valor: v2, valor2: v22 });
|
|
41500
|
+
return;
|
|
41501
|
+
}
|
|
41502
|
+
out.push({ campo, operador, valor: v2 });
|
|
41503
|
+
return;
|
|
41504
|
+
}
|
|
41505
|
+
if (def2.tipo === "opcion") {
|
|
41506
|
+
const v2 = str(c.valor)?.toUpperCase() ?? "";
|
|
41507
|
+
if (!(def2.opciones ?? []).includes(v2)) {
|
|
41508
|
+
problemas.push(`${ref}: \xAB${def2.nombre}\xBB debe ser ${(def2.opciones ?? []).join(" o ")}`);
|
|
41509
|
+
return;
|
|
41510
|
+
}
|
|
41511
|
+
out.push({ campo, operador: "es", valor: v2 });
|
|
41512
|
+
return;
|
|
41513
|
+
}
|
|
41514
|
+
if (def2.tipo === "codigo") {
|
|
41515
|
+
const v2 = str(c.valor)?.toUpperCase() ?? "";
|
|
41516
|
+
if (!/^[A-Z][0-9]{1,2}(\.[0-9A-Z]{1,2})?$/.test(v2)) {
|
|
41517
|
+
problemas.push(`${ref}: \xAB${def2.nombre}\xBB espera un c\xF3digo CIE-10 o su prefijo (p. ej. E11)`);
|
|
41518
|
+
return;
|
|
41519
|
+
}
|
|
41520
|
+
out.push({ campo, operador: "empieza_con", valor: v2 });
|
|
41521
|
+
return;
|
|
41522
|
+
}
|
|
41523
|
+
const v = str(c.valor);
|
|
41524
|
+
if (!v || v.length > 80) {
|
|
41525
|
+
problemas.push(`${ref}: \xAB${def2.nombre}\xBB necesita un texto de hasta 80 caracteres`);
|
|
41526
|
+
return;
|
|
41527
|
+
}
|
|
41528
|
+
out.push({ campo, operador, valor: v });
|
|
41529
|
+
});
|
|
41530
|
+
return out;
|
|
41531
|
+
}
|
|
41448
41532
|
function diasHasta(problemas, parametros, p) {
|
|
41449
41533
|
if (p.dias_hasta === void 0 || p.dias_hasta === null || p.dias_hasta === "") return;
|
|
41450
41534
|
const hasta = numeroEn(problemas, "dias_hasta", p.dias_hasta);
|
|
@@ -41461,6 +41545,8 @@ function validarRegla(input2) {
|
|
|
41461
41545
|
if (!tipo) problemas.push(`tipo: debe ser ${TIPOS_REGLA_DEMANDA.join(", ")}`);
|
|
41462
41546
|
const p = jsonb(input2.parametros);
|
|
41463
41547
|
const parametros = poblacion(problemas, p);
|
|
41548
|
+
const conds = condiciones(problemas, tipo, p);
|
|
41549
|
+
if (conds.length > 0) parametros.condiciones = conds;
|
|
41464
41550
|
if (tipo === "orden_sin_turno") {
|
|
41465
41551
|
const estudio = textoCorto(problemas, "estudio", p.estudio, 80, false);
|
|
41466
41552
|
if (estudio) parametros.estudio = estudio;
|
|
@@ -41588,7 +41674,7 @@ function cambio(version2, actor, texto3) {
|
|
|
41588
41674
|
return { version: version2, fecha: (/* @__PURE__ */ new Date()).toISOString(), actorTipo: actor.tipo, actorId: actor.id, cambio: texto3 };
|
|
41589
41675
|
}
|
|
41590
41676
|
function soloPersonas(actor, que) {
|
|
41591
|
-
if (actor.tipo !== "humano") throw new OpsError("actor_no_permitido", `${que} lo hace una persona
|
|
41677
|
+
if (actor.tipo !== "humano") throw new OpsError("actor_no_permitido", `${que} lo hace una persona de la instituci\xF3n desde el portal; el agente solo lee las reglas e informa la prueba`);
|
|
41592
41678
|
}
|
|
41593
41679
|
async function crearRegla(ctx, input2) {
|
|
41594
41680
|
soloPersonas(input2.actor, "crear una regla");
|
|
@@ -42201,11 +42287,11 @@ async function registrarAccion(ctx, input2) {
|
|
|
42201
42287
|
const objetivo = str2(input2.objetivo);
|
|
42202
42288
|
if (!objetivo) throw new OpsError("objetivo_requerido", "objetivo es obligatorio (qu\xE9 pantalla, endpoint o archivo se toc\xF3)");
|
|
42203
42289
|
if (WORKFLOWS_SOLO_LECTURA.has(caso.workflow) && input2.tipo === "escritura" && input2.actor.tipo === "agente") {
|
|
42204
|
-
throw new OpsError("politica", `en ${caso.workflow} el puesto solo lee: no registra escrituras sobre el
|
|
42290
|
+
throw new OpsError("politica", `en ${caso.workflow} el puesto solo lee: no registra escrituras sobre el HIS; eso lo hace el equipo`);
|
|
42205
42291
|
}
|
|
42206
42292
|
if (input2.tipo === "escritura" && input2.actor.tipo === "agente") {
|
|
42207
42293
|
const modo = await obtenerModo(ctx, input2.companyId, caso.workflow);
|
|
42208
|
-
if (!modoHabilita(modo, "ejecuta")) throw new OpsError("politica", `la pol\xEDtica vigente de ${caso.workflow} es "${modo}": un agente no puede registrar escrituras sobre el
|
|
42294
|
+
if (!modoHabilita(modo, "ejecuta")) throw new OpsError("politica", `la pol\xEDtica vigente de ${caso.workflow} es "${modo}": un agente no puede registrar escrituras sobre el HIS`);
|
|
42209
42295
|
}
|
|
42210
42296
|
const id = randomUUID2();
|
|
42211
42297
|
const evidencia = { ...input2.evidencia ?? {} };
|
|
@@ -42250,7 +42336,7 @@ function motivoSinCarga(caso) {
|
|
|
42250
42336
|
}
|
|
42251
42337
|
async function registrarCargaManual(ctx, input2) {
|
|
42252
42338
|
if (input2.actor.tipo !== "humano") {
|
|
42253
|
-
throw new OpsError("actor_no_permitido", "la carga manual la declara una persona
|
|
42339
|
+
throw new OpsError("actor_no_permitido", "la carga manual la declara una persona de la instituci\xF3n; un agente carga con ops_registrar_accion y la transici\xF3n aplicar");
|
|
42254
42340
|
}
|
|
42255
42341
|
const caso = await leerCaso(ctx, input2.companyId, input2.casoId);
|
|
42256
42342
|
if (!caso) throw new OpsError("caso_inexistente", `no existe el caso ${input2.casoId} en esta instituci\xF3n`);
|
|
@@ -42282,7 +42368,7 @@ async function registrarCargaManual(ctx, input2) {
|
|
|
42282
42368
|
casoId: caso.id,
|
|
42283
42369
|
tipo: "escritura",
|
|
42284
42370
|
conector: "manual",
|
|
42285
|
-
objetivo: `
|
|
42371
|
+
objetivo: `HIS \xB7 ${caso.titulo}${caso.referencia ? ` (ref ${caso.referencia})` : ""}`,
|
|
42286
42372
|
resultado: "ok",
|
|
42287
42373
|
evidencia: {
|
|
42288
42374
|
...persona ? { cargado_por: persona } : {},
|
|
@@ -42322,7 +42408,7 @@ async function registrarCargaManual(ctx, input2) {
|
|
|
42322
42408
|
}
|
|
42323
42409
|
}
|
|
42324
42410
|
async function registrarRespuestaPaciente(ctx, input2) {
|
|
42325
|
-
if (input2.actor.tipo !== "humano") throw new OpsError("actor_no_permitido", "la respuesta del paciente la registra una persona
|
|
42411
|
+
if (input2.actor.tipo !== "humano") throw new OpsError("actor_no_permitido", "la respuesta del paciente la registra una persona de la instituci\xF3n; un agente usa ops_transicionar");
|
|
42326
42412
|
const caso = await leerCaso(ctx, input2.companyId, input2.casoId);
|
|
42327
42413
|
if (!caso) throw new OpsError("caso_inexistente", `no existe el caso ${input2.casoId} en esta instituci\xF3n`);
|
|
42328
42414
|
if (caso.workflow !== "recupero_turno") throw new OpsError("estado_invalido", "solo las citas ofrecidas al paciente llevan respuesta");
|
|
@@ -42332,7 +42418,7 @@ async function registrarRespuestaPaciente(ctx, input2) {
|
|
|
42332
42418
|
return transicionar(ctx, { companyId: input2.companyId, casoId: caso.id, via: input2.acepto ? "aceptar" : "no_acepta", datos, motivo: comentario, idempotencyKey: input2.idempotencyKey, actor: input2.actor });
|
|
42333
42419
|
}
|
|
42334
42420
|
async function registrarContacto(ctx, input2) {
|
|
42335
|
-
if (input2.actor.tipo !== "humano") throw new OpsError("actor_no_permitido", "el contacto manual lo declara una persona
|
|
42421
|
+
if (input2.actor.tipo !== "humano") throw new OpsError("actor_no_permitido", "el contacto manual lo declara una persona de la instituci\xF3n; un agente registra la escritura y usa ops_transicionar con contactar");
|
|
42336
42422
|
const caso = await leerCaso(ctx, input2.companyId, input2.casoId);
|
|
42337
42423
|
if (!caso) throw new OpsError("caso_inexistente", `no existe el caso ${input2.casoId} en esta instituci\xF3n`);
|
|
42338
42424
|
if (caso.workflow !== "demanda_pendiente") throw new OpsError("estado_invalido", "solo los casos de demanda pendiente llevan contacto");
|
|
@@ -43126,7 +43212,7 @@ async function manejarApi(ctx, input2) {
|
|
|
43126
43212
|
case "respuesta-paciente":
|
|
43127
43213
|
return respuesta(200, await registrarRespuestaPaciente(ctx, { companyId, casoId: input2.params.casoId ?? "", acepto: body.acepto === true, comentario: str3(body.comentario), persona: decididoPor, idempotencyKey: str3(body.idempotencyKey), actor }));
|
|
43128
43214
|
case "no-corresponde": {
|
|
43129
|
-
if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "no_corresponde lo decide una persona
|
|
43215
|
+
if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "no_corresponde lo decide una persona de la instituci\xF3n" });
|
|
43130
43216
|
if (!str3(body.motivo)) return respuesta(422, { error: "validacion", motivo: "motivo_presente: no_corresponde requiere motivo" });
|
|
43131
43217
|
return respuesta(200, await transicionar(ctx, { companyId, casoId: input2.params.casoId ?? "", via: "no_corresponde", motivo: motivoConPersona(str3(body.motivo)), datos: conPersona(obj(body.datos)), idempotencyKey: str3(body.idempotencyKey), actor }));
|
|
43132
43218
|
}
|
|
@@ -43149,20 +43235,20 @@ async function manejarApi(ctx, input2) {
|
|
|
43149
43235
|
case "reglas":
|
|
43150
43236
|
return respuesta(200, { reglas: await listarReglas(ctx, companyId, { workflow: qs("workflow") ?? "demanda_pendiente", estado: qs("estado") }) });
|
|
43151
43237
|
case "crear-regla": {
|
|
43152
|
-
if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "las reglas las crea una persona
|
|
43238
|
+
if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "las reglas las crea una persona de la instituci\xF3n" });
|
|
43153
43239
|
const workflow = str3(body.workflow) ?? "demanda_pendiente";
|
|
43154
43240
|
return respuesta(200, { regla: await crearRegla(ctx, { companyId, workflow, nombre: body.nombre, tipo: body.tipo, parametros: body.parametros, contacto: body.contacto, cierre: body.cierre, actor: { tipo: "humano", id: decididoPor ?? actor.id } }) });
|
|
43155
43241
|
}
|
|
43156
43242
|
case "editar-regla": {
|
|
43157
|
-
if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "las reglas las edita una persona
|
|
43243
|
+
if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "las reglas las edita una persona de la instituci\xF3n" });
|
|
43158
43244
|
return respuesta(200, { regla: await editarRegla(ctx, { companyId, id: input2.params.reglaId ?? "", nombre: body.nombre, tipo: body.tipo, parametros: body.parametros, contacto: body.contacto, cierre: body.cierre, motivo: str3(body.motivo), actor: { tipo: "humano", id: decididoPor ?? actor.id } }) });
|
|
43159
43245
|
}
|
|
43160
43246
|
case "estado-regla": {
|
|
43161
|
-
if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "activar o pausar una regla lo hace una persona
|
|
43247
|
+
if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "activar o pausar una regla lo hace una persona de la instituci\xF3n" });
|
|
43162
43248
|
return respuesta(200, { regla: await cambiarEstadoRegla(ctx, { companyId, id: input2.params.reglaId ?? "", estado: body.estado, motivo: str3(body.motivo), actor: { tipo: "humano", id: decididoPor ?? actor.id } }) });
|
|
43163
43249
|
}
|
|
43164
43250
|
case "probar-regla": {
|
|
43165
|
-
if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "la prueba la pide una persona
|
|
43251
|
+
if (actor.tipo !== "humano") return respuesta(403, { error: "actor_no_permitido", motivo: "la prueba la pide una persona de la instituci\xF3n; el agente la informa con ops_informar_prueba_regla" });
|
|
43166
43252
|
return respuesta(200, { regla: await pedirPruebaRegla(ctx, { companyId, id: input2.params.reglaId ?? "", actor: { tipo: "humano", id: decididoPor ?? actor.id } }) });
|
|
43167
43253
|
}
|
|
43168
43254
|
case "contacto":
|
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.18",
|
|
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": [
|