const { Client } = require('pg'); const client = new Client({ user: 'dtic_user', host: '127.0.0.1', database: 'dtic_bitacoras', password: 'dtic_pass_2026', port: 5433, }); async function run() { await client.connect(); console.log("Connected to DB"); const codigo = 'P2601'; // Get Project ID const pRes = await client.query("SELECT id FROM bitacoras.proyectos WHERE codigo = $1", [codigo]); if (pRes.rowCount === 0) { console.error("Proyecto no encontrado"); process.exit(1); } const pid = pRes.rows[0].id; // Fases IDs const fRes = await client.query("SELECT id, numero FROM bitacoras.fases WHERE proyecto_id = $1", [pid]); const fases = {}; fRes.rows.forEach(f => fases[f.numero] = f.id); // Nodos IDs const nRes = await client.query("SELECT id, nombre FROM bitacoras.nodos"); const nodos = {}; nRes.rows.forEach(n => nodos[n.nombre] = n.id); // Updates a realizar según el HTML const hitos = [ { fase: 5, id_hito: 'P02.APP', titulo: 'Despliegue del Sistema DASUTEN', desc: 'Transferencia SCP, extracción, configuración de Kermet.ini → SERVER=sql-dasuten, instalación de componentes Kermet y fuentes TrueType. Login exitoso con usuario aalmiron.', est: '✅', fec: '2026-03-05', h_p: 1, h_r: 2, nodo: 'pcv-dasu0' }, { fase: 5, id_hito: 'NET01', titulo: 'Tailscale VPN en srv-dasu', desc: 'Instalación de Tailscale v1.94.2 en el hipervisor. Configurado como subnet router para 10.0.100.0/24. IP Tailscale: 100.116.210.36. Acceso remoto exterior garantizado.', est: '✅', fec: '2026-03-05', h_p: 0, h_r: 0.5, nodo: 'srv-dasu' }, { fase: 5, id_hito: 'TEST03', titulo: 'Conectividad SQL desde Cliente', desc: 'Apertura de firewall TCP 1433 en sql-dasuten. Test-NetConnection confirmó TcpTestSucceeded: True. Conexión ODBC validada vía login al sistema.', est: '✅', fec: '2026-03-05', h_p: 0, h_r: 1, nodo: 'pcv-dasu0' }, { fase: 6, id_hito: 'UAT', titulo: 'Verificación Presencial por Usuario', desc: 'Validación funcional del sistema por Andrea Almirón in-situ. Se confirmó la operatividad completa de los módulos y generación de reportes correctos.', est: '✅', fec: '2026-03-05', h_p: 1, h_r: 0, nodo: 'pc-dasu0' }, { fase: 6, id_hito: 'FÍSICO', titulo: 'Instalación Física de srv-dasu', desc: 'Traslado e instalación definitiva del servidor físico Proxmox en los gabinetes / racks de la oficina DASUTeN.', est: '⏳', fec: null, h_p: 0, h_r: 0, nodo: 'srv-dasu' }, { fase: 6, id_hito: 'ADDOM', titulo: 'Unión de Cliente pc-dasu0 al Dominio', desc: 'Unir la PC física del cliente local al directorio activo (dc-dasuten) y configurar DNS primarios apuntando al controlador 10.0.100.10.', est: '⏳', fec: null, h_p: 0, h_r: 0, nodo: 'pc-dasu0' }, { fase: 6, id_hito: 'GPO', titulo: 'Políticas de Seguridad Local', desc: 'Configuración de GPOs de dominio para restringir acceso de usuarios regulares, perfiles locales, mapeo de unidades y carpetas del sistema DASUTEN.', est: '⏳', fec: null, h_p: 0, h_r: 0, nodo: 'dc-dasuten' } ]; // Primero marcamos P02.DB, P02.APP viejos u otros como completados/borrados si es necesario await client.query("UPDATE bitacoras.hitos SET estado = '✅', fecha = '2026-03-04' WHERE id_hito = 'P02.DB'"); await client.query("DELETE FROM bitacoras.hitos WHERE id_hito IN ('MIG', 'P02.APP')"); for (const h of hitos) { if (!fases[h.fase]) { console.log(`Fase ${h.fase} no existe, creándola...`); const faseI = await client.query("INSERT INTO bitacoras.fases (proyecto_id, numero, titulo) VALUES ($1, $2, $3) RETURNING id", [pid, h.fase, `Fase ${h.fase}`]); fases[h.fase] = faseI.rows[0].id; } const nodo_id = nodos[h.nodo] || null; // Verificar si existe el hito const exRes = await client.query("SELECT id FROM bitacoras.hitos WHERE id_hito = $1 AND fase_id = $2", [h.id_hito, fases[h.fase]]); if (exRes.rowCount > 0) { console.log(`Updating ${h.id_hito}...`); await client.query(`UPDATE bitacoras.hitos SET titulo=$1, descripcion=$2, estado=$3, fecha=$4, horas_presencial=$5, horas_remoto=$6, nodo_id=$7 WHERE id=$8`, [h.titulo, h.desc, h.est, h.fec, h.h_p, h.h_r, nodo_id, exRes.rows[0].id]); } else { console.log(`Inserting ${h.id_hito}...`); await client.query(`INSERT INTO bitacoras.hitos (fase_id, id_hito, titulo, descripcion, estado, fecha, horas_presencial, horas_remoto, nodo_id) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)`, [fases[h.fase], h.id_hito, h.titulo, h.desc, h.est, h.fec, h.h_p, h.h_r, nodo_id]); } } console.log("Done"); await client.end(); } run().catch(console.error);