codigo0/backend/scripts/seed-drugs.js

1100 lines
35 KiB
JavaScript

/**
* SCRIPT DE SEED: Vademécum TES (35 fármacos)
*
* Inserta los 35 fármacos oficiales del vademécum TES
* Basado en: docs/VADEMECUM_COMPLETO_TES.md
*
* Uso:
* node backend/scripts/seed-drugs.js
*/
import { query } from '../config/database.js';
import 'dotenv/config';
/**
* Obtener usuario admin
*/
async function getAdminId() {
const result = await query(
`SELECT id FROM tes_content.users WHERE role = 'super_admin' LIMIT 1`
);
if (result.rows.length === 0) {
throw new Error('No se encontró usuario admin. Ejecuta seed-admin.js primero.');
}
return result.rows[0].id;
}
/**
* Insertar fármaco
*/
async function insertDrug(drug, adminId) {
try {
// Verificar si ya existe
const existing = await query(
'SELECT id FROM tes_content.drugs WHERE slug = $1',
[drug.slug]
);
if (existing.rows.length > 0) {
console.log(` ⏭️ Saltado: ${drug.generic_name} (ya existe)`);
return { action: 'skipped', id: existing.rows[0].id };
}
// Insertar
const result = await query(
`INSERT INTO tes_content.drugs (
id, slug, generic_name, trade_name, category, line, frequency,
presentation, adult_dose, pediatric_dose, routes, dilution,
indications, contraindications, side_effects, antidote,
notes, critical_points, source, status, version, latest_version,
created_by, updated_by
) VALUES (
gen_random_uuid(), $1, $2, $3, $4, $5::tes_content.drug_line,
$6::tes_content.drug_frequency, $7, $8, $9, $10::text[], $11,
$12::text[], $13::text[], $14, $15,
$16::text[], $17::text[], $18, $19::tes_content.content_status,
$20, $20, $21, $21
)
RETURNING id, slug, generic_name, status`,
[
drug.slug,
drug.generic_name,
drug.trade_name || null,
drug.category,
drug.line,
drug.frequency,
drug.presentation,
drug.adult_dose,
drug.pediatric_dose || null,
drug.routes || [],
drug.dilution || null,
drug.indications || [],
drug.contraindications || [],
drug.side_effects || null,
drug.antidote || null,
drug.notes || [],
drug.critical_points || [],
drug.source || null,
drug.status || 'draft',
drug.version || '1.0.0',
adminId
]
);
console.log(` ✅ Creado: ${drug.generic_name} (${drug.status})`);
return { action: 'created', id: result.rows[0].id };
} catch (error) {
console.error(` ❌ Error: ${drug.generic_name} - ${error.message}`);
return { action: 'error', error: error.message };
}
}
/**
* Fármacos de PRIMERA LÍNEA (15 fármacos)
*/
const firstLineDrugs = [
{
slug: 'adrenalina',
generic_name: 'Adrenalina',
trade_name: 'Adrenalina 1mg/1ml',
category: 'cardiovascular',
line: 'first',
frequency: 'high',
presentation: '1mg/1ml ampolla',
adult_dose: '1mg IV/IO cada 3-5 min (RCP) | 0.3-0.5mg IM (anafilaxia)',
pediatric_dose: '0.01mg/kg IV/IO cada 3-5 min (RCP) | 0.01mg/kg IM (anafilaxia)',
routes: ['IV', 'IO', 'IM', 'Subcutánea'],
dilution: 'No requiere dilución',
indications: [
'Parada cardiorrespiratoria (RCP)',
'Shock anafiláctico',
'Bradicardia sintomática',
'Asistolia'
],
contraindications: [
'Hipertensión arterial severa',
'Arritmias ventriculares',
'Feocromocitoma'
],
side_effects: 'Taquicardia, hipertensión, arritmias, ansiedad',
antidote: 'No aplica',
notes: [
'En RCP, administrar cada 3-5 minutos',
'En anafilaxia, vía IM en muslo anterolateral',
'Monitorizar constantes vitales continuamente'
],
critical_points: [
'Verificar dosis según peso en pediatría',
'No mezclar con otros fármacos en misma jeringa',
'En RCP, no interrumpir compresiones para administrar'
],
source: 'Manual TES Digital, ERC 2021',
status: 'published'
},
{
slug: 'amiodarona',
generic_name: 'Amiodarona',
trade_name: 'Amiodarona 150mg/3ml',
category: 'cardiovascular',
line: 'first',
frequency: 'high',
presentation: '150mg/3ml ampolla',
adult_dose: '300mg IV/IO (bolo) en RCP | 150mg IV/IO (repetir si necesario)',
pediatric_dose: '5mg/kg IV/IO (bolo) | 2.5mg/kg IV/IO (repetir)',
routes: ['IV', 'IO'],
dilution: 'Diluir en 20ml SF 0.9%',
indications: [
'Fibrilación ventricular (FV) refractaria a desfibrilación',
'Taquicardia ventricular sin pulso (TVSP)',
'Arritmias ventriculares'
],
contraindications: [
'Hipersensibilidad',
'Bloqueo AV de 2º o 3º grado sin marcapasos'
],
side_effects: 'Hipotensión, bradicardia, flebitis',
notes: [
'Administrar en bolo rápido',
'Monitorizar ECG continuamente',
'Puede causar hipotensión'
],
critical_points: [
'Solo usar en RCP si FV/TVSP persiste después de 3 descargas',
'No usar como primera línea en arritmias estables'
],
source: 'ERC 2021, Manual TES Digital',
status: 'published'
},
{
slug: 'atropina',
generic_name: 'Atropina',
trade_name: 'Atropina 1mg/1ml',
category: 'cardiovascular',
line: 'first',
frequency: 'high',
presentation: '1mg/1ml ampolla',
adult_dose: '0.5-1mg IV/IO (repetir cada 3-5 min, máx. 3mg)',
pediatric_dose: '0.02mg/kg IV/IO (mín. 0.1mg, máx. 0.5mg)',
routes: ['IV', 'IO', 'IM'],
dilution: 'No requiere dilución',
indications: [
'Bradicardia sintomática',
'Bloqueo AV',
'Intoxicación por organofosforados'
],
contraindications: [
'Glaucoma de ángulo cerrado',
'Obstrucción urinaria',
'Miastenia gravis'
],
side_effects: 'Taquicardia, sequedad de boca, visión borrosa, retención urinaria',
notes: [
'Dosis mínima en pediatría: 0.1mg',
'En bradicardia, repetir cada 3-5 minutos hasta respuesta o dosis máxima'
],
critical_points: [
'No usar en bradicardia asintomática',
'En pediatría, respetar dosis mínima y máxima'
],
source: 'Manual TES Digital, ERC 2021',
status: 'published'
},
{
slug: 'suero-fisiologico',
generic_name: 'Cloruro Sódico 0.9%',
trade_name: 'Suero Fisiológico 0.9%',
category: 'fluidos',
line: 'first',
frequency: 'high',
presentation: '500ml, 1000ml bolsa',
adult_dose: '500-1000ml IV (bolo inicial) | Según necesidad',
pediatric_dose: '20ml/kg IV (bolo inicial) | Repetir según necesidad',
routes: ['IV'],
dilution: 'No aplica',
indications: [
'Reanimación con fluidos',
'Shock hipovolémico',
'Deshidratación',
'Mantenimiento de vía venosa'
],
contraindications: [
'Hipernatremia severa',
'Edema pulmonar',
'Insuficiencia cardíaca'
],
side_effects: 'Sobrecarga de volumen, edema',
notes: [
'Fluido de primera elección en reanimación',
'Monitorizar signos de sobrecarga',
'En pediatría, calcular según peso'
],
critical_points: [
'No usar en shock cardiogénico',
'En shock séptico, considerar Ringer Lactato'
],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'ringer-lactato',
generic_name: 'Solución de Ringer Lactato',
trade_name: 'Ringer Lactato',
category: 'fluidos',
line: 'first',
frequency: 'high',
presentation: '500ml, 1000ml bolsa',
adult_dose: '500-1000ml IV (bolo inicial) | Según necesidad',
pediatric_dose: '20ml/kg IV (bolo inicial) | Repetir según necesidad',
routes: ['IV'],
dilution: 'No aplica',
indications: [
'Reanimación con fluidos',
'Shock séptico',
'Shock hipovolémico',
'Quemaduras'
],
contraindications: [
'Hiperlactatemia',
'Insuficiencia hepática',
'Alcalosis metabólica'
],
side_effects: 'Sobrecarga de volumen, hiperlactatemia',
notes: [
'Preferible a SF 0.9% en shock séptico',
'Contiene lactato (metabolizado por hígado)',
'Monitorizar signos de sobrecarga'
],
critical_points: [
'No usar en insuficiencia hepática',
'En shock séptico, primera elección'
],
source: 'Manual TES Digital, Guías Sepsis',
status: 'draft'
},
{
slug: 'oxigeno',
generic_name: 'Oxígeno',
trade_name: 'Oxígeno Medicinal',
category: 'respiratorio',
line: 'first',
frequency: 'high',
presentation: 'Botella comprimida (varios litros)',
adult_dose: 'Según dispositivo: Mascarilla simple 6-10 L/min | Mascarilla Venturi 24-60% | Mascarilla reservorio 10-15 L/min',
pediatric_dose: 'Según dispositivo y edad',
routes: ['Inhalación'],
dilution: 'No aplica',
indications: [
'Hipoxia',
'Insuficiencia respiratoria',
'Shock',
'Trauma',
'Post-RCP'
],
contraindications: [
'Intoxicación por monóxido de carbono (considerar oxigenoterapia hiperbárica)',
'Enfermedad pulmonar obstructiva crónica (EPOC) - usar con precaución'
],
side_effects: 'Sequedad de mucosas, toxicidad por oxígeno (exposición prolongada)',
notes: [
'Titular según SpO₂ objetivo (94-98% en mayoría, 88-92% en EPOC)',
'En EPOC, usar flujo bajo (2-4 L/min) o Venturi',
'Monitorizar SpO₂ continuamente'
],
critical_points: [
'En EPOC, no usar flujos altos sin monitorización',
'En RCP, usar mascarilla reservorio a flujo máximo'
],
source: 'Manual TES Digital, Guías BTS',
status: 'published'
},
{
slug: 'salbutamol',
generic_name: 'Salbutamol',
trade_name: 'Ventolin / Salbutamol',
category: 'respiratorio',
line: 'first',
frequency: 'high',
presentation: 'Nebulización: 2.5mg/2.5ml | MDI: 100mcg/dosis',
adult_dose: 'Nebulización: 2.5-5mg cada 20 min | MDI: 4-8 inhalaciones',
pediatric_dose: 'Nebulización: 2.5mg cada 20 min | MDI: 4-8 inhalaciones',
routes: ['Nebulización', 'MDI'],
dilution: 'Nebulización: diluir en 2-4ml SF 0.9%',
indications: [
'Asma aguda',
'EPOC agudizado',
'Broncoespasmo'
],
contraindications: [
'Hipersensibilidad',
'Taquiarritmias severas'
],
side_effects: 'Taquicardia, temblor, hipopotasemia',
notes: [
'Primera línea en asma/EPOC',
'Puede combinarse con ipratropio',
'Monitorizar respuesta (mejora síntomas, SpO₂)'
],
critical_points: [
'En asma severa, repetir cada 20 minutos',
'Si no mejora, considerar corticoides'
],
source: 'Manual TES Digital, Guías GINA',
status: 'draft'
},
{
slug: 'glucosa-50',
generic_name: 'Glucosa',
trade_name: 'Glucosa 50%',
category: 'metabolico',
line: 'first',
frequency: 'high',
presentation: '50ml (25g glucosa)',
adult_dose: '50ml IV (25g) | Repetir según glucemia',
pediatric_dose: '2ml/kg IV (1g/kg) | Máx. 50ml',
routes: ['IV'],
dilution: 'No requiere dilución',
indications: [
'Hipoglucemia',
'Alteración nivel de conciencia (si hipoglucemia)'
],
contraindications: [
'Hiperglucemia',
'Accidente cerebrovascular (controversial)'
],
side_effects: 'Hiperglucemia, flebitis, extravasación',
notes: [
'Administrar en vía venosa de gran calibre',
'Monitorizar glucemia antes y después',
'En pediatría, calcular según peso'
],
critical_points: [
'Verificar glucemia antes de administrar',
'En AVD, considerar como causa reversible (4H y 4T)'
],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'diazepam',
generic_name: 'Diazepam',
trade_name: 'Valium / Diazepam',
category: 'neurologico',
line: 'first',
frequency: 'high',
presentation: '10mg/2ml ampolla',
adult_dose: '5-10mg IV (lento) | Repetir cada 10-15 min si necesario',
pediatric_dose: '0.2-0.3mg/kg IV (lento) | Máx. 10mg',
routes: ['IV', 'Rectal'],
dilution: 'No requiere dilución',
indications: [
'Convulsiones',
'Agitación',
'Espasmos musculares'
],
contraindications: [
'Hipersensibilidad',
'Miastenia gravis',
'Glaucoma de ángulo cerrado'
],
side_effects: 'Depresión respiratoria, sedación, hipotensión',
antidote: 'Flumazenil',
notes: [
'Administrar IV lento (mín. 2 minutos)',
'Monitorizar respiración y constantes',
'Tener flumazenil disponible'
],
critical_points: [
'Riesgo de depresión respiratoria',
'En convulsiones, considerar midazolam como alternativa'
],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'midazolam',
generic_name: 'Midazolam',
trade_name: 'Dormicum / Midazolam',
category: 'neurologico',
line: 'first',
frequency: 'high',
presentation: '5mg/1ml, 15mg/3ml ampolla',
adult_dose: '2.5-5mg IV (lento) | 5-10mg IM | Repetir según necesidad',
pediatric_dose: '0.1-0.2mg/kg IV (lento) | 0.2mg/kg IM | Máx. 5mg',
routes: ['IV', 'IM', 'Intranasal'],
dilution: 'No requiere dilución',
indications: [
'Convulsiones',
'Sedación',
'Agitación',
'Premedicación intubación'
],
contraindications: [
'Hipersensibilidad',
'Shock',
'Depresión respiratoria'
],
side_effects: 'Depresión respiratoria, hipotensión, sedación',
antidote: 'Flumazenil',
notes: [
'Administrar IV lento',
'Efecto más rápido que diazepam',
'Tener flumazenil disponible'
],
critical_points: [
'Riesgo de depresión respiratoria',
'En convulsiones, primera elección en algunos protocolos'
],
source: 'Manual TES Digital',
status: 'published'
},
{
slug: 'morfina',
generic_name: 'Morfina',
trade_name: 'Morfina Clorhidrato',
category: 'analgesico',
line: 'first',
frequency: 'high',
presentation: '10mg/1ml ampolla',
adult_dose: '2.5-5mg IV (lento) | Repetir cada 5-10 min según dolor',
pediatric_dose: '0.1mg/kg IV (lento) | Máx. 5mg',
routes: ['IV', 'IM'],
dilution: 'No requiere dilución',
indications: [
'Dolor agudo severo',
'Infarto agudo de miocardio',
'Trauma'
],
contraindications: [
'Depresión respiratoria',
'Shock',
'Hipersensibilidad'
],
side_effects: 'Depresión respiratoria, náuseas, sedación, hipotensión',
antidote: 'Naloxona',
notes: [
'Administrar IV lento (mín. 2 minutos)',
'Titular según dolor',
'Tener naloxona disponible'
],
critical_points: [
'Riesgo de depresión respiratoria',
'En IAM, primera elección para dolor'
],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'paracetamol',
generic_name: 'Paracetamol',
trade_name: 'Paracetamol',
category: 'analgesico',
line: 'first',
frequency: 'high',
presentation: '1g/100ml perfusión | 500mg comprimido',
adult_dose: '1g IV (perfusión 15 min) | 1g oral cada 6-8h',
pediatric_dose: '15mg/kg IV | 15mg/kg oral cada 6-8h',
routes: ['IV', 'Oral'],
dilution: 'No requiere dilución',
indications: [
'Dolor',
'Fiebre'
],
contraindications: [
'Hipersensibilidad',
'Insuficiencia hepática severa'
],
side_effects: 'Hepatotoxicidad (sobredosis), reacciones alérgicas',
notes: [
'Dosis máxima: 4g/día (adulto)',
'En pediatría, calcular según peso',
'No usar en insuficiencia hepática'
],
critical_points: [
'Riesgo de hepatotoxicidad en sobredosis',
'No superar dosis máxima diaria'
],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'aas',
generic_name: 'Ácido Acetilsalicílico',
trade_name: 'Aspirina / AAS',
category: 'antiagregante',
line: 'first',
frequency: 'high',
presentation: '100mg, 300mg comprimido',
adult_dose: '150-300mg oral (masticar)',
pediatric_dose: 'No indicado en pediatría',
routes: ['Oral'],
dilution: 'No aplica',
indications: [
'Síndrome coronario agudo (SCA)',
'Ictus isquémico'
],
contraindications: [
'Hipersensibilidad',
'Úlcera péptica activa',
'Hemorragia activa',
'Ictus hemorrágico'
],
side_effects: 'Gastritis, hemorragia digestiva, reacciones alérgicas',
notes: [
'Masticar para absorción rápida',
'No usar en ictus hemorrágico',
'En SCA, administrar lo antes posible'
],
critical_points: [
'Verificar que no sea ictus hemorrágico antes de administrar',
'En SCA, primera línea junto con otros antiagregantes'
],
source: 'Manual TES Digital, Guías ESC',
status: 'draft'
},
{
slug: 'naloxona',
generic_name: 'Naloxona',
trade_name: 'Narcan / Naloxona',
category: 'antidoto',
line: 'first',
frequency: 'high',
presentation: '0.4mg/1ml ampolla',
adult_dose: '0.4-2mg IV/IO/IM | Repetir cada 2-3 min si necesario',
pediatric_dose: '0.01mg/kg IV/IO/IM | Repetir según necesidad',
routes: ['IV', 'IO', 'IM', 'Intranasal'],
dilution: 'No requiere dilución',
indications: [
'Intoxicación por opioides',
'Depresión respiratoria por opioides',
'Sobredosis de opioides'
],
contraindications: [
'Hipersensibilidad'
],
side_effects: 'Síndrome de abstinencia, náuseas, vómitos',
notes: [
'Antídoto de opioides (morfina, fentanilo, heroína, etc.)',
'Efecto rápido pero corto (30-90 min)',
'Puede requerir dosis repetidas'
],
critical_points: [
'Monitorizar después de administrar (puede requerir dosis repetidas)',
'En sobredosis, puede precipitar síndrome de abstinencia'
],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'flumazenil',
generic_name: 'Flumazenil',
trade_name: 'Anexate / Flumazenil',
category: 'antidoto',
line: 'first',
frequency: 'medium',
presentation: '0.5mg/5ml ampolla',
adult_dose: '0.2mg IV (bolo) | Repetir 0.1mg cada minuto hasta respuesta (máx. 1mg)',
pediatric_dose: '0.01mg/kg IV | Repetir según necesidad',
routes: ['IV'],
dilution: 'No requiere dilución',
indications: [
'Intoxicación por benzodiacepinas',
'Reversión de sedación por benzodiacepinas'
],
contraindications: [
'Hipersensibilidad',
'Epilepsia tratada con benzodiacepinas',
'Intoxicación mixta (benzodiacepinas + antidepresivos tricíclicos)'
],
side_effects: 'Convulsiones, ansiedad, náuseas',
notes: [
'Antídoto de benzodiacepinas (diazepam, midazolam, etc.)',
'Riesgo de convulsiones si epilepsia',
'Administrar con precaución'
],
critical_points: [
'No usar si epilepsia tratada con benzodiacepinas (riesgo de convulsiones)',
'En intoxicación mixta, puede precipitar convulsiones'
],
source: 'Manual TES Digital',
status: 'draft',
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información']
}
];
/**
* Fármacos de SEGUNDA LÍNEA (20 fármacos)
* Con estructura mínima y marcados como "PENDIENTE VALIDACIÓN CLÍNICA"
*/
const secondLineDrugs = [
{
slug: 'dobutamina',
generic_name: 'Dobutamina',
trade_name: 'Dobutrex / Dobutamina',
category: 'cardiovascular',
line: 'second',
frequency: 'medium',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Shock cardiogénico', 'Insuficiencia cardíaca aguda'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'noradrenalina',
generic_name: 'Noradrenalina',
trade_name: 'Levophed / Noradrenalina',
category: 'cardiovascular',
line: 'second',
frequency: 'medium',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Shock séptico', 'Shock distributivo'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'adenosina',
generic_name: 'Adenosina',
trade_name: 'Adenosina',
category: 'cardiovascular',
line: 'second',
frequency: 'low',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Taquicardia supraventricular'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'lidocaina',
generic_name: 'Lidocaína',
trade_name: 'Lidocaína',
category: 'cardiovascular',
line: 'second',
frequency: 'medium',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Arritmias ventriculares (alternativa)'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'furosemida',
generic_name: 'Furosemida',
trade_name: 'Seguril / Furosemida',
category: 'diuretico',
line: 'second',
frequency: 'medium',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Edema agudo de pulmón', 'Insuficiencia cardíaca'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'nitroglicerina',
generic_name: 'Nitroglicerina',
trade_name: 'Nitroglicerina',
category: 'cardiovascular',
line: 'second',
frequency: 'medium',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Angina', 'Edema agudo de pulmón'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'ipratropio',
generic_name: 'Ipratropio',
trade_name: 'Atrovent / Ipratropio',
category: 'respiratorio',
line: 'second',
frequency: 'medium',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Asma', 'EPOC (combinado con salbutamol)'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'adrenalina-nebulizada',
generic_name: 'Adrenalina Nebulizada',
trade_name: 'Adrenalina Nebulizada',
category: 'respiratorio',
line: 'second',
frequency: 'low',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Laringitis', 'Edema glótico'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'metilprednisolona',
generic_name: 'Metilprednisolona',
trade_name: 'Urbason / Metilprednisolona',
category: 'corticosteroide',
line: 'second',
frequency: 'medium',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Asma severa', 'Shock anafiláctico'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'hidrocortisona',
generic_name: 'Hidrocortisona',
trade_name: 'Hidrocortisona',
category: 'corticosteroide',
line: 'second',
frequency: 'medium',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Shock anafiláctico', 'Insuficiencia suprarrenal'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'fenitoina',
generic_name: 'Fenitoína',
trade_name: 'Epanutin / Fenitoína',
category: 'antiepileptico',
line: 'second',
frequency: 'low',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Convulsiones refractarias'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'acido-valproico',
generic_name: 'Ácido Valproico',
trade_name: 'Depakine / Ácido Valproico',
category: 'antiepileptico',
line: 'second',
frequency: 'low',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Convulsiones (alternativa)'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'haloperidol',
generic_name: 'Haloperidol',
trade_name: 'Haldol / Haloperidol',
category: 'neurologico',
line: 'second',
frequency: 'medium',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Agitación psicomotriz'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'tiamina',
generic_name: 'Tiamina (Vitamina B1)',
trade_name: 'Tiamina',
category: 'metabolico',
line: 'second',
frequency: 'medium',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Encefalopatía de Wernicke', 'AVD'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'fentanilo',
generic_name: 'Fentanilo',
trade_name: 'Fentanilo',
category: 'analgesico',
line: 'second',
frequency: 'medium',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Dolor agudo severo (alternativa a morfina)'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'ketamina',
generic_name: 'Ketamina',
trade_name: 'Ketamina',
category: 'anestesico',
line: 'second',
frequency: 'medium',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Sedación', 'Analgesia', 'Intubación'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'propofol',
generic_name: 'Propofol',
trade_name: 'Propofol',
category: 'anestesico',
line: 'second',
frequency: 'low',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Sedación profunda', 'Intubación (SVA)'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'tranexamico',
generic_name: 'Ácido Tranexámico',
trade_name: 'Amchafibrin / Tranexámico',
category: 'hemostatico',
line: 'second',
frequency: 'medium',
presentation: '500mg/5ml ampolla',
adult_dose: '1g IV (bolo lento 10 min) | Repetir 1g en 8h si trauma',
pediatric_dose: '15mg/kg IV (bolo lento) | Repetir según necesidad',
routes: ['IV'],
dilution: 'Diluir en 100ml SF 0.9%',
indications: [
'Hemorragia masiva',
'Trauma con hemorragia',
'Hemorragia posparto'
],
contraindications: [
'Hipersensibilidad',
'Trombosis activa',
'Insuficiencia renal severa'
],
side_effects: 'Náuseas, vómitos, trombosis',
notes: [
'Administrar en las primeras 3 horas post-trauma',
'En hemorragia masiva, primera línea'
],
critical_points: [
'Eficacia máxima si se administra en primeras 3 horas',
'No usar si trombosis activa'
],
source: 'Manual TES Digital, CRASH-2 Trial',
status: 'draft'
},
{
slug: 'cloruro-calcico',
generic_name: 'Cloruro Cálcico',
trade_name: 'Cloruro Cálcico',
category: 'metabolico',
line: 'second',
frequency: 'low',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Hiperpotasemia', 'Intoxicación bloqueadores CC'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
},
{
slug: 'bicarbonato-sodico',
generic_name: 'Bicarbonato Sódico',
trade_name: 'Bicarbonato Sódico',
category: 'metabolico',
line: 'second',
frequency: 'low',
presentation: 'PENDIENTE VALIDACIÓN CLÍNICA',
adult_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
pediatric_dose: 'PENDIENTE VALIDACIÓN CLÍNICA',
routes: [],
indications: ['Acidosis metabólica', 'Hiperpotasemia'],
contraindications: [],
notes: ['PENDIENTE VALIDACIÓN CLÍNICA - Completar información'],
critical_points: ['PENDIENTE VALIDACIÓN CLÍNICA'],
source: 'Manual TES Digital',
status: 'draft'
}
];
/**
* Función principal
*/
async function main() {
console.log('🚀 SCRIPT DE SEED: Vademécum TES (35 fármacos)\n');
console.log('═══════════════════════════════════════════════\n');
try {
// 1. Obtener usuario admin
console.log('👤 Obteniendo usuario admin...');
const adminId = await getAdminId();
console.log(` ✅ Usuario admin: ${adminId}\n`);
// 2. Insertar fármacos primera línea
console.log('💊 Insertando fármacos PRIMERA LÍNEA (15 fármacos)...');
let firstLineCreated = 0;
let firstLineSkipped = 0;
let firstLineErrors = 0;
for (const drug of firstLineDrugs) {
const result = await insertDrug(drug, adminId);
if (result.action === 'created') firstLineCreated++;
else if (result.action === 'skipped') firstLineSkipped++;
else if (result.action === 'error') firstLineErrors++;
}
console.log('');
// 3. Insertar fármacos segunda línea
console.log('💊 Insertando fármacos SEGUNDA LÍNEA (20 fármacos)...');
let secondLineCreated = 0;
let secondLineSkipped = 0;
let secondLineErrors = 0;
for (const drug of secondLineDrugs) {
const result = await insertDrug(drug, adminId);
if (result.action === 'created') secondLineCreated++;
else if (result.action === 'skipped') secondLineSkipped++;
else if (result.action === 'error') secondLineErrors++;
}
console.log('');
// 4. Resumen
console.log('═══════════════════════════════════════════════');
console.log('📊 RESUMEN DE SEED\n');
console.log('Primera Línea:');
console.log(` ✅ Creados: ${firstLineCreated}`);
console.log(` ⏭️ Saltados: ${firstLineSkipped}`);
console.log(` ❌ Errores: ${firstLineErrors}\n`);
console.log('Segunda Línea:');
console.log(` ✅ Creados: ${secondLineCreated}`);
console.log(` ⏭️ Saltados: ${secondLineSkipped}`);
console.log(` ❌ Errores: ${secondLineErrors}\n`);
const totalCreated = firstLineCreated + secondLineCreated;
const totalSkipped = firstLineSkipped + secondLineSkipped;
const totalErrors = firstLineErrors + secondLineErrors;
console.log('═══════════════════════════════════════════════');
console.log(`TOTAL: ${totalCreated} creados, ${totalSkipped} saltados, ${totalErrors} errores\n`);
// 5. Verificar estado final
const statsResult = await query(`
SELECT
line,
status,
COUNT(*) as count
FROM tes_content.drugs
GROUP BY line, status
ORDER BY line, status
`);
console.log('📊 Estado final por línea y estado:');
statsResult.rows.forEach(row => {
console.log(` ${row.line} - ${row.status}: ${row.count}`);
});
console.log('');
console.log('✅ Seed de vademécum completado!\n');
console.log('📝 Nota: Los fármacos marcados como "PENDIENTE VALIDACIÓN CLÍNICA"');
console.log(' deben completarse desde el panel de administración.\n');
} catch (error) {
console.error('\n❌ Error durante el seed:', error);
process.exit(1);
}
}
main();