Files
whatsapp/cronograma_turnero.html
T
2026-05-11 12:21:56 -05:00

457 lines
25 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Cronograma — Sistema Turnero Inteligente (60 días)</title>
<style>
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:'Segoe UI',system-ui,sans-serif;background:#f1f5f9;color:#1e293b;font-size:13px}
/* HEADER */
.hdr{background:linear-gradient(135deg,#1565c0 0%,#0d47a1 100%);color:#fff;padding:2rem 2.5rem}
.hdr h1{font-size:1.7rem;font-weight:800;letter-spacing:-0.02em}
.hdr .sub{opacity:.8;margin-top:.3rem;font-size:.9rem}
.stats{display:flex;gap:1.2rem;margin-top:1.5rem;flex-wrap:wrap}
.stat{background:rgba(255,255,255,.15);border-radius:10px;padding:.7rem 1.4rem;text-align:center;min-width:110px}
.stat .v{font-size:1.9rem;font-weight:800;line-height:1}
.stat .l{font-size:.7rem;opacity:.78;margin-top:.3rem;text-transform:uppercase;letter-spacing:.04em}
/* TOOLBAR */
.toolbar{background:#fff;padding:.8rem 2.5rem;display:flex;gap:.8rem;align-items:center;border-bottom:1px solid #e2e8f0;flex-wrap:wrap}
.btn{padding:.45rem 1.1rem;border-radius:8px;border:none;cursor:pointer;font-weight:600;font-size:.8rem;display:inline-flex;align-items:center;gap:.4rem;text-decoration:none}
.btn-xl{background:#217346;color:#fff}
.btn-pr{background:#374151;color:#fff}
.toolbar-note{font-size:.75rem;color:#64748b;margin-left:auto}
/* LEGEND */
.legend{background:#fff;padding:.7rem 2.5rem;display:flex;gap:1.2rem;flex-wrap:wrap;border-bottom:2px solid #e2e8f0;align-items:center}
.legend-title{font-weight:700;font-size:.78rem;color:#475569;margin-right:.5rem}
.li{display:flex;align-items:center;gap:.4rem;font-size:.75rem;color:#475569}
.ld{width:18px;height:14px;border-radius:3px;flex-shrink:0}
/* TABLE WRAPPER */
.wrap{padding:1.5rem 2.5rem;overflow-x:auto}
/* GANTT TABLE */
table{border-collapse:separate;border-spacing:0;background:#fff;border-radius:12px;overflow:hidden;box-shadow:0 1px 4px rgba(0,0,0,.1);width:100%;min-width:1100px}
thead tr th{background:#1e3a5f;color:#fff;padding:.65rem .45rem;text-align:center;font-weight:600;font-size:.73rem;white-space:nowrap;border-right:1px solid rgba(255,255,255,.1)}
thead tr th.tl{text-align:left;padding-left:.9rem}
.wd{display:block;font-size:.6rem;color:rgba(255,255,255,.65);font-weight:400;margin-top:.15rem}
tbody tr:nth-child(even) td{background:#f8fafc}
tbody tr:nth-child(odd) td{background:#fff}
tbody tr:hover td{background:#eff6ff!important}
td{padding:.55rem .45rem;border-bottom:1px solid #e8edf2;border-right:1px solid #f0f4f8;vertical-align:middle}
td.tl{padding-left:.9rem}
td.cn{text-align:center}
/* PHASE HEADER ROW */
tr.ph td{background:#334155!important;color:#fff;font-weight:700;font-size:.78rem;padding:.35rem .9rem;letter-spacing:.03em}
tr.ph td:first-child{border-radius:0}
/* BADGES */
.badge{display:inline-block;padding:.18rem .65rem;border-radius:100px;font-size:.68rem;font-weight:700;white-space:nowrap}
.b-done{background:#dcfce7;color:#14532d}
.b-next{background:#dbeafe;color:#1e3a8a}
.b-pend{background:#f1f5f9;color:#475569}
.b-qa{background:#fef3c7;color:#78350f}
.b-cap{background:#ede9fe;color:#4c1d95}
.b-dep{background:#d1fae5;color:#064e3b}
/* GANTT CELL COLORS */
.g0{background:#86efac!important} /* completado */
.g1{background:#60a5fa!important} /* dev fase 1 */
.g2{background:#818cf8!important} /* dev fase 2 */
.g3{background:#a78bfa!important} /* dev fase 3 */
.g4{background:#fbbf24!important} /* QA / testing */
.g5{background:#c084fc!important} /* capacitación */
.g6{background:#34d399!important} /* deploy */
.ge{background:#f1f5f9!important;color:transparent} /* empty */
/* DELIVERABLES CELL */
.del{font-size:.71rem;color:#475569;line-height:1.4}
.del b{color:#1e293b;font-size:.72rem}
/* PHASE BADGE */
.pbadge{display:inline-block;background:#1d4ed8;color:#fff;font-size:.68rem;font-weight:700;padding:.15rem .55rem;border-radius:5px;white-space:nowrap}
/* NOTES SECTION */
.notes{background:#fff;margin:0 2.5rem 2.5rem;border-radius:12px;padding:1.5rem;box-shadow:0 1px 3px rgba(0,0,0,.08)}
.notes h3{font-size:.95rem;color:#1e3a5f;margin-bottom:1rem;font-weight:700}
.notes-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:1rem}
.note-card{padding:1rem;border-radius:8px;border-left:4px solid #60a5fa;background:#f8fafc}
.note-card b{display:block;margin-bottom:.35rem;color:#1e3a5f;font-size:.82rem}
.note-card p{font-size:.75rem;color:#475569;line-height:1.5}
.note-card.nc1{border-left-color:#86efac}
.note-card.nc2{border-left-color:#fbbf24}
.note-card.nc3{border-left-color:#a78bfa}
/* FOOTER */
.footer{text-align:center;padding:1rem;font-size:.72rem;color:#94a3b8}
/* PRINT */
@media print{
.toolbar{display:none}
body{background:#fff}
.wrap{padding:.5rem}
table{font-size:8pt;min-width:unset}
.hdr{padding:1rem}
.notes{margin:0;padding:1rem}
}
</style>
</head>
<body>
<!-- HEADER -->
<div class="hdr">
<h1>📅 Cronograma de Implementación — Sistema Turnero Inteligente</h1>
<div class="sub">Proyecto: ERP Multi-Módulo &nbsp;·&nbsp; Laboratorio Clínico &nbsp;·&nbsp; 14 Abril 20 Junio 2026</div>
<div class="stats">
<div class="stat"><div class="v">67</div><div class="l">Días calendario</div></div>
<div class="stat"><div class="v">10</div><div class="l">Semanas</div></div>
<div class="stat"><div class="v">9</div><div class="l">Entregables</div></div>
<div class="stat"><div class="v">1/10</div><div class="l">Completado</div></div>
<div class="stat"><div class="v">20 Jun</div><div class="l">Go-live</div></div>
</div>
</div>
<!-- LEGEND -->
<div class="legend">
<span class="legend-title">Referencias:</span>
<span class="li"><span class="ld" style="background:#86efac"></span>Completado</span>
<span class="li"><span class="ld" style="background:#60a5fa"></span>Desarrollo (BD + APIs)</span>
<span class="li"><span class="ld" style="background:#818cf8"></span>Desarrollo (Vistas)</span>
<span class="li"><span class="ld" style="background:#a78bfa"></span>Desarrollo (Admin)</span>
<span class="li"><span class="ld" style="background:#fbbf24"></span>Pruebas / QA</span>
<span class="li"><span class="ld" style="background:#c084fc"></span>Capacitación</span>
<span class="li"><span class="ld" style="background:#34d399"></span>Go-Live / Producción</span>
</div>
<!-- TOOLBAR -->
<div class="toolbar">
<button class="btn btn-xl" onclick="exportExcel()">📥 Descargar Excel (.xls)</button>
<button class="btn btn-pr" onclick="window.print()">🖨️ Imprimir / PDF</button>
<span class="toolbar-note">67 días calendario · 14 Abr 20 Jun 2026</span>
</div>
<!-- GANTT TABLE -->
<div class="wrap">
<table id="gt">
<thead>
<tr>
<th class="tl" style="width:24px">#</th>
<th class="tl" style="width:72px">Fase</th>
<th class="tl" style="width:195px">Actividad</th>
<th class="tl" style="width:270px">Entregables principales</th>
<th style="width:46px">Días</th>
<th style="width:78px">Inicio</th>
<th style="width:78px">Fin</th>
<th style="width:90px">Estado</th>
<th>S1<span class="wd">14-20 Abr</span></th>
<th>S2<span class="wd">21-27 Abr</span></th>
<th>S3<span class="wd">28 Abr-4 May</span></th>
<th>S4<span class="wd">5-11 May</span></th>
<th>S5<span class="wd">12-18 May</span></th>
<th>S6<span class="wd">19-25 May</span></th>
<th>S7<span class="wd">26 May-1 Jun</span></th>
<th>S8<span class="wd">2-8 Jun</span></th>
<th>S9<span class="wd">9-15 Jun</span></th>
<th>S10<span class="wd">16-20 Jun</span></th>
</tr>
</thead>
<tbody>
<!-- ═══ BLOQUE 1: ERP BASE ═══ -->
<tr class="ph"><td colspan="18">⚙️ BLOQUE 1 — ADECUACIÓN ERP BASE &nbsp;&nbsp; (Semana 1 — COMPLETADO)</td></tr>
<tr>
<td class="cn">1</td>
<td><span class="pbadge">ERP</span></td>
<td class="tl"><b>Adecuar Software como ERP</b></td>
<td class="del">Estructura <b>core/ · modules/ · shared/</b> · Router centralizado · Sidebar dinámico · SYSTEM_MODULES en BD · 11 módulos migrados a nueva estructura</td>
<td class="cn">7</td>
<td>14 Abr</td>
<td>20 Abr</td>
<td><span class="badge b-done">✅ Completado</span></td>
<td class="g0"></td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td>
</tr>
<!-- ═══ BLOQUE 2: BD TURNERO ═══ -->
<tr class="ph"><td colspan="18">🗄️ BLOQUE 2 — BASE DE DATOS DEL TURNERO — FASE 3.1 &nbsp;&nbsp; (Semana 2)</td></tr>
<tr>
<td class="cn">2</td>
<td><span class="pbadge" style="background:#0891b2">F 3.1</span></td>
<td class="tl"><b>Migración 003 — Tablas Turnero</b></td>
<td class="del"><b>exam_tipos · exam_tipo_consentimientos</b> · turnero_lugares · turnero_prioridades · turnero_sesiones · turnero_turnos · turnero_solicitudes · turnero_examen_items · turnero_consentimientos · ALTER lab_formularios</td>
<td class="cn">5</td>
<td>21 Abr</td>
<td>25 Abr</td>
<td><span class="badge b-next">🔵 Próximo</span></td>
<td class="ge">·</td><td class="g1"></td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td>
</tr>
<tr>
<td class="cn">3</td>
<td><span class="pbadge" style="background:#0891b2">F 3.1</span></td>
<td class="tl"><b>Datos iniciales + module.php</b></td>
<td class="del">Prioridades A-F por defecto · Registro en <b>system_modules</b> · module.php descriptor · Asignación roles recepcionista / auxiliar</td>
<td class="cn">2</td>
<td>26 Abr</td>
<td>27 Abr</td>
<td><span class="badge b-pend">⬜ Pendiente</span></td>
<td class="ge">·</td><td class="g1"></td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td>
</tr>
<!-- ═══ BLOQUE 3: MOTOR DE COLA ═══ -->
<tr class="ph"><td colspan="18">⚡ BLOQUE 3 — MOTOR DE PRIORIDADES + APIs CORE — FASE 3.2 &nbsp;&nbsp; (Semana 3)</td></tr>
<tr>
<td class="cn">4</td>
<td><span class="pbadge" style="background:#0369a1">F 3.2</span></td>
<td class="tl"><b>APIs de turno y solicitud</b></td>
<td class="del"><b>create_turno.php</b> (sesión diaria + correlativo) · <b>create_solicitud.php</b> (exámenes + pago + lugar + consentimientos auto) · Actualización estado turno</td>
<td class="cn">4</td>
<td>28 Abr</td>
<td>01 May</td>
<td><span class="badge b-pend">⬜ Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="g1"></td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td>
</tr>
<tr>
<td class="cn">5</td>
<td><span class="pbadge" style="background:#0369a1">F 3.2</span></td>
<td class="tl"><b>Motor de cola + SSE</b></td>
<td class="del"><b>llamar_turno.php</b> (motor prioridad + FIFO) · <b>cambiar_estado.php</b> (validaciones bloqueo) · <b>get_cola.php</b> · <b>sse_turno.php</b> (Server-Sent Events)</td>
<td class="cn">3</td>
<td>02 May</td>
<td>04 May</td>
<td><span class="badge b-pend">⬜ Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="g1"></td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td>
</tr>
<!-- ═══ BLOQUE 4: PANTALLAS ═══ -->
<tr class="ph"><td colspan="18">📺 BLOQUE 4 — KIOSKO + PANTALLAS TV — FASE 3.3 &nbsp;&nbsp; (Semana 4)</td></tr>
<tr>
<td class="cn">6</td>
<td><span class="pbadge" style="background:#6d28d9">F 3.3</span></td>
<td class="tl"><b>Kiosko táctil</b></td>
<td class="del"><b>views/kiosko.php</b> fullscreen · Botones A-F (icono + descripción) · Campo nombre/celular (opcional) · Código generado (ej. "E-042") · Sin exposición de datos</td>
<td class="cn">3</td>
<td>05 May</td>
<td>07 May</td>
<td><span class="badge b-pend">⬜ Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="g2"></td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td>
</tr>
<tr>
<td class="cn">7</td>
<td><span class="pbadge" style="background:#6d28d9">F 3.3</span></td>
<td class="tl"><b>Pantallas TV / Display</b></td>
<td class="del"><b>views/display.php</b> · ?display=recepcion (cola general) · ?display=lugar&amp;lugar_id=X (cola del lugar) · SSE en tiempo real · Colores prioridad + animación</td>
<td class="cn">4</td>
<td>08 May</td>
<td>11 May</td>
<td><span class="badge b-pend">⬜ Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="g2"></td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td>
</tr>
<!-- ═══ BLOQUE 5: RECEPCIÓN ═══ -->
<tr class="ph"><td colspan="18">🖥️ BLOQUE 5 — PUESTO DE RECEPCIÓN — FASE 3.4 &nbsp;&nbsp; (Semana 5)</td></tr>
<tr>
<td class="cn">8</td>
<td><span class="pbadge" style="background:#0f766e">F 3.4a</span></td>
<td class="tl"><b>Vista Recepción — Atención al paciente</b></td>
<td class="del"><b>views/recepcion.php</b> · Cola general con prioridad visual · Llamar siguiente · Buscador/creación paciente (reutiliza lab_pacientes) · Catálogo exam_tipos + selector</td>
<td class="cn">4</td>
<td>12 May</td>
<td>15 May</td>
<td><span class="badge b-pend">⬜ Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="g2"></td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td>
</tr>
<tr>
<td class="cn">9</td>
<td><span class="pbadge" style="background:#0f766e">F 3.4b</span></td>
<td class="tl"><b>Solicitudes + Pago + Lugar destino</b></td>
<td class="del">Registro pago (monto + método) · Selector Lugar destino · Botón Crear Solicitud · <b>create_solicitud.php</b> · Cálculo auto consentimientos requeridos</td>
<td class="cn">3</td>
<td>16 May</td>
<td>18 May</td>
<td><span class="badge b-pend">⬜ Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="g2"></td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td>
</tr>
<tr>
<td class="cn">10</td>
<td><span class="pbadge" style="background:#0f766e">F 3.4c</span></td>
<td class="tl"><b>Envío Consentimientos por WhatsApp</b></td>
<td class="del"><b>send_consentimiento.php</b> · Deduplicación de formularios · Tokens UUID únicos · WhatsAppService + plantilla Meta "consentimiento_turno" · Estados en tiempo real</td>
<td class="cn">7</td>
<td>19 May</td>
<td>25 May</td>
<td><span class="badge b-pend">⬜ Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="g2"></td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td>
</tr>
<!-- ═══ BLOQUE 6: LUGAR / ESTACIÓN ═══ -->
<tr class="ph"><td colspan="18">🔬 BLOQUE 6 — PUESTO LUGAR / ESTACIÓN DE SERVICIO — FASE 3.5 &nbsp;&nbsp; (Semana 7)</td></tr>
<tr>
<td class="cn">11</td>
<td><span class="pbadge" style="background:#7e22ce">F 3.5</span></td>
<td class="tl"><b>Vista Lugar / Estación genérica</b></td>
<td class="del"><b>views/lugar.php</b> (?lugar_id=X) · Cola priorizada del lugar · Llamar siguiente · Ficha: datos + exámenes + estado consentimientos · Bloqueo si pendientes</td>
<td class="cn">4</td>
<td>26 May</td>
<td>29 May</td>
<td><span class="badge b-pend">⬜ Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="g2"></td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td>
</tr>
<tr>
<td class="cn">12</td>
<td><span class="pbadge" style="background:#7e22ce">F 3.5</span></td>
<td class="tl"><b>Flujo de servicio: Iniciar / Finalizar</b></td>
<td class="del">Botón "Iniciar atención" (habilitado si consentimientos OK) · Botón "Finalizar" → estado finalizado · Botón "Ausente" / Regresar a cola · polling 5s</td>
<td class="cn">3</td>
<td>30 May</td>
<td>01 Jun</td>
<td><span class="badge b-pend">⬜ Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="g2"></td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td>
</tr>
<!-- ═══ BLOQUE 7: FIRMA DIGITAL ═══ -->
<tr class="ph"><td colspan="18">✍️ BLOQUE 7 — FIRMA DIGITAL DE CONSENTIMIENTOS — FASE 3.6 &nbsp;&nbsp; (Semana 8)</td></tr>
<tr>
<td class="cn">13</td>
<td><span class="pbadge" style="background:#be185d">F 3.6</span></td>
<td class="tl"><b>Integración firma en flujo turnero</b></td>
<td class="del">Campo <b>tipo</b> en lab_formularios · ver_formulario_enviado.php detecta token de turno · Actualiza turnero_consentimientos · Registro evidencia: IP, UA, fecha, versión</td>
<td class="cn">4</td>
<td>02 Jun</td>
<td>05 Jun</td>
<td><span class="badge b-pend">⬜ Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="g2"></td><td class="ge">·</td><td class="ge">·</td>
</tr>
<tr>
<td class="cn">14</td>
<td><span class="pbadge" style="background:#be185d">F 3.6</span></td>
<td class="tl"><b>"Firmar aquí" en tablet del puesto</b></td>
<td class="del">Botón "Firmar aquí" en lugar.php → modal/iframe con ver_formulario_enviado.php · Firma física en pantalla del auxiliar · Detección en tiempo real (polling 5s)</td>
<td class="cn">3</td>
<td>06 Jun</td>
<td>08 Jun</td>
<td><span class="badge b-pend">⬜ Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="g2"></td><td class="ge">·</td><td class="ge">·</td>
</tr>
<!-- ═══ BLOQUE 8: PANEL ADMIN ═══ -->
<tr class="ph"><td colspan="18">⚙️ BLOQUE 8 — PANEL ADMIN + CONFIGURACIÓN — FASE 3.7 &nbsp;&nbsp; (Semana 9)</td></tr>
<tr>
<td class="cn">15</td>
<td><span class="pbadge" style="background:#b45309">F 3.7</span></td>
<td class="tl"><b>Configuración: Lugares + Exámenes</b></td>
<td class="del">Tab Lugares: CRUD + URL TV automática · Tab Exámenes y Consentimientos: M:N (exam_tipos ↔ formularios) · Vista inversa por consentimiento</td>
<td class="cn">4</td>
<td>09 Jun</td>
<td>12 Jun</td>
<td><span class="badge b-pend">⬜ Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="g3"></td><td class="ge">·</td>
</tr>
<tr>
<td class="cn">16</td>
<td><span class="pbadge" style="background:#b45309">F 3.7</span></td>
<td class="tl"><b>Dashboard Admin + Prioridades + Sesión</b></td>
<td class="del">Dashboard: KPIs del día + tiempo promedio + exportar CSV · Tab Prioridades (CRUD) · Tab Sesiones (abrir/cerrar/historial) · Tab WhatsApp (plantilla Meta)</td>
<td class="cn">3</td>
<td>13 Jun</td>
<td>15 Jun</td>
<td><span class="badge b-pend">⬜ Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="g3"></td><td class="ge">·</td>
</tr>
<!-- ═══ BLOQUE 9: QA + CAPACITACIÓN + GO-LIVE ═══ -->
<tr class="ph"><td colspan="18">🧪 BLOQUE 9 — QA · CAPACITACIÓN · GO-LIVE &nbsp;&nbsp; (Semana 10 · 1620 Jun)</td></tr>
<tr>
<td class="cn">17</td>
<td><span class="pbadge" style="background:#b45309">QA</span></td>
<td class="tl"><b>Testing end-to-end y corrección de bugs</b></td>
<td class="del">Flujo completo paciente · Múltiples lugares simultáneos · SSE stress test · Consentimientos en tiempo real · Validación OWASP Top 10</td>
<td class="cn">2</td>
<td>16 Jun</td>
<td>17 Jun</td>
<td><span class="badge b-qa">🟡 Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="g4"></td>
</tr>
<tr>
<td class="cn">18</td>
<td><span class="pbadge" style="background:#5b21b6">CAP</span></td>
<td class="tl"><b>Capacitación del equipo</b></td>
<td class="del">Manual recepcionista · Manual auxiliar/lugar · Manual administrador · Capacitación presencial o remota · Guías rápidas por rol</td>
<td class="cn">1</td>
<td>18 Jun</td>
<td>18 Jun</td>
<td><span class="badge b-cap">🟣 Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="g5"></td>
</tr>
<tr>
<td class="cn">19</td>
<td><span class="pbadge" style="background:#065f46">DEPLOY</span></td>
<td class="tl"><b>Go-Live y soporte post-lanzamiento</b></td>
<td class="del">Deploy en producción · Configuración inicial: lugares, exámenes, prioridades, plantillas Meta · Prueba en producción · Monitoreo · Ajustes finales</td>
<td class="cn">2</td>
<td>19 Jun</td>
<td>20 Jun</td>
<td><span class="badge b-dep">🟢 Pendiente</span></td>
<td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="ge">·</td><td class="g6"></td>
</tr>
</tbody>
</table>
</div>
<!-- NOTES -->
<div class="notes">
<h3>📌 Notas del Cronograma</h3>
<div class="notes-grid">
<div class="note-card nc1">
<b>🔄 Metodología incremental</b>
<p>Desarrollo iterativo. El sistema sigue funcionando en producción durante toda la implementación. Los módulos legacy (lab_*.php) permanecen activos hasta que su equivalente nuevo esté validado.</p>
</div>
<div class="note-card">
<b>🔗 Reutilización de componentes</b>
<p>Los consentimientos reutilizan el módulo de Formularios existente. El buscador de pacientes reutiliza lab_pacientes. WhatsApp reutiliza el servicio ya activo. La firma digital ya está implementada.</p>
</div>
<div class="note-card nc2">
<b>⚠️ Dependencias críticas</b>
<p>El Bloque 3 (API Core) debe completarse antes de iniciar las vistas (Bloques 47). La plantilla Meta "consentimiento_turno" debe aprobarse en WhatsApp Business Manager preferiblemente en la semana 3. La última semana (S10) es compacta: QA + capacitación + go-live en 5 días — cualquier retraso acumulado en semanas anteriores impacta directamente la fecha de lanzamiento.</p>
</div>
<div class="note-card nc3">
<b>📱 Compatibilidad móvil</b>
<p>Kiosko: táctil fullscreen (tablet Android/iPad). Display TV: cualquier pantalla con navegador. Puesto Recepción y Lugar: PC o tablet. Firma paciente: cualquier celular vía WhatsApp.</p>
</div>
<div class="note-card nc1">
<b>🛡️ Seguridad OWASP</b>
<p>Todas las APIs implementan: requireMethod() + verificar sesión + PDO preparado + sanitización de parámetros. Pantallas sin login (kiosko, TV) nunca exponen datos sensibles.</p>
</div>
<div class="note-card">
<b>📊 Soporte post-lanzamiento</b>
<p>30 días de soporte incluidos tras el go-live (20 Jun 20 Jul 2026) para ajustes basados en uso real, reportes de KPIs, y optimizaciones de UX identificadas en producción.</p>
</div>
</div>
</div>
<div class="footer">
Sistema Turnero Inteligente — ERP Multi-Módulo &nbsp;·&nbsp; Laboratorio Clínico &nbsp;·&nbsp; 14 Abril 20 Junio 2026 (67 días calendario) &nbsp;·&nbsp; GitHub Copilot
</div>
<script>
function exportExcel(){
const tbl = document.getElementById('gt');
const htm = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel"><head><meta charset="UTF-8"><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>Cronograma Turnero</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body>'+tbl.outerHTML+'</body></html>';
const blob = new Blob(['\ufeff'+htm],{type:'application/vnd.ms-excel;charset=utf-8'});
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = 'Cronograma_Turnero_60dias.xls';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
</script>
</body>
</html>