Toma de muestras: mostrar exámenes de la visita anterior en muestras pendientes

Cuando el paciente vuelve a completar una muestra pendiente, el panel de
lugar.php ahora lista los exámenes de la solicitud original debajo del
badge "visita anterior", con la misma clase visual que el motivo de
rechazo (hereda color según estado: pendiente/recibida/rechazada).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-03 12:41:28 -05:00
co-authored by Claude Sonnet 4.6
parent fd8b83a588
commit aacf26168b
2 changed files with 34 additions and 0 deletions
@@ -392,6 +392,7 @@ if ($incluirSolicitud) {
"SELECT tm.id, tm.tipo_muestra, tm.estado, tm.motivo_rechazo, tm.recibida_at,
COALESCE(lt.nombre, tm.tipo_muestra) AS label,
1 AS es_pendiente_anterior,
ts.id AS solicitud_id_anterior,
ts.numero_orden AS solicitud_orden_anterior
FROM turnero_muestras tm
JOIN turnero_solicitudes ts ON ts.id = tm.solicitud_id
@@ -425,6 +426,7 @@ if ($incluirSolicitud) {
"SELECT tm.id, tm.tipo_muestra, tm.estado, tm.motivo_rechazo, tm.recibida_at,
COALESCE(lt.nombre, tm.tipo_muestra) AS label,
1 AS es_pendiente_anterior,
ts.id AS solicitud_id_anterior,
ts.numero_orden AS solicitud_orden_anterior
FROM turnero_muestras tm
JOIN turnero_solicitudes ts ON ts.id = tm.solicitud_id
@@ -438,6 +440,33 @@ if ($incluirSolicitud) {
} catch (\Throwable $_) {}
}
// Cargar exámenes de la solicitud original para cada muestra pendiente de visita anterior,
// para que al recibirla se vea el contexto completo del servicio (no solo el tipo de muestra)
$solIdsAnteriores = array_values(array_unique(array_filter(
array_column($muestras, 'solicitud_id_anterior')
)));
if ($solIdsAnteriores) {
$ph = implode(',', array_fill(0, count($solIdsAnteriores), '?'));
$stmtExAnt = $pdo->prepare(
"SELECT tei.solicitud_id, et.nombre, et.codigo
FROM turnero_examen_items tei
JOIN exam_tipos et ON et.id = tei.exam_tipo_id
WHERE tei.solicitud_id IN ($ph)
ORDER BY et.nombre ASC"
);
$stmtExAnt->execute($solIdsAnteriores);
$examPorSolicitud = [];
foreach ($stmtExAnt->fetchAll(PDO::FETCH_ASSOC) as $row) {
$examPorSolicitud[(int)$row['solicitud_id']][] = ['nombre' => $row['nombre'], 'codigo' => $row['codigo']];
}
foreach ($muestras as &$m) {
if (!empty($m['solicitud_id_anterior'])) {
$m['examenes_anteriores'] = $examPorSolicitud[(int)$m['solicitud_id_anterior']] ?? [];
}
}
unset($m);
}
$respuesta['solicitud'] = $solicitud;
$respuesta['paciente'] = $paciente;
$respuesta['examenes'] = $examenes;
+5
View File
@@ -594,6 +594,7 @@ try {
.muestra-info { flex: 1; min-width: 0; }
.muestra-label { font-weight: 600; font-size: .82rem; font-family: monospace; }
.muestra-motivo { font-size: .7rem; margin-top: 2px; opacity: .85; }
.muestra-examenes { font-size: .7rem; margin-top: 2px; opacity: .85; }
.muestra-ts { font-size: .68rem; color: #94a3b8; flex-shrink: 0; }
.btn-muestra-accion {
border: none; border-radius: 8px; padding: 3px 11px;
@@ -2500,6 +2501,9 @@ function renderMuestras(lista) {
<i class="fas fa-history me-1"></i>visita anterior${m.solicitud_orden_anterior ? ' · ' + escHtml(m.solicitud_orden_anterior) : ''}
</span>`
: '';
const examAntHtml = (esPrevio && m.examenes_anteriores && m.examenes_anteriores.length)
? `<div class="muestra-examenes"><i class="fas fa-vials me-1"></i>${m.examenes_anteriores.map(e => escHtml(e.nombre)).join(', ')}</div>`
: '';
const tsHtml = m.recibida_at
? `<span class="muestra-ts">${formatHora(m.recibida_at)}</span>`
: '';
@@ -2534,6 +2538,7 @@ function renderMuestras(lista) {
${ico}
<div class="muestra-info">
<span class="muestra-label">${label}</span>${origenTag}
${examAntHtml}
${motivoHtml}
</div>
${acciones}