1100 lines
35 KiB
JavaScript
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();
|
|
|