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
This commit is contained in:
@@ -271,7 +271,7 @@ export function useHospitalStore() {
|
||||
}
|
||||
}, [state.camas, state.currentUser, apiCall]);
|
||||
|
||||
const agregarCama = useCallback(async (cama: Omit<Cama, 'id'>) => {
|
||||
const agregarCama = useCallback(async (cama: Omit<Cama, 'id'>) => {
|
||||
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<Internacion, 'id' | 'activa'>) => {
|
||||
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;
|
||||
}),
|
||||
|
||||
@@ -265,11 +265,11 @@ export function MapaCamas({
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
{/* Mapa de Camas */}
|
||||
{/* Mapa de Camas */}
|
||||
<div className="grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-2 sm:gap-4">
|
||||
{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 (
|
||||
<Dialog key={cama.id}>
|
||||
@@ -297,6 +297,7 @@ export function MapaCamas({
|
||||
)}
|
||||
|
||||
|
||||
|
||||
</CardContent>
|
||||
</Card>
|
||||
</DialogTrigger>
|
||||
|
||||
Reference in New Issue
Block a user