Repository navigation
Conversation
Agrega el flujo de pre-validación (doble firma) de informes RUP: - permiso rup:prevalidacion:<tipo> y estado pendienteValidacion - lista firmasPrevalidacion con push atómico, tope 4 y anti-duplicado - operaciones prevalidacion y quitarPrevalidacion en el PATCH de prestaciones - rol del firmante derivado de permisos (deriveRolFirmante), con matrícula - fix: ObjectId sobre comodín en servicio-intermedio - actualiza ADR 0001
admitePrevalidacion, formatearMatriculas, usuarioAuditoria e historialParaUpdateAtomico, con tests unitarios.
- La matrícula de la firma reutiliza searchMatriculas (vigencia, baja, posgrado y matrícula externa), con el mismo formato que el informe PDF. - quitarPrevalidacion rechaza quitar una firma ajena sin rup:validacion (antes ignoraba firmaProfesionalId y quitaba la propia en silencio). - quitarPrevalidacion: $pull condicionado a que la firma exista y vuelta a ejecucion solo si la lista sigue vacía (evita perder firmas concurrentes). - Persiste la entrada de historial de solicitud (prestaciones top) y updatedAt/updatedBy, que se perdían por no pasar por data.save().
Pre-validación y validación son excluyentes (ADR 0001); antes la exclusión solo existía en la UI y la API aceptaba la firma como 'validador'.
Pela2silveira
approved these changes
Oct 22, 2026
La pre-validación ya no cambia el estado de la prestación: sigue en ejecución y acumula firmas en firmasPrevalidacion. Se elimina pendienteValidacion del enum de estados, quitarPrevalidacion opera en ejecución y no transiciona, y el push de firmas deja de necesitar el reintento por cambio de estado. Se actualiza el ADR 0001 con la enmienda del 2026-10-31: eliminación del estado y de la cola de pendientes, y la regla real del botón Validar (se oculta solo a quien tiene rup:prevalidacion; rup:validacion nunca fue requisito para validar).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Note
TL;DR — Agrega la pre-validación (doble firma) de informes RUP: un médico residente puede dejar su firma sobre un informe antes de que el médico de planta lo valide. Es opcional, no cambia el estado de la prestación y no modifica el flujo de validación actual.
feat— doble firma de informes RUPnpx jest modules/rup/prevalidacion.test.ts→ ✅ 13/13;tsc --noEmit→ ✅; flujo completo por API → ✅; build completo →Por qué
En hospitales escuela el informe lo elabora un médico residente y lo valida un médico de planta, pero hoy la prestación tiene un único firmante: quien presiona "Validar". No hay forma de registrar la firma del residente. Este cambio introduce una firma de pre-validación, opcional, sin tocar el proceso de validación. Diseño y decisiones en el ADR
docs/rup/0001-doble-firma-informe.md(incluido en este PR y actualizado con cada ajuste de la revisión).Qué cambió
rup:prevalidacion:<tipoPrestacion>, el que se asigna a los residentes (auth/permisos.ts).firmasPrevalidacioncon snapshot de profesional, rol y matrícula; índice para estadística por firmante (modules/rup/schemas/prestacion.ts).ejecuciony acumula firmas. La app muestra la cantidad como badge. (En una iteración anterior existía el estadopendienteValidacion; se eliminó por feedback de los usuarios, ver "Historial de la revisión".)prevalidacion(agrega firma con$pushatómico, tope y anti-duplicado forzados en el filtro) yquitarPrevalidacion(saca una firma) en elPATCH /prestaciones/:id(modules/rup/routes/prestacion.ts). Ninguna transiciona estado.rup.maxFirmasPrevalidacion(4) enconfig.ts; la app lo obtiene deGET /modules/rup/prevalidacion/config→{ maxFirmasPrevalidacion }para no duplicarlo.rup:validacion(deben validar);quitarPrevalidacionrechaza quitar una firma ajena sin permiso de validación. La matrícula del snapshot usasearchMatriculas(vigencia, posgrado, matrícula externa), con el mismo formato que el PDF.ejecucionse limpian las firmas de pre-validación (quedan enprestacionesHistorial); los residentes vuelven a pre-validar si corresponde.deriveRolFirmante(modules/rup/controllers/prestacion.ts).GET /prestaciones/servicio-intermediohacíaObjectId('*')con permisos comodín y tiraba el proceso; ahora descarta valores que no sean ObjectId válido (modules/rup/routes/prestacion.ts).Cómo probar
rup:prevalidacion:<tipo>(sinrup:validacion) y a otrorup:validacion:<tipo>.ejecucion→ queda enejecucioncon su firma enfirmasPrevalidacion. → ✅ observadoejecucion. →ejecucioncon una firma menos. →validada, conservando las firmas previas. → ✅ observadoejecucionsin firmas previas; los residentes pueden volver a pre-validar. →Automatizado:⚠️ no ejecutada localmente (convención del entorno).
npx jest modules/rup/prevalidacion.test.ts→ ✅ 13/13.tsc --noEmit→ ✅. Suite completa →Historial de la revisión
config.ts; ADR con metadata y endocs/rup/; rechazo de pre-validación conrup:validacion; matrícula víasearchMatriculas; limpieza de firmas al romper validación.pendienteValidacion(generaba problemas con los flujos existentes gateados porejecucion); la pre-validación ya no transiciona yquitarPrevalidaciontampoco. El enum de estados vuelve a ser el original. ADR enmendado.Riesgo y rollback
firmasPrevalidacion(históricas) se resuelven en lectura con el validador como firmante único; no requieren migración. No se agregan estados.autoIndexdesactivado:db.prestaciones.createIndex({ "firmasPrevalidacion.profesional.id": 1 }, { sparse: true }). El permisorup:prevalidacionse asigna a residentes (administración, no migración).pendienteValidacionde una versión anterior de esta rama, fallan al guardar por validación de enum. Volverlas aejecucion:db.prestaciones.updateMany({ 'estadoActual.tipo': 'pendienteValidacion' }, { $set: { 'estadoActual.tipo': 'ejecucion', 'estados.$[e].tipo': 'ejecucion' } }, { arrayFilters: [{ 'e.tipo': 'pendienteValidacion' }] }). No aplica a producción: el estado nunca llegó.Notas para el revisor
Tip
Empezá por: el
case 'prevalidacion'enmodules/rup/routes/prestacion.ts(push atómico, sin transición de estado).estadoActual.createdBy; el campofirmaValidacionqueda diferido. Hacer cumplir un permiso de validación en la API sigue siendo un punto abierto del ADR (riesgo con internación).andes/appcon la interfaz: RUP - Doble firma: pre-validación de informes app#3429.