From a6f6449707070bc2ed21d12a3699ce22afca1ea4 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Tue, 23 Jun 2026 23:12:23 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20n=C3=BAmero=20de=20orden=20consecutivo?= =?UTF-8?q?=20en=20recepci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Campo N.° Orden editable en la ficha, antes de seleccionar paciente - Se carga automáticamente al abrir un turno (YYYYMMDD-001, 002…) - Botón para regenerar el siguiente consecutivo - Columna numero_orden en turnero_solicitudes (VARCHAR 20) - Nuevo endpoint get_consecutivo.php calcula el siguiente del día - create_solicitud.php guarda el numero_orden junto con la solicitud Co-Authored-By: Claude Sonnet 4.6 --- modules/turnero/api/create_solicitud.php | 8 +++--- modules/turnero/api/get_consecutivo.php | 23 ++++++++++++++++++ modules/turnero/views/recepcion.php | 31 ++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 modules/turnero/api/get_consecutivo.php diff --git a/modules/turnero/api/create_solicitud.php b/modules/turnero/api/create_solicitud.php index 39ab56e..61a20ab 100644 --- a/modules/turnero/api/create_solicitud.php +++ b/modules/turnero/api/create_solicitud.php @@ -29,6 +29,8 @@ $total = isset($datos['total_cobrado']) && $datos['total_cobrado'] !== nul ? (float) $datos['total_cobrado'] : null; $metodoPago = isset($datos['metodo_pago']) ? trim((string) $datos['metodo_pago']) : null; $obs = isset($datos['observaciones']) ? trim((string) $datos['observaciones']) : null; +$numOrden = isset($datos['numero_orden']) ? trim((string) $datos['numero_orden']) : null; +if ($numOrden === '') $numOrden = null; // ── Validaciones ────────────────────────────────────────────── if ($turnoId <= 0) jsonError('turno_id inválido.'); @@ -90,11 +92,11 @@ try { $stmt = $pdo->prepare( "INSERT INTO turnero_solicitudes - (turno_id, paciente_id, lugar_id, total_cobrado, metodo_pago, observaciones, creado_por) - VALUES (?, ?, ?, ?, ?, ?, ?)" + (turno_id, paciente_id, lugar_id, numero_orden, total_cobrado, metodo_pago, observaciones, creado_por) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)" ); $stmt->execute([ - $turnoId, $pacienteId, $lugarId, + $turnoId, $pacienteId, $lugarId, $numOrden, $total, $metodoPago ?: null, $obs ?: null, adminId(), ]); $solicitudId = (int) $pdo->lastInsertId(); diff --git a/modules/turnero/api/get_consecutivo.php b/modules/turnero/api/get_consecutivo.php new file mode 100644 index 0000000..c3abeb6 --- /dev/null +++ b/modules/turnero/api/get_consecutivo.php @@ -0,0 +1,23 @@ +prepare( + "SELECT MAX(CAST(SUBSTRING_INDEX(numero_orden,'-',-1) AS UNSIGNED)) AS ultimo + FROM turnero_solicitudes + WHERE numero_orden LIKE ?" +); +$row->execute([$prefix . '%']); +$ultimo = (int)($row->fetch(PDO::FETCH_ASSOC)['ultimo'] ?? 0); + +$siguiente = $prefix . str_pad($ultimo + 1, 3, '0', STR_PAD_LEFT); + +jsonOk(['consecutivo' => $siguiente]); diff --git a/modules/turnero/views/recepcion.php b/modules/turnero/views/recepcion.php index 0a2803d..3c4e088 100644 --- a/modules/turnero/views/recepcion.php +++ b/modules/turnero/views/recepcion.php @@ -330,6 +330,22 @@ require_once __DIR__ . '/../../../shared/components/sidebar.php'; + +
+
+ + + +
+
+
Paciente
@@ -722,6 +738,18 @@ async function rellamarActivo() { } // ── Abrir ficha ─────────────────────────────────────────────── +async function cargarConsecutivo() { + const inp = document.getElementById('inp-consecutivo'); + if (!inp) return; + inp.value = '…'; + try { + const r = await fetch(API + 'get_consecutivo.php'); + const d = await r.json(); + if (d.ok) inp.value = d.consecutivo; + } catch(_) { inp.value = ''; } +} +function recargarConsecutivo() { cargarConsecutivo(); } + function abrirFicha(turno) { turnoActivo = turno; pacienteActivo = null; @@ -730,6 +758,8 @@ function abrirFicha(turno) { document.getElementById('ficha-placeholder').classList.add('d-none'); document.getElementById('ficha-turno').classList.remove('d-none'); + cargarConsecutivo(); + // Datos del turno document.getElementById('ficha-codigo').textContent = turno.codigo; document.getElementById('ficha-prio-nombre').textContent = turno.prioridad_nombre || ''; @@ -1023,6 +1053,7 @@ async function guardarSolicitud() { paciente_id: pacienteActivo.id, lugar_id: lugarId, exam_tipo_ids: examIds, + numero_orden: document.getElementById('inp-consecutivo').value.trim() || null, total_cobrado: parseFloat(document.getElementById('inp-total').value) || null, metodo_pago: document.getElementById('sel-pago').value || null, observaciones: document.getElementById('inp-obs').value.trim() || null,