{{-- Les dossiers de projet d'une promotion (v2.1 §8). Ordre délibéré : la couverture du catalogue EN PREMIER. C'est le seul défaut qui vaut pour toute la promotion à la fois, et le seul qu'on ne peut plus rattraper une fois les dossiers remis. Ensuite les bénéficiaires, avec ce qui leur manque nommé en clair — un pourcentage ne dit pas quoi faire ; « il manque le prix de vente » se traite dans l'heure. --}} @php $programme = $this->programme(); $couverture = $this->couverture(); @endphp @if ($programme === null)

Aucun programme d'incubation n'est encore enregistré.

@else
{{-- ------------------------------------------------ 1. La couverture --}} Un champ du catalogue qu'aucune question ne va chercher reste vide sur le dossier de TOUS les bénéficiaires de cette promotion. Ce contrôle est affiché en permanence : un trou repéré au moment de remettre les dossiers ne se rattrape plus.
{{ $couverture->tauxCouverture() }} % du catalogue couvert
@if ($couverture->complet()) Tous les champs obligatoires sont demandés quelque part. @endif
@php $obligatoires = $couverture->manquantsObligatoires(); @endphp @if ($obligatoires->isNotEmpty())

{{ $obligatoires->count() }} champ(s) OBLIGATOIRE(S) que personne ne demande

Aucun bénéficiaire de cette promotion ne pourra remettre un dossier complet tant qu'une question ne les couvre pas.

    @foreach ($obligatoires as $trou)
  • {{ $trou['libelle'] }}
  • @endforeach
@endif @php $inconnus = $couverture->champsInconnus(); @endphp @if ($inconnus->isNotEmpty())

Des questions visent un champ qui n'existe plus au catalogue

Leurs réponses ne rejoindront aucun document. À corriger dans l'éditeur de notion.

    @foreach ($inconnus as $champ)
  • {{ $champ }}
  • @endforeach
@endif @php $doublons = $couverture->doublons(); @endphp @if ($doublons->isNotEmpty())

Des champs sont demandés plusieurs fois

Le bénéficiaire répondra deux fois à la même chose, et la seconde réponse écrasera la première.

    @foreach ($doublons as $doublon)
  • {{ $doublon['libelle'] }} — {{ $doublon['fois'] }} fois
  • @endforeach
@endif {{-- Le détail, document par document : facultatifs compris. --}} @php $manquants = $couverture->manquants(); @endphp @if ($manquants->isNotEmpty())
@foreach ($manquants as $documentValue => $trous)

{{ App\Enums\Formation\DocumentProjet::from($documentValue)->label() }} — {{ $trous->count() }} champ(s) non demandé(s)

    @foreach ($trous as $trou)
  • $trou['obligatoire'], 'bg-gray-500/10 text-gray-600 dark:text-gray-400' => ! $trou['obligatoire'], ]) title="{{ $trou['question'] }}">{{ $trou['libelle'] }}
  • @endforeach
@endforeach
@endif
{{-- ------------------------------------------------ 2. La promotion --}} Ce qui manque est NOMMÉ, pas compté : « il manque le prix de vente et la saisonnalité » se traite dans l'heure, « 68 % » ne dit pas quoi faire. @php $promotion = $this->promotion(); @endphp @if ($promotion->isEmpty())

Aucun bénéficiaire dans cette promotion.

@else
@foreach ($promotion as $ligne) @endforeach
Bénéficiaire Avancement Ce qui manque Dernière réponse
{{ $ligne['apprenant']->nomComplet }}
@if (filled($ligne['apprenant']->projet_intitule))
{{ $ligne['apprenant']->projet_intitule }}
@endif
$ligne['avancement'] >= 80, 'text-amber-600 dark:text-amber-400' => $ligne['avancement'] >= 40 && $ligne['avancement'] < 80, 'text-red-600 dark:text-red-400' => $ligne['avancement'] < 40, ])>{{ $ligne['avancement'] }} % @if ($ligne['manquants'] === []) Rien — le dossier est complet. @else
    @foreach (array_slice($ligne['manquants'], 0, 8) as $manque)
  • {{ $manque }}
  • @endforeach @if (count($ligne['manquants']) > 8)
  • et {{ count($ligne['manquants']) - 8 }} autre(s)
  • @endif
@endif
{{ $ligne['derniere_reponse']?->format('d/m/Y') ?? '—' }}
@endif
{{-- ---------------------------------- 3. Les deux appareils au même moment --}} @php $anomalies = $this->anomaliesAppareils(app(App\Services\Formation\AnomaliesAppareils::class)); @endphp @if ($anomalies->isNotEmpty()) Depuis que l'entrée se fait par numéro seul, c'est le seul signal qui reste sur l'identité de qui travaille. Un bénéficiaire n'a qu'une paire de mains : soit le numéro est partagé, soit quelqu'un fait le parcours à sa place. Aucune heure n'est retirée — elles sont contractuelles, et c'est à vous de trancher depuis sa fiche. @endif {{-- ------------------------------------------------ 4. Les corrections --}} Un chiffre corrigé engage la société devant un financeur. On garde qui, quoi et quand ; la valeur d'avant reste dans le journal d'audit de la réponse. @php $corrections = $this->corrections(); @endphp @if ($corrections->isEmpty())

Aucune correction pour l'instant.

@else
@foreach ($corrections as $correction) @endforeach
Quand Qui Bénéficiaire Champ Valeur retenue
{{ $correction->corrige_at?->format('d/m/Y H:i') }} {{ $correction->corrigePar?->name ?? '—' }} {{ $correction->dossier?->apprenant?->nomComplet ?? '—' }} {{ App\Support\Formation\CatalogueChamps::libelleDocument($correction->champ) }} {{ Str::limit($correction->valeurAffichee(), 80) }}
@endif
@endif