@php use App\Enums\Order\OrderItemStatusEnum; use App\Enums\Order\OrderStatusEnum; use App\Support\Currency\CurrencyDisplay; @endphp @php $isScheduledOrder = !empty($isScheduledOrder) || str_contains(request()->route()?->getName() ?? '', 'scheduled_orders') || request()->boolean('is_scheduled'); $activeMenuPage = $isScheduledOrder ? ($menuSeller['scheduled_orders']['active'] ?? "") : ($menuSeller['orders']['active'] ?? ""); $ordersListTitle = $isScheduledOrder ? __('labels.scheduled_orders') : __('labels.orders'); $ordersListRoute = $isScheduledOrder ? route('seller.scheduled_orders.index') : route('seller.orders.index'); $invoiceRoute = $isScheduledOrder ? route('seller.scheduled_orders.invoice', ['id' => $order['uuid']]) : route('seller.orders.invoice', ['id' => $order['uuid']]); $isReschedulePending = ($order['reschedule_status'] ?? null) === 'needs_reschedule'; $orderCurrencyCode = strtoupper((string) ($order['currency_code'] ?? $order['base_currency_code'] ?? ($systemSettings['currency'] ?? ''))); $money = fn ($amount) => CurrencyDisplay::format($amount, $orderCurrencyCode, $systemSettings['currencySymbol'] ?? null); @endphp @extends('layouts.seller.app', ['page' => $activeMenuPage]) @section('title', __('labels.order_details')) @section('header_data') @php $page_title = __('labels.order_details'); $page_pretitle = __('labels.seller') . " " . $ordersListTitle; @endphp @endsection @php $breadcrumbs = [ ['title' => __('labels.home'), 'url' => route('seller.dashboard')], ['title' => $ordersListTitle, 'url' => $ordersListRoute], ['title' => __('labels.order_details'), 'url' => ''] ]; @endphp @section('seller-content')
{{-- END PAGE HEADER --}}
@if($isReschedulePending) @endif
{{-- Order Summary — colored status strip + icon header. Status + total are already in the page header so we drop the duplicate rows here for a tighter datagrid. --}}
@php $sellerPaymentStatus = strtolower((string) ($order['payment_status'] ?? '')); $sellerPaymentBadgeClass = match (true) { in_array($sellerPaymentStatus, ['paid', 'completed', 'success'], true) => 'bg-green-lt', in_array($sellerPaymentStatus, ['failed', 'declined'], true) => 'bg-red-lt', in_array($sellerPaymentStatus, ['refunded', 'partially_refunded'], true) => 'bg-blue-lt', default => 'bg-yellow-lt', }; $sellerStatusStripClass = match (true) { in_array($order['status'] ?? '', ['cancelled', 'rejected_by_seller', 'failed'], true) => 'bg-red', in_array($order['status'] ?? '', ['delivered'], true) => 'bg-success', in_array($order['status'] ?? '', ['out_for_delivery', 'collected', 'assigned'], true) => 'bg-blue', default => 'bg-primary', }; @endphp

{{ __('labels.order_summary') }}

{{ __('labels.order_number') }}
#{{ $order['order_id'] }}
{{ __('labels.order_date') }}
{{ $order['created_at'] }}
{{ __('labels.payment_method') }}
{{ $order['payment_method'] }}
{{ __('labels.payment_status') }}
{{ $order['payment_status'] }}
{{ __('labels.total_price') }}
{{ $money($order['total_payable'] ?? $order['total_price']) }}
{{ __('labels.uuid') }}
{{ $order['uuid'] }}
@if(!empty($order['order_note']) && ($order['delivery_type'] ?? '') !== 'pickup')

{{ __('labels.order_note') }}

{{ $order['order_note'] }}

@endif
{{-- Customer card — avatar-led, mobile is a tel: link, email is a mailto: link. Same rhythm as admin. --}}

{{ __('labels.customer_information') }}

{{ $order['billing_name'] ?? '—' }}
@if(!empty($order['email'])) {{ $order['email'] }} @endif @if(!empty($order['billing_phone'])) {{ $order['billing_phone'] }} @endif
{{-- Shipping address — recipient called out separately when it differs from billing name. --}} @if(($order['delivery_type'] ?? '') !== 'pickup')

{{ __('labels.shipping_address') }}

@if(!empty($order['shipping_name']) && $order['shipping_name'] !== ($order['billing_name'] ?? null))
{{ $order['shipping_name'] }}
@endif
{{ $order['shipping_address_1'] }}@if($order['shipping_address_2']), {{ $order['shipping_address_2'] }}@endif
@if($order['shipping_landmark']) {{ $order['shipping_landmark'] }}
@endif {{ $order['shipping_city'] }}, {{ $order['shipping_state'] }} {{ $order['shipping_zip'] }}
{{ $order['shipping_country'] }}
@if(!empty($order['shipping_phone'])) {{ $order['shipping_phone'] }} @endif
@endif @if(($order['delivery_type'] ?? '') === 'pickup')

{{ __('labels.pickup_information') ?? 'Pickup Information' }}

{{ __('labels.delivery_type') ?? 'Delivery Type' }}
{{ __('labels.delivery_type_pickup') ?? 'Pickup' }}
{{ __('labels.picked_up_at') ?? 'Picked Up At' }}
{{ $order['picked_up_at'] ?? '—' }}
@else

{{ __('labels.delivery_information') }}

@if(!empty($order['delivery_boy']) && !empty($order['delivery_boy']['id']))
{{ $order['delivery_boy']['full_name'] ?? __('labels.delivery_boy') }} @if(!empty($order['delivery_boy']['is_blocked'])) {{ __('labels.blocked') }} @endif
@if(!empty($order['delivery_boy']['mobile'])) {{ $order['delivery_boy']['mobile'] }} @endif @if(!empty($order['delivery_boy']['email'])) {{ $order['delivery_boy']['email'] }} @endif
@else
{{ __('labels.no_rider_assigned') }}
{{ __('labels.no_rider_assigned_hint') }}
@endif
{{ __('labels.delivery_zone') }}
{{ $order['delivery_zone']['name'] ?? '—' }}
{{ __('labels.estimated_delivery_time') }}
{{ $order['estimated_delivery_time'] ?? '—' }}
@if(!empty($order['scheduled_date']))
{{ __('labels.scheduled_date') ?? 'Scheduled Date' }}
{{ \Carbon\Carbon::parse($order['scheduled_date'])->format('M d, Y') }}
@if(!empty($order['scheduled_time_slot_label']))
{{ __('labels.scheduled_time') ?? 'Scheduled Time' }}
{{ $order['scheduled_time_slot_label'] }}
@endif @endif
@endif
@php // Bulk UI is hidden once the order has exited the seller-actionable // window. Mirrors the admin "$isOrderTerminal" gating. $sellerOrderTerminal = in_array($order['status'] ?? null, [ OrderStatusEnum::COLLECTED(), OrderStatusEnum::OUT_FOR_DELIVERY(), OrderStatusEnum::DELIVERED(), OrderStatusEnum::FAILED(), OrderStatusEnum::CANCELLED(), ], true); $bulkEnabled = !$sellerOrderTerminal && ($order['delivery_type'] ?? '') !== 'pickup'; @endphp

{{ __('labels.order_items') }}

@if($bulkEnabled)
@endif
@if($bulkEnabled) @endif @foreach($order['items'] as $item) @php $itemId = $item['orderItem']['id'] ?? null; $hasTransitions = !empty($itemTransitions[$itemId] ?? []); @endphp @if($bulkEnabled) @endif @php $itemStatus = $item['orderItem']['status'] ?? null; @endphp @endforeach @php // Without checkbox col: product, variant, price, status = 4 // With checkbox col: +1 = 5 $sellerColspan = $bulkEnabled ? 5 : 4; @endphp @if(!empty($order['rider_tip_amount']) && (float)$order['rider_tip_amount'] > 0) @endif @if(!empty($order['promo_discount']) && (float)$order['promo_discount'] > 0) @endif @if(!empty($order['wallet_balance']) && (float)$order['wallet_balance'] > 0) @endif
{{ __('labels.product') }} {{ __('labels.variant') }} {{ __('labels.price') }} {{ __('labels.status') }} {{ __('labels.quantity') }} {{ __('labels.subtotal') }} {{ __('labels.actions') }}
{{ $item['product']['title'] ?? 'N/A' }} @if(!empty($item['attachments']))
Attachments
    @foreach($item['attachments'] as $attachment)
  • view
  • @endforeach
@endif @if(!empty($item['addons']))
{{ __('labels.addons') }}
    @foreach($item['addons'] as $addon)
  • @if(!empty($addon['group']['title'])) {{ $addon['group']['title'] }} — @endif {{ $addon['item']['title'] ?? '—' }} · {{ $money($addon['price']) }}
  • @endforeach
@endif
{{ $item['variant']['title'] ?? 'N/A' }} {{ $money($item['price'] + $item['tax_amount']) }} @php $itemReason = $item['orderItem']['cancellation_reason'] ?? $item['orderItem']['delivery_fail_reason'] ?? ($itemStatusReasons[$itemId] ?? null); @endphp {{ $item['orderItem']['status_formatted'] }} @if(!empty($itemReason))
{{ __('labels.reason') }}: {{ $itemReason }}
@endif @if(!empty($acceptanceDeadlines[$itemId]))
@include('partials.order-acceptance-deadline', ['deadline' => $acceptanceDeadlines[$itemId]])
@endif
{{ $item['quantity'] }} {{ $money($item['sub_total']) }} @if(!empty($item['addons_total']) && (float) $item['addons_total'] > 0)
{{ __('labels.addons_total') }}: {{ $money($item['addons_total']) }}
@endif
@if($isReschedulePending) {{ __('labels.needs_reschedule') }} @elseif(($order['delivery_type'] ?? '') === 'pickup' && !empty($itemTransitions[$itemId]))
@foreach($itemTransitions[$itemId] as $transition) @endforeach
@elseif(($order['delivery_type'] ?? '') !== 'pickup' && !empty($itemTransitions[$itemId]) && $itemStatus !== \App\Enums\Order\OrderItemStatusEnum::RETURNING_TO_STORE()) @endif @if(!$isReschedulePending && in_array($itemStatus, [\App\Enums\Order\OrderItemStatusEnum::ACCEPTED(), \App\Enums\Order\OrderItemStatusEnum::PREPARING()], true)) @elseif(!$isReschedulePending && $itemStatus === \App\Enums\Order\OrderItemStatusEnum::RETURNING_TO_STORE()) @else @if(empty($itemTransitions[$itemId])) — @endif @endif
{{ __('labels.subtotal') }}: {{ collect($order['items'])->sum('quantity') }} {{ $money($order['subtotal'] ?? $order['total_price']) }}
{{ __('labels.rider_tips') }}: {{ $money($order['rider_tip_amount']) }}
{{ __('labels.promo_discount') }}@if(!empty($order['promo_code'])) ({{ $order['promo_code'] }})@endif: - {{ $money($order['promo_discount']) }}
{{ __('labels.wallet_used') }}: - {{ $money($order['wallet_balance']) }}
{{ __('labels.total_payable') }}: {{ $money($order['total_payable'] ?? $order['total_price']) }}
@if(isset($refunds) && $refunds->isNotEmpty())

Return & Refund History

@foreach($refunds as $refund)

Method: {{ ucfirst($refund->refund_method) }} @if(!empty($refund->refund_method_meta['note'])) ({{ $refund->refund_method_meta['note'] }}) @endif
Processed By: {{ $refund->refundedBy?->name ?? 'System' }}
Reason: {{ $refund->reason ?? 'No reason provided' }}
@foreach($refund->lines as $line) @endforeach
Item Returned Qty Amount
{{ $line->orderItem?->title ?? 'N/A' }} @if($line->orderItem?->variant_title) ({{ $line->orderItem->variant_title }}) @endif {{ $line->quantity }} -{{ CurrencyDisplay::format($line->amount, $refund->currency_code ?: $orderCurrencyCode, $systemSettings['currencySymbol'] ?? null) }}
@endforeach
@endif {{-- The legacy inline "Update Status" card was retired here — the shared bulk-update modal now lives in the items card header. --}}
@include('seller.orders.partials.order-cancel-item-modal') @include('seller.orders.partials.order-confirm-return-modal') @include('seller.orders.partials.pickup-refund-modal') @if(!$sellerOrderTerminal) @include('seller.orders.partials.bulk-update-status-modal') @endif @endsection @push('styles') @endpush @push('scripts') @if(!$sellerOrderTerminal) @endif @endpush