From c54aa09b15faf86d04657899ff68e1dcafceb11d Mon Sep 17 00:00:00 2001 From: Sergio Nicolas Lavaise Date: Fri, 24 Apr 2026 00:28:16 -0300 Subject: [PATCH] =?UTF-8?q?Fix:=20corregir=20l=C3=B3gica=20de=20permisos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Cualquier usuario puede crear ingresos en cualquier cama 2. Cualquier usuario puede ver todos los pacientes 3. Solo usuarios del área pueden modificar registros de su área 4. Solo usuarios del área pueden cambiar la cama de una internación --- src/hooks/useHospitalStore.ts | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/src/hooks/useHospitalStore.ts b/src/hooks/useHospitalStore.ts index 5f74a6b..d2e8905 100644 --- a/src/hooks/useHospitalStore.ts +++ b/src/hooks/useHospitalStore.ts @@ -210,16 +210,6 @@ export function useHospitalStore() { // Acciones de internaciones const iniciarInternacion = useCallback((internacion: Omit) => { - const user = state.currentUser; - const areaId = internacion.areaId || null; - const area = state.areas.find(a => a.id === areaId); - const esFueraDeArea = area && (area.nombre || '').trim().toLowerCase() === 'fuera de area'; - if (user && user.rol !== 'admin' && !esFueraDeArea) { - if (!user.areaId || user.areaId !== areaId) { - console.warn('No tiene permisos para iniciar internación en esta área'); - return null; - } - } const nuevaInternacion: Internacion = { ...internacion, id: generateUUID(), @@ -230,12 +220,12 @@ export function useHospitalStore() { internaciones: [...prev.internaciones, nuevaInternacion], camaS: prev.camas.map(c => c.id === internacion.camaId - ? { ...c, estado: 'Ocupada', pacienteId: internacion.pacienteId, internacionId: nuevaInternacion.id } + ? { ...c, estado: 'Ocupada' as const, pacienteId: internacion.pacienteId, internacionId: nuevaInternacion.id } : c ), })); return nuevaInternacion.id; - }, [state.currentUser, state.areas]); + }, []); const finalizarInternacion = useCallback((internacionId: string, datos: { fechaEgreso: string; @@ -273,15 +263,16 @@ const finalizarInternacion = useCallback((internacionId: string, datos: { if (!internacion) return; const user = state.currentUser; const areaId = internacion.areaId || null; - const area = state.areas.find(a => a.id === areaId); - const esFueraDeArea = area && (area.nombre || '').trim().toLowerCase() === 'fuera de area'; - if (user && user.rol !== 'admin' && !esFueraDeArea && areaId && user.areaId !== areaId) { - console.warn('No tiene permisos para actualizar internación en esta área'); - return; - } const oldCamaId = internacion.camaId; const newCamaId = datos.camaId; + const cambioDeCama = newCamaId && newCamaId !== oldCamaId; + + if (cambioDeCama && user && user.rol !== 'admin' && areaId && user.areaId !== areaId) { + console.warn('No tiene permisos para cambiar la cama de esta internación'); + return; + } + const pacienteId = datos.pacienteId || internacion.pacienteId; setState(prev => { @@ -933,11 +924,8 @@ const getEstadisticas = useCallback(() => { if (!user) return false; if (user.rol === 'admin') return true; if (!areaId) return false; - const area = state.areas.find(a => a.id === areaId); - const esFueraDeArea = area && (area.nombre || '').trim().toLowerCase() === 'fuera de area'; - if (esFueraDeArea) return true; return user.areaId === areaId; - }, [state.currentUser, state.areas]); + }, [state.currentUser]); const canEditCama = useCallback((camaId: string): boolean => { const areaId = getCamaAreaId(camaId);