@php use App\Enums\TaskStatut; $pct = fn (?float $v): string => $v === null ? '—' : rtrim(rtrim(number_format($v, 1, ',', ' '), '0'), ',').' %'; $h = fn (float $v): string => rtrim(rtrim(number_format($v, 2, ',', ' '), '0'), ',').' h'; $tuile = 'rounded-lg border border-gray-100 bg-gray-50 px-2 py-2 text-center dark:border-white/5 dark:bg-white/5'; $valeur = 'block text-lg font-bold tabular-nums text-gray-900 dark:text-white'; $legende = 'block text-[11px] text-gray-500 dark:text-gray-400'; $barre = 'relative mt-1 h-2 w-full overflow-hidden rounded-full bg-gray-200 dark:bg-white/10'; @endphp {{-- v4.32.1 §D.3 — sans salaire de référence, un mois sans bulletin ne s'estime pas. --}} @if ($this->employe()->salaireDeReferenceManquant())

Salaire de référence manquant

Renseignez le salaire mensuel (ou le TJM) sur la fiche : sans lui, un mois dont le bulletin n'est pas encore saisi ne peut pas être estimé dans la répartition des coûts.

@endif {{-- v4.8.0 §C — LA FICHE « COCKPIT » : en-tête, quatre blocs (maquette écran 2), sa semaine, ses heures. Toutes les définitions viennent de `KpiDuCollaborateur`. --}} {{-- ═══ En-tête : poste, régime, badges ═══════════════════════════════════════════════ --}} {{-- v4.30.0 §B5 — Pilotage éteint : restent l'en-tête, l'Assiduité, le Coût et ses heures. --}}

{{ $employe->job_title ?: 'Collaborateur' }} · {{ $employe->regime?->label() ?? '—' }} @if ($employe->contract_type) · {{ $employe->contract_type->label() }} @endif

{{ $employe->active && $employe->isEmployedOn($maintenant) ? 'en poste' : 'hors poste' }} @if (! $pilotageActif) {{-- v4.30.0 §B5 — Pilotage éteint : pas de badge de prime gamifiée. --}} @elseif ($prime['active']) {{ $employe->prime_cible !== null ? 'prime cible '.\App\Support\Money::format($employe->prime_cible) : 'prime activée, cible à définir' }} @else prime non activée @endif
@if ($pilotageActif) {{-- ═══ 1. Production ═══════════════════════════════════════════════════════════════ --}} 📦 Production — {{ $moisLisible }} @if ($production['echues_mois'] === 0 && $production['en_retard'] === 0 && $production['livrables_valides'] === 0)

Aucune tâche reçue échue ce mois-ci — distribuez sa semaine depuis Équipe.

@else
{{ $production['a_lheure_mois'] }}/{{ $production['echues_mois'] }} tâches à l'heure
{{ $production['livrables_valides'] }} livrables validés
$production['en_retard'] > 0])>{{ $production['en_retard'] }} en retard aujourd'hui
@endif

À l'heure sur 30 jours

@if ($production['moyenne_equipe_30j'] !== null) @endif

{{ $pct($production['taux_30j']) }} @if ($production['moyenne_equipe_30j'] !== null) — moyenne équipe {{ $pct($production['moyenne_equipe_30j']) }} @endif @if ($production['taux_30j'] === null) — aucune tâche reçue échue sur la période @endif

@endif {{-- ═══ 2. Assiduité ════════════════════════════════════════════════════════════════ --}} ⏱ Assiduité — {{ $moisLisible }}
{{ $h($assiduite['heures_pointees']) }} pointées / {{ $h($assiduite['heures_attendues']) }}
$assiduite['jours_sans_pointage'] > 0, '!text-success-600 dark:!text-success-400' => $assiduite['jours_sans_pointage'] === 0])>{{ $assiduite['jours_sans_pointage'] }} jour{{ $assiduite['jours_sans_pointage'] > 1 ? 's' : '' }} sans pointage
{{ $assiduite['conges_approuves'] }} jour{{ $assiduite['conges_approuves'] > 1 ? 's' : '' }} de congé approuvé

Heures pointées vs attendues ({{ $assiduite['jours_ouvres'] }} jours ouvrés × {{ rtrim(rtrim(number_format($assiduite['heures_par_jour'], 2, ',', ' '), '0'), ',') }} h)

{{ $assiduite['heures_attendues'] > 0 ? $pct(round($assiduite['heures_pointees'] / $assiduite['heures_attendues'] * 100, 1)) : '—' }} @if ($assiduite['heures_non_approuvees'] > 0) · dont {{ $h($assiduite['heures_non_approuvees']) }} non approuvées @endif — @if ($assiduite['feuilles_approuvees_jusquau']) feuilles approuvées jusqu'au {{ $assiduite['feuilles_approuvees_jusquau']->format('d/m') }} ✓ @else aucune feuille approuvée encore @endif

@if ($assiduite['heures_pointees'] <= 0)

Aucune heure pointée ce mois-ci.

@endif
@if ($pilotageActif) {{-- ═══ 3. Prime ════════════════════════════════════════════════════════════════════ --}} 🏆 Prime — {{ $moisLisible }} @if ($prime['a_des_points'] ?? false) niveau {{ $prime['niveau']->label() }} @endif @if (! $prime['active'])

Prime non activée : ce collaborateur n'est pas dans le dispositif. L'interrupteur est sur sa fiche RH.

@elseif (! $prime['a_des_points'])

Aucun point encore calculé — les points se déduisent des tâches, chaque soir à l'heure du calcul.

@else
{{ $prime['points'] }}/{{ $prime['maximum'] }} points du mois
{{ $prime['serie'] > 0 ? $prime['serie'].' j 🔥' : '0' }} série (joker {{ $prime['joker_utilise'] ? 'utilisé' : '✓' }})
{{ $prime['projete_lisible'] ?? '—' }} projetée
{{ $prime['phrase'] }}
@endif
@endif {{-- ═══ 4. Coût & rentabilité — direction seulement ═════════════════════════════════ --}} @if ($voitLeCout && $cout !== null) 💰 Coût & rentabilité — direction seulement 🔒 @if ($cout['cout'] === null)

Aucun bulletin calculé ou payé ce mois-ci : le coût se lit quand la paie du mois est passée.

@else
{{ $cout['cout_lisible'] }} coût du mois
{{ $pct($cout['pct_affecte']) }} heures sur marchés
{{ $cout['cout_heure_lisible'] ?? '—' }} coût / h affectée
@endif

Coût employeur (brut + parts patronales) ; heures approuvées seulement. @if ($cout['repartition'] !== []) Réparti : @foreach ($cout['repartition'] as $part) {{ $part['libelle'] }} {{ (int) $part['pct'] }} %{{ $loop->last ? '' : ' · ' }} @endforeach @elseif ($cout['heures_pointees'] > 0) Aucune heure approuvée ce mois-ci : la répartition attend l'approbation des feuilles. @else Aucune heure pointée ce mois-ci. @endif

@if ($cout['pct_affecte'] !== null)
@endif
@endif
@if ($pilotageActif) {{-- ═══ Sa semaine ════════════════════════════════════════════════════════════════════ --}} Sa semaine du {{ $maintenant->copy()->startOfWeek()->translatedFormat('D j M') }} au {{ $maintenant->copy()->endOfWeek()->subDays(2)->translatedFormat('D j M') }} — ses tâches prévues ou dues, et ses retards @if ($semaine->isEmpty())

Aucune tâche encore — distribuez sa semaine depuis Équipe.

@else
@foreach ($semaine as $tache) @endforeach
Tâche Marché Échéance État
{{ $tache->titre }}@if ($tache->livrable) ✓ livrable@endif @if ($par = $cockpit->origineLisible($tache)) · par {{ $par }} @endif {{ $tache->libelleDuMarche() }} $tache->estEnRetard($maintenant)])> {{ $tache->echeance?->translatedFormat('D d/m') ?? '—' }} @if ($tache->statut === TaskStatut::Termine && $tache->conformite === 'conforme') validé conforme @elseif ($tache->statut === TaskStatut::EnCours) en cours · {{ $tache->dureeLisible($maintenant) }} @elseif ($tache->estEnRetard($maintenant)) en retard @elseif ($tache->prevu_le !== null && $tache->statut->estOuvert()) prévu {{ $tache->prevu_le->translatedFormat('l') }} @else {{ mb_strtolower($tache->statut->label()) }} @endif
@endif
@endif {{-- ═══ Ses heures de la semaine (lecture) ═══════════════════════════════════════════ --}} Ses heures de la semaine lecture seule — la saisie reste la sienne, l'approbation passe par Feuilles de temps ou par « Feuilles à approuver » @if (collect($heures)->sum('heures') <= 0)

Aucune heure pointée cette semaine.

@else
@foreach ($heures as $jour)

{{ $jour['date']->translatedFormat('D d') }}

{{ $jour['heures'] > 0 ? $h($jour['heures']) : '—' }}

@if ($jour['heures'] > 0)

{{ $jour['approuvees'] ? 'approuvées' : 'brouillon' }}

@endif
@endforeach
@endif
@if ($pilotageActif) {{-- ═══ Journal du jour — écrit par ses gestes, rien à saisir ═════════════════════════ --}} Journal du jour écrit par ses gestes et les affectations reçues — rien à saisir @endif