Permitir eliminar Fosfatasa Alcalina, Albúmina, HCM, VCM y sincronizar observaciones dinámicamente

This commit is contained in:
2026-08-12 03:07:48 +00:00
parent d49250460b
commit e038c25e9e
+87 -112
View File
@@ -1060,19 +1060,89 @@ function SeccionLaboratorios({ lab, patientId, internacionId, add, update, del,
setEdit(null); setEdit(null);
}; };
const buildObservacionesFromResultados = (resultadosArray: ResultadoLaboratorio[]): string => {
const observacionesExtra: string[] = [];
// 1. Lípidos
const ordenLipidos = ['Colesterol Total', 'Colesterol LDL', 'Colesterol No HDL', 'Colesterol HDL', 'Triglicéridos'];
const lipidosEncontrados = resultadosArray.filter(r => ordenLipidos.includes(r.parametro));
if (lipidosEncontrados.length > 0) {
observacionesExtra.push('PERFIL LIPIDICO:');
for (const nombre of ordenLipidos) {
const item = lipidosEncontrados.find(l => l.parametro === nombre);
if (item) {
observacionesExtra.push(`- ${item.parametro}: ${item.valor} ${item.unidad}`);
}
}
}
// 2. Férricos
const ordenFerricos = ['Hierro', 'Transferrina', 'Porcentaje de Saturación de Transferrina', 'Ferritina', 'Ácido Fólico', 'Vitamina B12'];
const ferricosEncontrados = resultadosArray.filter(r => ordenFerricos.includes(r.parametro));
if (ferricosEncontrados.length > 0) {
if (observacionesExtra.length > 0) {
observacionesExtra.push('');
}
observacionesExtra.push('PERFIL FERRICO:');
for (const nombre of ordenFerricos) {
const item = ferricosEncontrados.find(f => f.parametro === nombre);
if (item) {
observacionesExtra.push(`- ${item.parametro}: ${item.valor} ${item.unidad}`);
}
}
}
// 3. Independientes
const ordenInd = [
'Albúmina',
'Calcio Total',
'Fosfatasa Alcalina',
'LDH',
'NT-proBNP',
'Procalcitonina',
'Fósforo',
'Magnesio',
'Calcio Iónico'
];
const indEncontrados = resultadosArray.filter(r => ordenInd.includes(r.parametro));
if (indEncontrados.length > 0) {
if (observacionesExtra.length > 0) {
observacionesExtra.push('');
}
for (const nombre of ordenInd) {
const item = indEncontrados.find(i => i.parametro === nombre);
if (item) {
observacionesExtra.push(`${item.parametro}: ${item.valor} ${item.unidad}`);
}
}
}
// 4. VCM & HCM
const ordenHemogramaAdicionales = ['VCM', 'HCM'];
const hemogramaAdicionalesEncontrados = resultadosArray.filter(r => ordenHemogramaAdicionales.includes(r.parametro));
if (hemogramaAdicionalesEncontrados.length > 0) {
if (observacionesExtra.length > 0) {
observacionesExtra.push('');
}
for (const nombre of ordenHemogramaAdicionales) {
const item = hemogramaAdicionalesEncontrados.find(h => h.parametro === nombre);
if (item) {
observacionesExtra.push(`${item.parametro}: ${item.valor} ${item.unidad}`);
}
}
}
return observacionesExtra.join('\n');
};
const parseLaboratorioTexto = (texto: string): { resultados: ResultadoLaboratorio[]; observaciones: string } => { const parseLaboratorioTexto = (texto: string): { resultados: ResultadoLaboratorio[]; observaciones: string } => {
const resultados: ResultadoLaboratorio[] = []; const resultados: ResultadoLaboratorio[] = [];
const observacionesExtra: string[] = [];
const lipidosEncontrados: { parametro: string; valor: number; unidad: string }[] = [];
const ferricosEncontrados: { parametro: string; valor: number; unidad: string }[] = [];
const indEncontrados: { parametro: string; valor: number; unidad: string }[] = [];
const hemogramaAdicionalesEncontrados: { parametro: string; valor: number; unidad: string }[] = [];
const mapeoParametros: { claves: string[]; nombre: string; unidad: string; esPrincipal: boolean; esAdicional?: boolean }[] = [ const mapeoParametros: { claves: string[]; nombre: string; unidad: string; esPrincipal: boolean; esAdicional?: boolean }[] = [
{ claves: ['hematocrito', 'hto'], nombre: 'Hematocrito', unidad: '%', esPrincipal: true }, { claves: ['hematocrito', 'hto'], nombre: 'Hematocrito', unidad: '%', esPrincipal: true },
{ claves: ['hemoglobina corpuscular media', 'hcm'], nombre: 'HCM', unidad: 'pg', esPrincipal: false }, { claves: ['hemoglobina corpuscular media', 'hcm'], nombre: 'HCM', unidad: 'pg', esPrincipal: false, esAdicional: true },
{ claves: ['hemoglobina', 'hb'], nombre: 'Hemoglobina', unidad: 'g/dL', esPrincipal: true }, { claves: ['hemoglobina', 'hb'], nombre: 'Hemoglobina', unidad: 'g/dL', esPrincipal: true },
{ claves: ['volumen corpuscular medio', 'vcm'], nombre: 'VCM', unidad: 'fL', esPrincipal: false }, { claves: ['volumen corpuscular medio', 'vcm'], nombre: 'VCM', unidad: 'fL', esPrincipal: false, esAdicional: true },
{ claves: ['rdw'], nombre: 'RDW', unidad: '%', esPrincipal: false }, { claves: ['rdw'], nombre: 'RDW', unidad: '%', esPrincipal: false },
{ claves: ['eritroblastos'], nombre: 'Eritroblastos', unidad: '%', esPrincipal: false }, { claves: ['eritroblastos'], nombre: 'Eritroblastos', unidad: '%', esPrincipal: false },
{ claves: ['neutrófilos', 'neutrofilos'], nombre: 'Neutrófilos', unidad: '%', esPrincipal: false }, { claves: ['neutrófilos', 'neutrofilos'], nombre: 'Neutrófilos', unidad: '%', esPrincipal: false },
@@ -1115,7 +1185,7 @@ function SeccionLaboratorios({ lab, patientId, internacionId, add, update, del,
{ claves: ['magnesio', 'mg', 'magnesemia'], nombre: 'Magnesio', unidad: 'mg/dL', esPrincipal: false, esAdicional: true }, { claves: ['magnesio', 'mg', 'magnesemia'], nombre: 'Magnesio', unidad: 'mg/dL', esPrincipal: false, esAdicional: true },
{ claves: ['calcio ionico', 'calcio iónico', 'ca ionico', 'ca iónico', 'ca++ ionico', 'ca++ iónico', 'calcio_ionico'], nombre: 'Calcio Iónico', unidad: 'mmol/L', esPrincipal: false, esAdicional: true }, { claves: ['calcio ionico', 'calcio iónico', 'ca ionico', 'ca iónico', 'ca++ ionico', 'ca++ iónico', 'calcio_ionico'], nombre: 'Calcio Iónico', unidad: 'mmol/L', esPrincipal: false, esAdicional: true },
// Perfil Férrico requested determinations (must put Porcentaje Saturación before Transferrina) // Perfil Férrico requested determinations
{ claves: ['porcentaje de saturacion de transferrina', 'porcentaje de saturación de transferrina', 'saturacion de transferrina', 'saturación de transferrina', 'sat. transferrina', 'sat transferrina', '% sat', '% de sat', '% saturacion', '% saturación'], nombre: 'Porcentaje de Saturación de Transferrina', unidad: '%', esPrincipal: false, esAdicional: true }, { claves: ['porcentaje de saturacion de transferrina', 'porcentaje de saturación de transferrina', 'saturacion de transferrina', 'saturación de transferrina', 'sat. transferrina', 'sat transferrina', '% sat', '% de sat', '% saturacion', '% saturación'], nombre: 'Porcentaje de Saturación de Transferrina', unidad: '%', esPrincipal: false, esAdicional: true },
{ claves: ['transferrina', 'transferrin'], nombre: 'Transferrina', unidad: 'mg/dL', esPrincipal: false, esAdicional: true }, { claves: ['transferrina', 'transferrin'], nombre: 'Transferrina', unidad: 'mg/dL', esPrincipal: false, esAdicional: true },
{ claves: ['hierro', 'sideremia', 'fe'], nombre: 'Hierro', unidad: 'µg/dL', esPrincipal: false, esAdicional: true }, { claves: ['hierro', 'sideremia', 'fe'], nombre: 'Hierro', unidad: 'µg/dL', esPrincipal: false, esAdicional: true },
@@ -1164,7 +1234,6 @@ function SeccionLaboratorios({ lab, patientId, internacionId, add, update, del,
} }
if (matchedClave) { if (matchedClave) {
// Extraer la porción de texto posterior a la clave/nombre del parámetro para evitar capturar números dentro del nombre (ej: B12, T4)
let subLinea = linea; let subLinea = linea;
const idxClave = lineaLower.indexOf(matchedClaveString); const idxClave = lineaLower.indexOf(matchedClaveString);
if (idxClave !== -1) { if (idxClave !== -1) {
@@ -1201,45 +1270,6 @@ function SeccionLaboratorios({ lab, patientId, internacionId, add, update, del,
unidad: unidadFinal, unidad: unidadFinal,
estado: calcularEstadoLaboratorio(nombreNormalizado, String(valorFinal)) estado: calcularEstadoLaboratorio(nombreNormalizado, String(valorFinal))
}); });
const isLipido = [
'Colesterol Total',
'Colesterol LDL',
'Colesterol No HDL',
'Colesterol HDL',
'Triglicéridos'
].includes(nombreNormalizado);
const isFerrico = [
'Hierro',
'Transferrina',
'Porcentaje de Saturación de Transferrina',
'Ferritina',
'Ácido Fólico',
'Vitamina B12'
].includes(nombreNormalizado);
const isIndependiente = [
'Albúmina',
'Calcio Total',
'Fosfatasa Alcalina',
'LDH',
'NT-proBNP',
'Procalcitonina',
'Fósforo',
'Magnesio',
'Calcio Iónico'
].includes(nombreNormalizado);
if (isLipido) {
lipidosEncontrados.push({ parametro: nombreNormalizado, valor: valorFinal, unidad: unidadFinal });
} else if (isFerrico) {
ferricosEncontrados.push({ parametro: nombreNormalizado, valor: valorFinal, unidad: unidadFinal });
} else if (isIndependiente) {
indEncontrados.push({ parametro: nombreNormalizado, valor: valorFinal, unidad: unidadFinal });
}
} else if (nombreNormalizado === 'VCM' || nombreNormalizado === 'HCM') {
hemogramaAdicionalesEncontrados.push({ parametro: nombreNormalizado, valor: valorFinal, unidad: unidadFinal });
} }
break; break;
} }
@@ -1248,67 +1278,8 @@ function SeccionLaboratorios({ lab, patientId, internacionId, add, update, del,
} }
} }
if (lipidosEncontrados.length > 0) { const observacionesStr = buildObservacionesFromResultados(resultados);
observacionesExtra.push('PERFIL LIPIDICO:'); return { resultados, observaciones: observacionesStr };
const ordenLipidos = ['Colesterol Total', 'Colesterol LDL', 'Colesterol No HDL', 'Colesterol HDL', 'Triglicéridos'];
for (const nombre of ordenLipidos) {
const item = lipidosEncontrados.find(l => l.parametro === nombre);
if (item) {
observacionesExtra.push(`- ${item.parametro}: ${item.valor} ${item.unidad}`);
}
}
}
if (ferricosEncontrados.length > 0) {
if (observacionesExtra.length > 0) {
observacionesExtra.push('');
}
observacionesExtra.push('PERFIL FERRICO:');
const ordenFerricos = ['Hierro', 'Transferrina', 'Porcentaje de Saturación de Transferrina', 'Ferritina', 'Ácido Fólico', 'Vitamina B12'];
for (const nombre of ordenFerricos) {
const item = ferricosEncontrados.find(f => f.parametro === nombre);
if (item) {
observacionesExtra.push(`- ${item.parametro}: ${item.valor} ${item.unidad}`);
}
}
}
if (indEncontrados.length > 0) {
if (observacionesExtra.length > 0) {
observacionesExtra.push('');
}
const ordenInd = [
'Albúmina',
'Calcio Total',
'Fosfatasa Alcalina',
'LDH',
'NT-proBNP',
'Procalcitonina',
'Fósforo',
'Magnesio',
'Calcio Iónico'
];
for (const nombre of ordenInd) {
const item = indEncontrados.find(i => i.parametro === nombre);
if (item) {
observacionesExtra.push(`${item.parametro}: ${item.valor} ${item.unidad}`);
}
}
}
if (hemogramaAdicionalesEncontrados.length > 0) {
if (observacionesExtra.length > 0) {
observacionesExtra.push('');
}
for (const nombre of ['VCM', 'HCM']) {
const item = hemogramaAdicionalesEncontrados.find(h => h.parametro === nombre);
if (item) {
observacionesExtra.push(`${item.parametro}: ${item.valor} ${item.unidad}`);
}
}
}
return { resultados, observaciones: observacionesExtra.join('\n') };
}; };
const parseAcidoBaseTexto = (texto: string): Omit<AcidoBase, 'id'> | null => { const parseAcidoBaseTexto = (texto: string): Omit<AcidoBase, 'id'> | null => {
@@ -1388,7 +1359,7 @@ function SeccionLaboratorios({ lab, patientId, internacionId, add, update, del,
const coreParameters = [ const coreParameters = [
// Hemograma // Hemograma
'hematocrito', 'hto', 'hemoglobina', 'hb', 'leucocitos', 'gb', 'plaquetas', 'plaq', 'hematocrito', 'hto', 'hemoglobina', 'hb', 'leucocitos', 'gb', 'plaquetas', 'plaq',
'vcm', 'hcm', 'rdw', 'eritroblastos', 'neutrófilos', 'neutrofilos', 'linfocitos', 'monocitos', 'eosinófilos', 'eosinofilos', 'basófilos', 'basofilos', 'vpm', 'rdw', 'eritroblastos', 'neutrófilos', 'neutrofilos', 'linfocitos', 'monocitos', 'eosinófilos', 'eosinofilos', 'basófilos', 'basofilos', 'vpm',
// Glucemia // Glucemia
'glucemia', 'glucosa', 'glucemia', 'glucosa',
// Urea // Urea
@@ -1398,7 +1369,7 @@ function SeccionLaboratorios({ lab, patientId, internacionId, add, update, del,
// Ionograma // Ionograma
'sodio', 'na', 'potasio', 'k', 'k+', 'cloro', 'cl', 'cl-', 'sodio', 'na', 'potasio', 'k', 'k+', 'cloro', 'cl', 'cl-',
// Hepatograma // Hepatograma
'bilirrubina total', 'bt', 'bilirrubina directa', 'bd', 'got', 'ast', 'gpt', 'alt', 'proteínas totales', 'proteinas totales', 'fosfatasa alcalina', 'fal', 'albúmina', 'albumina', 'bilirrubina total', 'bt', 'bilirrubina directa', 'bd', 'got', 'ast', 'gpt', 'alt', 'proteínas totales', 'proteinas totales',
// Coagulograma // Coagulograma
'tiempo de protrombina', 'tp', 't.p.', 't.p', 'rin', 'inr', 'aptt', 'kptt' 'tiempo de protrombina', 'tp', 't.p.', 't.p', 'rin', 'inr', 'aptt', 'kptt'
]; ];
@@ -1406,7 +1377,11 @@ function SeccionLaboratorios({ lab, patientId, internacionId, add, update, del,
}; };
const handleEliminarDeterminacion = (index: number) => { const handleEliminarDeterminacion = (index: number) => {
setImportResultados(prev => prev.filter((_, i) => i !== index)); setImportResultados(prev => {
const filtered = prev.filter((_, i) => i !== index);
setImportObservaciones(buildObservacionesFromResultados(filtered));
return filtered;
});
}; };
const handleProcesarTexto = () => { const handleProcesarTexto = () => {