Spaces:
Sleeping
Sleeping
| // Gravedad | |
| // La desviación se mide en múltiplos del ancho del rango de referencia. | |
| // Ej: rango WBC 6-17 (ancho = 11). WBC = 28 → desviación = 11/11 = 1.0 → moderado. | |
| const UMBRALES_GRAVEDAD = { leve: 0.5, moderado: 1.5 }; | |
| const clasificarGravedad = (valor, ref) => { | |
| // Mide cuantos anchos de rango de referencia se desvia el valor | |
| const rango = ref.superior - ref.inferior; | |
| const desviacion = valor > ref.superior | |
| ? (valor - ref.superior) / rango | |
| : (ref.inferior - valor) / rango; | |
| if (desviacion <= UMBRALES_GRAVEDAD.leve) return 'leve'; | |
| if (desviacion <= UMBRALES_GRAVEDAD.moderado) return 'moderado'; | |
| return 'grave'; | |
| }; | |
| // Edad | |
| const categorizarEdad = (edadMeses, especie) => { | |
| if (edadMeses === null) return 'adulto'; | |
| if (especie === 'canino') { | |
| if (edadMeses < 12) return 'cachorro'; | |
| if (edadMeses < 84) return 'adulto'; | |
| if (edadMeses < 120) return 'senior'; | |
| return 'geriatrico'; | |
| } | |
| // felino | |
| if (edadMeses < 12) return 'cachorro'; | |
| if (edadMeses < 120) return 'adulto'; | |
| return 'senior'; | |
| }; | |
| // Ajustes por edad | |
| const AJUSTES_EDAD = { | |
| canino: { | |
| cachorro: { fal: { superior: 3.0 }, wbc: { superior: 1.25 } }, | |
| adulto: {}, | |
| senior: { bun: { superior: 1.15 }, creat: { superior: 1.15 } }, | |
| geriatrico: { bun: { superior: 1.25 }, creat: { superior: 1.25 }, fal: { superior: 1.40 } } | |
| }, | |
| felino: { | |
| cachorro: { fal: { superior: 2.0 }, wbc: { superior: 1.20 } }, | |
| adulto: {}, | |
| senior: { bun: { superior: 1.20 }, creat: { superior: 1.20 } } | |
| } | |
| }; | |
| // Ajustes por raza | |
| const AJUSTES_RAZA = { | |
| canino: [ | |
| { | |
| razas: ['galgo', 'greyhound', 'whippet', 'lebrel'], | |
| ajustes: { | |
| rbc: { inferior: 1.15, superior: 1.15 }, | |
| hgb: { inferior: 1.12, superior: 1.12 }, | |
| hct: { inferior: 1.12, superior: 1.12 }, | |
| plt: { inferior: 0.75, superior: 0.75 } | |
| } | |
| }, | |
| { | |
| razas: ['shiba', 'akita'], | |
| ajustes: { | |
| rbc: { inferior: 1.10, superior: 1.10 }, | |
| hct: { inferior: 1.08, superior: 1.08 }, | |
| hgb: { inferior: 1.08, superior: 1.08 } | |
| } | |
| } | |
| ] | |
| }; | |
| // Ajustes por sexo | |
| const AJUSTES_SEXO = { | |
| felino: { | |
| Macho: { creat: { superior: 1.15 } } | |
| } | |
| }; | |
| const obtenerAjustesRaza = (raza, especie) => { | |
| const razaNorm = raza?.toLowerCase().trim() ?? ''; | |
| const grupos = AJUSTES_RAZA[especie] ?? []; | |
| return grupos.find(g => g.razas.some(r => razaNorm.includes(r)))?.ajustes ?? {}; | |
| }; | |
| // Ajuste de referencias | |
| const ajustarReferencias = (refsEspecie, paciente) => { | |
| const catEdad = categorizarEdad(paciente.edadMeses, paciente.especie); | |
| const ajEdad = AJUSTES_EDAD[paciente.especie]?.[catEdad] ?? {}; | |
| const ajRaza = obtenerAjustesRaza(paciente.raza, paciente.especie); | |
| const ajSexo = AJUSTES_SEXO[paciente.especie]?.[paciente.sexo] ?? {}; | |
| // Multiplica los limites inferiores y superiores por los factores de edad, raza y sexo | |
| return Object.entries(refsEspecie).reduce((acc, [clave, ref]) => { | |
| const factorEdad = ajEdad[clave] ?? {}; | |
| const factorRaza = ajRaza[clave] ?? {}; | |
| const factorSexo = ajSexo[clave] ?? {}; | |
| acc[clave] = { | |
| ...ref, | |
| inferior: ref.inferior * (factorEdad.inferior ?? 1) * (factorRaza.inferior ?? 1) * (factorSexo.inferior ?? 1), | |
| superior: ref.superior * (factorEdad.superior ?? 1) * (factorRaza.superior ?? 1) * (factorSexo.superior ?? 1) | |
| }; | |
| return acc; | |
| }, {}); | |
| }; | |
| // Detección de patrones clínicos | |
| const detectarPatrones = (hallazgos, especie, alt) => { | |
| const mapa = hallazgos.reduce((acc, h) => { acc[h.clave] = h; return acc; }, {}); | |
| const esAlto = (clave) => mapa[clave]?.direccion === 'alto'; | |
| const esBajo = (clave) => mapa[clave]?.direccion === 'bajo'; | |
| const presente = (clave) => clave in mapa; | |
| const valor = (clave) => mapa[clave]?.valor ?? null; | |
| const gravedadDe = (...claves) => { | |
| const clave = claves.find(c => mapa[c]); | |
| return mapa[clave]?.gravedad ?? 'leve'; | |
| }; | |
| const patrones = []; | |
| const agregar = (patron) => patrones.push(patron); | |
| // Serie roja | |
| if (esBajo('hct') || esBajo('hgb') || esBajo('rbc')) { | |
| // Clasifica el tipo de anemia segun el VCM para sugerir la etiologia mas probable | |
| const tipoPorVcm = !presente('vcm') ? '' : | |
| esBajo('vcm') ? 'microcítica' : | |
| esAlto('vcm') ? 'macrocítica' : 'normocítica'; | |
| const claveEtiologia = esBajo('vcm') ? 'ferropenia' : | |
| esAlto('vcm') ? 'macrocitica' : | |
| tipoPorVcm === 'normocítica' ? 'normocitica' : null; | |
| const etiologia = claveEtiologia ? alt.anemia.etiologias?.[claveEtiologia] ?? '' : ''; | |
| agregar({ | |
| nombre: `${alt.anemia.nombre}${tipoPorVcm ? ` ${tipoPorVcm}` : ''}`, | |
| descripcion: [alt.anemia.prefijo, etiologia].filter(Boolean).join(' '), | |
| gravedad: gravedadDe('hct', 'hgb', 'rbc'), | |
| parametros: ['hct', 'hgb', 'rbc', 'vcm'].filter(presente) | |
| }); | |
| } | |
| if (esAlto('hct') || esAlto('rbc')) agregar({ | |
| nombre: alt.eritrocitosis.nombre, | |
| descripcion: alt.eritrocitosis.descripcion, | |
| gravedad: gravedadDe('hct', 'rbc'), | |
| parametros: ['hct', 'rbc', 'hgb'].filter(presente) | |
| }); | |
| // Serie blanca | |
| if (esAlto('wbc')) { | |
| // Diferencia leucocitosis neutrofilica de linfocitica; si no hay diferencial, informa generico | |
| const neutrofilia = esAlto('neutro'); | |
| const linfocitosis = esAlto('linfo'); | |
| if (neutrofilia) agregar({ | |
| nombre: alt.leucocitosis_neutrofilica.nombre, | |
| descripcion: alt.leucocitosis_neutrofilica.descripcion, | |
| gravedad: gravedadDe('wbc', 'neutro'), | |
| parametros: ['wbc', 'neutro'].filter(presente) | |
| }); | |
| if (linfocitosis) agregar({ | |
| nombre: alt.leucocitosis_linfocitica.nombre, | |
| descripcion: alt.leucocitosis_linfocitica.descripcion, | |
| gravedad: gravedadDe('wbc', 'linfo'), | |
| parametros: ['wbc', 'linfo'].filter(presente) | |
| }); | |
| if (!neutrofilia && !linfocitosis) agregar({ | |
| nombre: alt.leucocitosis.nombre, | |
| descripcion: alt.leucocitosis.descripcion, | |
| gravedad: gravedadDe('wbc'), | |
| parametros: ['wbc'] | |
| }); | |
| } | |
| if (esBajo('wbc')) agregar({ | |
| nombre: alt.leucopenia.nombre, | |
| descripcion: alt.leucopenia.descripcion, | |
| gravedad: gravedadDe('wbc'), | |
| parametros: ['wbc'] | |
| }); | |
| if (esBajo('neutro')) agregar({ | |
| nombre: alt.neutropenia.nombre, | |
| descripcion: alt.neutropenia.descripcion, | |
| gravedad: gravedadDe('neutro'), | |
| parametros: ['neutro'] | |
| }); | |
| if (esBajo('linfo')) agregar({ | |
| nombre: alt.linfopenia.nombre, | |
| descripcion: alt.linfopenia.descripcion, | |
| gravedad: gravedadDe('linfo'), | |
| parametros: ['linfo'] | |
| }); | |
| if (esAlto('eosino')) agregar({ | |
| nombre: alt.eosinofilia.nombre, | |
| descripcion: alt.eosinofilia.descripcion, | |
| gravedad: gravedadDe('eosino'), | |
| parametros: ['eosino'] | |
| }); | |
| // Plaquetas | |
| if (esBajo('plt')) agregar({ | |
| nombre: alt.trombocitopenia.nombre, | |
| descripcion: alt.trombocitopenia.descripcion, | |
| gravedad: gravedadDe('plt'), | |
| parametros: ['plt'] | |
| }); | |
| if (esAlto('plt')) agregar({ | |
| nombre: alt.trombocitosis.nombre, | |
| descripcion: alt.trombocitosis.descripcion, | |
| gravedad: gravedadDe('plt'), | |
| parametros: ['plt'] | |
| }); | |
| // Hígado | |
| if (esAlto('alt') && esAlto('ast')) agregar({ | |
| nombre: alt.dano_hepatocelular.nombre, | |
| descripcion: alt.dano_hepatocelular.descripcion, | |
| gravedad: gravedadDe('alt', 'ast'), | |
| parametros: ['alt', 'ast'].filter(presente) | |
| }); | |
| else if (esAlto('alt')) agregar({ | |
| nombre: alt.alt_aislada.nombre, | |
| descripcion: alt.alt_aislada.descripcion, | |
| gravedad: gravedadDe('alt'), | |
| parametros: ['alt'] | |
| }); | |
| if (esAlto('fal')) agregar({ | |
| nombre: alt.patron_colestasico.nombre, | |
| descripcion: alt.patron_colestasico.descripcion[especie] ?? alt.patron_colestasico.descripcion.canino, | |
| gravedad: gravedadDe('fal'), | |
| parametros: ['fal'] | |
| }); | |
| if (esAlto('bili')) agregar({ | |
| nombre: alt.hiperbilirrubinemia.nombre, | |
| descripcion: alt.hiperbilirrubinemia.descripcion, | |
| gravedad: gravedadDe('bili'), | |
| parametros: ['bili'] | |
| }); | |
| // Riñón | |
| if (esAlto('bun') && esAlto('creat')) agregar({ | |
| nombre: alt.azotemia.nombre, | |
| descripcion: alt.azotemia.descripcion, | |
| gravedad: gravedadDe('creat', 'bun'), | |
| parametros: ['bun', 'creat'].filter(presente) | |
| }); | |
| else if (esAlto('bun')) agregar({ | |
| nombre: alt.hiperuremia_bun.nombre, | |
| descripcion: alt.hiperuremia_bun.descripcion, | |
| gravedad: gravedadDe('bun'), | |
| parametros: ['bun'] | |
| }); | |
| else if (esAlto('creat')) agregar({ | |
| nombre: alt.creatinina_aislada.nombre, | |
| descripcion: alt.creatinina_aislada.descripcion, | |
| gravedad: gravedadDe('creat'), | |
| parametros: ['creat'] | |
| }); | |
| if (esBajo('bun')) agregar({ | |
| nombre: alt.bun_disminuido.nombre, | |
| descripcion: alt.bun_disminuido.descripcion, | |
| gravedad: gravedadDe('bun'), | |
| parametros: ['bun'] | |
| }); | |
| // Glucosa | |
| if (esAlto('gluc')) agregar({ | |
| nombre: alt.hiperglucemia.nombre, | |
| descripcion: alt.hiperglucemia.descripcion[especie] ?? alt.hiperglucemia.descripcion.canino, | |
| gravedad: gravedadDe('gluc'), | |
| parametros: ['gluc'] | |
| }); | |
| if (esBajo('gluc')) agregar({ | |
| nombre: alt.hipoglucemia.nombre, | |
| descripcion: alt.hipoglucemia.descripcion, | |
| gravedad: gravedadDe('gluc'), | |
| parametros: ['gluc'] | |
| }); | |
| // Proteínas | |
| if (esAlto('prot')) agregar({ | |
| nombre: alt.hiperproteinemia.nombre, | |
| descripcion: alt.hiperproteinemia.descripcion, | |
| gravedad: gravedadDe('prot'), | |
| parametros: ['prot'] | |
| }); | |
| if (esBajo('alb')) { | |
| const hipoproteinemia = esBajo('prot'); | |
| const claveAlteracion = hipoproteinemia ? 'hipoproteinemia_hipoalbuminemia' : 'hipoalbuminemia'; | |
| agregar({ | |
| nombre: alt[claveAlteracion].nombre, | |
| descripcion: alt[claveAlteracion].descripcion, | |
| gravedad: gravedadDe('alb'), | |
| parametros: ['alb', ...(hipoproteinemia ? ['prot'] : [])].filter(presente) | |
| }); | |
| } | |
| // Electrolitos | |
| const valSodio = valor('sodio'); | |
| const valPotasio = valor('potasio'); | |
| // Ratio Na/K < 27 es sugestivo de hipoadrenocorticismo; la gravedad aumenta a menor ratio | |
| if (valSodio !== null && valPotasio !== null && valPotasio > 0) { | |
| const ratioNaK = valSodio / valPotasio; | |
| if (ratioNaK < 27) agregar({ | |
| nombre: alt.ratio_nak.nombre, | |
| descripcion: alt.ratio_nak.descripcion.replace('{ratio}', ratioNaK.toFixed(1)), | |
| gravedad: ratioNaK < 20 ? 'grave' : ratioNaK < 24 ? 'moderado' : 'leve', | |
| parametros: ['sodio', 'potasio'].filter(presente) | |
| }); | |
| } | |
| if (esAlto('sodio')) agregar({ | |
| nombre: alt.hipernatremia.nombre, | |
| descripcion: alt.hipernatremia.descripcion, | |
| gravedad: gravedadDe('sodio'), | |
| parametros: ['sodio'] | |
| }); | |
| if (esBajo('sodio')) agregar({ | |
| nombre: alt.hiponatremia.nombre, | |
| descripcion: alt.hiponatremia.descripcion, | |
| gravedad: gravedadDe('sodio'), | |
| parametros: ['sodio'] | |
| }); | |
| if (esAlto('calc')) agregar({ | |
| nombre: alt.hipercalcemia.nombre, | |
| descripcion: alt.hipercalcemia.descripcion, | |
| gravedad: gravedadDe('calc'), | |
| parametros: ['calc'] | |
| }); | |
| if (esBajo('calc')) agregar({ | |
| nombre: alt.hipocalcemia.nombre, | |
| descripcion: alt.hipocalcemia.descripcion, | |
| gravedad: gravedadDe('calc'), | |
| parametros: ['calc'] | |
| }); | |
| if (esBajo('potasio')) agregar({ | |
| nombre: alt.hipopotasemia.nombre, | |
| descripcion: alt.hipopotasemia.descripcion, | |
| gravedad: gravedadDe('potasio'), | |
| parametros: ['potasio'] | |
| }); | |
| if (esAlto('potasio')) agregar({ | |
| nombre: alt.hiperpotasemia.nombre, | |
| descripcion: alt.hiperpotasemia.descripcion, | |
| gravedad: gravedadDe('potasio'), | |
| parametros: ['potasio'] | |
| }); | |
| if (esAlto('fosf')) agregar({ | |
| nombre: alt.hiperfosforemia.nombre, | |
| descripcion: alt.hiperfosforemia.descripcion, | |
| gravedad: gravedadDe('fosf'), | |
| parametros: ['fosf'] | |
| }); | |
| // Urianálisis | |
| const valUsg = valor('usg'); | |
| if (valUsg !== null && valUsg < 1.008) agregar({ | |
| nombre: alt.hiposthenuria.nombre, | |
| descripcion: alt.hiposthenuria.descripcion, | |
| gravedad: valUsg < 1.005 ? 'grave' : 'moderado', | |
| parametros: ['usg'] | |
| }); | |
| else if (valUsg !== null && valUsg < 1.013) agregar({ | |
| nombre: alt.isosthenuria.nombre, | |
| descripcion: alt.isosthenuria.descripcion, | |
| gravedad: 'leve', | |
| parametros: ['usg'] | |
| }); | |
| // Tiroides | |
| if (especie === 'canino' && esBajo('t4_total')) agregar({ | |
| nombre: alt.hipotiroidismo.nombre, | |
| descripcion: alt.hipotiroidismo.descripcion.canino, | |
| gravedad: gravedadDe('t4_total'), | |
| parametros: ['t4_total'].filter(presente) | |
| }); | |
| if (esAlto('t4_total')) agregar({ | |
| nombre: alt.hipertiroidismo.nombre, | |
| descripcion: alt.hipertiroidismo.descripcion[especie] ?? alt.hipertiroidismo.descripcion.felino, | |
| gravedad: gravedadDe('t4_total'), | |
| parametros: ['t4_total'].filter(presente) | |
| }); | |
| // Suprarrenal / Cortisol | |
| if (esAlto('cortisol_acth')) agregar({ | |
| nombre: alt.hiperadrenocorticismo.nombre, | |
| descripcion: alt.hiperadrenocorticismo.descripcion[especie] ?? alt.hiperadrenocorticismo.descripcion.canino, | |
| gravedad: gravedadDe('cortisol_acth'), | |
| parametros: ['cortisol_acth', ...(presente('cortisol_bas') ? ['cortisol_bas'] : [])] | |
| }); | |
| if (esBajo('cortisol_acth')) agregar({ | |
| nombre: alt.hipoadrenocorticismo_cortisol.nombre, | |
| descripcion: alt.hipoadrenocorticismo_cortisol.descripcion, | |
| gravedad: gravedadDe('cortisol_acth'), | |
| parametros: ['cortisol_acth', ...(presente('cortisol_bas') ? ['cortisol_bas'] : [])] | |
| }); | |
| if (esBajo('cortisol_bas') && !presente('cortisol_acth')) agregar({ | |
| nombre: alt.cortisol_basal_bajo.nombre, | |
| descripcion: alt.cortisol_basal_bajo.descripcion, | |
| gravedad: 'moderado', | |
| parametros: ['cortisol_bas'] | |
| }); | |
| // Insulina | |
| if (esBajo('insulina') && esAlto('gluc')) agregar({ | |
| nombre: alt.deficit_insulina.nombre, | |
| descripcion: alt.deficit_insulina.descripcion, | |
| gravedad: 'moderado', | |
| parametros: ['insulina', 'gluc'].filter(presente) | |
| }); | |
| // Páncreas exocrino (PLI) | |
| if (esAlto('pli')) agregar({ | |
| nombre: alt.pancreatitis.nombre, | |
| descripcion: alt.pancreatitis.descripcion[especie] ?? alt.pancreatitis.descripcion.canino, | |
| gravedad: gravedadDe('pli'), | |
| parametros: ['pli', ...(presente('lipasa') ? ['lipasa'] : []), ...(presente('amylasa') ? ['amylasa'] : [])].filter(presente) | |
| }); | |
| if (esAlto('amylasa') && !presente('pli')) agregar({ | |
| nombre: alt.hiperamylasemia.nombre, | |
| descripcion: alt.hiperamylasemia.descripcion, | |
| gravedad: gravedadDe('amylasa'), | |
| parametros: ['amylasa'] | |
| }); | |
| // Tiroides — TSH | |
| if (esAlto('tsh')) agregar({ | |
| nombre: alt.tsh_elevado.nombre, | |
| descripcion: alt.tsh_elevado.descripcion[especie] ?? alt.tsh_elevado.descripcion.canino, | |
| gravedad: gravedadDe('tsh'), | |
| parametros: ['tsh', ...(presente('t4_total') ? ['t4_total'] : []), ...(presente('t4_libre') ? ['t4_libre'] : [])].filter(presente) | |
| }); | |
| if (esBajo('tsh')) agregar({ | |
| nombre: alt.tsh_suprimido.nombre, | |
| descripcion: alt.tsh_suprimido.descripcion[especie] ?? alt.tsh_suprimido.descripcion.canino, | |
| gravedad: gravedadDe('tsh'), | |
| parametros: ['tsh', ...(presente('t4_total') ? ['t4_total'] : [])].filter(presente) | |
| }); | |
| if (esBajo('t4_libre') && !presente('tsh')) agregar({ | |
| nombre: alt.t4_libre_baja.nombre, | |
| descripcion: alt.t4_libre_baja.descripcion[especie] ?? alt.t4_libre_baja.descripcion.canino, | |
| gravedad: gravedadDe('t4_libre'), | |
| parametros: ['t4_libre', ...(presente('t4_total') ? ['t4_total'] : [])].filter(presente) | |
| }); | |
| // Biomarcadores cardíacos | |
| if (esAlto('ctni')) agregar({ | |
| nombre: alt.dano_miocardico.nombre, | |
| descripcion: alt.dano_miocardico.descripcion, | |
| gravedad: gravedadDe('ctni'), | |
| parametros: ['ctni', ...(presente('nt_probnp') ? ['nt_probnp'] : [])].filter(presente) | |
| }); | |
| if (esAlto('nt_probnp')) agregar({ | |
| nombre: alt.cardiopatia_bnp.nombre, | |
| descripcion: alt.cardiopatia_bnp.descripcion[especie] ?? alt.cardiopatia_bnp.descripcion.canino, | |
| gravedad: gravedadDe('nt_probnp'), | |
| parametros: ['nt_probnp', ...(presente('ctni') ? ['ctni'] : [])].filter(presente) | |
| }); | |
| // Proteínas de fase aguda | |
| if (esAlto('crp') || esAlto('saa')) agregar({ | |
| nombre: alt.inflamacion_aguda.nombre, | |
| descripcion: alt.inflamacion_aguda.descripcion[especie] ?? alt.inflamacion_aguda.descripcion.canino, | |
| gravedad: gravedadDe('crp', 'saa'), | |
| parametros: ['crp', 'saa'].filter(presente) | |
| }); | |
| // Progesterona | |
| if (esAlto('progesterona')) agregar({ | |
| nombre: alt.progesterona_elevada.nombre, | |
| descripcion: alt.progesterona_elevada.descripcion[especie] ?? alt.progesterona_elevada.descripcion.canino, | |
| gravedad: gravedadDe('progesterona'), | |
| parametros: ['progesterona'] | |
| }); | |
| // Magnesio | |
| if (esBajo('magnesio')) agregar({ | |
| nombre: alt.hipomagnesemia.nombre, | |
| descripcion: alt.hipomagnesemia.descripcion, | |
| gravedad: gravedadDe('magnesio'), | |
| parametros: ['magnesio'] | |
| }); | |
| if (esAlto('magnesio')) agregar({ | |
| nombre: alt.hipermagnesemia.nombre, | |
| descripcion: alt.hipermagnesemia.descripcion, | |
| gravedad: gravedadDe('magnesio'), | |
| parametros: ['magnesio'] | |
| }); | |
| // Hierro | |
| if (esBajo('hierro')) agregar({ | |
| nombre: alt.ferropenia_hierro.nombre, | |
| descripcion: alt.ferropenia_hierro.descripcion, | |
| gravedad: gravedadDe('hierro'), | |
| parametros: ['hierro'] | |
| }); | |
| // Ácido úrico | |
| if (esAlto('ac_urico')) agregar({ | |
| nombre: alt.ac_urico_elevado.nombre, | |
| descripcion: alt.ac_urico_elevado.descripcion, | |
| gravedad: gravedadDe('ac_urico'), | |
| parametros: ['ac_urico'] | |
| }); | |
| // LDH | |
| if (esAlto('ldh')) agregar({ | |
| nombre: alt.ldh_elevada.nombre, | |
| descripcion: alt.ldh_elevada.descripcion, | |
| gravedad: gravedadDe('ldh'), | |
| parametros: ['ldh'] | |
| }); | |
| // Monitorización de fármacos (TDM) | |
| if (esBajo('fenobarbital')) agregar({ | |
| nombre: alt.fenobarbital_subterapeutico.nombre, | |
| descripcion: alt.fenobarbital_subterapeutico.descripcion, | |
| gravedad: gravedadDe('fenobarbital'), | |
| parametros: ['fenobarbital'] | |
| }); | |
| if (esAlto('fenobarbital')) agregar({ | |
| nombre: alt.fenobarbital_toxico.nombre, | |
| descripcion: alt.fenobarbital_toxico.descripcion, | |
| gravedad: gravedadDe('fenobarbital'), | |
| parametros: ['fenobarbital'] | |
| }); | |
| if (esBajo('ciclosporina')) agregar({ | |
| nombre: alt.ciclosporina_subterapeutica.nombre, | |
| descripcion: alt.ciclosporina_subterapeutica.descripcion, | |
| gravedad: gravedadDe('ciclosporina'), | |
| parametros: ['ciclosporina'] | |
| }); | |
| if (esAlto('ciclosporina')) agregar({ | |
| nombre: alt.ciclosporina_toxica.nombre, | |
| descripcion: alt.ciclosporina_toxica.descripcion, | |
| gravedad: gravedadDe('ciclosporina'), | |
| parametros: ['ciclosporina'] | |
| }); | |
| // Coagulación | |
| if (esAlto('pt') && !esAlto('aptt')) agregar({ | |
| nombre: alt.coagulopatia_extrinseca.nombre, | |
| descripcion: alt.coagulopatia_extrinseca.descripcion, | |
| gravedad: gravedadDe('pt'), | |
| parametros: ['pt'] | |
| }); | |
| if (esAlto('aptt') && !esAlto('pt')) agregar({ | |
| nombre: alt.coagulopatia_intrinseca.nombre, | |
| descripcion: alt.coagulopatia_intrinseca.descripcion, | |
| gravedad: gravedadDe('aptt'), | |
| parametros: ['aptt'] | |
| }); | |
| if (esAlto('pt') && esAlto('aptt')) agregar({ | |
| nombre: alt.coagulopatia_mixta.nombre, | |
| descripcion: alt.coagulopatia_mixta.descripcion, | |
| gravedad: gravedadDe('pt', 'aptt', 'act'), | |
| parametros: ['pt', 'aptt', ...(presente('act') ? ['act'] : [])].filter(presente) | |
| }); | |
| if ((esAlto('ddimeros') || esAlto('fdp')) && esBajo('fibrinogeno')) agregar({ | |
| nombre: alt.cid.nombre, | |
| descripcion: alt.cid.descripcion, | |
| gravedad: 'grave', | |
| parametros: ['ddimeros', 'fdp', 'fibrinogeno', 'plt'].filter(presente) | |
| }); | |
| if (esAlto('fibrinogeno') && !esAlto('ddimeros') && !esAlto('fdp')) agregar({ | |
| nombre: alt.hiperfibrinogenemia.nombre, | |
| descripcion: alt.hiperfibrinogenemia.descripcion, | |
| gravedad: gravedadDe('fibrinogeno'), | |
| parametros: ['fibrinogeno'] | |
| }); | |
| if (esBajo('fibrinogeno') && !esAlto('ddimeros') && !esAlto('fdp')) agregar({ | |
| nombre: alt.hipofibrinogenemia.nombre, | |
| descripcion: alt.hipofibrinogenemia.descripcion, | |
| gravedad: gravedadDe('fibrinogeno'), | |
| parametros: ['fibrinogeno'] | |
| }); | |
| if (esBajo('vwf')) agregar({ | |
| nombre: alt.deficit_vwf.nombre, | |
| descripcion: alt.deficit_vwf.descripcion, | |
| gravedad: gravedadDe('vwf'), | |
| parametros: ['vwf', ...(presente('aptt') ? ['aptt'] : [])].filter(presente) | |
| }); | |
| if (esBajo('antitrombina')) agregar({ | |
| nombre: alt.antitrombina_baja.nombre, | |
| descripcion: alt.antitrombina_baja.descripcion, | |
| gravedad: gravedadDe('antitrombina'), | |
| parametros: ['antitrombina'] | |
| }); | |
| // Urianálisis — sedimento / UPC | |
| if (esAlto('rbc_uri')) agregar({ | |
| nombre: alt.hematuria_uri.nombre, | |
| descripcion: alt.hematuria_uri.descripcion, | |
| gravedad: gravedadDe('rbc_uri'), | |
| parametros: ['rbc_uri'] | |
| }); | |
| if (esAlto('wbc_uri')) agregar({ | |
| nombre: alt.piuria.nombre, | |
| descripcion: alt.piuria.descripcion, | |
| gravedad: gravedadDe('wbc_uri'), | |
| parametros: ['wbc_uri'] | |
| }); | |
| if (esAlto('upc')) agregar({ | |
| nombre: alt.proteinuria_upc.nombre, | |
| descripcion: alt.proteinuria_upc.descripcion, | |
| gravedad: gravedadDe('upc'), | |
| parametros: ['upc'] | |
| }); | |
| // Gasometría — ácido-base | |
| if (presente('ph_sangre')) { | |
| const phBajo = esBajo('ph_sangre'); | |
| const phAlto = esAlto('ph_sangre'); | |
| const hipercarbia = esAlto('pco2'); | |
| const hipocarbia = esBajo('pco2'); | |
| const componenteAcidMet = esBajo('hco3') || esBajo('exceso_base'); | |
| const componenteAlcalMet = esAlto('hco3') || esAlto('exceso_base'); | |
| if (phBajo) { | |
| if (hipercarbia && componenteAcidMet) { | |
| agregar({ | |
| nombre: alt.acidosis_respiratoria.nombre + ' + ' + alt.acidosis_metabolica.nombre, | |
| descripcion: alt.acidosis_metabolica.descripcion, | |
| gravedad: 'grave', | |
| parametros: ['ph_sangre', 'pco2', 'hco3', 'exceso_base'].filter(presente) | |
| }); | |
| } else if (hipercarbia) { | |
| agregar({ | |
| nombre: alt.acidosis_respiratoria.nombre, | |
| descripcion: alt.acidosis_respiratoria.descripcion, | |
| gravedad: gravedadDe('ph_sangre', 'pco2'), | |
| parametros: ['ph_sangre', 'pco2'].filter(presente) | |
| }); | |
| } else if (componenteAcidMet) { | |
| agregar({ | |
| nombre: alt.acidosis_metabolica.nombre, | |
| descripcion: alt.acidosis_metabolica.descripcion, | |
| gravedad: gravedadDe('ph_sangre', 'hco3', 'exceso_base'), | |
| parametros: ['ph_sangre', 'hco3', 'exceso_base', 'anion_gap'].filter(presente) | |
| }); | |
| } | |
| } | |
| if (phAlto) { | |
| if (hipocarbia && componenteAlcalMet) { | |
| agregar({ | |
| nombre: alt.alcalosis_respiratoria.nombre + ' + ' + alt.alcalosis_metabolica.nombre, | |
| descripcion: alt.alcalosis_metabolica.descripcion, | |
| gravedad: 'grave', | |
| parametros: ['ph_sangre', 'pco2', 'hco3', 'exceso_base'].filter(presente) | |
| }); | |
| } else if (hipocarbia) { | |
| agregar({ | |
| nombre: alt.alcalosis_respiratoria.nombre, | |
| descripcion: alt.alcalosis_respiratoria.descripcion, | |
| gravedad: gravedadDe('ph_sangre', 'pco2'), | |
| parametros: ['ph_sangre', 'pco2'].filter(presente) | |
| }); | |
| } else if (componenteAlcalMet) { | |
| agregar({ | |
| nombre: alt.alcalosis_metabolica.nombre, | |
| descripcion: alt.alcalosis_metabolica.descripcion, | |
| gravedad: gravedadDe('ph_sangre', 'hco3', 'exceso_base'), | |
| parametros: ['ph_sangre', 'hco3', 'exceso_base'].filter(presente) | |
| }); | |
| } | |
| } | |
| } | |
| if (esBajo('po2')) agregar({ | |
| nombre: alt.hipoxemia.nombre, | |
| descripcion: alt.hipoxemia.descripcion, | |
| gravedad: gravedadDe('po2', 'so2'), | |
| parametros: ['po2', ...(presente('so2') ? ['so2'] : [])].filter(presente) | |
| }); | |
| if (esAlto('lactato')) agregar({ | |
| nombre: alt.hiperlactatemia.nombre, | |
| descripcion: alt.hiperlactatemia.descripcion, | |
| gravedad: gravedadDe('lactato'), | |
| parametros: ['lactato'] | |
| }); | |
| if (esBajo('ca_ion')) agregar({ | |
| nombre: alt.ca_ionizado_bajo.nombre, | |
| descripcion: alt.ca_ionizado_bajo.descripcion, | |
| gravedad: gravedadDe('ca_ion'), | |
| parametros: ['ca_ion'] | |
| }); | |
| if (esAlto('ca_ion')) agregar({ | |
| nombre: alt.ca_ionizado_alto.nombre, | |
| descripcion: alt.ca_ionizado_alto.descripcion, | |
| gravedad: gravedadDe('ca_ion'), | |
| parametros: ['ca_ion'] | |
| }); | |
| if (esAlto('anion_gap')) agregar({ | |
| nombre: alt.anion_gap_elevado.nombre, | |
| descripcion: alt.anion_gap_elevado.descripcion, | |
| gravedad: gravedadDe('anion_gap'), | |
| parametros: ['anion_gap', ...(presente('lactato') ? ['lactato'] : [])].filter(presente) | |
| }); | |
| return patrones; | |
| }; | |
| // Exportación principal | |
| export const analizarResultados = (valoresInput, paciente, referencias, alteraciones) => { | |
| const refsEspecie = referencias[paciente.especie]; | |
| if (!refsEspecie) return { hallazgos: [], patrones: [] }; | |
| // Ajusta los rangos segun edad, raza y sexo antes de comparar | |
| const refsAjustadas = ajustarReferencias(refsEspecie, paciente); | |
| const hallazgos = []; | |
| for (const [clave, ref] of Object.entries(refsAjustadas)) { | |
| const crudo = valoresInput[clave]; | |
| if (crudo === null || crudo === undefined || crudo === '') continue; | |
| const valorNum = parseFloat(crudo); | |
| if (isNaN(valorNum)) continue; | |
| if (valorNum > ref.superior) { | |
| hallazgos.push({ | |
| clave, nombre: ref.nombre, valor: valorNum, unidad: ref.unidad, | |
| direccion: 'alto', gravedad: clasificarGravedad(valorNum, ref) | |
| }); | |
| } else if (valorNum < ref.inferior) { | |
| hallazgos.push({ | |
| clave, nombre: ref.nombre, valor: valorNum, unidad: ref.unidad, | |
| direccion: 'bajo', gravedad: clasificarGravedad(valorNum, ref) | |
| }); | |
| } | |
| } | |
| return { hallazgos, patrones: detectarPatrones(hallazgos, paciente.especie, alteraciones) }; | |
| }; | |