# Écran Suivi livraison

Écran de suivi en temps réel des livraisons du jour, accessible via le menu **Suivi > Suivi livraison** (`/suivi_livraison`).

## Fonctionnement général

- Un **Kanban par commande** en cours de livraison. En-tête : nom du client, code chantier, adresse, code commande, quantités commandée / livrée / reste.
- Dans chaque colonne, une **carte par véhicule** actif : code + libellé véhicule, code BL + quantité, nom de la centrale du BL, statut, dernière heure connue, et une **icône œil** qui ouvre la modale "Avancement de la livraison".
- Date de référence : **toujours la date du jour** (pas de sélecteur ; un sélecteur date/heure temporaire a servi aux tests puis a été retiré). Badge "Situation du JJ/MM/AAAA HH:MM".
- Filtre **centrale** (sur `t_commande.centrale_id`), **zone de recherche** côté client (commande, chantier, client, véhicule, BL, centrale), rafraîchissement auto toutes les 20 s, bouton "Actualiser", spinner de chargement.
- Légende des couleurs au-dessus de la grille.

## Sélection des commandes

Une commande apparaît si :
- **non soldée** et (`commande_date_livraison` = aujourd'hui **ou** un BL non annulé existe aujourd'hui), **ou**
- **soldée** mais avec au moins un BL du jour (non annulé, non préfa) dont le dernier tour n'est pas terminé. Le pré-filtre SQL ne regarde volontairement pas `bl_heure_arr_centrale` (elle peut être théorique et pas encore atteinte) ; le tri fin est fait en PHP, et une commande soldée sans plus aucun véhicule actif est retirée.

Exclusions :
- commandes portant une ligne de zone (`t_ligne_commande.ligne_commande_type_article = 4`, `article_id = id_zone`) dont la zone est cochée sous-centrale (`t_zone.zone_sous_centrale = 1`) ;
- BL préfa (`bl_prefa = 1`) et BL annulés ;
- BL dont le retour centrale est atteint (voyage terminé).

Un véhicule n'apparaît que sur son **BL le plus récent** du jour (s'il est reparti livrer une autre commande, il disparaît de l'ancienne).

## Calcul du statut

Les colonnes `bl_heure_*` sont des `TIME NOT NULL` : une heure non renseignée vaut `'00:00:00'`.

Types d'heure (`*_type`) : **confirmée = type 2 (manuel) ou 3 (GPS)** ; 0 et 1 = non confirmée (théorique). Attention aux noms réels : `bl_heure_deb_vidange_type`, `bl_heure_deb_chantier_type`, `bl__heure_arr_centrale_type` (double underscore).

Une étape est **atteinte** si son heure est renseignée et :
1. son type est confirmé → atteinte ;
2. sinon, si le BL possède au moins une heure confirmée → ignorée (non atteinte) ;
3. sinon → atteinte si l'heure théorique est déjà passée.

Le statut est la première étape atteinte dans l'ordre : départ chantier → **Retour vers la centrale** ; début vidange → **Vidange** ; arrivée chantier → **Attente sur chantier** ; départ centrale → **En route vers le chantier** ; fabrication → **Chargement** (ou **Non défini**, gris, si la première gâchée date de plus de 15 min) ; sinon **En préparation**.

Couleurs : chargement bleu ciel, en route bleu, attente orange, vidange violet, retour jaune, non défini gris.

## Modale "Avancement de la livraison"

Ouverte par l'icône œil d'une carte véhicule. Appel AJAX `GET /suivi_livraison/avancement/{id_bl}` (route `suivi_livraison.avancement`, protégée par `auth:sanctum` + `interne`). Affiche le statut, le véhicule, client, chantier, formule, quantité du BL, et une frise des 7 étapes (cycle démarré, départ centrale, arrivée chantier, début vidange, fin déchargement, départ chantier, retour centrale) avec l'heure de chaque étape atteinte et l'écart avec l'étape précédente (`+<1m`, `+23m`, `+1h06`). Les étapes atteintes suivent la même règle que le statut.

## Fichiers

- [app/Http/Controllers/suivi_livraison_controller.php](../app/Http/Controllers/suivi_livraison_controller.php) — `index()`, `data()` (JSON du Kanban), `avancement()` (JSON de la modale).
- [resources/views/suivi_livraison/index.blade.php](../resources/views/suivi_livraison/index.blade.php) — vue Kanban, modale, styles et JS.
- [routes/web.php](../routes/web.php) — routes `suivi_livraison.index`, `.data`, `.avancement`.
- [public/inc/haut.inc.php](../public/inc/haut.inc.php) — entrée de menu, gatée sur `profil_bl`.

## Décisions

- Pas de migration : lecture seule de `t_commande`, `t_bl`, `t_chantier`, `t_client`, `t_vehicule`, `t_centrale`, `t_formule`, `t_ligne_commande`, `t_zone`.
- Accès gaté sur `profil_bl`.
- Filtre centrale basé sur la centrale de la commande (pas celle du BL), à la demande.
