/** * 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();