@extends('admin.layout') @php $viewLabel = match ($viewMode) { 'day' => 'journalier', 'month' => 'mensuel', default => 'hebdomadaire', }; @endphp @section('title', 'Planning ' . $viewLabel) @section('content')

Planning {{ $viewLabel }}

@canany(['plannings.createChantier', 'plannings.createIntervention'])
@can('plannings.createChantier') Chantier @endcan @can('plannings.createIntervention') Intervention @endcan
@endcanany
@include('admin.gestan._stale_banner', [ 'stale' => $planningStale ?? false, 'unavailable' => $planningUnavailable ?? false, ])
@php // Types de créneaux (filtre) $allTypes = [ 'pose' => 'Pose', 'maconnerie' => 'Maçonnerie', 'intervention' => 'Intervention', 'absence' => 'Absence', ]; $currentTypes = request()->input('types', array_keys($allTypes)); if (request('user_id')) { $currentTypes = array_keys($allTypes); } // Navigation (pager) + réinitialisation, selon la vue $query = request()->query(); if ($viewMode === 'day') { $prevUrl = route('plannings.index', array_merge($query, ['day' => $previousDay])); $nextUrl = route('plannings.index', array_merge($query, ['day' => $nextDay])); $periodLabel = $dayLabel; $resetUrl = route('plannings.index', ['view' => 'day', 'day' => $dayOffset]); } elseif ($viewMode === 'week') { $prevUrl = route('plannings.index', array_merge($query, ['week' => $previousWeek])); $nextUrl = route('plannings.index', array_merge($query, ['week' => $nextWeek])); $periodLabel = 'Semaine ' . $weekLabel; $resetUrl = route('plannings.index', ['view' => 'week', 'week' => $weekOffset]); } else { $prevUrl = route('plannings.index', array_merge($query, ['month' => $previousMonth])); $nextUrl = route('plannings.index', array_merge($query, ['month' => $nextMonth])); $periodLabel = $monthLabel; $resetUrl = route('plannings.index', ['view' => 'month', 'month' => $monthOffset]); } // Vue jour : la grille laisse place aux cartes de l'agenda, et les equipes // sans creneau disparaissent avec elle. On les liste sous les cartes pour // garder l'information « qui n'a rien aujourd'hui ». A calculer ici : la // boucle de la grille reutilise $planning comme variable de boucle. $equipesLibres = $viewMode === 'day' ? collect($planning) ->filter(fn ($equipe) => empty($equipe['plannings']) && ($equipe['type'] ?? '') !== 'absence') ->pluck('nom') ->all() : []; $viewButtons = [ 'day' => ['Jour', 'bi-calendar-day'], 'week' => ['Semaine', 'bi-calendar-week'], 'month' => ['Mois', 'bi-calendar3'], ]; // Sélecteur utilisateur $selectedUser = $usersFilter->firstWhere('id', (int) request('user_id')); $upColors = ['#0d6efd','#198754','#6f42c1','#fd7e14','#dc3545','#20c997','#d63384','#0dcaf0','#e6a800','#6610f2']; $upColor = fn($id) => $upColors[$id % count($upColors)]; $upInitials = fn($u) => mb_strtoupper(mb_substr($u->prenom, 0, 1) . mb_substr($u->nom, 0, 1)); @endphp {{-- Portée + Vue (contrôles segmentés) --}}
Planning complet @if (Auth::user()->chantier) Mon planning @endif
@foreach ($viewButtons as $mode => $meta) {{ $meta[0] }} @endforeach
{{-- MESSAGES --}} @if (session('success'))
{{ session('success') }}
@endif @if (session('error'))
{{ session('error') }}
@endif {{-- Pager --}}
{{ $periodLabel }}
{{-- Filtres --}}
@if ($viewMode === 'day') @elseif ($viewMode === 'week') @else @endif
Type
@foreach ($allTypes as $value => $label) @endforeach
@foreach ($usersFilter as $user) @endforeach
Réinitialiser
{{-- Recherche --}} {{-- Filtre "à réaffecter" : affiché par le JS seulement s'il existe des chantiers dont un employé assigné est absent sur la période. --}} @if ($viewMode === 'week' || $viewMode === 'day')
{{-- COLONNE JOURS --}}
Jour
@foreach ($jours as $jour)
{{ $jour['label'] }} {{ $jour['carbon']->format('d/m/Y') }}
@endforeach
{{-- COLONNES EQUIPES --}} @foreach ($planning as $equipe)
{{-- HEADER --}}
{{ $equipe['nom'] }}
{{-- GRID --}}
{{-- FOND --}} @for ($i = 1; $i <= $rowsCount; $i++)
@endfor {{-- PLANNINGS --}} @foreach ($equipe['plannings'] as $planning) @if (!empty($planning['is_absence_count']))
@foreach ($planning['absents'] as $abs) {{ $abs['label'] }} @endforeach
@else @include('admin.plannings._card', [ 'cell' => $planning, ]) @endif
@endforeach
@endforeach {{-- BANDEAUX jours non travaillés (fériés + dates bloquées) --}} @foreach ($blockedBands as $band)
{{ $band['label'] }}
@endforeach
@if ($viewMode === 'day' && $equipesLibres)
Sans créneau aujourd'hui @foreach ($equipesLibres as $nomEquipe) {{ $nomEquipe }} @endforeach
@endif @else {{-- PLANNING MOIS --}}
{{-- COLONNE JOURS --}}
Jour
@foreach ($semaines as $semaine) @foreach ($semaine['jours'] as $jour)
{{ $jour['label'] }} {{ $jour['carbon']->format('d/m/Y') }}
@endforeach @endforeach
{{-- COLONNES ÉQUIPES --}} @foreach ($planningMonth as $equipe) @php $totalRows = count($semaines) * 10; // 5 jours × 2 créneaux par semaine @endphp
{{ $equipe['nom'] }}
{{-- FOND --}} @for ($i = 1; $i <= $totalRows; $i++)
@endfor {{-- SÉPARATEURS DE SEMAINES --}} @for ($s = 1; $s < count($semaines); $s++)
@endfor {{-- PLANNINGS --}} @foreach ($equipe['semaines'] as $si => $sem) @php $rowOffset = $si * 10; @endphp @foreach ($sem['plannings'] as $planning) @if (!empty($planning['is_absence_count']))
@foreach ($planning['absents'] as $abs) {{ $abs['label'] }} @endforeach
@else @include('admin.plannings._card', [ 'cell' => $planning, ]) @endif
@endforeach @endforeach
@endforeach {{-- BANDEAUX jours non travaillés (fériés + dates bloquées) --}} @foreach ($blockedBands as $band)
{{ $band['label'] }}
@endforeach
@endif {{-- MODAL --}}
{{-- CSRF --}} {{-- JS --}} @can('plannings.move') @endcan {{-- CSS --}} @endsection