@php use App\Enums\TaskStatut; use App\Filament\Admin\Pages\FicheCollaborateur; use App\Services\Pilotage\SignauxService; $liseres = [ SignauxService::RETARD => 'border-l-4 border-l-danger-500', SignauxService::BLOQUE => 'border-l-4 border-l-warning-500', SignauxService::PLANNING_VIDE => 'border-l-4 border-l-gray-400', SignauxService::SILENCE => 'border-l-4 border-l-gray-400', ]; $etiquette = 'block text-xs font-semibold uppercase tracking-wide text-gray-500 dark:text-gray-400'; $champ = 'rounded-lg border-gray-300 text-sm shadow-sm focus:border-primary-500 focus:ring-primary-500 dark:border-white/20 dark:bg-white/5 dark:text-white'; $pct = fn (?float $v): string => $v === null ? '—' : rtrim(rtrim(number_format($v, 1, ',', ' '), '0'), ',').' %'; $heures = fn (float $v): string => rtrim(rtrim(number_format($v, 2, ',', ' '), '0'), ',').' h'; @endphp {{-- v4.1.0 §C2 → v4.8.0 §B — « ÉQUIPE » : deux minutes par jour, et l'écran qui amorce. Bandeau → cinq tuiles de signaux → grille de cartes (quatre KPIs par carte, clic = fiche Cockpit) → tableau par marché → pied d'actions dans l'ordre de la maquette `MAQUETTE-PILOTAGE-RH.html` (écran 1) → panneaux. --}} {{-- ═══ Bandeau : date, filtre par marché, feuilles à approuver ═══════════════════════ --}}

{{ $maintenant->translatedFormat('D d/m/Y') }} · {{ $maintenant->format('H:i') }}

{{-- v4.8.0 §B3 — Le badge des feuilles en brouillon sur des semaines écoulées : chaque ligne est un coût RH à zéro tant qu'elle n'est pas approuvée. --}} @if ($peutApprouver && $nombreAApprouver > 0) Feuilles à approuver ({{ $nombreAApprouver }}) @endif Toutes les personnes
{{-- ═══ Cinq tuiles de signaux, cliquables : elles filtrent la grille ═══════════════════ --}}
@foreach ($definitions as $cle => $definition) @endforeach
{{-- ═══ La grille de cartes — une par personne, clic = fiche Cockpit ═══════════════════ --}} @if ($toutesLesCartes->isEmpty())

Aucune tâche — planifiez la semaine.

Le geste du lundi : « Distribuer la semaine » ci-dessous, une ligne par tâche, Entrée = ligne suivante.

@elseif ($cartes->isEmpty())

Aucune personne ne correspond à ce filtre.

@else {{-- v4.2.0 §0.1 — `repeat(auto-fit, minmax(340px, 1fr))` en style en ligne : la grille compte elle-même ses colonnes, et le CSS de Filament est précompilé. --}}
@foreach ($cartes as $carte) @php $employe = $carte['employee']; $pire = $carte['signaux']['pire'] ?? null; $enCours = $carte['maintenant']; $kpi = $kpis[$employe->id] ?? null; @endphp $pire !== null, ])>

{{ $employe->full_name }}

{{ $employe->job_title ?: '—' }}

{{-- v4.8.0 §B1 — La ligne des quatre KPIs : production · heures · points+série · prime projetée. « — » quand il n'y a rien à dire, jamais un zéro inventé. --}}
($kpi['a_lheure'] ?? null) !== null && $kpi['a_lheure'] >= 90, 'text-warning-600 dark:text-warning-400' => ($kpi['a_lheure'] ?? null) !== null && $kpi['a_lheure'] >= 70 && $kpi['a_lheure'] < 90, 'text-danger-600 dark:text-danger-400' => ($kpi['a_lheure'] ?? null) !== null && $kpi['a_lheure'] < 70, 'text-gray-900 dark:text-white' => ($kpi['a_lheure'] ?? null) === null, ])>{{ $pct($kpi['a_lheure'] ?? null) }} à l'heure (30 j)
($kpi['heures_jour'] ?? 0) <= 0, 'text-gray-900 dark:text-white' => ($kpi['heures_jour'] ?? 0) > 0, ])>{{ $heures((float) ($kpi['heures_jour'] ?? 0)) }} pointées auj.
{{ ($kpi['points_jour'] ?? null) === null ? '—' : $kpi['points_jour'].' pts' }} @if (($kpi['serie'] ?? null) === null) série — @elseif ($kpi['serie'] > 0) série {{ $kpi['serie'] }} j{{ $kpi['serie'] >= 5 ? ' 🔥' : '' }} @else série 0 @endif
{{ ($kpi['projetee'] ?? null) === null ? '—' : number_format($kpi['projetee'], 0, ',', ' ') }} DH prime proj.
{{-- Zone 1 : Maintenant --}}

Maintenant

@if ($enCours)

{{ $enCours->titre }}

{{ $enCours->libelleDuMarche() }} @if ($enCours->statut === TaskStatut::Bloque) bloqué depuis {{ $enCours->bloque_le?->diffForHumans(null, true) }} — {{ $enCours->motif_blocage?->court() }} @else depuis {{ $enCours->commence_le?->format('H:i') }} · {{ $enCours->dureeLisible($maintenant) }} @endif @if ($par = $cockpit->origineLisible($enCours)) · par {{ $par }} @endif
@else

rien en cours

dernier geste : {{ $carte['signaux']['dernier_geste']?->diffForHumans() ?? 'aucun' }}

@endif
{{-- Zone 2 : Fait aujourd'hui --}}

Fait aujourd'hui {{ $carte['fait']->count() }}

@forelse ($carte['fait'] as $faite)

{{ $faite->termine_le?->format('H:i') }} {{ $faite->titre }}

@empty

rien de terminé aujourd'hui

@endforelse @if ($carte['heures'] > 0)

{{ number_format($carte['heures'], 2, ',', ' ') }} h pointées

@endif
{{-- Zone 3 : Ensuite --}}

Ensuite {{ $carte['ensuite']->count() }}

@forelse ($carte['ensuite'] as $suivante)
$suivante->estEnRetard($maintenant), 'text-gray-400' => ! $suivante->estEnRetard($maintenant), ])>{{ $suivante->echeance->translatedFormat('D d/m') }} {{ $suivante->titre }} @if ($suivante->estEnRetard($maintenant)) retard @endif @if ($par = $cockpit->origineLisible($suivante)) · par {{ $par }} @endif @if ($suivante->estNouvelle()) non vue @endif
@empty

rien de prévu — planning vide, distribuez ➜

@endforelse
{{-- Pied : les signaux de la personne, ou « rien à signaler » --}}
@php $aSignaler = false; @endphp @foreach ([SignauxService::RETARD, SignauxService::BLOQUE, SignauxService::PLANNING_VIDE, SignauxService::SILENCE] as $cle) @if (($carte['signaux'][$cle] ?? 0) > 0) @php $aSignaler = true; @endphp {{ $definitions[$cle]['libelle'] }} @endif @endforeach @unless ($aSignaler) rien à signaler @endunless fiche Cockpit ›
@endforeach
@endif {{-- ═══ Tableau « Par marché » ═════════════════════════════════════════════════════════ --}} Par marché ce qui est ouvert, ce qui accroche, ce qui est dû cette semaine @if ($parMarche->isEmpty())

Aucune tâche ouverte — planifiez la semaine.

@else
@foreach ($parMarche as $ligne) @endforeach
Marché Chef de marché Ouvertes En retard Bloquées Livrables sem. Prochain livrable
{{ $ligne['libelle'] }} {{ $ligne['chef'] }} {{ $ligne['ouvertes'] }} $ligne['retards'] > 0])>{{ $ligne['retards'] }} $ligne['bloquees'] > 0])>{{ $ligne['bloquees'] }} {{ $ligne['livrables_semaine'] }} @if ($ligne['prochain_livrable']) {{ $ligne['prochain_livrable']->titre }} ({{ $ligne['prochain_livrable']->echeance->format('d/m') }}) @else — @endif
@endif
{{-- ═══ Pied d'actions — l'ordre de la maquette (v4.8.0 §B4) ═════════════════════════ --}}
Distribuer la semaine Une tâche Coller une liste @if ($estDirection) Objectif de la semaine @endif {{-- v4.4.0 §C2 — Le bouton n'apparaît qu'à qui peut trancher les primes. --}} @if ($primesAccessibles) Primes du mois @endif Rapport hebdo (PDF) @if ($whatsappActif) Copier pour WhatsApp @endif Planifier la semaine {{-- §E — Le compte rendu rédigé : À LA DEMANDE seulement, et le bouton n'existe que si le réglage est allumé (il est éteint par défaut). --}} @if ($iaDisponible) Rédiger le compte rendu @endif
@if ($compteRendu)

Compte rendu de la semaine — proposition à relire

{{ $compteRendu }}

@endif @if ($rapports->isNotEmpty())

Derniers rapports : @foreach ($rapports as $rapport) {{ $rapport['nom'] }} ({{ $rapport['ecrit_le']->format('d/m/Y') }})@if (! $loop->last) · @endif @endforeach

@endif
{{-- ═══ « + Une tâche » — formulaire EN LIGNE, jamais une page à part ═════════════════ --}} @if ($panneau === 'nouvelle') + Une tâche Responsable et échéance obligatoires. Le collaborateur reçoit un push.
@foreach ($collaborateurs as $id => $nom) @endforeach
@foreach ($marches as $id => $nom) @endforeach
Créer Fermer
@endif {{-- ═══ v4.8.0 §D1 — « Distribuer la semaine » : la grille, Entrée = ligne suivante ═════ --}} @if ($panneau === 'distribuer') + Distribuer la semaine Le geste du lundi matin : autant de lignes que vous voulez, Entrée dans le titre = ligne suivante, un seul bouton à la fin. Chaque ligne passe par le service des tâches : une ligne refusée s'affiche en erreur, les autres passent.
@foreach ($lignes as $index => $ligne) @endforeach
Tâche Qui Marché Échéance Livrable ?
@if ($ligne['erreur'])

{{ $ligne['erreur'] }}

@endif
Créer les {{ $this->nombreDeLignesPretes() }} tâche{{ $this->nombreDeLignesPretes() > 1 ? 's' : '' }} → push à chacun + Une ligne 📋 Coller une liste Annuler
{{-- v4.8.0 §D3 — Les tâches récurrentes, dans le même panneau. --}}

🔁 Récurrentes

Chaque matin à 06 h 15, la tâche du jour de chaque modèle dû se crée toute seule — échéance le jour même, jamais deux fois. Un modèle dont le collaborateur quitte l'entreprise s'éteint de lui-même.

@if ($modeles->isEmpty())

Aucun modèle encore — ajoutez-en un ci-dessous.

@else
    @foreach ($modeles as $modeleLigne)
  • {{ $modeleLigne->titre }} — {{ $modeleLigne->cadenceLisible() }} → {{ $modeleLigne->employee?->full_name ?? '—' }} · {{ $modeleLigne->project?->libelle() ?? \App\Services\Interne\FonctionnementInterneService::LIBELLE }} @if ($modeleLigne->livrable) · livrable @endif @if ($modeleLigne->derniere_creee_le) · dernière le {{ $modeleLigne->derniere_creee_le->format('d/m') }} @endif @if ($modeleLigne->note) {{ $modeleLigne->note }} @endif {{ $modeleLigne->actif ? 'actif' : 'inactif' }} @if ($estDirection) {{ $modeleLigne->actif ? 'Désactiver' : 'Activer' }} Supprimer @endif
  • @endforeach
@endif @if ($estDirection)
@if (($modele['recurrence'] ?? 'hebdo') === 'mensuel') @else @endif
+ Ajouter le modèle
@endif
@endif {{-- ═══ v4.8.0 §D2 — « Coller une liste » : rien n'est créé ici ═══════════════════════ --}} @if ($panneau === 'coller') 📋 Coller une liste Collez des lignes (WhatsApp, notes) — une ligne = une tâche proposée. @nom assigne, ven, demain ou 12/09 en fin de ligne pose l'échéance, #marché choisit le marché. Ce qui n'est pas reconnu reste dans le titre, et se corrige dans la grille.
Analyser → tâches proposées Annuler
@endif {{-- ═══ v4.8.0 §B2 — « Objectif de la semaine », côté direction ═══════════════════════ --}} @if ($panneau === 'objectif' && $estDirection) 🎯 Objectif de la semaine Semaine du {{ \Illuminate\Support\Carbon::today()->startOfWeek()->translatedFormat('j F') }}. Un objectif par marché, ou pour toute l'équipe. Vendredi, marquez-le atteint : chaque membre affecté gagne ses points. Un objectif tranché ne se réécrit plus.
Fermer
@endif {{-- ═══ v4.8.0 §B3 — « Feuilles à approuver » : l'approbation en masse ═══════════════ --}} @if ($panneau === 'approuver' && $peutApprouver) Feuilles à approuver Une ligne par collaborateur et par semaine écoulée. Les semaines complètes sont cochées d'avance ; les autres se cochent à la main. Les coûts RH ne lisent que les heures approuvées : tant qu'une ligne est ici, son coût est à zéro. Une journée approuvée se verrouille. @if ($feuillesAApprouver->isEmpty())

Rien à approuver : toutes les semaines écoulées sont à jour.

@else
@foreach ($feuillesAApprouver as $ligne) @endforeach
Collaborateur Semaine Heures Marchés État
{{ $ligne['employee']->full_name }} du {{ $ligne['semaine']->format('d/m') }} au {{ $ligne['semaine']->copy()->endOfWeek()->format('d/m') }} {{ $heures($ligne['heures']) }} {{ $ligne['marches'] }} {{ $ligne['complete'] ? 'semaine complète' : 'jours manquants' }}
@endif
@if ($feuillesAApprouver->isNotEmpty()) Approuver la sélection @endif Fermer
@endif {{-- ═══ « Planifier la semaine » ═══════════════════════════════════════════════════════ --}} @if ($panneau === 'planifier') Planifier la semaine Les tâches ouvertes de chacun, un jour prévu par tâche. @if ($aPlanifier->isEmpty())

Aucune tâche ouverte à planifier.

@else
@foreach ($aPlanifier as $tache)

{{ $tache->titre }}

{{ $tache->employee?->full_name }} · {{ $tache->libelleDuMarche() }} · échéance {{ $tache->echeance->format('d/m') }}

@endforeach
@endif
Enregistrer Fermer
@endif