@extends('layouts.app') @section('title', 'Réservations — ' . $activeHostel?->name) @section('content')
{{-- ── HERO ── --}}
Réservations {{ $activeHostel?->name }} @php $roleColors = ['owner'=>'rgba(253,186,116,1)','manager'=>'rgba(147,197,253,1)','staff'=>'rgba(110,231,183,1)','financial'=>'rgba(252,211,77,1)']; $roleLabels = ['owner'=>'Propriétaire','manager'=>'Manager','staff'=>'Staff','financial'=>'Financier']; $rc = $roleColors[$role] ?? 'rgba(255,255,255,.6)'; $rl = $roleLabels[$role] ?? $role; @endphp {{ $rl }}

Gestion des réservations

{{-- ── STATS ── --}}
Total
{{ $stats['total'] }}
réservations
Confirmées
{{ $stats['confirmed'] }}
réservations
En attente
{{ $stats['pending'] }}
réservations
Revenus
{{ number_format($stats['revenue'], 0, '.', ' ') }}
TND (hors annulées)
@if($role === 'financial')
ℹ️

Accès lecture seule

En tant que Financier, vous consultez uniquement sans pouvoir créer ou modifier.

@endif @if(session('success'))
{{ session('success') }}
@endif {{-- ── TABLE PRINCIPALE ── --}}
📋 Réservations {{ $year }}
{{ $year }}
@if($reservations->isEmpty())
📅

Aucune réservation pour {{ $year }}

Commencez par créer votre première réservation.

@else
@if($canEdit)@endif @foreach($reservations as $res) @php $today = now()->toDateString(); $isActive = $res->start_date->toDateString() <= $today && $res->end_date->toDateString() > $today; $initial = strtoupper(mb_substr($res->mainGuest?->first_name ?? '?', 0, 1)); $colors = ['#1B4FD8','#059669','#D97706','#7C3AED','#DC2626']; $bg = $colors[crc32($initial) % count($colors)]; @endphp @if($canEdit) @endif @endforeach
Guest principal Arrivée Départ Nuits Guests Source Montant TND Statut Ajouté parActions
@if($isActive)
{{ $initial }}
@else
{{ $initial }}
@endif

{{ $res->mainGuest?->first_name }} {{ $res->mainGuest?->last_name }}

{{ $res->mainGuest?->country?->name ?? '—' }}

{{ $res->start_date->format('d/m/Y') }} {{ $res->end_date->format('d/m/Y') }} {{ $res->nights }}n {{ $res->total_guests }} {{ $res->source ?? '—' }} {{ number_format($res->total_price_tnd, 3) }} @if($res->status === 'confirmed') Confirmé @elseif($res->status === 'pending') En attente @else {{ ucfirst($res->status) }} @endif {{ $res->created_by ?? '—' }}
@endif
{{-- ── PLANNING ── --}}
@php $pStart = $planning['start']; $pEnd = $planning['end']; $pDays = $planning['days']; $today = \Carbon\Carbon::today(); $showBeds = $planning['show_beds']; $occupancy = $planning['occupancy']; $baseParams = ['year' => $year, 'planning_days' => $pDays, 'show_beds' => $showBeds ? 1 : 0]; $prevUrl = route($routes['index'], array_merge($baseParams, ['planning_start' => $pStart->copy()->subDays($pDays)->toDateString()])); $nextUrl = route($routes['index'], array_merge($baseParams, ['planning_start' => $pStart->copy()->addDays($pDays)->toDateString()])); $todayUrl = route($routes['index'], array_merge($baseParams, ['planning_start' => $today->toDateString()])); @endphp
📊 Planning des hébergements
{{-- Navigation période --}}
{{ $pStart->format('d/m') }} → {{ $pEnd->format('d/m/Y') }}
📍 Aujourd'hui {{-- Switcher période --}}
@foreach([7, 14, 30] as $d) {{ $d }}j @endforeach
{{-- Toggle afficher les lits --}}
@if($planning['private_rooms']->isEmpty() && $planning['dormitory_rooms']->isEmpty() && $planning['tent_spaces']->isEmpty())
🛏️

Aucune unité d'hébergement

Configurez d'abord vos chambres et tentes.

@else
@foreach($planning['dates'] as $d) @php $isToday = $d->isSameDay($today); $isWeekend = $d->isWeekend(); $cls = $isToday ? 'today-col' : ($isWeekend ? 'weekend-col' : ''); @endphp @endforeach {{-- Chambres privées --}} @foreach($planning['private_rooms'] as $room) @foreach($planning['dates'] as $d) @php $key = $d->format('Y-m-d'); $occ = $occupancy['room'][$room->id][$key] ?? null; $cls = $d->isSameDay($today) ? 'today-col' : ($d->isWeekend() ? 'weekend-col' : ''); @endphp @if($occ) @else @endif @endforeach @endforeach {{-- Chambres dortoirs : récap + lits --}} @foreach($planning['dormitory_rooms'] as $room) @foreach($planning['dates'] as $d) @php $key = $d->format('Y-m-d'); $totalBeds = $room->beds->count(); $occupiedBeds = 0; foreach ($room->beds as $bed) { if (isset($occupancy['bed'][$bed->id][$key])) $occupiedBeds++; } $freeBeds = max(0, $totalBeds - $occupiedBeds); if ($totalBeds === 0) $recapCls = 'empty'; elseif ($freeBeds === 0) $recapCls = 'full'; elseif ($freeBeds < $totalBeds) $recapCls = 'partial'; else $recapCls = 'empty'; $cls = $d->isSameDay($today) ? 'today-col' : ($d->isWeekend() ? 'weekend-col' : ''); @endphp @endforeach @if($showBeds) @foreach($room->beds as $bed) @foreach($planning['dates'] as $d) @php $key = $d->format('Y-m-d'); $occ = $occupancy['bed'][$bed->id][$key] ?? null; $cls = $d->isSameDay($today) ? 'today-col' : ($d->isWeekend() ? 'weekend-col' : ''); @endphp @if($occ) @else @endif @endforeach @endforeach @endif @endforeach {{-- Tent spaces --}} @foreach($planning['tent_spaces'] as $tent) @foreach($planning['dates'] as $d) @php $key = $d->format('Y-m-d'); $occ = $occupancy['tent_space'][$tent->id][$key] ?? null; $cls = $d->isSameDay($today) ? 'today-col' : ($d->isWeekend() ? 'weekend-col' : ''); @endphp @if($occ) @else @endif @endforeach @endforeach
Unité
{{ $d->format('d') }} {{ ucfirst($d->locale('fr')->isoFormat('ddd')) }} {{ $d->format('m') }}
🏠 {{ $room->name }} ({{ $room->max_capacity }} pers.)
🛏️ {{ $room->name }} ({{ $room->beds->count() }} lits) {{ $freeBeds }}/{{ $totalBeds }}
↳ {{ $bed->name }}
⛺ {{ $tent->name }} ({{ $tent->max_persons }} pers.)
{{-- Légende --}}
Libre Occupé confirmé Occupé en attente X/Y Dortoir : lits libres / total
@endif
{{-- ── DELETE MODAL ── --}} @endsection