codigo0/src/data/pediatric-drugs.ts

240 lines
6.2 KiB
TypeScript
Raw Normal View History

/**
* Fármacos comunes con dosis pediátricas para calculadora
*/
export interface PediatricDrug {
id: string;
name: string;
presentation: string;
concentration: string; // Ej: "1 mg/ml" o "150 mg/3 ml"
dosePerKg: string; // Ej: "0.01 mg/kg" o "5 mg/kg"
maxDose?: string; // Dosis máxima
minDose?: string; // Dosis mínima
route: string;
indication: string;
notes?: string[];
warning?: string;
}
export const pediatricDrugs: PediatricDrug[] = [
{
id: 'adrenalina-anafilaxia',
name: 'Adrenalina (Anafilaxia)',
presentation: 'Ampolla 1 mg/1 ml (1:1000)',
concentration: '1 mg/ml',
dosePerKg: '0.01 mg/kg',
maxDose: '0.5 mg',
route: 'IM',
indication: 'Anafilaxia grave',
notes: [
'Sitio IM: tercio medio del vasto externo (muslo lateral)',
'Repetir a los 5 min si no mejora',
'Efectos adversos esperados (temblor, taquicardia) son normales',
],
warning: '⚠️ CONCENTRACIÓN CRÍTICA: Usar ampolla 1:1000 (1 mg/ml) para IM',
},
{
id: 'adrenalina-pcr',
name: 'Adrenalina (PCR)',
presentation: 'Ampolla 1 mg/10 ml (1:10.000)',
concentration: '0.1 mg/ml',
dosePerKg: '0.01 mg/kg',
route: 'IV/IO',
indication: 'Parada cardiorrespiratoria',
notes: [
'Administrar durante pausa mínima en compresiones',
'Lavado con 20 ml SSF',
'Repetir cada 3-5 minutos',
],
warning: '⚠️ CONCENTRACIÓN CRÍTICA: Usar ampolla 1:10.000 (0.1 mg/ml) para IV/IO',
},
{
id: 'amiodarona',
name: 'Amiodarona',
presentation: 'Ampolla 150 mg/3 ml',
concentration: '50 mg/ml',
dosePerKg: '5 mg/kg',
maxDose: '300 mg',
route: 'IV/IO',
indication: 'FV/TVSP refractaria',
notes: [
'Diluir en SG5% (precipita con SSF)',
'Segunda dosis: 150 mg si persiste FV/TVSP',
],
},
{
id: 'atropina',
name: 'Atropina',
presentation: 'Ampolla 1 mg/1 ml',
concentration: '1 mg/ml',
dosePerKg: '0.02 mg/kg',
minDose: '0.1 mg',
maxDose: '0.5 mg',
route: 'IV/IO',
indication: 'Bradicardia sintomática',
notes: [
'Dosis <0.5 mg pueden causar bradicardia paradójica',
'Repetir cada 3-5 min si es necesario',
],
},
{
id: 'midazolam-crisis',
name: 'Midazolam (Crisis)',
presentation: 'Ampolla 5 mg/1 ml o 10 mg/2 ml',
concentration: '5 mg/ml',
dosePerKg: '0.2-0.3 mg/kg',
maxDose: '10 mg',
route: 'Intranasal/Bucal',
indication: 'Crisis convulsiva',
notes: [
'Vía intranasal o bucal preferida en pediatría',
'Monitorizar respiración',
],
},
{
id: 'salbutamol-nebulizacion',
name: 'Salbutamol (Nebulización)',
presentation: 'Ampolla 2.5 mg/2.5 ml',
concentration: '1 mg/ml',
dosePerKg: '0.15 mg/kg',
route: 'Nebulizado',
indication: 'Crisis asmática / Broncoespasmo',
notes: [
'<20 kg: 2.5 mg',
'≥20 kg: 5 mg',
'Repetir cada 20 min si es necesario',
],
},
{
id: 'furosemida',
name: 'Furosemida',
presentation: 'Ampolla 20 mg/2 ml',
concentration: '10 mg/ml',
dosePerKg: '1-2 mg/kg',
maxDose: '40 mg',
route: 'IV/IO',
indication: 'Edema pulmonar / Insuficiencia cardíaca',
notes: [
'Administrar lentamente',
'Monitorizar diuresis',
],
},
{
id: 'morfina',
name: 'Morfina',
presentation: 'Ampolla 10 mg/1 ml',
concentration: '10 mg/ml',
dosePerKg: '0.1-0.2 mg/kg',
maxDose: '10 mg',
route: 'IV/IO',
indication: 'Dolor severo',
notes: [
'Administrar lentamente',
'Monitorizar respiración',
'Tener naloxona disponible',
],
warning: '⚠️ Monitorizar respiración. Tener naloxona disponible',
},
{
id: 'naloxona',
name: 'Naloxona',
presentation: 'Ampolla 0.4 mg/1 ml',
concentration: '0.4 mg/ml',
dosePerKg: '0.01-0.1 mg/kg',
route: 'IV/IO/IM',
indication: 'Intoxicación opioides / Depresión respiratoria',
notes: [
'Dosis inicial: 0.01 mg/kg',
'Repetir si es necesario',
'Efecto corto, puede requerir múltiples dosis',
],
},
{
id: 'glucosa',
name: 'Glucosa (Dextrosa)',
presentation: 'Ampolla 50% 25 g/50 ml',
concentration: '0.5 g/ml',
dosePerKg: '0.5-1 g/kg',
route: 'IV/IO',
indication: 'Hipoglucemia',
notes: [
'Diluir al 10% o 25% según protocolo',
'Administrar lentamente',
'Monitorizar glucemia',
],
},
];
/**
* Calcula la dosis pediátrica de un fármaco
*/
export const calculatePediatricDose = (
drug: PediatricDrug,
weightKg: number
): {
doseMg: number;
doseMl: number;
isValid: boolean;
warning?: string;
message?: string;
} => {
// Extraer dosis por kg del string (ej: "0.01 mg/kg" -> 0.01)
const doseMatch = drug.dosePerKg.match(/([\d.]+)\s*mg\/kg/);
if (!doseMatch) {
return {
doseMg: 0,
doseMl: 0,
isValid: false,
message: 'Error al parsear dosis por kg',
};
}
const dosePerKg = parseFloat(doseMatch[1]);
let doseMg = weightKg * dosePerKg;
// Aplicar dosis mínima si existe
if (drug.minDose) {
const minMatch = drug.minDose.match(/([\d.]+)\s*mg/);
if (minMatch) {
const minDose = parseFloat(minMatch[1]);
if (doseMg < minDose) {
doseMg = minDose;
}
}
}
// Aplicar dosis máxima si existe
let warning: string | undefined;
if (drug.maxDose) {
const maxMatch = drug.maxDose.match(/([\d.]+)\s*mg/);
if (maxMatch) {
const maxDose = parseFloat(maxMatch[1]);
if (doseMg > maxDose) {
warning = `⚠️ Dosis calculada (${doseMg.toFixed(2)} mg) excede el máximo (${maxDose} mg). Usar dosis máxima: ${maxDose} mg`;
doseMg = maxDose;
}
}
}
// Calcular ml según concentración
const concMatch = drug.concentration.match(/([\d.]+)\s*mg\/ml/);
if (!concMatch) {
return {
doseMg,
doseMl: 0,
isValid: false,
message: 'Error al parsear concentración',
};
}
const concentration = parseFloat(concMatch[1]);
const doseMl = doseMg / concentration;
return {
doseMg: Math.round(doseMg * 100) / 100, // Redondear a 2 decimales
doseMl: Math.round(doseMl * 1000) / 1000, // Redondear a 3 decimales
isValid: true,
warning,
};
};