@extends('admin.layout') @section('title', __('Tableau de bord')) @php use App\Helpers\CommandeHelper; // Le tunnel renvoie vers l'index des commandes filtre sur l'etat. Sans la // permission de lecture, les barres restent des barres : le compteur a du // sens meme pour qui ne peut pas ouvrir la liste. $peutVoirCommandes = auth()->user()?->can('commandes.view') ?? false; $peutVoirDecoupes = auth()->user()?->can('commande_decoupes.view') ?? false; // Chaque chiffre mene a la liste qu'il compte. Les filtres reprennent la // definition exacte du chiffre (TableauBordService, et CommandeService::VUES // dans l'api) : ce qu'on lit ici est le nombre de lignes apres le clic. // Sans le droit d'ouvrir la liste, le chiffre reste du texte. $lienCmd = fn (array $p) => $peutVoirCommandes ? route('commandes.index', $p) : null; $lienDec = fn (array $p) => $peutVoirDecoupes ? route('commande_decoupes.index', $p) : null; $a = function (?string $url, $texte, string $classe = '') { $texte = e((string) $texte); return $url ? '' . $texte . '' : $texte; }; // Jalons du parcours : la derniere position sert d'echelle a la barre. $totalParcours = collect($parcours)->max('position') ?: 1; $posEntrepot = collect($parcours)->firstWhere('cle', 'entrepot')['position'] ?? 0; $jalonEntrepot = collect($parcours)->firstWhere('cle', 'entrepot'); $jalonPose = collect($parcours)->firstWhere('cle', 'pose'); $jalonVisuel = collect($parcours)->firstWhere('cle', 'visuel'); @endphp @section('content')
{{ __("Les commandes posées sont exclues : elles ne se pilotent plus.") }} @if ($peutVoirCommandes) {{ __("Chaque barre mène à la liste filtrée sur l'état.") }} @endif
{{ __("Médianes et non moyennes : une seule date saisie de travers déplacerait une moyenne.") }} @if ($jalonEntrepot) {{ (int) $jalonEntrepot['position'] }} {{ __('jours') }} {{ __("jusqu'à l'entrepôt, contre les") }} {{ config('commandes.delais_previsionnels.standard') }} {{ __('annoncés.') }} @endif
{{ __(':bloc des :total jours tiennent entre le visuel validé et le retour du laquage.', [ 'bloc' => $bloc, 'total' => (int) $jalonEntrepot['position'], ]) }} {{ __("Soit :part % du délai de fabrication dans une seule portion du parcours.", ['part' => $partBloc]) }}
@endif @endif @if ($jalonVisuel){{ __('Le jalon « visuel validé » repose sur :n commandes — la colonne n\'existait pas dans le logiciel métier.', [ 'n' => number_format($jalonVisuel['n'], 0, ',', ' '), ]) }}
@endif| {{ __('Modèle') }} | {{ __('Cmd') }} |
|---|---|
| {!! $a($url, $modele['libelle']) !!} | {!! $a($url, number_format($modele['n'], 0, ',', ' ')) !!} |
| {{ __('Aucune commande sur la période.') }} | |
| {{ __('Couleur') }} | {{ __('Cmd') }} |
|---|---|
| {!! $a($url, $couleur['libelle']) !!} | {!! $a($url, number_format($couleur['n'], 0, ',', ' ')) !!} |
| {{ __('Aucune commande sur la période.') }} | |
{{ __(':couleur pèse :part % des commandes colorées : un stock de poudre calé sur ce seul RAL couvre l\'essentiel du laquage.', [ 'couleur' => $couleurs[0]['libelle'], 'part' => $partCouleur, ]) }}
@endif{{ __("Date de commande + délai prévisionnel : le degré d'urgence annoncé à l'usine, pas une promesse au client. Les commandes déjà fabriquées en sont exclues — à partir de l'attente de chargement, l'usine n'a plus rien à en faire. Même calcul que les pastilles de la liste.") }}
{{-- Les pastilles reprennent les facettes de l'index, avec ses compteurs cumulatifs : ce qu'elles annoncent doit etre ce qu'on voit apres le clic. Les parts du donut au-dessus sont disjointes, d'ou les libelles differents. --}} @can('commandes.view'){{ __("Ces compteurs sont cumulatifs, comme sur la liste : « sous 15 j » comprend le retard et les 7 jours.") }}
@endcan @if (count($respect['familles'])){{ __("Écart à l'échéance, en médiane. Positif, l'usine a livré trop tard ; négatif, trop tôt — et sur une commande avec maçonnerie, trop tôt veut dire avant que le terrain soit prêt.") }}
| {{ __('Famille') }} | {{ __('Cmd') }} | {{ __('Écart') }} | {{ __('En cours') }} |
|---|---|---|---|
| {!! $a($lienCmd(['vue' => 'attendues,' . $vueFamille, 'tri' => 'echeance']), $famille['label']) !!} | {!! $a($lienCmd(['vue' => 'arrivees_24m,' . $vueFamille]), number_format($famille['n'], 0, ',', ' ')) !!} | {{ $famille['ecart'] > 0 ? '+' : '' }}{{ (int) $famille['ecart'] }} {{ __('j') }} | @if ($courant) {!! $a($lienCmd(['echeance' => 'retard', 'vue' => $vueFamille]), $courant['en_retard']) !!}/{!! $a($lienCmd(['vue' => 'attendues,' . $vueFamille, 'tri' => 'echeance']), $courant['n']) !!} @else — @endif |
{{ __(":tot des :n commandes avec maçonnerie sont arrivées plus d'un mois avant le besoin.", [ 'tot' => number_format($mac['tres_tot'], 0, ',', ' '), 'n' => number_format($mac['n'], 0, ',', ' '), ]) }} {{ __("Le terrain n'était pas prêt : le portail encombre l'entrepôt. Pendant ce temps :retard des :total commandes sans maçonnerie sont arrivées en retard. L'usine fabrique dans l'ordre des commandes, pas dans celui de l'urgence.", [ 'retard' => number_format($std['en_retard'], 0, ',', ' '), 'total' => number_format($std['n'], 0, ',', ' '), ]) }}
@endif @endif{{ __('Parties au laquage, pas encore revenues.') }}
| {{ __('Laqueur') }} | {{ __('Cmd') }} | {{ __('Moy.') }} | {{ __('Plus vieille') }} |
|---|---|---|---|
| {!! $a($url, $ligne['laqueur']) !!} | {!! $a($url, $ligne['n']) !!} | {{ $ligne['age_moyen'] }} {{ __('j') }} | {{ $ligne['age_max'] }} {{ __('j') }} |
| {{ __('Rien au laquage.') }} | |||
{{ __("Une commande partie depuis plus de deux mois n'est probablement plus au laquage : c'est une date de retour qu'on a oublié de saisir.") }}
@endif{{ __('Découpes non reçues. :recues sont revenues, :ouvertes restent ouvertes.', [ 'recues' => number_format($decoupes['recues'], 0, ',', ' '), 'ouvertes' => $decoupes['ouvertes'], ]) }}
| {{ __('Lasériste') }} | {{ __('État') }} | {{ __('Lig.') }} | {{ __('Depuis') }} |
|---|---|---|---|
| {!! $a($url, $ligne['laseriste']) !!} | {!! $a($url, $ligne['etat']) !!} | {!! $a($url, $ligne['n']) !!} | {{ $ligne['depuis']?->format('d/m/y') ?? '—' }} |
| {{ __('Aucune découpe en attente.') }} | |||
{{ __('Aucun chantier de pose ou de maçonnerie terminé depuis.') }}
@else{{ trans_choice(':sans chantier passé sur :total sans photo envoyée par ACPORTAIL.|:sans chantiers passés sur :total sans photo envoyée par ACPORTAIL.', $photosChantiers['sans'], [ 'sans' => $photosChantiers['sans'], 'total' => $photosChantiers['total'], ]) }}
| {{ __('Équipe') }} | {{ __('Chantiers') }} | {{ __('Sans photo') }} |
|---|---|---|
| {{ $ligne['nom'] }} | {{ $ligne['total'] }} | {{ $ligne['sans'] }} |
{{ __(':total refabrications pour :accueillies commandes accueillies : :taux %.', [ 'total' => $reprises['total'], 'accueillies' => number_format($reprises['accueillies'], 0, ',', ' '), 'taux' => str_replace('.', ',', (string) $reprises['taux']), ]) }}
{{ __('Ce qui fausse les compteurs ci-dessus.') }}