Refactor: reorganizar arquitectura de permisos y corregir bug de camaS

- Mover funciones utilitarias y de permisos al principio del hook
- Corregir bug camaS -> camas en iniciarInternacion
- Limpiar funciones duplicadas
- Estructura de permisos clara según reglas:
  1. Cualquier usuario puede crear ingresos en cualquier cama
  2. Cualquier usuario puede ver todos los pacientes
  3. Solo usuarios del área pueden crear/modificar registros
  4. Solo usuarios del área pueden cambiar la cama
This commit is contained in:
2026-04-24 01:07:02 -03:00
parent 1d0065683e
commit 079e3bd82c
2 changed files with 111 additions and 118 deletions
+105 -112
View File
@@ -139,6 +139,72 @@ export function useHospitalStore() {
return () => clearTimeout(t); return () => clearTimeout(t);
}, [state, initialLoadComplete]); }, [state, initialLoadComplete]);
// Utility functions
const getCamaAreaId = useCallback((camaId: string): string | null => {
const cama = state.camas.find(c => c.id === camaId);
return cama?.areaId || null;
}, [state.camas]);
const getInternacionAreaId = useCallback((internacionId: string): string | null => {
const internacion = state.internaciones.find(i => i.id === internacionId);
return internacion?.areaId || null;
}, [state.internaciones]);
const getPacienteAreaId = useCallback((pacienteId: string): string | null => {
const internacion = state.internaciones.find(i => i.pacienteId === pacienteId && i.activa);
if (!internacion) {
const anyInternacion = state.internaciones.find(i => i.pacienteId === pacienteId);
if (anyInternacion) return getCamaAreaId(anyInternacion.camaId);
return null;
}
return getCamaAreaId(internacion.camaId);
}, [state.internaciones, getCamaAreaId]);
// Permission functions
const canAccessArea = useCallback((areaId: string | null | undefined): boolean => {
const user = state.currentUser;
if (!user) return false;
if (user.rol === 'admin') return true;
if (!areaId) return false;
return user.areaId === areaId;
}, [state.currentUser]);
const canChangeBed = useCallback((internacionId: string): boolean => {
const internacion = state.internaciones.find(i => i.id === internacionId);
if (!internacion) return false;
return canAccessArea(internacion.areaId);
}, [state.internaciones, canAccessArea]);
const canEditInternacion = useCallback((internacionId: string): boolean => {
const areaId = getInternacionAreaId(internacionId);
return canAccessArea(areaId);
}, [getInternacionAreaId, canAccessArea]);
const canEditCama = useCallback((camaId: string): boolean => {
const areaId = getCamaAreaId(camaId);
return canAccessArea(areaId);
}, [getCamaAreaId, canAccessArea]);
const canEditPaciente = useCallback((pacienteId: string): boolean => {
const areaId = getPacienteAreaId(pacienteId);
return canAccessArea(areaId);
}, [getPacienteAreaId, canAccessArea]);
const hasPermission = useCallback((permission: 'read' | 'write', section: string): boolean => {
const user = state.currentUser;
if (!user) return false;
if (user.rol === 'admin') return true;
if (user.rol === 'enfermero') {
if (section === 'glucemias' || section === 'signosvitales') return permission === 'read' || permission === 'write';
return permission === 'read';
}
if (user.rol === 'medico') {
if (section === 'miArea') return permission === 'read' || permission === 'write';
return permission === 'read';
}
return false;
}, [state.currentUser]);
// Acciones de navegación // Acciones de navegación
const setVista = useCallback((vista: Vista) => { const setVista = useCallback((vista: Vista) => {
setState(prev => ({ ...prev, vistaActual: vista })); setState(prev => ({ ...prev, vistaActual: vista }));
@@ -218,7 +284,7 @@ export function useHospitalStore() {
setState(prev => ({ setState(prev => ({
...prev, ...prev,
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' as const, pacienteId: internacion.pacienteId, internacionId: nuevaInternacion.id } ? { ...c, estado: 'Ocupada' as const, pacienteId: internacion.pacienteId, internacionId: nuevaInternacion.id }
: c : c
@@ -247,7 +313,7 @@ const finalizarInternacion = useCallback((internacionId: string, datos: {
? { ...i, ...datos, activa: false } ? { ...i, ...datos, activa: false }
: i : i
), ),
cams: esFueraDeArea camas: esFueraDeArea
? prev.camas.filter(c => c.id !== internacion.camaId) ? prev.camas.filter(c => c.id !== internacion.camaId)
: prev.camas.map(c => : prev.camas.map(c =>
c.id === internacion.camaId c.id === internacion.camaId
@@ -261,18 +327,21 @@ const finalizarInternacion = useCallback((internacionId: string, datos: {
const actualizarInternacion = useCallback((internacionId: string, datos: Partial<Internacion>) => { const actualizarInternacion = useCallback((internacionId: string, datos: Partial<Internacion>) => {
const internacion = state.internaciones.find(i => i.id === internacionId); const internacion = state.internaciones.find(i => i.id === internacionId);
if (!internacion) return; if (!internacion) return;
const user = state.currentUser;
const areaId = internacion.areaId || null;
const oldCamaId = internacion.camaId; const oldCamaId = internacion.camaId;
const newCamaId = datos.camaId; const newCamaId = datos.camaId;
const cambioDeCama = newCamaId && newCamaId !== oldCamaId; const cambioDeCama = newCamaId && newCamaId !== oldCamaId;
if (cambioDeCama && user && user.rol !== 'admin' && areaId && user.areaId !== areaId) { if (cambioDeCama && !canChangeBed(internacionId)) {
console.warn('No tiene permisos para cambiar la cama de esta internación'); console.warn('No tiene permisos para cambiar la cama de esta internación');
return; return;
} }
if (!cambioDeCama && !canAccessArea(internacion.areaId)) {
console.warn('No tiene permisos para actualizar esta internación');
return;
}
const pacienteId = datos.pacienteId || internacion.pacienteId; const pacienteId = datos.pacienteId || internacion.pacienteId;
setState(prev => { setState(prev => {
@@ -318,7 +387,7 @@ const finalizarInternacion = useCallback((internacionId: string, datos: {
const agregarEvolucion = useCallback((evolucion: Omit<Evolucion, 'id'>) => { const agregarEvolucion = useCallback((evolucion: Omit<Evolucion, 'id'>) => {
const internacion = state.internaciones.find(i => i.id === evolucion.internacionId); const internacion = state.internaciones.find(i => i.id === evolucion.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para agregar evolución en esta área'); console.warn('No tiene permisos para agregar evolución en esta área');
return null; return null;
} }
@@ -338,7 +407,7 @@ const finalizarInternacion = useCallback((internacionId: string, datos: {
if (!evolucion) return; if (!evolucion) return;
const internacion = state.internaciones.find(i => i.id === evolucion.internacionId); const internacion = state.internaciones.find(i => i.id === evolucion.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para eliminar evolución en esta área'); console.warn('No tiene permisos para eliminar evolución en esta área');
return; return;
} }
@@ -353,7 +422,7 @@ const finalizarInternacion = useCallback((internacionId: string, datos: {
if (!evolucion) return; if (!evolucion) return;
const internacion = state.internaciones.find(i => i.id === evolucion.internacionId); const internacion = state.internaciones.find(i => i.id === evolucion.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para actualizar evolución en esta área'); console.warn('No tiene permisos para actualizar evolución en esta área');
return; return;
} }
@@ -367,7 +436,7 @@ const finalizarInternacion = useCallback((internacionId: string, datos: {
const agregarLaboratorio = useCallback((laboratorio: Omit<Laboratorio, 'id'>) => { const agregarLaboratorio = useCallback((laboratorio: Omit<Laboratorio, 'id'>) => {
const internacion = state.internaciones.find(i => i.id === laboratorio.internacionId); const internacion = state.internaciones.find(i => i.id === laboratorio.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para agregar laboratorio en esta área'); console.warn('No tiene permisos para agregar laboratorio en esta área');
return null; return null;
} }
@@ -387,7 +456,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
if (!laboratorio) return; if (!laboratorio) return;
const internacion = state.internaciones.find(i => i.id === laboratorio.internacionId); const internacion = state.internaciones.find(i => i.id === laboratorio.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para eliminar laboratorio en esta área'); console.warn('No tiene permisos para eliminar laboratorio en esta área');
return; return;
} }
@@ -402,7 +471,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
if (!laboratorio) return; if (!laboratorio) return;
const internacion = state.internaciones.find(i => i.id === laboratorio.internacionId); const internacion = state.internaciones.find(i => i.id === laboratorio.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para actualizar laboratorio en esta área'); console.warn('No tiene permisos para actualizar laboratorio en esta área');
return; return;
} }
@@ -416,7 +485,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
const agregarAcidoBase = useCallback((acidoBase: Omit<AcidoBase, 'id'>) => { const agregarAcidoBase = useCallback((acidoBase: Omit<AcidoBase, 'id'>) => {
const internacion = state.internaciones.find(i => i.id === acidoBase.internacionId); const internacion = state.internaciones.find(i => i.id === acidoBase.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para agregar ácido-base en esta área'); console.warn('No tiene permisos para agregar ácido-base en esta área');
return null; return null;
} }
@@ -436,7 +505,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
if (!acidoBase) return; if (!acidoBase) return;
const internacion = state.internaciones.find(i => i.id === acidoBase.internacionId); const internacion = state.internaciones.find(i => i.id === acidoBase.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para actualizar ácido-base en esta área'); console.warn('No tiene permisos para actualizar ácido-base en esta área');
return; return;
} }
@@ -451,7 +520,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
if (!acidoBase) return; if (!acidoBase) return;
const internacion = state.internaciones.find(i => i.id === acidoBase.internacionId); const internacion = state.internaciones.find(i => i.id === acidoBase.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para eliminar ácido-base en esta área'); console.warn('No tiene permisos para eliminar ácido-base en esta área');
return; return;
} }
@@ -465,7 +534,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
const agregarCultivo = useCallback((cultivo: Omit<Cultivo, 'id'>) => { const agregarCultivo = useCallback((cultivo: Omit<Cultivo, 'id'>) => {
const internacion = state.internaciones.find(i => i.id === cultivo.internacionId); const internacion = state.internaciones.find(i => i.id === cultivo.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para agregar cultivo en esta área'); console.warn('No tiene permisos para agregar cultivo en esta área');
return null; return null;
} }
@@ -485,7 +554,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
if (!cultivo) return; if (!cultivo) return;
const internacion = state.internaciones.find(i => i.id === cultivo.internacionId); const internacion = state.internaciones.find(i => i.id === cultivo.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para actualizar cultivo en esta área'); console.warn('No tiene permisos para actualizar cultivo en esta área');
return; return;
} }
@@ -500,7 +569,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
if (!cultivo) return; if (!cultivo) return;
const internacion = state.internaciones.find(i => i.id === cultivo.internacionId); const internacion = state.internaciones.find(i => i.id === cultivo.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para eliminar cultivo en esta área'); console.warn('No tiene permisos para eliminar cultivo en esta área');
return; return;
} }
@@ -514,7 +583,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
const agregarEstudioComplementario = useCallback((estudio: Omit<EstudioComplementario, 'id'>) => { const agregarEstudioComplementario = useCallback((estudio: Omit<EstudioComplementario, 'id'>) => {
const internacion = state.internaciones.find(i => i.id === estudio.internacionId); const internacion = state.internaciones.find(i => i.id === estudio.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para agregar estudio complementario en esta área'); console.warn('No tiene permisos para agregar estudio complementario en esta área');
return null; return null;
} }
@@ -534,7 +603,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
if (!estudio) return; if (!estudio) return;
const internacion = state.internaciones.find(i => i.id === estudio.internacionId); const internacion = state.internaciones.find(i => i.id === estudio.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para actualizar estudio complementario en esta área'); console.warn('No tiene permisos para actualizar estudio complementario en esta área');
return; return;
} }
@@ -549,7 +618,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
if (!estudio) return; if (!estudio) return;
const internacion = state.internaciones.find(i => i.id === estudio.internacionId); const internacion = state.internaciones.find(i => i.id === estudio.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para eliminar estudio complementario en esta área'); console.warn('No tiene permisos para eliminar estudio complementario en esta área');
return; return;
} }
@@ -563,7 +632,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
const agregarInterconsulta = useCallback((interconsulta: Omit<Interconsulta, 'id'>) => { const agregarInterconsulta = useCallback((interconsulta: Omit<Interconsulta, 'id'>) => {
const internacion = state.internaciones.find(i => i.id === interconsulta.internacionId); const internacion = state.internaciones.find(i => i.id === interconsulta.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para agregar interconsulta en esta área'); console.warn('No tiene permisos para agregar interconsulta en esta área');
return null; return null;
} }
@@ -580,7 +649,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
if (!interconsulta) return; if (!interconsulta) return;
const internacion = state.internaciones.find(i => i.id === interconsulta.internacionId); const internacion = state.internaciones.find(i => i.id === interconsulta.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para actualizar interconsulta en esta área'); console.warn('No tiene permisos para actualizar interconsulta en esta área');
return; return;
} }
@@ -595,7 +664,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
if (!interconsulta) return; if (!interconsulta) return;
const internacion = state.internaciones.find(i => i.id === interconsulta.internacionId); const internacion = state.internaciones.find(i => i.id === interconsulta.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para eliminar interconsulta en esta área'); console.warn('No tiene permisos para eliminar interconsulta en esta área');
return; return;
} }
@@ -608,7 +677,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
const agregarATB = useCallback((atb: Omit<ATB, 'id'>) => { const agregarATB = useCallback((atb: Omit<ATB, 'id'>) => {
const internacion = state.internaciones.find(i => i.id === atb.internacionId); const internacion = state.internaciones.find(i => i.id === atb.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para agregar ATB en esta área'); console.warn('No tiene permisos para agregar ATB en esta área');
return null; return null;
} }
@@ -625,7 +694,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
if (!atb) return; if (!atb) return;
const internacion = state.internaciones.find(i => i.id === atb.internacionId); const internacion = state.internaciones.find(i => i.id === atb.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para actualizar ATB en esta área'); console.warn('No tiene permisos para actualizar ATB en esta área');
return; return;
} }
@@ -640,7 +709,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
if (!atb) return; if (!atb) return;
const internacion = state.internaciones.find(i => i.id === atb.internacionId); const internacion = state.internaciones.find(i => i.id === atb.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para eliminar ATB en esta área'); console.warn('No tiene permisos para eliminar ATB en esta área');
return; return;
} }
@@ -653,7 +722,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
const agregarIndicacion = useCallback((indicacion: Omit<Indicacion, 'id'>) => { const agregarIndicacion = useCallback((indicacion: Omit<Indicacion, 'id'>) => {
const internacion = state.internaciones.find(i => i.id === indicacion.internacionId); const internacion = state.internaciones.find(i => i.id === indicacion.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para agregar indicación en esta área'); console.warn('No tiene permisos para agregar indicación en esta área');
return null; return null;
} }
@@ -670,7 +739,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
if (!indicacion) return; if (!indicacion) return;
const internacion = state.internaciones.find(i => i.id === indicacion.internacionId); const internacion = state.internaciones.find(i => i.id === indicacion.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para actualizar indicación en esta área'); console.warn('No tiene permisos para actualizar indicación en esta área');
return; return;
} }
@@ -685,7 +754,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
if (!indicacion) return; if (!indicacion) return;
const internacion = state.internaciones.find(i => i.id === indicacion.internacionId); const internacion = state.internaciones.find(i => i.id === indicacion.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para eliminar indicación en esta área'); console.warn('No tiene permisos para eliminar indicación en esta área');
return; return;
} }
@@ -698,7 +767,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
const agregarMovimientoIndicacion = useCallback((movimiento: any) => { const agregarMovimientoIndicacion = useCallback((movimiento: any) => {
const internacion = state.internaciones.find(i => i.id === movimiento.internacionId); const internacion = state.internaciones.find(i => i.id === movimiento.internacionId);
const areaId = internacion?.areaId || null; const areaId = internacion?.areaId || null;
if (!canEditInArea(areaId)) { if (!canAccessArea(areaId)) {
console.warn('No tiene permisos para agregar movimiento de indicación en esta área'); console.warn('No tiene permisos para agregar movimiento de indicación en esta área');
return; return;
} }
@@ -739,7 +808,7 @@ const eliminarLaboratorio = useCallback((id: string) => {
})); }));
}, []); }, []);
// Funciones de utilidad // Funciones de utilidad para consultas
const getPacienteById = useCallback((id: string) => { const getPacienteById = useCallback((id: string) => {
return state.pacientes.find(p => p.id === id); return state.pacientes.find(p => p.id === id);
}, [state.pacientes]); }, [state.pacientes]);
@@ -866,82 +935,6 @@ const getEstadisticas = useCallback(() => {
return true; return true;
}, []); }, []);
const hasPermission = useCallback((permission: 'read' | 'write', section: string): boolean => {
const user = state.currentUser;
if (!user) return false;
if (user.rol === 'admin') return true;
if (user.rol === 'enfermero') {
if (section === 'glucemias' || section === 'signosvitales') return permission === 'read' || permission === 'write';
return permission === 'read';
}
if (user.rol === 'medico') {
if (section === 'miArea') return permission === 'read' || permission === 'write';
return permission === 'read';
}
return false;
}, [state.currentUser]);
const canAccessInternacion = useCallback((internacionId: string): boolean => {
const user = state.currentUser;
if (!user) return false;
const rol = user.rol as string;
if (rol === 'admin') return true;
if (rol === 'medico' && user.areaId) {
const internacion = state.internaciones.find(i => i.id === internacionId);
if (!internacion) return false;
const cama = state.camas.find(c => c.id === internacion.camaId);
return cama?.areaId === user.areaId;
}
return rol === 'admin';
}, [state.currentUser, state.internaciones, state.camas]);
const getCamaAreaId = useCallback((camaId: string): string | null => {
const cama = state.camas.find(c => c.id === camaId);
return cama?.areaId || null;
}, [state.camas]);
const getInternacionAreaId = useCallback((internacionId: string): string | null => {
const internacion = state.internaciones.find(i => i.id === internacionId);
if (!internacion) return null;
// Use the new areaId field first
if (internacion.areaId) return internacion.areaId;
// Fallback to cama's area
return getCamaAreaId(internacion.camaId);
}, [state.internaciones, getCamaAreaId]);
const getPacienteAreaId = useCallback((pacienteId: string): string | null => {
const internacion = state.internaciones.find(i => i.pacienteId === pacienteId && i.activa);
if (!internacion) {
const anyInternacion = state.internaciones.find(i => i.pacienteId === pacienteId);
if (anyInternacion) return getCamaAreaId(anyInternacion.camaId);
return null;
}
return getCamaAreaId(internacion.camaId);
}, [state.internaciones, getCamaAreaId]);
const canEditInArea = useCallback((areaId: string | null | undefined): boolean => {
const user = state.currentUser;
if (!user) return false;
if (user.rol === 'admin') return true;
if (!areaId) return false;
return user.areaId === areaId;
}, [state.currentUser]);
const canEditCama = useCallback((camaId: string): boolean => {
const areaId = getCamaAreaId(camaId);
return canEditInArea(areaId);
}, [getCamaAreaId, canEditInArea]);
const canEditInternacion = useCallback((internacionId: string): boolean => {
const areaId = getInternacionAreaId(internacionId);
return canEditInArea(areaId);
}, [getInternacionAreaId, canEditInArea]);
const canEditPaciente = useCallback((pacienteId: string): boolean => {
const areaId = getPacienteAreaId(pacienteId);
return canEditInArea(areaId);
}, [getPacienteAreaId, canEditInArea]);
return { return {
...state, ...state,
isLoaded, isLoaded,
@@ -956,8 +949,10 @@ const getEstadisticas = useCallback(() => {
agregarCama, agregarCama,
eliminarCama, eliminarCama,
agregarEvolucion, agregarEvolucion,
actualizarEvolucion,
eliminarEvolucion, eliminarEvolucion,
agregarLaboratorio, agregarLaboratorio,
actualizarLaboratorio,
eliminarLaboratorio, eliminarLaboratorio,
agregarAcidoBase, agregarAcidoBase,
actualizarAcidoBase, actualizarAcidoBase,
@@ -990,8 +985,6 @@ const getEstadisticas = useCallback(() => {
getLaboratoriosByPaciente, getLaboratoriosByPaciente,
getAcidosBaseByPaciente, getAcidosBaseByPaciente,
getCultivosByPaciente, getCultivosByPaciente,
actualizarEvolucion,
actualizarLaboratorio,
setCurrentInternacion, setCurrentInternacion,
getEstadisticas, getEstadisticas,
login, login,
@@ -999,10 +992,10 @@ const getEstadisticas = useCallback(() => {
changePassword, changePassword,
updateEmail, updateEmail,
hasPermission, hasPermission,
canAccessInternacion, canAccessArea,
canEditInArea, canChangeBed,
canEditCama,
canEditInternacion, canEditInternacion,
canEditCama,
canEditPaciente, canEditPaciente,
getCamaAreaId, getCamaAreaId,
getInternacionAreaId, getInternacionAreaId,
+1 -1
View File
@@ -42,7 +42,7 @@ export function MapaCamas({
getPacienteById, getPacienteById,
getInternacionById getInternacionById
}: MapaCamasProps) { }: MapaCamasProps) {
const { canEditCama, canEditInArea } = useHospitalStore(); const { canEditCama, canAccessArea } = useHospitalStore();
const [filtroSala, setFiltroSala] = useState<string>('todas'); const [filtroSala, setFiltroSala] = useState<string>('todas');
const [filtroTipo, setFiltroTipo] = useState<string>('todos'); const [filtroTipo, setFiltroTipo] = useState<string>('todos');
const [filtroEstado, setFiltroEstado] = useState<string>('todos'); const [filtroEstado, setFiltroEstado] = useState<string>('todos');