import { useState } from 'react'; import { ClipboardList, Plus, Search, Bed, Calendar, Stethoscope, LogOut, CheckCircle2 } from 'lucide-react'; import { Card, CardContent } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import type { Internacion, Paciente, Cama, Area, Evolucion, Laboratorio, Cultivo } from '@/types'; import { formatDateDDMMYYYY } from '@/lib/utils'; interface InternacionesProps { internaciones: Internacion[]; pacientes: Paciente[]; camas: Cama[]; evoluciones?: Evolucion[]; laboratorios?: Laboratorio[]; cultivos?: Cultivo[]; areas: Area[]; onIniciarInternacion: (internacion: Omit) => void; onFinalizarInternacion: (internacionId: string, datos: { fechaEgreso: string; diagnosticoEgreso: string; motivoEgreso: Internacion['motivoEgreso'] }) => void; getPacienteById: (id: string) => Paciente | undefined; getCamaById: (id: string) => Cama | undefined; onVerHC?: (internacionId: string) => void; onNuevoIngreso?: () => void; } export function Internaciones({ internaciones, pacientes, camas, onIniciarInternacion, onFinalizarInternacion, getPacienteById, getCamaById, areas, onVerHC, onNuevoIngreso, }: InternacionesProps) { const [filtroEstado, setFiltroEstado] = useState<'todas' | 'activas' | 'finalizadas'>('todas'); const [dialogoNuevaAbierto, setDialogoNuevaAbierto] = useState(false); const [dialogoEgresoAbierto, setDialogoEgresoAbierto] = useState(false); const [internacionSeleccionada, setInternacionSeleccionada] = useState(null); const [busqueda, setBusqueda] = useState(''); const [pacienteSeleccionado, setPacienteSeleccionado] = useState(''); const [camaSeleccionada, setCamaSeleccionada] = useState(''); const [diagnosticoIngreso, setDiagnosticoIngreso] = useState(''); const [enfermedadActual, setEnfermedadActual] = useState(''); const [motivoConsulta, setMotivoConsulta] = useState(''); const [antecedentesEnfermedadActual, setAntecedentesEnfermedadActual] = useState(''); const [medicoIngresante, setMedicoIngresante] = useState(''); // Formulario nueva internación const [fechaEgreso, setFechaEgreso] = useState(''); const [diagnosticoEgreso, setDiagnosticoEgreso] = useState(''); const [motivoEgreso, setMotivoEgreso] = useState('Alta médica'); const resetFormularioNueva = () => { setPacienteSeleccionado(''); setCamaSeleccionada(''); setDiagnosticoIngreso(''); setEnfermedadActual(''); setAntecedentesEnfermedadActual(''); setMedicoIngresante(''); }; const resetFormularioEgreso = () => { setFechaEgreso(''); setDiagnosticoEgreso(''); setMotivoEgreso('Alta médica'); setInternacionSeleccionada(null); }; const handleIniciarInternacion = () => { if (pacienteSeleccionado && camaSeleccionada && motivoConsulta && enfermedadActual && medicoIngresante) { onIniciarInternacion({ pacienteId: pacienteSeleccionado, camaId: camaSeleccionada, diagnosticoIngreso: diagnosticoIngreso || motivoConsulta, motivoConsulta, enfermedadActual, antecedentesEnfermedadActual: antecedentesEnfermedadActual || undefined, medicoIngresante, }); resetFormularioNueva(); setDialogoNuevaAbierto(false); } }; const handleFinalizarInternacion = () => { if (internacionSeleccionada && fechaEgreso && diagnosticoEgreso && motivoEgreso) { onFinalizarInternacion(internacionSeleccionada.id, { fechaEgreso, diagnosticoEgreso, motivoEgreso, }); resetFormularioEgreso(); setDialogoEgresoAbierto(false); } }; const internacionesFiltradas = internaciones.filter(i => { const paciente = getPacienteById(i.pacienteId); const cumpleBusqueda = !busqueda || (paciente && ( paciente.nombre.toLowerCase().includes(busqueda.toLowerCase()) || paciente.apellido.toLowerCase().includes(busqueda.toLowerCase()) || paciente.dni.includes(busqueda) )); const cumpleEstado = filtroEstado === 'todas' || (filtroEstado === 'activas' && i.activa) || (filtroEstado === 'finalizadas' && !i.activa); return cumpleBusqueda && cumpleEstado; }).sort((a, b) => new Date(b.fechaIngresoClinica || '').getTime() - new Date(a.fechaIngresoClinica || '').getTime()); const pacientesSinInternar = pacientes.filter(p => { const internacionActiva = internaciones.find(i => i.pacienteId === p.id && i.activa); return !internacionActiva; }); const camasDisponibles = camas.filter(c => c.estado === 'Disponible'); const getAreaName = (areaId?: string) => areas.find(a => a.id === areaId)?.nombre; const abrirDialogoEgreso = (internacion: Internacion) => { setInternacionSeleccionada(internacion); setFechaEgreso(new Date().toISOString().split('T')[0]); setDialogoEgresoAbierto(true); }; // Ver Historia Clínica (navegar a página) return (
{/* Header */}

Internaciones

Gestión de internaciones en sala

Nuevo Ingreso
{!pacienteSeleccionado ? ( <> setBusqueda(e.target.value)} className="mb-2" />
{(() => { const q = busqueda.trim().toLowerCase(); if (!q) { return (
Escribe apellido, nombre o DNI para buscar
); } const matches = pacientesSinInternar.filter(p => ( p.apellido.toLowerCase().includes(q) || p.nombre.toLowerCase().includes(q) || p.dni.includes(q) )); if (matches.length === 0) { return
No se encontraron pacientes coincidentes
; } return matches.map(p => ( )); })()}
) : (
{(() => { const p = pacientes.find(x => x.id === pacienteSeleccionado); return p ? `${p.apellido}, ${p.nombre} — DNI: ${p.dni}` : ''; })()}
)}