diff --git a/app/Controllers/Opd.php b/app/Controllers/Opd.php index 8d1998f..3c78899 100644 --- a/app/Controllers/Opd.php +++ b/app/Controllers/Opd.php @@ -927,6 +927,37 @@ class Opd extends BaseController $query = $this->db->query($sql); $allRows = $query->getResult(); + // Doctor-day display queue should be contiguous (1..N), even when stored queue_no + // has gaps due to legacy/global sequencing from other doctors. + $queueRows = array_values(array_filter($allRows, static function ($row): bool { + return (int) ($row->queue_no ?? 0) > 0; + })); + usort($queueRows, static function ($left, $right): int { + $leftQueue = (int) ($left->queue_no ?? 0); + $rightQueue = (int) ($right->queue_no ?? 0); + if ($leftQueue !== $rightQueue) { + return $leftQueue <=> $rightQueue; + } + + return ((int) ($left->opd_id ?? 0)) <=> ((int) ($right->opd_id ?? 0)); + }); + + $displayQueueByOpdId = []; + $displayQueue = 1; + foreach ($queueRows as $queueRow) { + $queueOpdId = (int) ($queueRow->opd_id ?? 0); + if ($queueOpdId <= 0 || array_key_exists($queueOpdId, $displayQueueByOpdId)) { + continue; + } + + $displayQueueByOpdId[$queueOpdId] = $displayQueue; + $displayQueue++; + } + + foreach ($allRows as $row) { + $row->display_queue_no = (int) ($displayQueueByOpdId[(int) ($row->opd_id ?? 0)] ?? 0); + } + $opdList0 = []; $opdList1 = []; $opdList2 = []; @@ -1192,6 +1223,37 @@ class Opd extends BaseController } } + // Normalize queue display numbers to contiguous doctor-day sequence. + $queueRows = array_values(array_filter($normalized, static function (array $row): bool { + return (int) ($row['queue_no'] ?? 0) > 0; + })); + usort($queueRows, static function (array $left, array $right): int { + $leftQueue = (int) ($left['queue_no'] ?? 0); + $rightQueue = (int) ($right['queue_no'] ?? 0); + if ($leftQueue !== $rightQueue) { + return $leftQueue <=> $rightQueue; + } + + return ((int) ($left['opd_id'] ?? 0)) <=> ((int) ($right['opd_id'] ?? 0)); + }); + + $displayQueueByOpdId = []; + $displayQueue = 1; + foreach ($queueRows as $row) { + $queueOpdId = (int) ($row['opd_id'] ?? 0); + if ($queueOpdId <= 0 || array_key_exists($queueOpdId, $displayQueueByOpdId)) { + continue; + } + + $displayQueueByOpdId[$queueOpdId] = $displayQueue; + $displayQueue++; + } + + foreach ($normalized as &$row) { + $row['display_queue_no'] = (int) ($displayQueueByOpdId[(int) ($row['opd_id'] ?? 0)] ?? 0); + } + unset($row); + usort($normalized, static function ($left, $right): int { return ((int) ($left['opd_id'] ?? 0)) <=> ((int) ($right['opd_id'] ?? 0)); }); diff --git a/app/Views/billing/opd_appointment_list.php b/app/Views/billing/opd_appointment_list.php index 6b13ca5..bc6116d 100644 --- a/app/Views/billing/opd_appointment_list.php +++ b/app/Views/billing/opd_appointment_list.php @@ -89,7 +89,7 @@ $mergedGroups = [ $hasVitals = (int) ($row->has_vitals ?? 0) === 1; $hasPrescription = (int) ($row->has_prescription ?? 0) === 1; $isConfirmedForQueue= (int) ($row->is_confirmed_for_queue ?? 0) === 1; - $queueNo = (int) ($row->queue_no ?? 0); + $queueNo = (int) (($row->display_queue_no ?? 0) ?: ($row->queue_no ?? 0)); $hasQueueNo = $queueNo > 0; $showFullActions = $hasPrescription || $isConfirmedForQueue; $opdId = (int) ($row->opd_id ?? 0); @@ -567,7 +567,7 @@ $mergedGroups = [ $row.attr('data-has-vitals', parseInt(live.has_vitals || 0, 10) === 1 ? '1' : '0'); applyStatusVisual($row, status); - updateQueueCell($row, parseInt(live.queue_no || 0, 10)); + updateQueueCell($row, parseInt(live.display_queue_no || live.queue_no || 0, 10)); updateVitalsButtonState($row, parseInt(live.has_prescription || 0, 10), parseInt(live.has_vitals || 0, 10)); if (status === 'waiting') {