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)}