From c717d474f70eae6066f728f273765fe9503f7a0e Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Fri, 17 Jul 2026 15:13:48 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20autocomplete=20CIE-10=20en=20diagn?= =?UTF-8?q?=C3=B3stico=20y=20fix=20tab=20en=20ex=C3=A1menes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - buscar_cie10.php: busca por código o descripción, límite 12 resultados - inp-diag: dropdown estilo empresa, Enter selecciona primero - selectOnTab:false en TomSelect de exámenes Co-Authored-By: Claude Sonnet 4.6 --- modules/turnero/api/buscar_cie10.php | 22 ++++++++++++++ modules/turnero/views/recepcion.php | 43 ++++++++++++++++++++++++++-- 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 modules/turnero/api/buscar_cie10.php diff --git a/modules/turnero/api/buscar_cie10.php b/modules/turnero/api/buscar_cie10.php new file mode 100644 index 0000000..4479234 --- /dev/null +++ b/modules/turnero/api/buscar_cie10.php @@ -0,0 +1,22 @@ + []]); } + +$pdo = db(); +$like = '%' . $q . '%'; + +// Código exacto primero, luego coincidencias por descripción +$stmt = $pdo->prepare( + "SELECT cod_diag, concepto + FROM cie10_diagnosticos + WHERE cod_diag LIKE ? OR concepto LIKE ? + ORDER BY CASE WHEN cod_diag LIKE ? THEN 0 ELSE 1 END, cod_diag + LIMIT 12" +); +$stmt->execute([$like, $like, $like]); + +jsonOk(['items' => $stmt->fetchAll(PDO::FETCH_ASSOC)]); diff --git a/modules/turnero/views/recepcion.php b/modules/turnero/views/recepcion.php index fc6a392..ebbaea8 100644 --- a/modules/turnero/views/recepcion.php +++ b/modules/turnero/views/recepcion.php @@ -796,7 +796,15 @@ document.addEventListener('DOMContentLoaded', function() {
+ placeholder="Código o descripción CIE-10…" + autocomplete="off" + oninput="buscarDiag()" + onblur="setTimeout(()=>document.getElementById('diag-resultados').classList.add('d-none'),150)" + onkeydown="if(event.key==='Enter'&&_diagResultados.length){event.preventDefault();seleccionarDiag(_diagResultados[0].cod_diag,_diagResultados[0].concepto);}"> +
+
    +
    @@ -1133,7 +1141,7 @@ document.addEventListener('DOMContentLoaded', () => { examTS = new TomSelect('#sel-examenes', { plugins: ['remove_button'], maxOptions: null, - selectOnTab: true, + selectOnTab: false, onItemAdd() { recalcularPrecios(); examTS.setTextboxValue(''); examTS.refreshOptions(false); }, onItemRemove: () => recalcularPrecios(), @@ -2355,6 +2363,37 @@ function quitarEmpresa() { document.getElementById('inp-diag').value = ''; } +// ── CIE-10 autocomplete ─────────────────────────────────────── +let _diagTimer = null, _diagResultados = []; +function buscarDiag() { + clearTimeout(_diagTimer); + _diagTimer = setTimeout(_doDiagSearch, 250); +} +async function _doDiagSearch() { + const q = document.getElementById('inp-diag').value.trim(); + const ul = document.getElementById('diag-resultados'); + if (q.length < 2) { ul.classList.add('d-none'); return; } + const res = await fetch(`${API}buscar_cie10.php?q=${encodeURIComponent(q)}`); + const j = await res.json(); + _diagResultados = j.items || []; + if (!_diagResultados.length) { + ul.innerHTML = '
  • Sin resultados
  • '; + ul.classList.remove('d-none'); return; + } + ul.innerHTML = _diagResultados.map((d, i) => ` +
  • + ${escHtml(d.cod_diag)} + ${escHtml(d.concepto)} +
  • `).join(''); + ul.classList.remove('d-none'); +} +function seleccionarDiag(cod, concepto) { + document.getElementById('inp-diag').value = cod; + document.getElementById('diag-resultados').classList.add('d-none'); + _diagResultados = []; +} + // ── Motor de precios ────────────────────────────────────────── let _recalcTimer; let _preciosActivos = [];