@extends('layouts.app') @section('title', $prestataire->user->name . ' - Prestataire') @push('styles') @endpush @push('scripts') @endpush @section('content') @php $totalReviews = $allReviews->count(); $averageRating = $totalReviews > 0 ? round($allReviews->avg('rating'), 1) : 0; $hasProducts = $allUrgentSales->count() > 0; $hasFood = isset($foodProducts) && $foodProducts->count() > 0; $hasVideos = $prestataire->videos && $prestataire->videos->count() > 0; $hasServices = $allServices->count() > 0; $hasEquipments = $allEquipments->count() > 0; $isOnline = $prestataire->user->is_online ?? false; // Calcul des tabs actifs $tabs = []; if($hasServices) $tabs[] = ['id' => 'services', 'icon' => 'fa-concierge-bell', 'label' => 'Services', 'count' => $allServices->count()]; if($hasEquipments) $tabs[] = ['id' => 'location', 'icon' => 'fa-tools', 'label' => 'Location', 'count' => $allEquipments->count()]; if($hasProducts) $tabs[] = ['id' => 'boutique', 'icon' => 'fa-store', 'label' => 'Boutique', 'count' => $allUrgentSales->count()]; if($hasFood) $tabs[] = ['id' => 'menu', 'icon' => 'fa-utensils', 'label' => 'Menu', 'count' => $foodProducts->count()]; $tabs[] = ['id' => 'avis', 'icon' => 'fa-star', 'label' => 'Avis', 'count' => $totalReviews]; $serviceCategories = $allServices ->flatMap(fn ($service) => $service->categories?->pluck('name') ?? collect()) ->filter() ->unique() ->sort() ->values(); $equipmentCategories = $allEquipments ->pluck('category.name') ->filter() ->unique() ->sort() ->values(); $equipmentConditions = $allEquipments ->pluck('condition') ->filter() ->unique() ->values(); $urgentCategories = $allUrgentSales ->pluck('category.name') ->filter() ->unique() ->sort() ->values(); $urgentConditions = collect(\App\Models\UrgentSale::CONDITION_OPTIONS) ->only($allUrgentSales->pluck('condition')->filter()->unique()->values()->all()); $foodCategoryOptions = collect(\App\Models\FoodProduct::categories()) ->only(($foodProducts ?? collect())->pluck('category')->filter()->unique()->values()->all()); $defaultActiveTab = $tabs[0]['id'] ?? 'avis'; @endphp
{{-- HEADER COMPACT --}}
@php $avatarUrl = null; if ($prestataire->photo) { $avatarUrl = filter_var($prestataire->photo, FILTER_VALIDATE_URL) ? $prestataire->photo : asset('storage/' . $prestataire->photo); } elseif ($prestataire->user->avatar) { $avatarUrl = filter_var($prestataire->user->avatar, FILTER_VALIDATE_URL) ? $prestataire->user->avatar : asset('storage/' . $prestataire->user->avatar); } elseif ($prestataire->user->profile_photo_url) { $avatarUrl = $prestataire->user->profile_photo_url; } @endphp @if($avatarUrl) {{ $prestataire->user->name }} @else
{{ strtoupper(substr($prestataire->user->name, 0, 1)) }}
@endif @if($prestataire->isVerified()) @endif

{{ $prestataire->user->name }}

{{ $isOnline ? '● En ligne' : '○ Hors ligne' }} @if($totalReviews > 0) ★ {{ $averageRating }} ({{ $totalReviews }}) @endif
@auth @if(auth()->user()->isClient()) @endif @else @endauth
{{-- BARRE DE NAVIGATION FLOTTANTE STICKY --}} {{-- CONTENU PAR ONGLETS --}}
{{-- TAB: SERVICES --}} @if($hasServices)

Nos Services

Découvrez nos prestations professionnelles

{{ $allServices->count() }} service{{ $allServices->count() > 1 ? 's' : '' }}
Recherche instantanée sur les prestations de ce profil.
@foreach($allServices as $service) @php $serviceCategoryNames = $service->categories?->pluck('name')->filter()->values() ?? collect(); $serviceCategorySlugs = $serviceCategoryNames->map(fn ($name) => \Illuminate\Support\Str::slug($name))->implode(' '); $serviceSearch = mb_strtolower(trim($service->title . ' ' . strip_tags($service->description ?? '') . ' ' . $serviceCategoryNames->implode(' '))); @endphp
@if($service->images && $service->images->count() > 0) {{ $service->title }} @else
@endif @if($service->images && $service->images->count() > 1) {{ $service->images->count() }} @endif

{{ $service->title }}

{{ Str::limit($service->description, 80) }}

@if($serviceCategoryNames->isNotEmpty() || $service->delivery_time)
@foreach($serviceCategoryNames->take(2) as $categoryName) {{ $categoryName }} @endforeach @if($service->delivery_time) {{ $service->delivery_time }} @endif
@endif
@endforeach
@endif {{-- TAB: LOCATION / ÉQUIPEMENTS --}} @if($hasEquipments)

Location de Matériel

Équipements professionnels disponibles à la location

{{ $allEquipments->count() }} équipement{{ $allEquipments->count() > 1 ? 's' : '' }}
Filtrez le matériel par mot-clé, catégorie, état ou budget.
@foreach($allEquipments as $equipment) @php $equipmentCategoryName = $equipment->category?->name; $equipmentSearch = mb_strtolower(trim( $equipment->name . ' ' . strip_tags($equipment->description ?? '') . ' ' . ($equipment->brand ?? '') . ' ' . ($equipment->model ?? '') . ' ' . ($equipmentCategoryName ?? '') . ' ' . ($equipment->condition ?? '') )); $equipmentPriceReference = $equipment->price_per_day ?? $equipment->price_per_hour ?? $equipment->price_per_week ?? null; @endphp
@if($equipment->main_photo) {{ $equipment->name }} @else
@endif @if($equipment->is_available) Disponible @else Réservé @endif

{{ $equipment->name }}

{{ Str::limit($equipment->description, 70) }}

@if($equipmentCategoryName || $equipment->condition || $equipment->brand)
@if($equipmentCategoryName) {{ $equipmentCategoryName }} @endif @if($equipment->condition) {{ ucfirst(str_replace('_', ' ', $equipment->condition)) }} @endif @if($equipment->brand) {{ $equipment->brand }} @endif
@endif
@if($equipment->price_per_hour) {{ number_format($equipment->price_per_hour, 0, ',', ' ') }} €/h @endif @if($equipment->price_per_day) {{ number_format($equipment->price_per_day, 0, ',', ' ') }} €/jour @endif
Réserver
@endforeach
@endif {{-- TAB: BOUTIQUE --}} @if($hasProducts)

Notre Boutique

{{ $allUrgentSales->count() }} articles disponibles

{{ $allUrgentSales->count() }} annonce{{ $allUrgentSales->count() > 1 ? 's' : '' }}
Affinez la boutique par recherche, prix, état ou disponibilité.
{{-- Indicateur panier flottant dans la boutique --}} @auth @php $cartItemCount = 0; try { $userCart = \App\Models\Cart::forUserActive(auth()->id()); if ($userCart) { $cartItemCount = $userCart->items()->sum('quantity'); } } catch (\Exception $e) {} @endphp @endauth
@foreach($allUrgentSales as $sale) @php $availableQty = ($sale->quantity ?? 1) - ($sale->reserved_quantity ?? 0) - ($sale->sold_quantity ?? 0); $stockState = $availableQty <= 0 ? 'out' : ($availableQty <= 3 ? 'low' : 'in'); $saleCategoryName = $sale->category?->name; $saleSearch = mb_strtolower(trim( $sale->title . ' ' . strip_tags($sale->description ?? '') . ' ' . ($saleCategoryName ?? '') . ' ' . ($sale->condition ?? '') )); @endphp
@if($sale->photos && count($sale->photos) > 0) @php $firstPhoto = $sale->photos[0]; @endphp @if(filter_var($firstPhoto, FILTER_VALIDATE_URL)) {{ $sale->title }} @else @endif @else
@endif @if($availableQty <= 3 && $availableQty > 0) Plus que {{ $availableQty }}! @elseif($availableQty <= 0) Épuisé @endif

{{ $sale->title }}

{{ Str::limit($sale->description, 60) }}

@if($saleCategoryName || $sale->condition || $availableQty >= 0)
@if($saleCategoryName) {{ $saleCategoryName }} @endif @if($sale->condition) {{ \App\Models\UrgentSale::CONDITION_OPTIONS[$sale->condition] ?? ucfirst($sale->condition) }} @endif {{ $availableQty > 0 ? $availableQty . ' dispo' : 'Épuisé' }}
@endif
{{ number_format($sale->price, 2, ',', ' ') }} €
@if($availableQty > 0) @auth @php $sellerId = (int) ($sale->prestataire?->user_id ?? 0); $isOwnSale = (int) auth()->id() === $sellerId; $hasOnlinePayment = (function_exists('normalize_payment_requirement_for_mode') ? normalize_payment_requirement_for_mode($sale->payment_requirement ?? 'none') : ($sale->payment_requirement ?? 'none')) === 'full'; $hasStripeConnect = !empty($sale->prestataire?->stripe_account_id); $canAddToCart = !$isOwnSale && $hasOnlinePayment && $hasStripeConnect && \Illuminate\Support\Facades\Route::has('client.cart.add.urgent-sale'); @endphp @if($canAddToCart)
@csrf
@elseif($isOwnSale) Votre annonce @else {{ $hasOnlinePayment ? 'Contacter' : 'Réserver' }} @endif @else Connexion @endauth @else Épuisé @endif
@endforeach
@endif {{-- TAB: MENU FOOD --}} @if($hasFood)

Notre Menu

Commandez et faites-vous livrer

{{ $foodProducts->count() }} plat{{ $foodProducts->count() > 1 ? 's' : '' }}
Préfiltrez le menu avant d'ouvrir la commande complète.
{{-- Lien vers la page complète de commande --}}
@endif {{-- TAB: AVIS --}}

Avis Clients

{{ $averageRating }}
@for($i = 1; $i <= 5; $i++) @endfor
{{ $totalReviews }} avis
@if($totalReviews > 0)
{{ $totalReviews }} avis
Filtrez les retours clients par note ou mot-clé.
@endif {{-- Formulaire avis --}} @auth @if(auth()->user()->client && !$existingReview && $hasInteracted)

Donnez votre avis

@csrf
@for($i = 5; $i >= 1; $i--) @endfor
@endif @endauth {{-- Liste des avis --}} @if($totalReviews > 0)
@foreach($allReviews as $review) @php $reviewSearch = mb_strtolower(trim(($review->client->name ?? 'Client') . ' ' . strip_tags($review->comment ?? ''))); @endphp
{{ strtoupper(substr($review->client->name ?? 'A', 0, 1)) }}
{{ $review->client->name ?? 'Client' }}
@for($i = 1; $i <= 5; $i++) @endfor
{{ $review->created_at->diffForHumans() }}
@if($review->comment)

{{ $review->comment }}

@endif
@endforeach
@else

Aucun avis pour le moment

Soyez le premier à donner votre avis !
@endif
{{-- SECTION: À propos (toujours visible en bas) --}} @if($prestataire->description)

À propos

{{ $prestataire->description }}

@if($prestataire->city || $prestataire->phone)
@if($prestataire->city) {{ $prestataire->city }} @endif @auth @if($prestataire->phone && ($prestataire->phone_visible ?? true)) {{ $prestataire->phone }} @endif @endauth
@endif
@endif {{-- Vidéos (si existantes) --}} @if($hasVideos)

Nos Vidéos

@foreach($prestataire->videos as $video)
@if($video->thumbnail) {{ $video->title }} @else @endif
@endforeach
@endif
{{-- BOUTON FLOTTANT FOLLOW --}} @auth @if(auth()->user()->isClient())
@if(auth()->user()->client && auth()->user()->client->isFollowing($prestataire->id))
@csrf @method('DELETE')
@else
@csrf
@endif
@endif @endauth
{{-- Modal Vidéo --}}
@endsection