Implementar y centralizar el ordenamiento automatico y riguroso de camas por las reglas de grupos 2XX, 3XX, 4XX
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user