From b84c7e31ba22aa451b78cb524b624391ec600070 Mon Sep 17 00:00:00 2001 From: isaacclad Date: Sat, 18 Jul 2026 23:16:49 +0000 Subject: [PATCH] Make cashier billing invoices actionable for walk-up payment. Clarify booth Call next vs unpaid invoice list, and expose Pay/View row actions so cashiers can open bills when the booth queue is empty. Co-authored-by: Cursor --- app/Http/Controllers/Care/BillController.php | 5 +- resources/views/care/bills/index.blade.php | 50 +++++++++++++------ .../views/care/partials/queue-ops.blade.php | 3 +- tests/Feature/CareBillTest.php | 35 +++++++++++++ 4 files changed, 75 insertions(+), 18 deletions(-) diff --git a/app/Http/Controllers/Care/BillController.php b/app/Http/Controllers/Care/BillController.php index 00b3a24..460ef39 100644 --- a/app/Http/Controllers/Care/BillController.php +++ b/app/Http/Controllers/Care/BillController.php @@ -89,7 +89,10 @@ class BillController extends Controller $result = $this->queueBridge->callNext($organization, CareQueueContexts::BILLING, $branchId, $member); $ticket = $result['ticket'] ?? null; if (! $ticket) { - return back()->with('info', 'No bills waiting at your billing service point.'); + return back()->with( + 'info', + 'No patients waiting at the billing booth. Open an unpaid invoice below to record a walk-up payment.', + ); } return back()->with('success', 'Called '.$ticket['ticket_number'].'.'); diff --git a/resources/views/care/bills/index.blade.php b/resources/views/care/bills/index.blade.php index c553a72..8f434b7 100644 --- a/resources/views/care/bills/index.blade.php +++ b/resources/views/care/bills/index.blade.php @@ -29,17 +29,20 @@ -
- @include('care.partials.queue-ops', [ - 'queueIntegration' => $queueIntegration ?? null, - 'queueCallNextRoute' => 'care.bills.call-next', - 'queueCallNextParams' => [], - 'branchId' => $branchId ?? null, - 'variant' => 'bar', - ]) -
+ @if (! empty($canManageQueue) && ! empty($queueIntegration['enabled'])) +
+ @include('care.partials.queue-ops', [ + 'queueIntegration' => $queueIntegration, + 'queueCallNextRoute' => 'care.bills.call-next', + 'queueCallNextParams' => [], + 'queueCallNextDescription' => 'Call the next patient waiting at the billing booth. Unpaid invoices below stay open for walk-up payment.', + 'branchId' => $branchId ?? null, + 'variant' => 'bar', + ]) +
+ @endif -
+
@@ -49,12 +52,25 @@ - + @forelse ($bills as $bill) - + @php + $billUrl = route('care.bills.show', $bill); + $canServe = ! empty($queueIntegration['enabled']) + && $bill->queue_ticket_uuid + && ! in_array($bill->queue_ticket_status ?? '', ['serving', 'completed', 'cancelled'], true) + && $bill->balance_minor > 0; + $actionLabel = $bill->balance_minor > 0 && $bill->status !== \App\Models\Bill::STATUS_VOID + ? 'Pay' + : 'View'; + @endphp + - + - diff --git a/resources/views/care/partials/queue-ops.blade.php b/resources/views/care/partials/queue-ops.blade.php index 6f4f1d1..84af63c 100644 --- a/resources/views/care/partials/queue-ops.blade.php +++ b/resources/views/care/partials/queue-ops.blade.php @@ -3,6 +3,7 @@ $qi = $queueIntegration ?? null; $callNextRoute = $queueCallNextRoute ?? null; $callNextParams = $queueCallNextParams ?? []; + $callNextDescription = $queueCallNextDescription ?? 'Bring the next waiting patient to your desk'; $currentAppointmentId = $currentAppointmentId ?? null; $variant = $variant ?? 'bar'; // bar | button @endphp @@ -24,7 +25,7 @@
Total Balance StatusActions
@if (! empty($queueIntegration['enabled']) && $bill->queue_ticket_number) @include('care.partials.queue-ticket', [ @@ -65,20 +81,22 @@ @endif {{ $bill->invoice_number }} + {{ $bill->invoice_number }} + {{ $bill->patient->fullName() }} {{ $money($bill->total_minor) }} {{ $money($bill->balance_minor) }} {{ $statuses[$bill->status] ?? $bill->status }} +
- @if (! empty($queueIntegration['enabled']) && $bill->queue_ticket_uuid && ! in_array($bill->queue_ticket_status ?? '', ['serving', 'completed', 'cancelled'], true) && $bill->balance_minor > 0) + @if ($canServe)
@csrf
@endif - View + {{ $actionLabel }}