@php $translator = app(\App\Services\TranslationService::class); $locale = app()->getLocale(); $dishName = $translator->translate($dish->name, $locale); $dishDescription = $translator->translate(strip_tags($dish->description ?? ''), $locale); $resto = $dish->restaurateur; $restoName = $resto ? ($resto->company ?: $resto->name) : null; $photos = $dish->photos; @endphp
@include('front.partials.top-header') @include('front.partials.desktop.search-header') @include('front.partials.sticky-header')
@include('front.partials.mobile.menu')

@forelse($photos as $key => $photo)
{{ $dishName }}
@empty
no image
@endforelse
@forelse($photos as $key => $photo)
{{ $dishName }}
@empty
no image
@endforelse
{{ $dish->category ?: __('restaurant.menu_label') }}
@for ($i = 1; $i <= 5; $i++)
@if ($averageRating >= $i) @elseif ($averageRating >= ($i - 0.5)) @else @endif
@endfor {{ $averageRating }} / 5 ({{ $reviewCount }} {{ __('messages.reviews') }})

{{ $dishName }}

@include('front.partials.report-listing', ['type' => 'dish', 'id' => $dish->id])
{{ display_price($dish->price, $dish->currency) }}
@csrf
@if($restoName)
{{ __('restaurant.menu_label') }}
{{ $restoName }}{{ $resto->city ? ' · ' . $resto->city : '' }}
@endif
@php // Le sous-total est recalculé en JS : on expose les montants // déjà convertis dans la devise du visiteur, comme l'affichage. $converter = app(\App\Services\CurrencyConverter::class); $displayCurrency = display_currency(); $dishBasePrice = $converter->convert((float) $dish->price, $dish->currency ?: 'EUR', $displayCurrency); @endphp @if(!empty($dish->supplements)) @php // Les suppléments sont stockés à plat ; on les regroupe par // catégorie et on traduit les libellés via les mêmes clés // que le back-office restaurateur. $supplementsByCategory = collect($dish->supplements) ->groupBy(fn ($supplement) => $supplement['category'] ?? 'other'); @endphp
{{ __('restaurant.dish_supplements') }}
@foreach($supplementsByCategory as $categoryKey => $supplements)
{{ \Illuminate\Support\Facades\Lang::has("supplements.categories.{$categoryKey}") ? __("supplements.categories.{$categoryKey}") : $categoryKey }}
{{-- groupBy conserve les index d'origine : ils servent de référence au serveur pour retrouver le supplément. --}} @foreach($supplements as $index => $supplement) @php $supplementKey = $supplement['key'] ?? null; @endphp
{{ $supplementKey && \Illuminate\Support\Facades\Lang::has("supplements.items.{$supplementKey}") ? __("supplements.items.{$supplementKey}") : ($supplement['label'] ?? '') }} + {{ display_price($supplement['price'] ?? 0, $dish->currency) }}
@endforeach
@endforeach
@endif @if($dish->is_click_collect || $dish->is_carrier_delivery || $dish->is_restaurant_delivery) @php // Le mode livré par le restaurant n'est proposé que si son // tarif a pu être calculé (adresse acheteur connue) : sans // montant, la commande partirait avec des frais nuls. $restaurantDeliverable = $dish->is_restaurant_delivery && $deliveryQuote; $defaultDeliveryMode = $dish->is_click_collect ? 'click_collect' : ($restaurantDeliverable ? 'restaurant_delivery' : ($dish->is_carrier_delivery ? 'private_carrier_delivery' : null)); @endphp
{{ __('restaurant.dish_delivery') }}
{{-- Livraison offerte : les tarifs restent affichés pour information, mais ne sont pas facturés au client. --}} @if($dish->free_shipping)
@include('front.partials.free-shipping-badge')
{{ __('messages.free_shipping_detail_hint') }}
@endif @if($dish->is_click_collect) @endif @if($dish->is_restaurant_delivery)
@if($deliveryQuote) {{ __('messages.delivery_distance_from_address', [ 'distance' => number_format($deliveryQuote['distance_km'], 1, ',', ' '), 'rate' => display_price($dish->delivery_price_per_km, $dish->currency), ]) }} @elseif(auth()->check()) {{ __('messages.delivery_needs_address') }} @else {{ __('messages.delivery_login_for_quote') }} @endif
@endif @if($dish->is_carrier_delivery) {{-- Les quatre transporteurs les plus proches de l'adresse du client, famille livraison uniquement : le client choisit qui livre. --}}

{{ __('surmesure.carrier_loading') }}

@endif {{-- Adresse de livraison commune aux deux livraisons (restaurant et chauffeur Viki) : « Enregistrer » recalcule tous les tarifs. --}} @if($dish->is_restaurant_delivery || $dish->is_carrier_delivery) @php $buyer = auth()->user(); @endphp
{{ __('messages.delivery_address') }}
{{-- Les champs ne s'ouvrent qu'au clic sur « Modifier » ; le bouton devient alors « Enregistrer » et déclenche le calcul. --}}
@endif
@endif {{-- Sous-total en dernier : il additionne le plat, les suppléments cochés et les frais du mode de livraison retenu. --}}
{{ __('messages.subtotal') }} {{ display_price($dish->price, $dish->currency) }}
@if($dish->category)
{{ __('messages.categories_detail_product') }} {{ $dish->category }}
@endif
{!! nl2br(e($dishDescription)) !!}
@include('front.partials.reviews-section', ['reviewAction' => route('dish.review.store', $dish->id)])
@if($otherDishes->isNotEmpty())

{{ __('restaurant.menu_label') }}

@foreach($otherDishes as $other) @php $otherThumb = $other->firstPhotoPath(); @endphp @endforeach
@endif
{{ __('messages.what_we_offer') }}
icon

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

icon

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

icon

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

{{ __('messages.guaranteed_safe_checkout') }}
@include('front.partials.footer')