From 8eb071e31fe952bd66efdd2d8796739e354388b7 Mon Sep 17 00:00:00 2001 From: Sergio Nicolas Lavaise Date: Sun, 9 Aug 2026 19:34:36 +0000 Subject: [PATCH] =?UTF-8?q?Actualizar=20control=20de=20permisos=20de=20?= =?UTF-8?q?=C3=A1rea=20y=20gesti=C3=B3n=20de=20usuarios?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App.tsx | 17 +++- src/hooks/useHospitalStore.ts | 163 +++++++++++++++++++------------ src/sections/GestionUsuarios.tsx | 12 ++- 3 files changed, 129 insertions(+), 63 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 41bd971..01c3316 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -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 ( +
+

No tiene permisos para acceder a esta sección.

+ +
+ ); + } return ( ); diff --git a/src/hooks/useHospitalStore.ts b/src/hooks/useHospitalStore.ts index 5692291..c5baccf 100644 --- a/src/hooks/useHospitalStore.ts +++ b/src/hooks/useHospitalStore.ts @@ -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) => { + 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) => { @@ -311,6 +336,9 @@ const agregarCama = useCallback(async (cama: Omit) => { // Acciones de internaciones const iniciarInternacion = useCallback(async (internacion: Omit) => { + 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) => { 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) => { 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) => { 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) => { 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) => { 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) => { 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) => { 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) => { 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) => { 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) => { 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) => { 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) => { 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) => { 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) => { 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) => { 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) => { 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) => { 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) => { 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, diff --git a/src/sections/GestionUsuarios.tsx b/src/sections/GestionUsuarios.tsx index edd4634..7d3aa71 100644 --- a/src/sections/GestionUsuarios.tsx +++ b/src/sections/GestionUsuarios.tsx @@ -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([]); const [areas, setAreas] = useState([]); 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 ( +
+ No tiene permisos para acceder al módulo de gestión de usuarios. +
+ ); + } + if (loading) { return
Cargando...
; } @@ -319,7 +327,7 @@ export function GestionUsuarios() { - {form.rol === 'medico' && ( + {form.rol !== 'admin' && (