Fix: corregir lógica de permisos

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
This commit is contained in:
2026-04-24 00:28:16 -03:00
parent d0b25480c9
commit c54aa09b15
+10 -22
View File
@@ -210,16 +210,6 @@ export function useHospitalStore() {
// Acciones de internaciones // Acciones de internaciones
const iniciarInternacion = useCallback((internacion: Omit<Internacion, 'id' | 'activa'>) => { const iniciarInternacion = useCallback((internacion: Omit<Internacion, 'id' | 'activa'>) => {
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 = { const nuevaInternacion: Internacion = {
...internacion, ...internacion,
id: generateUUID(), id: generateUUID(),
@@ -230,12 +220,12 @@ export function useHospitalStore() {
internaciones: [...prev.internaciones, nuevaInternacion], internaciones: [...prev.internaciones, nuevaInternacion],
camaS: prev.camas.map(c => camaS: prev.camas.map(c =>
c.id === internacion.camaId 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 : c
), ),
})); }));
return nuevaInternacion.id; return nuevaInternacion.id;
}, [state.currentUser, state.areas]); }, []);
const finalizarInternacion = useCallback((internacionId: string, datos: { const finalizarInternacion = useCallback((internacionId: string, datos: {
fechaEgreso: string; fechaEgreso: string;
@@ -273,15 +263,16 @@ const finalizarInternacion = useCallback((internacionId: string, datos: {
if (!internacion) return; if (!internacion) return;
const user = state.currentUser; const user = state.currentUser;
const areaId = internacion.areaId || null; 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 oldCamaId = internacion.camaId;
const newCamaId = datos.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; const pacienteId = datos.pacienteId || internacion.pacienteId;
setState(prev => { setState(prev => {
@@ -933,11 +924,8 @@ const getEstadisticas = useCallback(() => {
if (!user) return false; if (!user) return false;
if (user.rol === 'admin') return true; if (user.rol === 'admin') return true;
if (!areaId) return false; 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; return user.areaId === areaId;
}, [state.currentUser, state.areas]); }, [state.currentUser]);
const canEditCama = useCallback((camaId: string): boolean => { const canEditCama = useCallback((camaId: string): boolean => {
const areaId = getCamaAreaId(camaId); const areaId = getCamaAreaId(camaId);