From dbaf49b30ec75e3f45be175a42011519a86b50c4 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Thu, 25 Jun 2026 19:49:21 -0500 Subject: [PATCH] Automation preview: show RDA per patient on click Preview now returns all patients with their grouped receptions. Clicking a patient row expands/collapses their RDA list showing factura, fecha, exam count, diagnosis, and total value. Co-Authored-By: Claude Sonnet 4.6 --- app/routes/automation.py | 20 +++++++++++++-- app/templates/automation.html | 47 +++++++++++++++++++++++++++-------- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/app/routes/automation.py b/app/routes/automation.py index 12296f1..6c1c15d 100644 --- a/app/routes/automation.py +++ b/app/routes/automation.py @@ -107,13 +107,30 @@ async def preview_automation( grupos = agrupar_por_recepcion(rows_rda) total_examenes = sum(len(v) for v in grupos.values()) + # Agrupar RDA por COD_PACIENTE + rda_por_pac = {} + for id_rec, filas in grupos.items(): + cod = str(filas[0].get("COD_PACIENTE", "")) + if cod not in rda_por_pac: + rda_por_pac[cod] = [] + rda_por_pac[cod].append({ + "id_recepcion": id_rec, + "factura": f"{str(filas[0].get('PREFIJO', '')).strip()}-{filas[0].get('NUM_FACTURA', '')}", + "fecha": str(filas[0].get("FECHA_RECEPCION", ""))[:10], + "examenes": len(filas), + "valor": float(filas[0].get("VALORTOTAL") or 0), + "diag": str(filas[0].get("DIAG_PPAL") or ""), + }) + pacientes_preview = [ { + "codigo": str(p.get("CODIGO", "")), "doc": str(p.get("DOCIDENT", "")), "nombre": f"{p.get('NOMBRES', '')} {p.get('APELLIDOS', '')}".strip(), "tipo": str(p.get("TIPOIDENT", "")), + "rda": rda_por_pac.get(str(p.get("CODIGO", "")), []), } - for p in rows_pac[:10] + for p in rows_pac ] return JSONResponse({ @@ -123,7 +140,6 @@ async def preview_automation( "recepciones": len(grupos), "examenes": total_examenes, "pacientes_preview": pacientes_preview, - "hay_mas": len(rows_pac) > 10, }) diff --git a/app/templates/automation.html b/app/templates/automation.html index 94f8cfb..21018c5 100644 --- a/app/templates/automation.html +++ b/app/templates/automation.html @@ -58,8 +58,8 @@
-

Primeros pacientes:

-
+

Pacientes — haz clic para ver sus recepciones:

+
@@ -129,16 +129,35 @@ async function previewAutomation() { table.innerHTML = '
No hay pacientes para esta fecha
'; showToast('No hay datos para esa fecha', 'warning'); } else { - table.innerHTML = data.pacientes_preview.map(p => ` -
- ${p.tipo} - ${p.doc} - ${p.nombre} -
- `).join('') + (data.hay_mas ? '
... y más pacientes
' : ''); + table.innerHTML = data.pacientes_preview.map((p, i) => { + const rdaRows = p.rda.map(r => ` +
+ + ${r.factura} + ${r.fecha} + ${r.examenes} examen(es) + ${r.diag} + $${r.valor.toLocaleString('es-CO')} +
`).join(''); + + return ` +
+
+ + ${p.tipo} + ${p.doc} + ${p.nombre} + + ${p.rda.length} RDA + +
+ +
`; + }).join(''); document.getElementById('btn-run').disabled = false; - showToast(`${data.pacientes} paciente(s) y ${data.recepciones} recepción(es) encontradas`, 'success'); + showToast(`${data.pacientes} paciente(s) · ${data.recepciones} recepción(es)`, 'success'); } document.getElementById('preview-section').classList.remove('hidden'); @@ -206,6 +225,14 @@ async function runAutomation() { } } +function toggleRda(id, row) { + const div = document.getElementById(id); + const chev = row.querySelector('[id^="chev-"]'); + const hidden = div.classList.contains('hidden'); + div.classList.toggle('hidden', !hidden); + if (chev) chev.style.transform = hidden ? 'rotate(90deg)' : ''; +} + function renderBadge(id, enviados, errores) { const el = document.getElementById(id); if (errores === 0) {