From 32dd26620ec121e2f7bb28d1372af93ed31a3a36 Mon Sep 17 00:00:00 2001 From: snlavaise Date: Tue, 11 Aug 2026 15:28:06 +0000 Subject: [PATCH] Fix internacion lookup, persistence and fallback patient resolution --- server/db-mongodb.js | 18 ++++++++++-- src/App.tsx | 52 +++++++++++++++++++++++++++++------ src/hooks/useHospitalStore.ts | 23 ++++++++++++++-- 3 files changed, 79 insertions(+), 14 deletions(-) diff --git a/server/db-mongodb.js b/server/db-mongodb.js index a29ad0f..d2613e2 100644 --- a/server/db-mongodb.js +++ b/server/db-mongodb.js @@ -1,4 +1,4 @@ -import { MongoClient } from 'mongodb'; +import { MongoClient, ObjectId } from 'mongodb'; import bcrypt from 'bcryptjs'; const { compareSync, hashSync } = bcrypt; @@ -102,6 +102,9 @@ export async function initDb() { function cleanDoc(doc) { if (!doc) return null; const { _id, ...rest } = doc; + if (!rest.id && _id) { + rest.id = _id.toString(); + } return rest; } @@ -352,12 +355,21 @@ export async function getAllInternaciones() { } export async function getInternacionById(id) { + if (!id) return null; + const idStr = String(id).trim(); if (db) { - const internacion = await db.collection('internaciones').findOne({ id }); + let internacion = await db.collection('internaciones').findOne({ id: idStr }); + if (!internacion && ObjectId.isValid(idStr)) { + try { + internacion = await db.collection('internaciones').findOne({ _id: new ObjectId(idStr) }); + } catch { + // ignore invalid objectid + } + } if (internacion) internacion.activa = !!internacion.activa; return cleanDoc(internacion); } - const internacion = memStore.internaciones.find(i => i.id === id); + const internacion = memStore.internaciones.find(i => i.id === idStr || String(i.id).trim() === idStr); if (!internacion) return null; return { ...internacion, activa: !!internacion.activa }; } diff --git a/src/App.tsx b/src/App.tsx index 4159223..fffd990 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -131,12 +131,30 @@ function AppContent() { /> ); case 'historiaclinica': { - const internacionId = store.currentInternacionId || ''; + const internacionId = store.currentInternacionId || sessionStorage.getItem('hospital_current_internacion_id') || ''; const internacion = store.getInternacionById(internacionId); - const paciente = internacion ? store.getPacienteById(internacion.pacienteId) : undefined; - if (!internacion || !paciente) { + const paciente = internacion + ? (store.getPacienteById(internacion.pacienteId) || store.pacientes.find(p => p.id === internacion.pacienteId || p.dni === internacion.pacienteId) || { + id: internacion.pacienteId || 'paciente-unknown', + apellido: 'Paciente', + nombre: 'Sin registrar', + dni: internacion.pacienteId || 'N/A', + fechaNacimiento: '1990-01-01', + sexo: 'Otro' as const, + fechaRegistro: new Date().toISOString() + }) + : undefined; + + if (!internacion) { + if (!store.isLoaded) { + return ( +
+

Cargando información de la internación...

+
+ ); + } return ( -
+

Internación no encontrada (id: {internacionId})

@@ -215,12 +233,30 @@ function AppContent() { ); case 'editaringreso': { - const internacionId = store.currentInternacionId || ''; + const internacionId = store.currentInternacionId || sessionStorage.getItem('hospital_current_internacion_id') || ''; const internacion = store.getInternacionById(internacionId); - const paciente = internacion ? store.getPacienteById(internacion.pacienteId) : undefined; - if (!internacion || !paciente) { + const paciente = internacion + ? (store.getPacienteById(internacion.pacienteId) || store.pacientes.find(p => p.id === internacion.pacienteId || p.dni === internacion.pacienteId) || { + id: internacion.pacienteId || 'paciente-unknown', + apellido: 'Paciente', + nombre: 'Sin registrar', + dni: internacion.pacienteId || 'N/A', + fechaNacimiento: '1990-01-01', + sexo: 'Otro' as const, + fechaRegistro: new Date().toISOString() + }) + : undefined; + + if (!internacion) { + if (!store.isLoaded) { + return ( +
+

Cargando información de la internación...

+
+ ); + } return ( -
+

Internación no encontrada (id: {internacionId})

diff --git a/src/hooks/useHospitalStore.ts b/src/hooks/useHospitalStore.ts index 8ef41c5..b1317eb 100644 --- a/src/hooks/useHospitalStore.ts +++ b/src/hooks/useHospitalStore.ts @@ -94,6 +94,7 @@ export function useHospitalStore() { if (mounted && body) { const defaults = defaultState(); const storedUser = sessionStorage.getItem('hospital_user'); + const storedInternacionId = sessionStorage.getItem('hospital_current_internacion_id'); const currentUser = storedUser ? JSON.parse(storedUser) : null; const normalized = { ...defaults, @@ -103,6 +104,7 @@ export function useHospitalStore() { atb: body.atb || [], glucemias: body.glucemias || [], movimientosIndicaciones: body.movimientosIndicaciones || [], + currentInternacionId: storedInternacionId || body.currentInternacionId || null, currentUser, isAuthenticated: !!currentUser, }; @@ -1237,15 +1239,24 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P // Funciones de utilidad para consultas const getPacienteById = useCallback((id: string) => { - return state.pacientes.find(p => p.id === id); + if (!id) return undefined; + const target = String(id).trim().toLowerCase(); + return state.pacientes.find(p => + (p.id && String(p.id).trim().toLowerCase() === target) || + (p.dni && String(p.dni).trim().toLowerCase() === target) + ); }, [state.pacientes]); const getCamaById = useCallback((id: string) => { - return state.camas.find(c => c.id === id); + if (!id) return undefined; + const target = String(id).trim().toLowerCase(); + return state.camas.find(c => c.id && String(c.id).trim().toLowerCase() === target); }, [state.camas]); const getInternacionById = useCallback((id: string) => { - return state.internaciones.find(i => i.id === id); + if (!id) return undefined; + const target = String(id).trim().toLowerCase(); + return state.internaciones.find(i => i.id && String(i.id).trim().toLowerCase() === target); }, [state.internaciones]); const getInternacionActivaByPaciente = useCallback((pacienteId: string) => { @@ -1309,6 +1320,11 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P // Current internacion selection (for HC page) const setCurrentInternacion = useCallback((id?: string | null) => { + if (id) { + sessionStorage.setItem('hospital_current_internacion_id', id); + } else { + sessionStorage.removeItem('hospital_current_internacion_id'); + } setState(prev => ({ ...prev, currentInternacionId: id ?? null })); }, []); @@ -1434,5 +1450,6 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P getCamaGrupoId, getInternacionGrupoId, getPacienteGrupoId, + isLoaded, }; }