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:
+105
-112
@@ -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,
|
||||||
|
|||||||
@@ -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');
|
||||||
|
|||||||
Reference in New Issue
Block a user