diff --git a/src/sections/EditIngreso.tsx b/src/sections/EditIngreso.tsx index d18a5ba..45bb3da 100644 --- a/src/sections/EditIngreso.tsx +++ b/src/sections/EditIngreso.tsx @@ -62,6 +62,49 @@ export function EditIngreso({ return nombre !== 'fuera de area'; }); + const parseBedNumber = (numero: string) => { + const match = numero.match(/^(\d{3})-(\d+)$/); + if (!match) return { sala: 0, cama: 0 }; + return { + sala: parseInt(match[1]), + cama: parseInt(match[2]) + }; + }; + + const sortedCamas = [...camas].sort((a, b) => { + const pa = parseBedNumber(a.numero); + const pb = parseBedNumber(b.numero); + + const getOrden = (sala: number) => { + const grupo = Math.floor(sala / 100); + const esPar = sala % 2 === 0; + + if (grupo === 2) { + if (esPar) return { grupo: 2, suborden: 0, sala }; + return { grupo: 1, suborden: 1, sala }; + } + if (grupo === 3) { + if (esPar) return { grupo: 3, suborden: 0, sala }; + return { grupo: 4, suborden: 1, sala }; + } + if (grupo === 4) { + if (esPar) return { grupo: 6, suborden: 0, sala }; + return { grupo: 5, suborden: 1, sala }; + } + return { grupo: 10, suborden: 1, sala }; + }; + + const oa = getOrden(pa.sala); + const ob = getOrden(pb.sala); + + if (oa.grupo !== ob.grupo) return oa.grupo - ob.grupo; + if (oa.suborden === ob.suborden) { + if (oa.suborden === 0) return (oa.sala || pa.sala) - (ob.sala || pb.sala); + return (ob.sala || 0) - (oa.sala || 0); + } + return oa.suborden - ob.suborden; + }); + const handleSubmit = () => { if (!pacienteSeleccionado || !camaSeleccionada || !areaSeleccionada || !medico || !diagnosticoIngreso || !enfermedadActual) { alert('Por favor complete los campos obligatorios'); @@ -218,7 +261,7 @@ export function EditIngreso({ - {camas.map(c => ( + {sortedCamas.map(c => ( {c.numero} - {getAreaName(c.areaId)} diff --git a/src/sections/Internaciones.tsx b/src/sections/Internaciones.tsx index e6c076e..b7f54e9 100644 --- a/src/sections/Internaciones.tsx +++ b/src/sections/Internaciones.tsx @@ -127,7 +127,33 @@ export function Internaciones({ const internacionActiva = internaciones.find(i => i.pacienteId === p.id && i.activa); return !internacionActiva; }); - const camasDisponibles = camas.filter(c => c.estado === 'Disponible'); + + const parseBedNumber = (numero: string) => { + const match = numero.match(/^(\d{3})-(\d+)$/); + if (!match) return { sala: 0, cama: 0 }; + return { sala: parseInt(match[1]), cama: parseInt(match[2]) }; + }; + + const sortedCamas = [...camas].sort((a, b) => { + const pa = parseBedNumber(a.numero); + const pb = parseBedNumber(b.numero); + const getOrden = (sala: number) => { + const grupo = Math.floor(sala / 100); + const esPar = sala % 2 === 0; + if (grupo === 2) return esPar ? { grupo: 2, suborden: 0, sala } : { grupo: 1, suborden: 1, sala }; + if (grupo === 3) return esPar ? { grupo: 3, suborden: 0, sala } : { grupo: 4, suborden: 1, sala }; + if (grupo === 4) return esPar ? { grupo: 6, suborden: 0, sala } : { grupo: 5, suborden: 1, sala }; + return { grupo: 10, suborden: 1, sala }; + }; + const oa = getOrden(pa.sala); + const ob = getOrden(pb.sala); + if (oa.grupo !== ob.grupo) return oa.grupo - ob.grupo; + if (oa.suborden === ob.suborden) { + return oa.suborden === 0 ? (oa.sala - ob.sala) : (ob.sala - oa.sala); + } + return oa.suborden - ob.suborden; + }); + const getAreaName = (areaId?: string) => areas.find(a => a.id === areaId)?.nombre; const abrirDialogoEgreso = (internacion: Internacion) => { @@ -231,7 +257,7 @@ export function Internaciones({ - {camasDisponibles.map(c => ( + {sortedCamas.filter(c => c.estado === 'Disponible').map(c => ( {c.numero} - {getAreaName(c.areaId) || 'Sin área'} ({c.tipo}) diff --git a/src/sections/NuevoIngreso.tsx b/src/sections/NuevoIngreso.tsx index 4be301c..c49eb41 100644 --- a/src/sections/NuevoIngreso.tsx +++ b/src/sections/NuevoIngreso.tsx @@ -56,6 +56,49 @@ export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, on }); const pacientesSinInternar = pacientes; + const parseBedNumber = (numero: string) => { + const match = numero.match(/^(\d{3})-(\d+)$/); + if (!match) return { sala: 0, cama: 0 }; + return { + sala: parseInt(match[1]), + cama: parseInt(match[2]) + }; + }; + + const sortedCamas = [...camas].sort((a, b) => { + const pa = parseBedNumber(a.numero); + const pb = parseBedNumber(b.numero); + + const getOrden = (sala: number) => { + const grupo = Math.floor(sala / 100); + const esPar = sala % 2 === 0; + + if (grupo === 2) { + if (esPar) return { grupo: 2, suborden: 0, sala }; + return { grupo: 1, suborden: 1, sala }; + } + if (grupo === 3) { + if (esPar) return { grupo: 3, suborden: 0, sala }; + return { grupo: 4, suborden: 1, sala }; + } + if (grupo === 4) { + if (esPar) return { grupo: 6, suborden: 0, sala }; + return { grupo: 5, suborden: 1, sala }; + } + return { grupo: 10, suborden: 1, sala }; + }; + + const oa = getOrden(pa.sala); + const ob = getOrden(pb.sala); + + if (oa.grupo !== ob.grupo) return oa.grupo - ob.grupo; + if (oa.suborden === ob.suborden) { + if (oa.suborden === 0) return (oa.sala || pa.sala) - (ob.sala || pb.sala); + return (ob.sala || 0) - (oa.sala || 0); + } + return oa.suborden - ob.suborden; + }); + const handleSubmit = () => { if (!pacienteSeleccionado || !camaSeleccionada || !areaSeleccionada || !medico || !diagnosticoIngreso || !enfermedadActual) { alert('Por favor complete los campos obligatorios'); @@ -202,7 +245,7 @@ export function NuevoIngreso({ pacientes, camas, areas, onIniciarInternacion, on - {camas.map(c => ( + {sortedCamas.map(c => ( {c.numero} - {getAreaName(c.areaId)}