import { useState } from 'react'; import { PDFDocument } from 'pdf-lib'; import { User } from 'lucide-react'; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "@/components/ui/accordion"; import { FlaskConical, Microscope, Plus, Calendar, Clock, AlertCircle, CheckCircle2, ArrowLeft, Pencil, Trash2, FileText, ChevronDown, ChevronUp, List, FileDown, Thermometer, Heart, Wind, Droplets, Save, X, MoreHorizontal, Edit, ClipboardList, TrendingUp, TypeOutline, Activity, Pill, Users } 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 { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table'; import { ScrollArea, ScrollBar } from "@/components/ui/scroll-area" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu'; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts'; import type { Laboratorio, AcidoBase, Cultivo, Paciente, ResultadoLaboratorio, Internacion, Evolucion, Cama, EstudioComplementario, Interconsulta, ATB } from '@/types'; import { formatDateDDMMYYYY } from '@/lib/utils'; interface HistoriaClinicaProps { internacion: Internacion; paciente: Paciente; cama?: Cama; allCamas?: Cama[]; evoluciones: Evolucion[]; laboratorios: Laboratorio[]; acidosBase: AcidoBase[]; cultivos: Cultivo[]; estudiosComplementarios: EstudioComplementario[]; interconsultas: Interconsulta[]; atb: ATB[]; onAgregarEvolucion: (evolucion: Omit) => void; onActualizarEvolucion: (id: string, datos: Partial) => void; onEliminarEvolucion: (id: string) => void; onAgregarLaboratorio: (laboratorios: Omit) => void; onActualizarLaboratorio: (id: string, datos: Partial) => void; onEliminarLaboratorio: (id: string) => void; onAgregarLaboratorioConAcidoBase?: (l: Omit, a?: Omit) => void; onAgregarAcidoBase: (acidoBase: Omit) => void; onActualizarAcidoBase: (id: string, datos: Partial) => void; onEliminarAcidoBase: (id: string) => void; onAgregarCultivo: (cultivo: Omit) => void; onActualizarCultivo: (id: string, datos: Partial) => void; onEliminarCultivo: (id: string) => void; onAgregarEstudioComplementario: (estudio: Omit) => void; onActualizarEstudioComplementario: (id: string, datos: Partial) => void; onEliminarEstudioComplementario: (id: string) => void; onAgregarInterconsulta: (interconsulta: Omit) => void; onActualizarInterconsulta: (id: string, datos: Partial) => void; onEliminarInterconsulta: (id: string) => void; onAgregarATB: (atb: Omit) => void; onActualizarATB: (id: string, datos: Partial) => void; onEliminarATB: (id: string) => void; onActualizarInternacion: (id: string, datos: Partial) => void; onActualizarCama: (id: string, datos: Partial) => void; onVolver: () => void; onEditarIngreso?: () => void; } const PARAMETROS_COMUNES: Record = { 'Hemoglobina': { unidad: 'g/dL', referencia: '12-14' }, 'Hematocrito': { unidad: '%', referencia: '36-42' }, 'Glóbulos Blancos': { unidad: 'cel/μL', referencia: '4000-11000' }, 'Plaquetas': { unidad: 'unidades/μL', referencia: '150000-400000' }, 'Glucosa': { unidad: 'mg/dL', referencia: '70-100' }, 'Urea': { unidad: 'mg/dL', referencia: '17-48.5' }, 'Creatinina': { unidad: 'mg/dL', referencia: '0.5-1' }, 'Sodio': { unidad: 'mEq/L', referencia: '135-145' }, 'Potasio': { unidad: 'mEq/L', referencia: '3.5-5.1' }, 'Cloro': { unidad: 'mEq/L', referencia: '101-109' }, 'Bilirrubina Total': { unidad: 'mg/dL', referencia: '0-1.2' }, 'Bilirrubina Directa': { unidad: 'mg/dL', referencia: '0-0.3' }, 'TGO/AST': { unidad: 'U/L', referencia: '0-35' }, 'TGP/ALT': { unidad: 'U/L', referencia: '0-35' }, 'TP': { unidad: '%', referencia: '70-100' }, 'KPTT': { unidad: 'seg', referencia: '30-45' }, 'RIN': { unidad: '', referencia: '0.8-1.5' }, }; const RANGOS_LABORATORIO: Record = { 'Hematocrito': { min: 36, max: 42 }, 'Hemoglobina': { min: 12, max: 14 }, 'Leucocitos': { min: 4000, max: 11000 }, 'Plaquetas': { min: 150000, max: 400000 }, 'Glucemia': { min: 70, max: 100 }, 'Urea': { min: 17, max: 48.5 }, 'Creatinina': { min: 0.5, max: 1.2 }, 'Sodio': { min: 135, max: 145 }, 'Potasio': { min: 3.5, max: 5.1 }, 'Cloro': { min: 101, max: 109 }, 'Bilirrubina Total': { min: 0.1, max: 1.2 }, 'Bilirrubina Directa': { min: 0, max: 0.3 }, 'GOT': { min: 0, max: 35 }, 'GPT': { min: 0, max: 35 }, 'Tiempo de Protrombina': { min: 12, max: 14 }, 'KPTT': { min: 30, max: 45 }, 'INR': { min: 0.8, max: 1.5 }, }; function calcularEstadoLaboratorio(parametro: string, valor: string): 'Normal' | 'Alto' | 'Bajo' { const rango = RANGOS_LABORATORIO[parametro]; if (!rango) return 'Normal'; const num = parseFloat(valor); if (isNaN(num)) return 'Normal'; if (num < rango.min) return 'Bajo'; if (num > rango.max) return 'Alto'; return 'Normal'; } function wrapText(text: string, font: any, fontSize: number, maxWidth: number): string[] { const words = text.split(' '); const lines: string[] = []; let currentLine = ''; for (const word of words) { const testLine = currentLine ? `${currentLine} ${word}` : word; const testWidth = font.widthOfTextAtSize(testLine, fontSize); if (testWidth > maxWidth && currentLine) { lines.push(currentLine); currentLine = word; } else { currentLine = testLine; } } if (currentLine) lines.push(currentLine); return lines; } export function HistoriaClinica({ internacion, paciente, cama, allCamas, evoluciones, laboratorios, acidosBase, cultivos, estudiosComplementarios, interconsultas, onAgregarEvolucion, onActualizarEvolucion, onEliminarEvolucion, onAgregarLaboratorio, onActualizarLaboratorio, onEliminarLaboratorio, onAgregarAcidoBase, onActualizarAcidoBase, onEliminarAcidoBase, onAgregarCultivo, onActualizarCultivo, onEliminarCultivo, onAgregarEstudioComplementario, onActualizarEstudioComplementario, onEliminarEstudioComplementario, onAgregarInterconsulta, onActualizarInterconsulta, onEliminarInterconsulta, atb, onAgregarATB, onActualizarATB, onEliminarATB, onActualizarInternacion, onActualizarCama, onVolver, onEditarIngreso, }: HistoriaClinicaProps) { const [tabActivo, setTabActivo] = useState('evoluciones'); const calcularEdad = (fechaNacimiento: string) => { const hoy = new Date(); const nac = new Date(fechaNacimiento); let edad = hoy.getFullYear() - nac.getFullYear(); const mes = hoy.getMonth() - nac.getMonth(); if (mes < 0 || (mes === 0 && hoy.getDate() < nac.getDate())) { edad--; } return edad; }; const calcularDiasInternado = (fechaIngreso: string) => { const hoy = new Date(); const ingreso = new Date(fechaIngreso); const diff = hoy.getTime() - ingreso.getTime(); return Math.floor(diff / (1000 * 60 * 60 * 24)); }; return (

{cama?.numero || 'N/A'} - Historia Clínica

Módulo de Historia Clínica de Internación

{paciente.apellido}, {paciente.nombre}

7 ? 'bg-red-100 text-red-800' : 'bg-blue-100 text-blue-800'}> {internacion.fechaIngresoClinica ? calcularDiasInternado(internacion.fechaIngresoClinica) : 0} días internado
{paciente.fechaNacimiento ? calcularEdad(paciente.fechaNacimiento) + ' años' : ''} DNI: {paciente.dni}
HC: {paciente.historiaClinica || 'No posee'} OS: {paciente.obraSocial || 'No posee'} Nacionalidad: {paciente.nacionalidad || 'N/A'}

Antecedentes

{paciente.antecedentes || 'No refiere'}

MH

{paciente.medicacionHabitual || 'No refiere'}

Fecha de Ingreso

{internacion.fechaIngresoClinica ? formatDateDDMMYYYY(internacion.fechaIngresoClinica) : 'N/A'}

Diagnóstico de Ingreso

{internacion.diagnosticoIngreso}

Detalle Episodio Actual

Motivo de Consulta

{internacion.motivoConsulta || 'Sin motivo registrado'}

Enfermedad Actual

{internacion.enfermedadActual || 'Sin información'}

Antecedentes de Enfermedad Actual

{internacion.antecedentesEnfermedadActual || 'Sin antecedentes registrados'}

Evoluciones ({evoluciones.length}) Indicaciones Laboratorio ({laboratorios.length}) EAB ({acidosBase.length}) Cultivos ({cultivos.length}) ATB ({atb.length}) Estudios ({estudiosComplementarios.length}) Interconsultas ({interconsultas.length})
); } function SeccionLaboratorios({ lab, patientId, add, update, del, addAcidoBase }: { lab: Laboratorio[]; patientId: string; add: (l: Omit) => void; update: (id: string, data: Partial) => void; del: (id: string) => void; addAcidoBase?: (a: Omit) => void; }) { const [dialog, setDialog] = useState(false); const [obsDialog, setObsDialog] = useState(false); const [evolDialog, setEvolDialog] = useState(false); const [selectedLab, setSelectedLab] = useState(null); const [edit, setEdit] = useState(null); const [obsLab, setObsLab] = useState(null); const [fecha, setFecha] = useState(new Date().toISOString().split('T')[0]); const [hora, setHora] = useState(new Date().toTimeString().slice(0, 5)); const [observaciones, setObservaciones] = useState(''); const [resultados, setResultados] = useState([]); const [hto, setHto] = useState(''); const [hb, setHb] = useState(''); const [gb, setGb] = useState(''); const [plaq, setPlaq] = useState(''); const [gluc, setGluc] = useState(''); const [urea, setUrea] = useState(''); const [creat, setCreat] = useState(''); const [na, setNa] = useState(''); const [k, setK] = useState(''); const [cl, setCl] = useState(''); const [bt, setBt] = useState(''); const [bd, setBd] = useState(''); const [got, setGot] = useState(''); const [gpt, setGpt] = useState(''); const [tp, setTp] = useState(''); const [kptt, setKptt] = useState(''); const [rin, setRin] = useState(''); const [parametroEvolucion, setParametroEvolucion] = useState(''); const [importDialog, setImportDialog] = useState(false); const [importFecha, setImportFecha] = useState(new Date().toISOString().split('T')[0]); const [importHora, setImportHora] = useState(new Date().toTimeString().slice(0, 5)); const [importTexto, setImportTexto] = useState(''); const [importResultados, setImportResultados] = useState([]); const [importObservaciones, setImportObservaciones] = useState(''); const [importAcidoBase, setImportAcidoBase] = useState | null>(null); const [labSortAsc, setLabSortAsc] = useState(false); const parametrosLaboratorio = [ 'Hematocrito', 'Hemoglobina', 'Leucocitos', 'Plaquetas', 'Glucemia', 'Urea', 'Creatinina', 'Sodio', 'Potasio', 'Cloro', 'Bilirrubina Total', 'Bilirrubina Directa', 'GOT', 'GPT', 'Tiempo de Protrombina', 'KPTT', 'INR' ]; const datosEvolucion = lab .filter(l => l.resultados.some(r => r.parametro === parametroEvolucion)) .sort((a, b) => new Date(a.fecha).getTime() - new Date(b.fecha).getTime()) .map(l => { const r = l.resultados.find(r => r.parametro === parametroEvolucion); return { fecha: l.fecha, valor: r ? parseFloat(String(r.valor)) : null }; }); const getEstadoColor = (estado: ResultadoLaboratorio['estado']) => { switch (estado) { case 'Normal': return 'bg-green-100 text-green-800'; case 'Alto': case 'Bajo': case 'Crítico': return 'bg-red-100 text-red-800'; } }; const getValor = (l: Laboratorio, param: string) => { const r = l.resultados.find(r => r.parametro === param); return r ? `${r.valor}` : '-'; }; const getValorRaw = (l: Laboratorio, param: string) => { const r = l.resultados.find(r => r.parametro === param); return r ? `${r.valor}` : ''; }; const getValorStyle = (l: Laboratorio, param: string) => { const r = l.resultados.find(r => r.parametro === param); if (!r) return ''; if (r.estado === 'Normal') return 'text-green-600 font-medium'; return 'text-red-600 font-bold'; }; const buildResultados = (): ResultadoLaboratorio[] => { const res: ResultadoLaboratorio[] = []; if (hto) res.push({ parametro: 'Hematocrito', valor: hto, unidad: '%', estado: calcularEstadoLaboratorio('Hematocrito', hto) }); if (hb) res.push({ parametro: 'Hemoglobina', valor: hb, unidad: 'g/dL', estado: calcularEstadoLaboratorio('Hemoglobina', hb) }); if (gb) res.push({ parametro: 'Leucocitos', valor: gb, unidad: '/mm3', estado: calcularEstadoLaboratorio('Leucocitos', gb) }); if (plaq) res.push({ parametro: 'Plaquetas', valor: plaq, unidad: '/mm3', estado: calcularEstadoLaboratorio('Plaquetas', plaq) }); if (gluc) res.push({ parametro: 'Glucemia', valor: gluc, unidad: 'mg/dL', estado: calcularEstadoLaboratorio('Glucemia', gluc) }); if (urea) res.push({ parametro: 'Urea', valor: urea, unidad: 'mg/dL', estado: calcularEstadoLaboratorio('Urea', urea) }); if (creat) res.push({ parametro: 'Creatinina', valor: creat, unidad: 'mg/dL', estado: calcularEstadoLaboratorio('Creatinina', creat) }); if (na) res.push({ parametro: 'Sodio', valor: na, unidad: 'mEq/L', estado: calcularEstadoLaboratorio('Sodio', na) }); if (k) res.push({ parametro: 'Potasio', valor: k, unidad: 'mEq/L', estado: calcularEstadoLaboratorio('Potasio', k) }); if (cl) res.push({ parametro: 'Cloro', valor: cl, unidad: 'mEq/L', estado: calcularEstadoLaboratorio('Cloro', cl) }); if (bt) res.push({ parametro: 'Bilirrubina Total', valor: bt, unidad: 'mg/dL', estado: calcularEstadoLaboratorio('Bilirrubina Total', bt) }); if (bd) res.push({ parametro: 'Bilirrubina Directa', valor: bd, unidad: 'mg/dL', estado: calcularEstadoLaboratorio('Bilirrubina Directa', bd) }); if (got) res.push({ parametro: 'GOT', valor: got, unidad: 'U/L', estado: calcularEstadoLaboratorio('GOT', got) }); if (gpt) res.push({ parametro: 'GPT', valor: gpt, unidad: 'U/L', estado: calcularEstadoLaboratorio('GPT', gpt) }); if (tp) res.push({ parametro: 'Tiempo de Protrombina', valor: tp, unidad: 'seg', estado: calcularEstadoLaboratorio('Tiempo de Protrombina', tp) }); if (kptt) res.push({ parametro: 'KPTT', valor: kptt, unidad: 'seg', estado: calcularEstadoLaboratorio('KPTT', kptt) }); if (rin) res.push({ parametro: 'INR', valor: rin, unidad: '', estado: calcularEstadoLaboratorio('INR', rin) }); return res; }; const reset = () => { setFecha(new Date().toISOString().split('T')[0]); setHora(new Date().toTimeString().slice(0, 5)); setObservaciones(''); setHto(''); setHb(''); setGb(''); setPlaq(''); setGluc(''); setUrea(''); setCreat(''); setNa(''); setK(''); setCl(''); setBt(''); setBd(''); setGot(''); setGpt(''); setTp(''); setKptt(''); setRin(''); setEdit(null); }; const parseLaboratorioTexto = (texto: string): { resultados: ResultadoLaboratorio[]; observaciones: string } => { const resultados: ResultadoLaboratorio[] = []; const observacionesExtra: string[] = []; const mapeoParametros: Record = { 'hematocrito': { nombre: 'Hematocrito', unidad: '%', esPrincipal: true }, 'hemoglobina corpuscular media': { nombre: 'HCM', unidad: 'pg', esPrincipal: false }, 'hemoglobina': { nombre: 'Hemoglobina', unidad: 'g/dL', esPrincipal: true }, 'volumen corpuscular medio': { nombre: 'VCM', unidad: 'fL', esPrincipal: false }, 'rdw': { nombre: 'RDW', unidad: '%', esPrincipal: false }, 'eritroblastos': { nombre: 'Eritroblastos', unidad: '%', esPrincipal: false }, 'neutrófilos': { nombre: 'Neutrófilos', unidad: '%', esPrincipal: false }, 'linfocitos': { nombre: 'Linfocitos', unidad: '%', esPrincipal: false }, 'monocitos': { nombre: 'Monocitos', unidad: '%', esPrincipal: false }, 'eosinófilos': { nombre: 'Eosinófilos', unidad: '%', esPrincipal: false }, 'basófilos': { nombre: 'Basófilos', unidad: '%', esPrincipal: false }, 'leucocitos': { nombre: 'Leucocitos', unidad: '10³/µl', esPrincipal: true }, 'recuento de leucocitos': { nombre: 'Leucocitos', unidad: '10³/µl', esPrincipal: true }, 'recuento de plaquetas': { nombre: 'Plaquetas', unidad: '10³/µl', esPrincipal: true }, 'plaquetas': { nombre: 'Plaquetas', unidad: '10³/µl', esPrincipal: true }, 'volumen plaquetario medio': { nombre: 'VPM', unidad: 'fL', esPrincipal: false }, 'procalcitonina': { nombre: 'Procalcitonina', unidad: 'ng/mL', esPrincipal: false }, 'glucosa': { nombre: 'Glucemia', unidad: 'mg/dL', esPrincipal: true }, 'urea': { nombre: 'Urea', unidad: 'mg/dL', esPrincipal: true }, 'creatinina': { nombre: 'Creatinina', unidad: 'mg/dL', esPrincipal: true }, 'mdrd': { nombre: 'Filtrado Glomerular (MDRD)', unidad: 'ml/min', esPrincipal: false }, 'sodio': { nombre: 'Sodio', unidad: 'mEq/L', esPrincipal: true }, 'potasio': { nombre: 'Potasio', unidad: 'mEq/L', esPrincipal: true }, 'cloro': { nombre: 'Cloro', unidad: 'mEq/L', esPrincipal: true }, 'bilirrubina total': { nombre: 'Bilirrubina Total', unidad: 'mg/dL', esPrincipal: true }, 'bilirrubina directa': { nombre: 'Bilirrubina Directa', unidad: 'mg/dL', esPrincipal: true }, 'got': { nombre: 'GOT', unidad: 'U/L', esPrincipal: true }, 'gpt': { nombre: 'GPT', unidad: 'U/L', esPrincipal: true }, 'fosfatasa alcalina': { nombre: 'Fosfatasa Alcalina', unidad: 'U/L', esPrincipal: false }, 'proteínas totales': { nombre: 'Proteínas Totales', unidad: 'g/dL', esPrincipal: false }, 'albúmina': { nombre: 'Albúmina', unidad: 'g/dL', esPrincipal: false }, 'tiempo de protrombina': { nombre: 'Tiempo de Protrombina', unidad: '%', esPrincipal: true }, 'rin': { nombre: 'INR', unidad: '', esPrincipal: true }, 'aptt': { nombre: 'KPTT', unidad: 'seg', esPrincipal: true }, 'kptt': { nombre: 'KPTT', unidad: 'seg', esPrincipal: true }, }; const lineas = texto.split('\n'); for (const linea of lineas) { const lineaLower = linea.toLowerCase().trim(); for (const [clave, info] of Object.entries(mapeoParametros)) { if (lineaLower.includes(clave)) { // buscar primer valor numérico después de cualquier texto (letra o palabra) const match = linea.match(/[a-zA-ZáéíóúñÁÉÍÓÚÑ]+.*?(\d+\.?\d*)/); if (match && match[1]) { const valor = parseFloat(match[1].replace(',', '.')); if (!isNaN(valor) && valor > 0 && valor < 1000) { const nombreNormalizado = info.nombre; let valorFinal = valor; if (nombreNormalizado === 'Leucocitos' || nombreNormalizado === 'Plaquetas') { valorFinal = valor * 1000; } if (info.esPrincipal) { resultados.push({ parametro: nombreNormalizado, valor: valorFinal, unidad: info.unidad, estado: calcularEstadoLaboratorio(nombreNormalizado, match[1]) }); } break; } } break; } } } return { resultados, observaciones: observacionesExtra.join('\n') }; }; const parseAcidoBaseTexto = (texto: string): Omit | null => { const lineas = texto.split('\n'); let ph: number | undefined; let pco2: number | undefined; let po2: number | undefined; let hco3: number | undefined; let be: number | undefined; let sato2: number | undefined; let lactato: number | undefined; let fio2: number | undefined; let fecha = importFecha; for (const linea of lineas) { const cleanLinea = linea.replace(/show_chart|list_alt|\t+/g, ' ').replace(/,/g, '.').replace(/\s+/g, ' ').trim().toLowerCase(); const getValue = (param: string): number | undefined => { const idx = cleanLinea.indexOf(param); if (idx === -1) return undefined; const after = cleanLinea.slice(idx + param.length).trim(); const parts = after.split(' '); for (const p of parts) { const v = parseFloat(p); if (!isNaN(v) && v > 0 && v < 1000) return v; } return undefined; }; if (cleanLinea.includes('estado') && cleanLinea.includes('ácido') || cleanLinea.includes('base')) { ph = getValue('ph') || (cleanLinea.match(/ph\s+(\d+\.?\d*)/)?.[1] ? parseFloat(cleanLinea.match(/ph\s+(\d+\.?\d*)/)![1]) : undefined); pco2 = getValue('pco2') || getValue('pco₂'); po2 = getValue('po2') || getValue('po₂'); hco3 = getValue('hco3'); be = getValue('exceso de base') || getValue('base excess') || getValue('exceso'); sato2 = getValue('saturación') || getValue('sato2') || getValue('sat'); lactato = getValue('lactato'); fio2 = getValue('fio2'); break; } } if (!ph) { for (const linea of lineas) { const cleanLinea = linea.replace(/show_chart|list_alt|\t+/g, ' ').replace(/,/g, '.').replace(/\s+/g, ' ').trim().toLowerCase(); const getValue = (param: string): number | undefined => { const idx = cleanLinea.indexOf(param); if (idx === -1) return undefined; const after = cleanLinea.slice(idx + param.length).trim(); const parts = after.split(' '); for (const p of parts) { const v = parseFloat(p); if (!isNaN(v) && v > 0 && v < 1000) return v; } return undefined; }; if (cleanLinea.includes('ph') && !cleanLinea.includes('pco2') && !cleanLinea.includes('pco')) { ph = getValue('ph'); } else if (cleanLinea.includes('pco2') || cleanLinea.includes('pco₂')) { pco2 = getValue('pco2'); } else if (cleanLinea.includes('po2') || cleanLinea.includes('po₂')) { po2 = getValue('po2'); } else if (cleanLinea.includes('hco3')) { hco3 = getValue('hco3'); } else if (cleanLinea.includes('exceso') || cleanLinea.includes('base excess')) { be = getValue('exceso') || getValue('base'); } else if (cleanLinea.includes('saturación') || cleanLinea.includes('sato2')) { sato2 = getValue('saturación') || getValue('sat'); } else if (cleanLinea.includes('lactato')) { lactato = getValue('lactato'); } else if (cleanLinea.includes('fio2')) { fio2 = getValue('fio2'); } } } if (ph) { return { pacienteId: patientId, fecha, hora: '', ph, pco2: pco2 || 40, po2: po2 || 85, hco3: hco3 || 24, be: be || 0, sato2: sato2 || 97, lactato, fio2, interpretacion: '' }; } return null; }; const handleProcesarTexto = () => { const { resultados, observaciones } = parseLaboratorioTexto(importTexto); const acidoBase = parseAcidoBaseTexto(importTexto); setImportResultados(resultados); setImportObservaciones(observaciones); setImportAcidoBase(acidoBase); }; const handleImportarLaboratorio = () => { if (!addAcidoBase) return; if (importResultados.length === 0 && !importObservaciones && !importAcidoBase) return; if (importAcidoBase) { addAcidoBase({ ...importAcidoBase, fecha: importFecha, hora: importHora }); } add({ pacienteId: patientId, fecha: importFecha, hora: importHora, resultados: importResultados, observaciones: importObservaciones }); setImportDialog(false); setImportTexto(''); setImportResultados([]); setImportObservaciones(''); setImportAcidoBase(null); setImportFecha(new Date().toISOString().split('T')[0]); setImportHora(new Date().toTimeString().slice(0, 5)); }; const loadEdit = (l: Laboratorio) => { setEdit(l); setFecha(l.fecha); setHora(l.hora || ''); setObservaciones(l.observaciones || ''); setHto(getValorRaw(l, 'Hematocrito')); setHb(getValorRaw(l, 'Hemoglobina')); setGb(getValorRaw(l, 'Leucocitos')); setPlaq(getValorRaw(l, 'Plaquetas')); setGluc(getValorRaw(l, 'Glucemia')); setUrea(getValorRaw(l, 'Urea')); setCreat(getValorRaw(l, 'Creatinina')); setNa(getValorRaw(l, 'Sodio')); setK(getValorRaw(l, 'Potasio')); setCl(getValorRaw(l, 'Cloro')); setBt(getValorRaw(l, 'Bilirrubina Total')); setBd(getValorRaw(l, 'Bilirrubina Directa')); setGot(getValorRaw(l, 'GOT')); setGpt(getValorRaw(l, 'GPT')); setTp(getValorRaw(l, 'Tiempo de Protrombina')); setKptt(getValorRaw(l, 'KPTT')); setRin(getValorRaw(l, 'INR')); setDialog(true); }; const handleGuardar = () => { const resultadosLaboratorio = buildResultados(); if (edit) { update(edit.id, { fecha, hora, resultados: resultadosLaboratorio, observaciones }); } else { add({ pacienteId: patientId || '', fecha, hora, resultados: resultadosLaboratorio, observaciones }); } setDialog(false); reset(); }; const labs = lab.filter(l => l.pacienteId === patientId).sort((a, b) => { const dateA = new Date(a.fecha + 'T' + (a.hora || '00:00')).getTime(); const dateB = new Date(b.fecha + 'T' + (b.hora || '00:00')).getTime(); const diff = dateB - dateA; return labSortAsc ? -diff : diff; }); return (
{edit ? 'Editar' : 'Nuevo'} Laboratorio
setFecha(e.target.value)} />
setHora(e.target.value)} />

Hemograma

setHto(e.target.value)} />
setHb(e.target.value)} />
setGb(e.target.value)} />
setPlaq(e.target.value)} />

Química

setGluc(e.target.value)} />
setUrea(e.target.value)} />
setCreat(e.target.value)} />

Ionograma

setNa(e.target.value)} />
setK(e.target.value)} />
setCl(e.target.value)} />

Hepatograma

setBt(e.target.value)} />
setBd(e.target.value)} />
setGot(e.target.value)} />
setGpt(e.target.value)} />

Coagulograma

setTp(e.target.value)} />
setKptt(e.target.value)} />
setRin(e.target.value)} />