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:
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user