From d3abb1c3fe13f236268513c5f736737c9a32cc71 Mon Sep 17 00:00:00 2001 From: Sergio Nicolas Lavaise Date: Thu, 16 Apr 2026 11:17:49 -0300 Subject: [PATCH] =?UTF-8?q?Agregar=20parser=20de=20Estado=20=C3=81cido=20B?= =?UTF-8?q?ase=20en=20importar=20laboratorio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/sections/HistoriaClinica.tsx | 107 ++++++++++++++++++++++++++++--- 1 file changed, 99 insertions(+), 8 deletions(-) diff --git a/src/sections/HistoriaClinica.tsx b/src/sections/HistoriaClinica.tsx index 8609a7b..2637f95 100644 --- a/src/sections/HistoriaClinica.tsx +++ b/src/sections/HistoriaClinica.tsx @@ -2,7 +2,6 @@ import { useState } from 'react'; import { PDFDocument } from 'pdf-lib'; import { FlaskConical, - Activity, Microscope, Plus, Calendar, @@ -27,7 +26,8 @@ import { Edit, ClipboardList, TrendingUp, - TypeOutline + TypeOutline, + Activity } from 'lucide-react'; import { Card, CardContent } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; @@ -59,6 +59,7 @@ interface HistoriaClinicaProps { 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; @@ -527,7 +528,7 @@ export function HistoriaClinica({ - + @@ -556,12 +557,13 @@ export function HistoriaClinica({ ); } -function SeccionLaboratorios({ lab, patientId, add, update, del }: { +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); @@ -595,6 +597,7 @@ function SeccionLaboratorios({ lab, patientId, add, update, del }: { const [importTexto, setImportTexto] = useState(''); const [importResultados, setImportResultados] = useState([]); const [importObservaciones, setImportObservaciones] = useState(''); + const [importAcidoBase, setImportAcidoBase] = useState | null>(null); const parametrosLaboratorio = [ 'Hematocrito', 'Hemoglobina', 'Leucocitos', 'Plaquetas', @@ -763,14 +766,82 @@ if (!esUnidadSiguiente) { 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 lineaLower = linea.toLowerCase().trim(); + const valorMatch = linea.replace(/,/g, '.').match(/(\d+\.?\d*)/); + + if (lineaLower.includes('ph') && !lineaLower.includes('pco2') && !lineaLower.includes('pco') && valorMatch) { + ph = parseFloat(valorMatch[1]); + } else if ((lineaLower.includes('pco2') || lineaLower.includes('pco 2') || lineaLower.includes('pco₂')) && valorMatch) { + pco2 = parseFloat(valorMatch[1]); + } else if (lineaLower.includes('po2') || lineaLower.includes('po 2') || lineaLower.includes('po₂')) { + if (valorMatch) po2 = parseFloat(valorMatch[1]); + } else if (lineaLower.includes('hco3') && valorMatch) { + hco3 = parseFloat(valorMatch[1]); + } else if (lineaLower.includes('exceso de base') || lineaLower.includes('exceso de bases') || lineaLower.includes('base excess') || lineaLower.includes('be ') || lineaLower.includes('be,')) { + if (valorMatch) be = parseFloat(valorMatch[1]); + } else if (lineaLower.includes('saturación de oxígeno') || lineaLower.includes('saturación de oxigeno') || lineaLower.includes('sato2') || lineaLower.includes('sat o2')) { + if (valorMatch) sato2 = parseFloat(valorMatch[1]); + } else if (lineaLower.includes('lactato') && valorMatch) { + lactato = parseFloat(valorMatch[1]); + } else if (lineaLower.includes('fio2') || lineaLower.includes('fi o2') || lineaLower.includes('fi o₂')) { + if (valorMatch) fio2 = parseFloat(valorMatch[1]); + } else if (lineaLower.match(/\d{4}-\d{2}-\d{2}/)) { + const fechaMatch = lineaLower.match(/(\d{4}-\d{2}-\d{2})/); + if (fechaMatch) fecha = fechaMatch[1]; + } + } + + if (ph !== undefined) { + const hora = new Date().toTimeString().slice(0, 5); + 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 (importResultados.length === 0 && !importObservaciones) return; + if (!addAcidoBase) return; + if (importResultados.length === 0 && !importObservaciones && !importAcidoBase) return; + + if (importAcidoBase) { + addAcidoBase(importAcidoBase); + } add({ pacienteId: patientId, @@ -783,6 +854,7 @@ if (!esUnidadSiguiente) { setImportTexto(''); setImportResultados([]); setImportObservaciones(''); + setImportAcidoBase(null); setImportFecha(new Date().toISOString().split('T')[0]); }; @@ -1013,6 +1085,25 @@ if (!esUnidadSiguiente) { )} + {importAcidoBase && ( +
+

+ + Estado Ácido Base detectado: +

+
+
pH: {importAcidoBase.ph}
+
pCO2: {importAcidoBase.pco2}
+
pO2: {importAcidoBase.po2}
+
HCO3: {importAcidoBase.hco3}
+
BE: {importAcidoBase.be}
+
SatO2: {importAcidoBase.sato2}%
+ {importAcidoBase.lactato &&
Lactato: {importAcidoBase.lactato}
} + {importAcidoBase.fio2 &&
FiO2: {importAcidoBase.fio2}
} +
+
+ )} + {importObservaciones && (

Valores adicionales en observaciones:

@@ -1020,7 +1111,7 @@ if (!esUnidadSiguiente) {
)} - {importResultados.length === 0 && !importObservaciones && importTexto && ( + {importResultados.length === 0 && !importObservaciones && !importAcidoBase && importTexto && (

No se detectaron parámetros. Verifique que el texto contenga los nombres correctos.

@@ -1028,9 +1119,9 @@ if (!esUnidadSiguiente) {
-