@include('front.partials.top-header') @include('front.partials.desktop.search-header') @include('front.partials.sticky-header')
@include('front.partials.mobile.menu')
@if (session('success'))
{{ session('success') }}
@endif @if (session('error'))
{{ session('error') }}
@endif @if ($errors->any())
@endif
@if (!request()->is('/'))
@endif

{{-- Ordre uniforme sous 1200px : la liste, puis le recapitulatif. Les anciennes classes order-sm/md/lg remontaient le total au-dessus de la liste entre 576px et 1199px seulement, ce qui inversait l'ordre d'un simple passage en paysage. --}}

{{ __('messages.products') }}

{{ __('messages.price_product_cart') }}

{{ __('messages.quantity') }}

@forelse($items as $item) @if($item->isDish()) @php $dish = $item->dish; @endphp @continue(!$dish) @php $dishThumb = $dish->firstPhotoPath(); $resto = $dish->restaurateur; $restoName = $resto ? ($resto->company ?: $resto->name) : null; @endphp
{{ $dish->name }}
{{ $dish->name }}
@if($restoName)
{{ $restoName }}{{ $resto->city ? ' · ' . $resto->city : '' }}
@endif @if(!empty($item->selected_variants) && is_array($item->selected_variants))
@foreach($item->selected_variants as $supplementLabel => $supplementPrice)
{{ label_or_raw($supplementLabel) }} {{ $supplementPrice }}
@endforeach
@endif
{{ __('restaurant.menu_label') }}
@if($item->hasFreeShipping()) @include('front.partials.free-shipping-badge', ['style' => 'margin-top:6px;']) @endif {{-- Le mode de livraison est choisi sur la fiche du plat : le panier se contente de rappeler ce qui a été retenu. --}} @if(in_array($item->delivery_mode, ['click_collect', 'restaurant_delivery', 'private_carrier_delivery'], true))
{{ match($item->delivery_mode) { 'click_collect' => __('restaurant.delivery_click_collect'), 'private_carrier_delivery' => __('messages.private_carrier_delivery'), default => __('restaurant.delivery_by_restaurant'), } }} : delivery_mode === 'private_carrier_delivery') data-chauffeur-price="{{ $item->id }}" data-free-shipping="{{ $item->hasFreeShipping() ? 1 : 0 }}" @endif> @if($item->hasFreeShipping()) {{ __('messages.free_shipping_offered') }} @else {{ (float) $item->carrier_price > 0 ? display_price($item->carrier_price, 'EUR') : __('messages.free_delivery') }} @endif @if($item->delivery_mode === 'restaurant_delivery' && $item->delivery_date_label) · {{ $item->delivery_date_label }} @endif @if($item->delivery_mode === 'private_carrier_delivery' && $item->private_carrier_name) · {{ $item->private_carrier_name }} @endif {{-- Comme une course : la demande part au chauffeur, le panier suit sa réponse en temps réel, et le paiement n'ouvre qu'une fois le chauffeur d'accord. --}} @if($item->isDish() && $item->delivery_mode === 'private_carrier_delivery')
{{ __('chauffeur.delivery_cart_state_pending', ['driver' => $item->private_carrier_name]) }}
@endif
@endif

{{ __('messages.price_product_cart') }} : {{ display_price($item->unitPrice(), $item->currency()) }}

{{ __('messages.subtotal') }} : {{ display_price($item->unitPrice() * (int) $item->quantity, $item->currency()) }}

@continue @endif @php $product = $item->product; @endphp @continue(!$product) @php $firstImage = $product->images->first(); $subtotal = ((float)$product->product_price) * (int)$item->quantity; @endphp
{{ $product->product_name }}
{{ $product->product_name }}
@if(!empty($item->selected_variants) && is_array($item->selected_variants)) @php $variantColors = $item->variantColors(); @endphp
@foreach($item->selected_variants as $variantName => $variantValue)
{{ label_or_raw($variantName) }} : @include('front.partials.variant-swatch', ['color' => $variantColors[$variantName] ?? null]) {{ label_or_raw($variantValue) }}
@endforeach
@endif @if($product->free_shipping) @include('front.partials.free-shipping-badge', ['style' => 'margin-top:6px;']) @endif
@php $deliveryOptions = [ 'home' => [ 'label' => __('messages.home_delivery'), 'enabled' => $product->productHomeDelivery ], 'relay' => [ 'label' => __('messages.relay_point'), 'enabled' => $product->productRelatedDelivery ], 'click_collect' => [ 'label' => __('messages.click_collect'), 'enabled' => $product->productClickAndCollect ], 'seller_delivery' => [ 'label' => __('messages.seller_delivery'), 'enabled' => $product->productSelfDelivery ], 'private_carrier_delivery' => [ 'label' => __('messages.private_carrier_delivery'), 'enabled' => $product->productPrivateCarrierDelivery ], ]; $savedDeliveryMode = $item->delivery_mode; $enabledKeys = collect($deliveryOptions) ->filter(fn($option) => $option['enabled']) ->keys() ->values(); $defaultMode = $savedDeliveryMode && $enabledKeys->contains($savedDeliveryMode) ? $savedDeliveryMode : $enabledKeys->first(); @endphp @foreach($deliveryOptions as $key => $option) @if($option['enabled']) @endif @endforeach {{-- Livraison par le créateur : tarif au km, recalculé côté serveur à partir de la distance jusqu'à l'acheteur. --}}
@if($item->delivery_mode === 'seller_delivery' && $item->chargedShipping() > 0) {{ __('messages.seller_delivery_fee', [ 'price' => display_price($item->carrier_price, 'EUR'), 'distance' => $item->delivery_date_label, ]) }} @endif
{{-- unitPrice() plutôt que final_price : les options payantes choisies sur la fiche entrent dans le prix unitaire, sans quoi le sous-total de la ligne ne serait pas prix × quantité. --}}

{{ __('messages.price_product_cart') }} : {{ display_price($item->unitPrice(), $item->currency()) }}

{{-- data-qty-managed : la page pilote la quantité, le handler générique du thème doit garder ses mains dans ses poches --}}

{{ __('messages.subtotal') }} : {{ display_price($item->unitPrice() * (int) $item->quantity, $item->currency()) }}

@empty
{{ __('messages.empty_cart') }}
@endforelse
@if($items->count())
@if(session('applied_promocode'))
{{ __('messages.promo_applied') }}
{{ session('applied_promocode.code') }}
{{ __('messages.discount') }} : -{{ number_format($promoDiscount ?? 0, 2, '.', ' ') }} {{ currency_symbol(display_currency()) }}
@csrf
@else
@csrf
@endif
@endif
{{ __('messages.cart_total') }}
{{ __('messages.sub_total_products') }}
{{ number_format($productsTotal ?? 0, 2, '.', ' ') }} {{ currency_symbol(display_currency()) }}
{{ __('messages.shipping') }}
{{ number_format($shippingTotal ?? 0, 2, '.', ' ') }} {{ currency_symbol(display_currency()) }}
{{ __('messages.discount') }}
-{{ number_format($promoDiscount ?? 0, 2, '.', ' ') }} {{ currency_symbol(display_currency()) }}
{{ __('messages.total') }}
{{ number_format($cartTotal ?? 0, 2, '.', ' ') }} {{ currency_symbol(display_currency()) }}
{{ __('messages.articles') }}
{{ $cartCount ?? 0 }}
@csrf
{{-- Paiement en attente de l'accord des chauffeurs Viki. --}}
@include('front.partials.footer') {{-- Livraisons par chauffeur Viki : l'état de chaque demande est relu en boucle, et le paiement ne s'ouvre qu'une fois tous les chauffeurs d'accord. Un refus ou un silence fait passer la demande au chauffeur suivant, côté serveur. --}}