feat: multi-archivo órdenes visible en enfermero, domicilios y órdenes médicas
- OrdenMedica::filtrarCampos(): agrega domicilio_id al whitelist - Domicilio::obtener(): consulta secundaria archivos_ordenes[] con fallback - Enfermera::agenda(): bulk-query archivos_ordenes[] por domicilio_id - api/lab/link_ordenes_domicilio.php: API POST vincula orden_ids a domicilio_id - conversations.php guardar(): trackea allOrdenIds[], llama link API post-save - lab_domicilios.php: renderOrdenesDetail() multi-archivo en detalle - enfermero_portal.php: renderOrdenesEnfermero() multi-archivo en cards - lab_ordenes.php: botón 'Ver domicilio' cuando domicilio_id está vinculado - migrations/: ALTER TABLE lab_ordenes_medicas ADD domicilio_id + índice
This commit is contained in:
@@ -111,7 +111,7 @@ class Domicilio {
|
||||
* Domicilio por ID con todos los datos relacionados.
|
||||
*/
|
||||
public function obtener(int $id): ?array {
|
||||
return $this->db->fetch("
|
||||
$dom = $this->db->fetch("
|
||||
SELECT
|
||||
d.*,
|
||||
p.nombre_completo AS paciente_nombre,
|
||||
@@ -133,7 +133,23 @@ class Domicilio {
|
||||
LEFT JOIN lab_enfermeras e ON e.id = a.enfermera_id
|
||||
LEFT JOIN admin_users adm ON adm.id = d.creado_por
|
||||
WHERE d.id = ?
|
||||
", [$id]) ?: null;
|
||||
", [$id]);
|
||||
if (!$dom) return null;
|
||||
|
||||
// Todos los archivos de órdenes vinculados a este domicilio
|
||||
$archivos = $this->db->fetchAll(
|
||||
"SELECT id AS orden_id, local_file
|
||||
FROM lab_ordenes_medicas
|
||||
WHERE domicilio_id = ? AND local_file IS NOT NULL
|
||||
ORDER BY id ASC",
|
||||
[$id]
|
||||
);
|
||||
// Fallback para domicilios creados antes de la migración (usan orden_id FK)
|
||||
if (empty($archivos) && !empty($dom['orden_local_file'])) {
|
||||
$archivos = [['orden_id' => $dom['orden_id'], 'local_file' => $dom['orden_local_file']]];
|
||||
}
|
||||
$dom['archivos_ordenes'] = $archivos;
|
||||
return $dom;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -91,7 +91,7 @@ class Enfermera {
|
||||
*/
|
||||
public function agenda(int $enfermeraId, string $fecha = ''): array {
|
||||
$fecha = $fecha ?: date('Y-m-d');
|
||||
return $this->db->fetchAll("
|
||||
$rows = $this->db->fetchAll("
|
||||
SELECT
|
||||
d.id AS domicilio_id,
|
||||
d.fecha_programada,
|
||||
@@ -151,6 +151,52 @@ class Enfermera {
|
||||
AND d.fecha_programada = ?
|
||||
ORDER BY d.hora_programada ASC
|
||||
", [$enfermeraId, $fecha]);
|
||||
|
||||
// Bulk-load todos los archivos de órdenes vinculados a estos domicilios
|
||||
$domIds = array_values(array_filter(array_column($rows, 'domicilio_id')));
|
||||
if (!empty($domIds)) {
|
||||
$ph = implode(',', array_fill(0, count($domIds), '?'));
|
||||
$archivos = $this->db->fetchAll(
|
||||
"SELECT domicilio_id, id AS orden_id, local_file
|
||||
FROM lab_ordenes_medicas
|
||||
WHERE domicilio_id IN ($ph) AND local_file IS NOT NULL
|
||||
ORDER BY id ASC",
|
||||
$domIds
|
||||
);
|
||||
$archivosPorDom = [];
|
||||
foreach ($archivos as $a) {
|
||||
$archivosPorDom[$a['domicilio_id']][] = $a;
|
||||
}
|
||||
foreach ($rows as &$row) {
|
||||
$did = $row['domicilio_id'];
|
||||
if (!empty($archivosPorDom[$did])) {
|
||||
$row['archivos_ordenes'] = $archivosPorDom[$did];
|
||||
} elseif (!empty($row['orden_local_file'])) {
|
||||
// Fallback: domicilio creado antes de la migración
|
||||
$row['archivos_ordenes'] = [[
|
||||
'orden_id' => $row['orden_id_display'] ?? $row['orden_id'],
|
||||
'local_file' => $row['orden_local_file'],
|
||||
]];
|
||||
} else {
|
||||
$row['archivos_ordenes'] = [];
|
||||
}
|
||||
}
|
||||
unset($row);
|
||||
} else {
|
||||
foreach ($rows as &$row) {
|
||||
if (!empty($row['orden_local_file'])) {
|
||||
$row['archivos_ordenes'] = [[
|
||||
'orden_id' => $row['orden_id_display'] ?? $row['orden_id'],
|
||||
'local_file' => $row['orden_local_file'],
|
||||
]];
|
||||
} else {
|
||||
$row['archivos_ordenes'] = [];
|
||||
}
|
||||
}
|
||||
unset($row);
|
||||
}
|
||||
|
||||
return $rows;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -306,7 +306,7 @@ class OrdenMedica {
|
||||
private function filtrarCampos(array $datos): array {
|
||||
$permitidos = [
|
||||
'paciente_id', 'conversation_id', 'whatsapp_media_id', 'local_file',
|
||||
'estado', 'medico_nombre', 'medico_registro', 'fecha_orden',
|
||||
'domicilio_id', 'estado', 'medico_nombre', 'medico_registro', 'fecha_orden',
|
||||
'diagnostico', 'examenes_solicitados', 'requiere_ayuno',
|
||||
'horas_ayuno', 'indicaciones', 'revisada_por', 'revisada_at',
|
||||
'autorizada_por', 'autorizada_at', 'comentario_revision', 'notas_admin',
|
||||
|
||||
Reference in New Issue
Block a user