From 91cde0e5d9f765177e5c3dcc657b1a6f7523ccf2 Mon Sep 17 00:00:00 2001 From: Sergio Nicolas Lavaise Date: Sun, 9 Aug 2026 19:42:05 +0000 Subject: [PATCH] =?UTF-8?q?Actualizar=20l=C3=B3gica=20de=20contabilizaci?= =?UTF-8?q?=C3=B3n=20de=20camas=20Fuera=20de=20=C3=81rea=20seg=C3=BAn=20sa?= =?UTF-8?q?la?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useHospitalStore.ts | 12 ++++++------ src/lib/utils.ts | 37 +++++++++++++++++++++++++++++++++++ src/sections/MapaCamas.tsx | 6 +++--- 3 files changed, 46 insertions(+), 9 deletions(-) diff --git a/src/hooks/useHospitalStore.ts b/src/hooks/useHospitalStore.ts index c5baccf..59beb71 100644 --- a/src/hooks/useHospitalStore.ts +++ b/src/hooks/useHospitalStore.ts @@ -1,6 +1,6 @@ import { useState, useEffect, useCallback } from 'react'; import { toast } from 'sonner'; -import { getNombreProfesional } from '@/lib/utils'; +import { getNombreProfesional, isCamaFueraDeArea } from '@/lib/utils'; import type { Paciente, Cama, @@ -1211,11 +1211,11 @@ const actualizarInternacion = useCallback(async (internacionId: string, datos: P }, [state.cultivos]); const getEstadisticas = useCallback(() => { - const fueraDeAreaList = state.camas.filter(c => c.areaId === 'Fuera de Area'); - const camasActivas = state.camas.filter(c => c.areaId !== 'Fuera de Area'); - const camaPrincipal = state.camas.filter(c => c.areaId !== 'Fuera de Area'); - const camaOcupadas = state.camas.filter(c => c.estado === 'Ocupada' && c.areaId !== 'Fuera de Area').length; - const camasDisponibles = state.camas.filter(c => c.estado === 'Disponible' && c.areaId !== 'Fuera de Area').length; + const fueraDeAreaList = state.camas.filter(c => isCamaFueraDeArea(c, state.areas)); + const camasActivas = state.camas.filter(c => !isCamaFueraDeArea(c, state.areas)); + const camaPrincipal = state.camas.filter(c => !isCamaFueraDeArea(c, state.areas)); + const camaOcupadas = state.camas.filter(c => c.estado === 'Ocupada' && !isCamaFueraDeArea(c, state.areas)).length; + const camasDisponibles = state.camas.filter(c => c.estado === 'Disponible' && !isCamaFueraDeArea(c, state.areas)).length; const camasMantenimiento = state.camas.filter(c => c.estado === 'Reparacion').length; const internacionesActivas = state.internaciones.filter(i => i.activa).length; const totalPacientes = state.pacientes.length; diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 052ee1e..6dab3b4 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -37,3 +37,40 @@ export function calcularEdad(fechaNacimiento?: string): string | number { } return edad; } + +export function isCamaFueraDeArea( + cama: { numero: string; areaId?: string }, + areas?: { id: string; nombre: string }[] +): boolean { + if (cama.areaId === 'Fuera de Area') { + return true; + } + + if (areas && cama.areaId) { + const area = areas.find(a => (a.nombre || '').toLowerCase().trim() === 'fuera de area'); + if (area && cama.areaId === area.id) { + return true; + } + } + + const numero = cama.numero; + if (!numero) return false; + const parts = numero.trim().split('-'); + if (parts.length === 0) return false; + const salaStr = parts[0].trim(); + const salaNum = parseInt(salaStr, 10); + if (isNaN(salaNum)) return false; + + // Formato 3XX que sean impares + if (salaNum >= 300 && salaNum < 400 && salaNum % 2 !== 0) { + return true; + } + + // Todas las 4XX (sean pares o impares) + if (salaNum >= 400 && salaNum < 500) { + return true; + } + + return false; +} + diff --git a/src/sections/MapaCamas.tsx b/src/sections/MapaCamas.tsx index 6915abb..30a8923 100644 --- a/src/sections/MapaCamas.tsx +++ b/src/sections/MapaCamas.tsx @@ -3,7 +3,7 @@ import { Bed, CheckCircle2, Clock, Wrench, User, Plus, Trash, Edit2, Save, X } f import { Card, CardContent } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; -import { formatDateDDMMYYYY, getNombreProfesional } from '@/lib/utils'; +import { formatDateDDMMYYYY, getNombreProfesional, isCamaFueraDeArea } from '@/lib/utils'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; @@ -187,10 +187,10 @@ export function MapaCamas({
- {camas.filter(c => c.estado === 'Disponible').length} Disponibles + {camas.filter(c => c.estado === 'Disponible' && !isCamaFueraDeArea(c, areas)).length} Disponibles - {camas.filter(c => c.estado === 'Ocupada').length} Ocupadas + {camas.filter(c => c.estado === 'Ocupada' && !isCamaFueraDeArea(c, areas)).length} Ocupadas