From 96058f52759ff90b7ee4f01f434802fb9009dcd4 Mon Sep 17 00:00:00 2001 From: Sergio Nicolas Lavaise Date: Fri, 24 Apr 2026 11:46:01 -0300 Subject: [PATCH] Fix bed management: preserve camaId from frontend to backend - Use camaId generated in frontend instead of generating new one in backend API - Remove patientId and internacionId from cama table (use internaciones table instead) - Fix discharge: delete cama if fuera de area, mark available otherwise - Fix MapaCamas to find patient via internaciones table --- server/api-mariadb.js | 5 ++++- server/db-mariadb.js | 15 ++++++++++++- src/hooks/useHospitalStore.ts | 40 +++++++++++++---------------------- src/sections/MapaCamas.tsx | 7 +++--- 4 files changed, 37 insertions(+), 30 deletions(-) diff --git a/server/api-mariadb.js b/server/api-mariadb.js index 0449dc3..f2ab810 100644 --- a/server/api-mariadb.js +++ b/server/api-mariadb.js @@ -239,7 +239,10 @@ app.put('/api/camas/:id', async (req, res) => { app.post('/api/camas', async (req, res) => { try { - const cama = { ...req.body, id: generateUUID() }; + const cama = req.body; + if (!cama.id) { + cama.id = generateUUID(); + } await createCama(cama); res.json(cama); } catch (err) { diff --git a/server/db-mariadb.js b/server/db-mariadb.js index 8326297..813baeb 100644 --- a/server/db-mariadb.js +++ b/server/db-mariadb.js @@ -1,6 +1,18 @@ import * as mariadb from 'mariadb'; import * as bcrypt from 'bcryptjs'; +// UUID generator +export function generateUUID() { + if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') { + return crypto.randomUUID(); + } + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { + const r = (Math.random() * 16) | 0; + const v = c === 'x' ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); +} + // MariaDB connection pool const pool = mariadb.createPool({ host: process.env.DB_HOST || '10.9.8.135', @@ -350,9 +362,10 @@ export async function getCamaById(id) { } export async function createCama(cama) { + const id = cama.id || generateUUID(); await query( 'INSERT INTO camas (id, numero, areaId, tipo, estado) VALUES (?, ?, ?, ?, ?)', - [cama.id, cama.numero, cama.areaId, cama.tipo, cama.estado] + [id, cama.numero, cama.areaId, cama.tipo, cama.estado] ); } diff --git a/src/hooks/useHospitalStore.ts b/src/hooks/useHospitalStore.ts index ce74723..465ba19 100644 --- a/src/hooks/useHospitalStore.ts +++ b/src/hooks/useHospitalStore.ts @@ -271,7 +271,7 @@ export function useHospitalStore() { } }, [state.camas, state.currentUser, apiCall]); - const agregarCama = useCallback(async (cama: Omit) => { +const agregarCama = useCallback(async (cama: Omit) => { const nuevaCama: Cama = { ...cama, id: generateUUID(), @@ -303,7 +303,7 @@ export function useHospitalStore() { } }, [apiCall]); - // Acciones de internaciones +// Acciones de internaciones const iniciarInternacion = useCallback(async (internacion: Omit) => { const nuevaInternacion: Internacion = { ...internacion, @@ -315,11 +315,9 @@ export function useHospitalStore() { // API call inmediata para crear internación await apiCall('POST', '/internaciones', nuevaInternacion); - // Actualizar estado de la cama en la base de datos + // Actualizar estado de la cama en la base de datos (solo estado) await apiCall('PUT', `/camas/${internacion.camaId}`, { - estado: 'Ocupada', - pacienteId: internacion.pacienteId, - internacionId: nuevaInternacion.id + estado: 'Ocupada' }); // Actualizar estado local después del éxito @@ -328,7 +326,7 @@ export function useHospitalStore() { internaciones: [...prev.internaciones, nuevaInternacion], camas: prev.camas.map(c => c.id === internacion.camaId - ? { ...c, estado: 'Ocupada' as const, pacienteId: internacion.pacienteId, internacionId: nuevaInternacion.id } + ? { ...c, estado: 'Ocupada' as const } : c ), })); @@ -348,9 +346,9 @@ const finalizarInternacion = useCallback(async (internacionId: string, datos: { const internacion = state.internaciones.find(i => i.id === internacionId); if (!internacion) return; - const areaFueraDeArea = state.areas.find(a => (a.nombre || '').trim().toLowerCase() === 'fuera de area'); + const areaFueraDeArea = state.areas.find(a => (a.nombre || '').toLowerCase().trim() === 'fuera de area'); const areaFueraDeAreaId = areaFueraDeArea?.id; - const esFueraDeArea = internacion.areaId === areaFueraDeAreaId; + const esFueraDeArea = !internacion.areaId || !areaFueraDeAreaId || internacion.areaId === areaFueraDeAreaId; const camaId = internacion.camaId; try { @@ -365,9 +363,7 @@ const finalizarInternacion = useCallback(async (internacionId: string, datos: { } else { // Marcar como disponible si es un área normal await apiCall('PUT', `/camas/${camaId}`, { - estado: 'Disponible', - pacienteId: null, - internacionId: null + estado: 'Disponible' }); } } @@ -385,7 +381,7 @@ const finalizarInternacion = useCallback(async (internacionId: string, datos: { ? prev.camas.filter(c => c.id !== camaId) : prev.camas.map(c => c.id === camaId - ? { ...c, estado: 'Disponible' as const, pacienteId: undefined, internacionId: undefined } + ? { ...c, estado: 'Disponible' as const } : c ), }; @@ -414,8 +410,6 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P return; } - const pacienteId = datos.pacienteId || internacion.pacienteId; - try { // API call inmediata await apiCall('PUT', `/internaciones/${internacionId}`, datos); @@ -423,18 +417,14 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P // Si hay cambio de cama, actualizar estados en la base de datos if (cambioDeCama && newCamaId && oldCamaId) { await apiCall('PUT', `/camas/${newCamaId}`, { - estado: 'Ocupada', - pacienteId, - internacionId + estado: 'Ocupada' }); await apiCall('PUT', `/camas/${oldCamaId}`, { - estado: 'Disponible', - pacienteId: null, - internacionId: null + estado: 'Disponible' }); } - // Actualizar estado local después del éxito +// Actualizar estado local después del éxito setState(prev => { const result = { ...prev, @@ -443,12 +433,12 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P ? { ...i, ...datos } : i ), - camas: prev.camas.map(c => { + cams: prev.camas.map(c => { if (c.id === newCamaId && newCamaId !== oldCamaId) { - return { ...c, estado: 'Ocupada' as const, pacienteId, internacionId }; + return { ...c, estado: 'Ocupada' as const }; } if (c.id === oldCamaId && oldCamaId !== newCamaId) { - return { ...c, estado: 'Disponible' as const, pacienteId: undefined, internacionId: undefined }; + return { ...c, estado: 'Disponible' as const }; } return c; }), diff --git a/src/sections/MapaCamas.tsx b/src/sections/MapaCamas.tsx index 26e8a26..f5ef3be 100644 --- a/src/sections/MapaCamas.tsx +++ b/src/sections/MapaCamas.tsx @@ -265,11 +265,11 @@ export function MapaCamas({ - {/* Mapa de Camas */} +{/* Mapa de Camas */}
{sortedCamas.map((cama) => { - const paciente = cama.pacienteId ? getPacienteById(cama.pacienteId) : null; - const internacion = cama.internacionId ? getInternacionById(cama.internacionId) : null; + const internacion = internaciones.find(i => i.camaId === cama.id && i.activa); + const paciente = internacion ? getPacienteById(internacion.pacienteId) : null; return ( @@ -297,6 +297,7 @@ export function MapaCamas({ )} +