Implementar y centralizar el ordenamiento automatico y riguroso de camas por las reglas de grupos 2XX, 3XX, 4XX

This commit is contained in:
2026-08-11 23:38:31 +00:00
parent 0a0f7782e9
commit e869d6a19e
6 changed files with 64 additions and 158 deletions
+52
View File
@@ -44,6 +44,58 @@ export function isCamaFueraDeGrupo(
return computeSector(cama?.numero || '') === 'Fuera de Área';
}
export function sortCamas<T extends { numero: string }>(camas: T[]): T[] {
const parseBedNumber = (numero: string) => {
const match = (numero || '').match(/^(\d{3})-(\d+)$/);
if (!match) return { sala: 0, cama: 0 };
return {
sala: parseInt(match[1], 10),
cama: parseInt(match[2], 10)
};
};
return [...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 { weight: 1, order: 'desc', sala }; // 2XX impares, mayor a menor
return { weight: 2, order: 'asc', sala }; // 2XX pares, menor a mayor
}
if (grupo === 3) {
if (esPar) return { weight: 3, order: 'asc', sala }; // 3XX pares, menor a mayor
return { weight: 4, order: 'desc', sala }; // 3XX impares, mayor a menor
}
if (grupo === 4) {
if (!esPar) return { weight: 5, order: 'desc', sala }; // 4XX impares, mayor a menor
return { weight: 6, order: 'asc', sala }; // 4XX pares, menor a mayor
}
return { weight: 10, order: 'asc', sala };
};
const oa = getOrden(pa.sala);
const ob = getOrden(pb.sala);
if (oa.weight !== ob.weight) {
return oa.weight - ob.weight;
}
if (oa.sala !== ob.sala) {
if (oa.order === 'desc') {
return ob.sala - oa.sala;
} else {
return oa.sala - ob.sala;
}
}
return pa.cama - pb.cama;
});
}
export function computeSector(numero: string): "En Área" | "Fuera de Área" {
if (!numero) return 'En Área';
const cleanNumero = String(numero).trim();