Actualizar control de permisos de área y gestión de usuarios
This commit is contained in:
+16
-1
@@ -1,5 +1,6 @@
|
||||
import { useHospitalStore } from '@/hooks/useHospitalStore';
|
||||
import { Layout } from '@/sections/Layout';
|
||||
import { toast } from 'sonner';
|
||||
import { Dashboard } from '@/sections/Dashboard';
|
||||
import { MapaCamas } from '@/sections/MapaCamas';
|
||||
import { Pacientes } from '@/sections/Pacientes';
|
||||
@@ -190,7 +191,13 @@ function AppContent() {
|
||||
onActualizarInternacion={store.actualizarInternacion}
|
||||
onActualizarCama={store.actualizarCama}
|
||||
onVolver={() => store.setVista('internaciones')}
|
||||
onEditarIngreso={() => { store.setVista('editaringreso'); }}
|
||||
onEditarIngreso={() => {
|
||||
if (store.canEditIngreso(internacion.id)) {
|
||||
store.setVista('editaringreso');
|
||||
} else {
|
||||
toast.error(`Solo el usuario que creó esta internación (${internacion.medicoIngresante}) puede modificar el ingreso.`);
|
||||
}
|
||||
}}
|
||||
canEdit={store.canEditInternacion(internacion.id)}
|
||||
/>
|
||||
);
|
||||
@@ -236,6 +243,14 @@ function AppContent() {
|
||||
);
|
||||
}
|
||||
case 'usuarios':
|
||||
if (store.currentUser?.rol !== 'admin') {
|
||||
return (
|
||||
<div className="p-8 text-center text-red-500 font-semibold">
|
||||
<p>No tiene permisos para acceder a esta sección.</p>
|
||||
<Button className="mt-4" onClick={() => store.setVista('dashboard')}>Volver al Dashboard</Button>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<GestionUsuarios />
|
||||
);
|
||||
|
||||
+103
-60
@@ -1,4 +1,6 @@
|
||||
import { useState, useEffect, useCallback } from 'react';
|
||||
import { toast } from 'sonner';
|
||||
import { getNombreProfesional } from '@/lib/utils';
|
||||
import type {
|
||||
Paciente,
|
||||
Cama,
|
||||
@@ -168,6 +170,14 @@ export function useHospitalStore() {
|
||||
return user.areaId === areaId;
|
||||
}, [state.currentUser]);
|
||||
|
||||
const checkAreaPermission = useCallback((areaId: string | null | undefined): boolean => {
|
||||
const allowed = canAccessArea(areaId);
|
||||
if (!allowed) {
|
||||
toast.error("no pertenecen al area de trabajo por la que se encuentra internado el paciente");
|
||||
}
|
||||
return allowed;
|
||||
}, [canAccessArea]);
|
||||
|
||||
const canChangeBed = useCallback((internacionId: string): boolean => {
|
||||
const internacion = state.internaciones.find(i => i.id === internacionId);
|
||||
if (!internacion) return false;
|
||||
@@ -179,6 +189,17 @@ export function useHospitalStore() {
|
||||
return canAccessArea(areaId);
|
||||
}, [getInternacionAreaId, canAccessArea]);
|
||||
|
||||
const canEditIngreso = useCallback((internacionId: string): boolean => {
|
||||
const internacion = state.internaciones.find(i => i.id === internacionId);
|
||||
if (!internacion) return false;
|
||||
const normalizeMedicoName = (name?: string) => {
|
||||
return (name || '').trim().toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
|
||||
};
|
||||
const userProfesionalName = getNombreProfesional(state.currentUser);
|
||||
return state.currentUser?.rol === 'admin' ||
|
||||
(normalizeMedicoName(internacion.medicoIngresante) === normalizeMedicoName(userProfesionalName));
|
||||
}, [state.internaciones, state.currentUser]);
|
||||
|
||||
const canEditCama = useCallback((camaId: string): boolean => {
|
||||
const areaId = getCamaAreaId(camaId);
|
||||
return canAccessArea(areaId);
|
||||
@@ -230,6 +251,8 @@ export function useHospitalStore() {
|
||||
}, [apiCall]);
|
||||
|
||||
const actualizarPaciente = useCallback(async (id: string, datos: Partial<Paciente>) => {
|
||||
const areaId = getPacienteAreaId(id);
|
||||
if (!checkAreaPermission(areaId)) return;
|
||||
try {
|
||||
await apiCall('PUT', `/pacientes/${id}`, datos);
|
||||
setState(prev => ({
|
||||
@@ -240,9 +263,11 @@ export function useHospitalStore() {
|
||||
console.error('Error al actualizar paciente:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [apiCall]);
|
||||
}, [apiCall, checkAreaPermission, getPacienteAreaId]);
|
||||
|
||||
const eliminarPaciente = useCallback(async (id: string) => {
|
||||
const areaId = getPacienteAreaId(id);
|
||||
if (!checkAreaPermission(areaId)) return;
|
||||
try {
|
||||
await apiCall('DELETE', `/pacientes/${id}`);
|
||||
setState(prev => ({
|
||||
@@ -253,7 +278,7 @@ export function useHospitalStore() {
|
||||
console.error('Error al eliminar paciente:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [apiCall]);
|
||||
}, [apiCall, checkAreaPermission, getPacienteAreaId]);
|
||||
|
||||
// Acciones de camas
|
||||
const actualizarCama = useCallback(async (id: string, datos: Partial<Cama>) => {
|
||||
@@ -311,6 +336,9 @@ const agregarCama = useCallback(async (cama: Omit<Cama, 'id'>) => {
|
||||
|
||||
// Acciones de internaciones
|
||||
const iniciarInternacion = useCallback(async (internacion: Omit<Internacion, 'id' | 'activa'>) => {
|
||||
if (!checkAreaPermission(internacion.areaId)) {
|
||||
return null;
|
||||
}
|
||||
const nuevaInternacion: Internacion = {
|
||||
...internacion,
|
||||
id: generateUUID(),
|
||||
@@ -402,16 +430,30 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
const internacion = state.internaciones.find(i => i.id === internacionId);
|
||||
if (!internacion) return;
|
||||
|
||||
// Check creator permission first
|
||||
const normalizeMedicoName = (name?: string) => {
|
||||
return (name || '').trim().toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
|
||||
};
|
||||
const userProfesionalName = getNombreProfesional(state.currentUser);
|
||||
const isCreator = state.currentUser?.rol === 'admin' ||
|
||||
(normalizeMedicoName(internacion.medicoIngresante) === normalizeMedicoName(userProfesionalName));
|
||||
|
||||
if (!isCreator) {
|
||||
toast.error(`Solo el usuario que creó esta internación (${internacion.medicoIngresante}) puede modificar el ingreso.`);
|
||||
return;
|
||||
}
|
||||
|
||||
const oldCamaId = internacion.camaId;
|
||||
const newCamaId = datos.camaId;
|
||||
const cambioDeCama = newCamaId && newCamaId !== oldCamaId;
|
||||
|
||||
if (cambioDeCama && !canChangeBed(internacionId)) {
|
||||
console.warn('No tiene permisos para cambiar la cama de esta internación');
|
||||
checkAreaPermission(null); // triggers toast
|
||||
return;
|
||||
}
|
||||
|
||||
if (!cambioDeCama && !canAccessArea(internacion.areaId)) {
|
||||
if (!cambioDeCama && !checkAreaPermission(internacion.areaId)) {
|
||||
console.warn('No tiene permisos para actualizar esta internación');
|
||||
return;
|
||||
}
|
||||
@@ -455,13 +497,13 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al actualizar internación:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
// Acciones de evoluciones
|
||||
const agregarEvolucion = useCallback(async (evolucion: Omit<Evolucion, 'id'>) => {
|
||||
const internacion = state.internaciones.find(i => i.id === evolucion.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para agregar evolución en esta área');
|
||||
return null;
|
||||
}
|
||||
@@ -481,14 +523,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al agregar evolución:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const eliminarEvolucion = useCallback(async (id: string) => {
|
||||
const evolucion = state.evoluciones.find(e => e.id === id);
|
||||
if (!evolucion) return;
|
||||
const internacion = state.internaciones.find(i => i.id === evolucion.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para eliminar evolución en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -503,14 +545,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al eliminar evolución:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const actualizarEvolucion = useCallback(async (id: string, datos: Partial<Evolucion>) => {
|
||||
const evolucion = state.evoluciones.find(e => e.id === id);
|
||||
if (!evolucion) return;
|
||||
const internacion = state.internaciones.find(i => i.id === evolucion.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para actualizar evolución en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -525,13 +567,13 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al actualizar evolución:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
// Acciones de laboratorios
|
||||
const agregarLaboratorio = useCallback(async (laboratorio: Omit<Laboratorio, 'id'>) => {
|
||||
const internacion = state.internaciones.find(i => i.id === laboratorio.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para agregar laboratorio en esta área');
|
||||
return null;
|
||||
}
|
||||
@@ -550,14 +592,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al agregar laboratorio:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const eliminarLaboratorio = useCallback(async (id: string) => {
|
||||
const laboratorio = state.laboratorios.find(l => l.id === id);
|
||||
if (!laboratorio) return;
|
||||
const internacion = state.internaciones.find(i => i.id === laboratorio.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para eliminar laboratorio en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -571,14 +613,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al eliminar laboratorio:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const actualizarLaboratorio = useCallback(async (id: string, datos: Partial<Laboratorio>) => {
|
||||
const laboratorio = state.laboratorios.find(l => l.id === id);
|
||||
if (!laboratorio) return;
|
||||
const internacion = state.internaciones.find(i => i.id === laboratorio.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para actualizar laboratorio en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -592,13 +634,13 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al actualizar laboratorio:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
// Acciones de glucemias
|
||||
const agregarGlucemia = useCallback(async (glucemia: Omit<Glucemia, 'id'>) => {
|
||||
const internacion = state.internaciones.find(i => i.id === glucemia.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para agregar glucemia en esta área');
|
||||
return null;
|
||||
}
|
||||
@@ -617,14 +659,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al agregar glucemia:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const eliminarGlucemia = useCallback(async (id: string) => {
|
||||
const glucemia = state.glucemias.find(g => g.id === id);
|
||||
if (!glucemia) return;
|
||||
const internacion = state.internaciones.find(i => i.id === glucemia.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para eliminar glucemia en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -638,14 +680,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al eliminar glucemia:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const actualizarGlucemia = useCallback(async (id: string, datos: Partial<Glucemia>) => {
|
||||
const glucemia = state.glucemias.find(g => g.id === id);
|
||||
if (!glucemia) return;
|
||||
const internacion = state.internaciones.find(i => i.id === glucemia.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para actualizar glucemia en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -659,13 +701,13 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al actualizar glucemia:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
// Acciones de ácido-base
|
||||
const agregarAcidoBase = useCallback(async (acidoBase: Omit<AcidoBase, 'id'>) => {
|
||||
const internacion = state.internaciones.find(i => i.id === acidoBase.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para agregar ácido-base en esta área');
|
||||
return null;
|
||||
}
|
||||
@@ -684,14 +726,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al agregar ácido-base:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const actualizarAcidoBase = useCallback(async (id: string, datos: Partial<AcidoBase>) => {
|
||||
const acidoBase = state.acidosBase.find(a => a.id === id);
|
||||
if (!acidoBase) return;
|
||||
const internacion = state.internaciones.find(i => i.id === acidoBase.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para actualizar ácido-base en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -705,14 +747,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al actualizar ácido-base:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const eliminarAcidoBase = useCallback(async (id: string) => {
|
||||
const acidoBase = state.acidosBase.find(a => a.id === id);
|
||||
if (!acidoBase) return;
|
||||
const internacion = state.internaciones.find(i => i.id === acidoBase.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para eliminar ácido-base en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -726,13 +768,13 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al eliminar ácido-base:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
// Acciones de cultivos
|
||||
const agregarCultivo = useCallback(async (cultivo: Omit<Cultivo, 'id'>) => {
|
||||
const internacion = state.internaciones.find(i => i.id === cultivo.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para agregar cultivo en esta área');
|
||||
return null;
|
||||
}
|
||||
@@ -751,14 +793,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al agregar cultivo:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const actualizarCultivo = useCallback(async (id: string, datos: Partial<Cultivo>) => {
|
||||
const cultivo = state.cultivos.find(c => c.id === id);
|
||||
if (!cultivo) return;
|
||||
const internacion = state.internaciones.find(i => i.id === cultivo.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para actualizar cultivo en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -772,14 +814,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al actualizar cultivo:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const eliminarCultivo = useCallback(async (id: string) => {
|
||||
const cultivo = state.cultivos.find(c => c.id === id);
|
||||
if (!cultivo) return;
|
||||
const internacion = state.internaciones.find(i => i.id === cultivo.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para eliminar cultivo en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -793,13 +835,13 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al eliminar cultivo:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
// Acciones de estudios complementarios
|
||||
const agregarEstudioComplementario = useCallback(async (estudio: Omit<EstudioComplementario, 'id'>) => {
|
||||
const internacion = state.internaciones.find(i => i.id === estudio.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para agregar estudio complementario en esta área');
|
||||
return null;
|
||||
}
|
||||
@@ -818,14 +860,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al agregar estudio:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const actualizarEstudioComplementario = useCallback(async (id: string, datos: Partial<EstudioComplementario>) => {
|
||||
const estudio = state.estudiosComplementarios.find(e => e.id === id);
|
||||
if (!estudio) return;
|
||||
const internacion = state.internaciones.find(i => i.id === estudio.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para actualizar estudio complementario en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -839,14 +881,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al actualizar estudio:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const eliminarEstudioComplementario = useCallback(async (id: string) => {
|
||||
const estudio = state.estudiosComplementarios.find(e => e.id === id);
|
||||
if (!estudio) return;
|
||||
const internacion = state.internaciones.find(i => i.id === estudio.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para eliminar estudio complementario en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -860,13 +902,13 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al eliminar estudio:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
// Acciones de interconsultas
|
||||
const agregarInterconsulta = useCallback(async (interconsulta: Omit<Interconsulta, 'id'>) => {
|
||||
const internacion = state.internaciones.find(i => i.id === interconsulta.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para agregar interconsulta en esta área');
|
||||
return null;
|
||||
}
|
||||
@@ -882,14 +924,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al agregar interconsulta:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const actualizarInterconsulta = useCallback(async (id: string, datos: Partial<Interconsulta>) => {
|
||||
const interconsulta = (state.interconsultas || []).find(ic => ic.id === id);
|
||||
if (!interconsulta) return;
|
||||
const internacion = state.internaciones.find(i => i.id === interconsulta.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para actualizar interconsulta en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -903,14 +945,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al actualizar interconsulta:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const eliminarInterconsulta = useCallback(async (id: string) => {
|
||||
const interconsulta = (state.interconsultas || []).find(ic => ic.id === id);
|
||||
if (!interconsulta) return;
|
||||
const internacion = state.internaciones.find(i => i.id === interconsulta.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para eliminar interconsulta en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -924,12 +966,12 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al eliminar interconsulta:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const agregarATB = useCallback(async (atb: Omit<ATB, 'id'>) => {
|
||||
const internacion = state.internaciones.find(i => i.id === atb.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para agregar ATB en esta área');
|
||||
return null;
|
||||
}
|
||||
@@ -945,14 +987,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al agregar ATB:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const actualizarATB = useCallback(async (id: string, datos: Partial<ATB>) => {
|
||||
const atb = state.atb.find(a => a.id === id);
|
||||
if (!atb) return;
|
||||
const internacion = state.internaciones.find(i => i.id === atb.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para actualizar ATB en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -966,14 +1008,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al actualizar ATB:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const eliminarATB = useCallback(async (id: string) => {
|
||||
const atb = state.atb.find(a => a.id === id);
|
||||
if (!atb) return;
|
||||
const internacion = state.internaciones.find(i => i.id === atb.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para eliminar ATB en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -987,12 +1029,12 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al eliminar ATB:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const agregarIndicacion = useCallback(async (indicacion: Omit<Indicacion, 'id'>) => {
|
||||
const internacion = state.internaciones.find(i => i.id === indicacion.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para agregar indicación en esta área');
|
||||
return null;
|
||||
}
|
||||
@@ -1008,14 +1050,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al agregar indicación:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state.internaciones, canAccessArea, apiCall]);
|
||||
}, [state.internaciones, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const actualizarIndicacion = useCallback(async (id: string, datos: Partial<Indicacion>) => {
|
||||
const indicacion = state.indicaciones.find(i => i.id === id);
|
||||
if (!indicacion) return;
|
||||
const internacion = state.internaciones.find(i => i.id === indicacion.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para actualizar indicación en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -1029,14 +1071,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al actualizar indicación:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state.indicaciones, state.internaciones, canAccessArea, apiCall]);
|
||||
}, [state.indicaciones, state.internaciones, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const eliminarIndicacion = useCallback(async (id: string) => {
|
||||
const indicacion = state.indicaciones.find(i => i.id === id);
|
||||
if (!indicacion) return;
|
||||
const internacion = state.internaciones.find(i => i.id === indicacion.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para eliminar indicación en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -1050,12 +1092,12 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al eliminar indicación:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state.indicaciones, state.internaciones, canAccessArea, apiCall]);
|
||||
}, [state.indicaciones, state.internaciones, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const agregarMovimientoIndicacion = useCallback(async (movimiento: any) => {
|
||||
const internacion = state.internaciones.find(i => i.id === movimiento.internacionId);
|
||||
const areaId = internacion?.areaId || null;
|
||||
if (!canAccessArea(areaId)) {
|
||||
if (!checkAreaPermission(areaId)) {
|
||||
console.warn('No tiene permisos para agregar movimiento de indicación en esta área');
|
||||
return;
|
||||
}
|
||||
@@ -1070,7 +1112,7 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
console.error('Error al agregar movimiento:', err);
|
||||
throw err;
|
||||
}
|
||||
}, [state, canAccessArea, apiCall]);
|
||||
}, [state, canAccessArea, checkAreaPermission, apiCall]);
|
||||
|
||||
const getMovimientosByInternacion = useCallback((internacionId: string) => {
|
||||
return (state.movimientosIndicaciones || [])
|
||||
@@ -1318,6 +1360,7 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P
|
||||
canAccessArea,
|
||||
canChangeBed,
|
||||
canEditInternacion,
|
||||
canEditIngreso,
|
||||
canEditCama,
|
||||
canEditPaciente,
|
||||
getCamaAreaId,
|
||||
|
||||
@@ -14,7 +14,7 @@ import { Plus, Pencil, Trash2 } from 'lucide-react';
|
||||
const API_BASE = import.meta.env.VITE_API_URL || '/api';
|
||||
|
||||
export function GestionUsuarios() {
|
||||
const { logout } = useHospitalStore();
|
||||
const { currentUser } = useHospitalStore();
|
||||
const [usuarios, setUsuarios] = useState<Usuario[]>([]);
|
||||
const [areas, setAreas] = useState<Area[]>([]);
|
||||
const [loading, setLoading] = useState(true);
|
||||
@@ -157,6 +157,14 @@ export function GestionUsuarios() {
|
||||
return areas.find(a => a.id === areaId)?.nombre || '-';
|
||||
};
|
||||
|
||||
if (!currentUser || currentUser.rol !== 'admin') {
|
||||
return (
|
||||
<div className="p-8 text-center text-red-500 font-semibold">
|
||||
No tiene permisos para acceder al módulo de gestión de usuarios.
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
if (loading) {
|
||||
return <div>Cargando...</div>;
|
||||
}
|
||||
@@ -319,7 +327,7 @@ export function GestionUsuarios() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{form.rol === 'medico' && (
|
||||
{form.rol !== 'admin' && (
|
||||
<div className="space-y-2">
|
||||
<Label>Área Asignada</Label>
|
||||
<Select value={form.areaId} onValueChange={(v) => setForm({ ...form, areaId: v })}>
|
||||
|
||||
Reference in New Issue
Block a user