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:
Lizandro Guarnizo
2026-03-24 21:51:29 -05:00
parent aa17dc299b
commit 2abce6d4c2
10 changed files with 262 additions and 51 deletions
+29 -17
View File
@@ -531,23 +531,8 @@ const portal = {
<!-- Cobro y pago -->
${cobroHtml}
<!-- Orden médica -->
${item.orden_local_file ? `
<div class="mt-2 mb-2">
<!-- Vista previa solo para imágenes (falla silenciosamente para PDFs) -->
<img src="${resOrden(item.orden_local_file)}"
id="ord-img-${item.orden_id}"
style="max-width:100%;max-height:180px;border-radius:8px;border:1px solid #ddd;cursor:zoom-in;display:block"
alt="Orden"
onclick="window.open('${resOrden(item.orden_local_file)}','_blank')"
onerror="this.style.display='none'">
<!-- Botón siempre visible: funciona para imágenes Y PDFs -->
<a href="${resOrden(item.orden_local_file)}" target="_blank"
class="btn btn-sm btn-outline-danger w-100 mt-1">
<i class="fas fa-file-medical me-1"></i>
Ver / Descargar orden #${item.orden_id_display || item.orden_id || ''}
</a>
</div>` : ''}
<!-- Órdenes médicas (multi-archivo) -->
${renderOrdenesEnfermero(item)}
<!-- Servicios extra registrados -->
${seSuf ? `<div class="d-flex flex-wrap gap-1 mb-2">${seSuf}</div>` : ''}
@@ -708,6 +693,33 @@ function resOrden(f) {
return `api/lab/descargar_orden.php?file=${encodeURIComponent(f)}`;
}
/**
* Renderiza todas las órdenes médicas adjuntas a un domicilio.
* Soporta multi-archivo (archivos_ordenes[]) con fallback a orden_local_file.
*/
function renderOrdenesEnfermero(item) {
const archivos = item.archivos_ordenes || [];
if (!archivos.length) return '';
return archivos.map(a => {
const lf = a.local_file || '';
const url = resOrden(lf);
const oid = a.orden_id || '';
if (!lf) return '';
const isImg = /\.(jpe?g|png|gif|webp)$/i.test(lf);
return `<div class="mt-2 mb-2">
${isImg ? `<img src="${url}"
style="max-width:100%;max-height:180px;border-radius:8px;border:1px solid #ddd;cursor:zoom-in;display:block"
alt="Orden" onclick="window.open('${url}','_blank')"
onerror="this.style.display='none'">` : ''}
<a href="${url}" target="_blank"
class="btn btn-sm btn-outline-danger w-100 mt-1">
<i class="fas fa-file-medical me-1"></i>
Ver / Descargar orden${oid ? ' #' + oid : ''}
</a>
</div>`;
}).join('');
}
document.addEventListener('DOMContentLoaded', () => {
portal.init();
agendaNueva.init();