diff --git a/app/Http/Controllers/Admin/PharmacyPickupController.php b/app/Http/Controllers/Admin/PharmacyPickupController.php index e38f60a..3785aeb 100644 --- a/app/Http/Controllers/Admin/PharmacyPickupController.php +++ b/app/Http/Controllers/Admin/PharmacyPickupController.php @@ -59,6 +59,20 @@ class PharmacyPickupController extends AdminController ]); } + /** + * AJAX:回傳某機台目前可領藥品(建立領藥單彈窗用,對齊取貨碼 slots-ajax 模式)。 + */ + public function productsAjax(Machine $machine) + { + $enabled = ($machine->settings['shopping_mode'] ?? null) === 'pickup_sheet' + && (bool) ($machine->settings['pharmacy_pickup_enabled'] ?? false); + abort_unless($enabled, 403); + + return response()->json([ + 'products' => $this->service->availableProducts($machine)->values(), + ]); + } + public function store(Request $request) { $request->validate([ diff --git a/resources/views/admin/sales/pharmacy-pickup/index.blade.php b/resources/views/admin/sales/pharmacy-pickup/index.blade.php index 8065d81..3092973 100644 --- a/resources/views/admin/sales/pharmacy-pickup/index.blade.php +++ b/resources/views/admin/sales/pharmacy-pickup/index.blade.php @@ -10,177 +10,449 @@ 'abandoned' => __('Abandoned'), ]; $statusColors = [ - 'awaiting_pickup' => 'bg-amber-100 text-amber-700 dark:bg-amber-500/10 dark:text-amber-400', - 'completed' => 'bg-emerald-100 text-emerald-700 dark:bg-emerald-500/10 dark:text-emerald-400', - 'failed' => 'bg-rose-100 text-rose-700 dark:bg-rose-500/10 dark:text-rose-400', + 'awaiting_pickup' => 'bg-amber-500/10 border border-amber-500/20 text-amber-600 dark:text-amber-400', + 'completed' => 'bg-emerald-500/10 border border-emerald-500/20 text-emerald-600 dark:text-emerald-400', + 'failed' => 'bg-rose-500/10 border border-rose-500/20 text-rose-600 dark:text-rose-400', + 'pending' => 'bg-slate-500/10 border border-slate-500/20 text-slate-500', + 'abandoned' => 'bg-slate-500/10 border border-slate-500/20 text-slate-500', ]; @endphp -
+
-
-

{{ __('menu.sales.pharmacy-pickup') }}

- {{ __('Issue a pharmacy pickup order, print the QR ticket, patient scans at the machine to dispense.') }} -
+ {{-- Page Header --}} + + @if($machines->isNotEmpty()) + + @endif + + {{-- Flash / Errors --}} @if(session('success')) -
{{ session('success') }}
+
+ + {{ session('success') }} +
@endif @if(session('error')) -
{{ session('error') }}
+
+ + {{ session('error') }} +
@endif @if($errors->any()) -
-
    +
    +
      @foreach($errors->all() as $err)
    • {{ $err }}
    • @endforeach
    @endif - {{-- 建立領藥單 --}} -
    -

    {{ __('Create Pharmacy Pickup Order') }}

    - - @if($machines->isEmpty()) -

    {{ __('No machines enabled for pharmacy pickup. Enable it under Machine System Settings (Pickup Sheet mode → Pharmacy Pickup switch).') }}

    - @else - {{-- 選機台(變更即重新載入該機台可領藥品) --}} -
    -
    - - -
    -
    - - @if($selectedMachine) -
    - @csrf - - -
    - - -
    - - @if($products->isEmpty()) -

    {{ __('This machine currently has no medicine in stock.') }}

    - @else -
    - - - - - - - - - - - - @foreach($products as $p) - - - - - - - - @endforeach - -
    {{ __('Medicine') }}{{ __('Spec') }}{{ __('Available') }}
    {{ __('(deducted by issued pickup orders)') }}
    {{ __('Quantity') }}
    - - {{ $p->name }}{{ $p->spec ?: '-' }} - {{ $p->available }} - @if(($p->reserved ?? 0) > 0) - ({{ __('physical') }} {{ $p->physical }} − {{ __('reserved') }} {{ $p->reserved }}) - @endif - - -
    -
    - - - @endif -
    - @endif - @endif -
    + @if($machines->isEmpty()) +
    + + {{ __('No machines enabled for pharmacy pickup. Enable it under Machine System Settings (Pickup Sheet mode → Pharmacy Pickup switch).') }} +
    + @endif {{-- 領藥單列表 --}} -
    -

    {{ __('Pharmacy Pickup Orders') }}

    +
    -
    - - - - - - - - - - - + {{-- Desktop Table --}} +
    {{ __('Order No.') }}{{ __('Pricing Slip No.') }}{{ __('Machine') }}{{ __('Items') }}{{ __('Pickup Code') }}{{ __('Status') }}{{ __('Created') }}{{ __('Actions') }}
    + + + + + + + + + - + @forelse($orders as $order) - - - - - + - - - - + + + @empty - + @endforelse
    {{ __('Order No.') }}{{ __('Machine') }}{{ __('Items') }}{{ __('Pickup Code') }}{{ __('Status') }}{{ __('Created') }}{{ __('Actions') }}
    {{ $order->order_no }}{{ $order->pricing_slip_no ?: '-' }}{{ $order->machine?->name ?? '-' }} - @foreach($order->items as $it) -
    {{ $it->product_name }} × {{ $it->quantity }}
    - @endforeach +
    +
    {{ $order->order_no }}
    + @if($order->pricing_slip_no) +
    {{ __('Pricing Slip No.') }}: {{ $order->pricing_slip_no }}
    + @endif
    {{ $order->pickupCode?->code ?? '-' }} - {{ $statusLabels[$order->status] ?? $order->status }} + +
    {{ $order->machine?->name ?? '-' }}
    +
    {{ $order->machine?->serial_no }}
    -
    {{ $order->created_at?->format('Y-m-d H:i') }}
    -
    {{ $order->creator?->name }}
    +
    +
    + @foreach($order->items as $it) +
    {{ $it->product_name }} × {{ $it->quantity }}
    + @endforeach +
    -
    +
    + @if($order->pickupCode?->code) + {{ $order->pickupCode->code }} + @else + - + @endif + + {{ $statusLabels[$order->status] ?? $order->status }} + +
    {{ $order->created_at?->format('Y-m-d H:i') }}
    +
    {{ $order->creator?->name }}
    +
    +
    @if($order->status !== 'failed' && $order->pickupCode) - {{ __('Print') }} + + + @endif @if($order->status === 'awaiting_pickup') -
    + @csrf - +
    @endif - @if($order->status === 'failed' && !($order->pickupCode)) - - + @if($order->status !== 'awaiting_pickup' && !($order->status !== 'failed' && $order->pickupCode)) + - @endif
    {{ __('No pharmacy pickup orders yet.') }}
    -
    {{ $orders->links() }}
    + {{-- Mobile Card Grid --}} +
    + @forelse($orders as $order) +
    + {{-- Header --}} +
    +
    +
    + +
    +
    +

    {{ $order->order_no }}

    +

    {{ $order->machine?->name ?? '-' }}

    +
    +
    + {{ $statusLabels[$order->status] ?? $order->status }} +
    + + {{-- Info Grid --}} +
    +
    +

    {{ __('Pickup Code') }}

    +

    {{ $order->pickupCode?->code ?? '-' }}

    +
    +
    +

    {{ __('Pricing Slip No.') }}

    +

    {{ $order->pricing_slip_no ?: '-' }}

    +
    +
    +

    {{ __('Items') }}

    +
    + @foreach($order->items as $it) +

    {{ $it->product_name }} × {{ $it->quantity }}

    + @endforeach +
    +
    +
    +

    {{ __('Created') }}

    +

    {{ $order->created_at?->format('Y-m-d H:i') }} · {{ $order->creator?->name }}

    +
    +
    + + {{-- Actions --}} + @if(($order->status !== 'failed' && $order->pickupCode) || $order->status === 'awaiting_pickup') +
    + @if($order->status !== 'failed' && $order->pickupCode) + + + {{ __('Print') }} + + @endif + @if($order->status === 'awaiting_pickup') +
    + @csrf + +
    + @endif +
    + @endif +
    + @empty +
    + +
    + @endforelse +
    + + {{-- Pagination --}} +
    + {{ $orders->appends(request()->query())->links('vendor.pagination.luxury') }} +
    + + {{-- Create Pharmacy Pickup Order Modal --}} + + + {{-- Confirm Cancel Modal --}} +
    + + @endsection diff --git a/resources/views/components/breadcrumbs.blade.php b/resources/views/components/breadcrumbs.blade.php index 2e26b80..e854ff5 100644 --- a/resources/views/components/breadcrumbs.blade.php +++ b/resources/views/components/breadcrumbs.blade.php @@ -120,6 +120,7 @@ 'promotions' => __('Promotions'), 'pass-codes' => __('Pass Codes'), 'store-gifts' => __('Store Gifts'), + 'pharmacy-pickup' => __('menu.sales.pharmacy-pickup'), 'change-stock' => __('Change Stock'), 'machine-reports' => __('Machine Reports'), 'product-reports' => __('Product Reports'), diff --git a/routes/web.php b/routes/web.php index ea1a262..a57020c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -174,6 +174,7 @@ Route::middleware(['auth', 'auth.session', 'verified', 'tenant.access'])->prefix // 領藥單(取物單模式 / 領藥模組)— 受權限 menu.sales.pharmacy-pickup 控管 Route::get('/pharmacy-pickup', [App\Http\Controllers\Admin\PharmacyPickupController::class, 'index'])->name('pharmacy-pickup')->middleware('can:menu.sales.pharmacy-pickup'); Route::post('/pharmacy-pickup', [App\Http\Controllers\Admin\PharmacyPickupController::class, 'store'])->name('pharmacy-pickup.store')->middleware('can:menu.sales.pharmacy-pickup'); + Route::get('/pharmacy-pickup/{machine}/products-ajax', [App\Http\Controllers\Admin\PharmacyPickupController::class, 'productsAjax'])->name('pharmacy-pickup.products-ajax')->middleware('can:menu.sales.pharmacy-pickup'); Route::get('/pharmacy-pickup/{order}/print', [App\Http\Controllers\Admin\PharmacyPickupController::class, 'print'])->name('pharmacy-pickup.print')->middleware('can:menu.sales.pharmacy-pickup'); Route::post('/pharmacy-pickup/{order}/cancel', [App\Http\Controllers\Admin\PharmacyPickupController::class, 'cancel'])->name('pharmacy-pickup.cancel')->middleware('can:menu.sales.pharmacy-pickup');