feat(lis): migración completa Firebird→MySQL + tracking de muestras en turnero

- Migraciones LIS 01-08: schema completo del nuevo LIS (secciones, protocolos,
  ítems de resultado, perfiles, tarifas, empresas, histórico transaccional)
- ETL Firebird→MySQL: script CLI con conversión WIN1252→UTF-8, batches de 500,
  resolución de FKs y deduplicación de pacientes
- turnero_muestras: tracking pendiente/recibida/rechazada por tipo de tubo
- lugar.php: widget de recepción de muestras (solo tipo=muestras)
- update_muestra_estado.php: API para marcar estado de muestra
- create_solicitud.php: auto-crea muestras al guardar solicitud
- get_consentimientos.php: incluye muestras[] en el response
- 6 vistas SQL: v_muestras_hoy, v_recepcion_completa, v_examen_precio, etc.
- numero_orden en encabezado del formulario firmado (D-/F- color diferenciado)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-07-04 21:44:22 -05:00
co-authored by Claude Sonnet 4.6
parent 86ed70db34
commit 5fedd233f4
18 changed files with 1754 additions and 4 deletions
+24
View File
@@ -166,6 +166,30 @@ try {
}
unset($c);
// ── Auto-crear muestras por tipo_muestra de los exámenes ──
try {
if (!$soloMuestras && !empty($examIds)) {
$ph = implode(',', array_fill(0, count($examIds), '?'));
$stmtTm = $pdo->prepare(
"SELECT DISTINCT COALESCE(NULLIF(TRIM(tipo_muestra),''), codigo) AS tipo_key
FROM exam_tipos WHERE id IN ($ph) AND activo = 1"
);
$stmtTm->execute($examIds);
$stmtIm = $pdo->prepare(
"INSERT IGNORE INTO turnero_muestras (solicitud_id, tipo_muestra) VALUES (?, ?)"
);
foreach ($stmtTm->fetchAll(PDO::FETCH_COLUMN) as $tipoKey) {
$stmtIm->execute([$solicitudId, $tipoKey]);
}
} elseif ($soloMuestras) {
$pdo->prepare(
"INSERT IGNORE INTO turnero_muestras (solicitud_id, tipo_muestra) VALUES (?, 'MUESTRA')"
)->execute([$solicitudId]);
}
} catch (\Throwable $_) {
// Tabla aún no existe (migración pendiente) — continuar sin muestras
}
$pdo->commit();
notificarSSE(obtenerOCrearSesionHoy());