# État des camions

Nouvelle page qui montre l'état du jour de chaque camion, groupé par statut, avec le tour suivant prévu.

URL : `/suivi_livraison/etat_camions` (menu : sous « Carte des livraisons »). Droits : comme le suivi de livraison (`profil_bl` ≠ 0, middlewares `auth:sanctum` + `interne`).

## Fichiers

| Fichier | Rôle |
| --- | --- |
| `app/Http/Controllers/suivi_livraison_controller.php` | `etat_camions()` (page), `etat_camions_donnees()` (JSON), `etat_camion()`, `estimer_heure()`, `minutes()`, `heure_texte()`. Requête des BL du jour factorisée dans `requete_bls_du_jour()` + `ids_centrales_filtrees()`, aussi utilisées par `carte_donnees()`. |
| `routes/web/suivi_livraison.php` | Routes `suivi_livraison.etat_camions` et `suivi_livraison.etat_camions_donnees`. |
| `resources/views/suivi_livraison/etat_camions.blade.php` | Page dédiée (layout `base`, avec le menu de gauche et le haut, comme le suivi de livraison, fond `#f4f6f3` des pages plein écran) : titre, liens, bouton plein écran (met seulement la zone `.etat-camions` en plein écran, sans les menus), puis `@include` du partial. |
| `resources/views/suivi_livraison/_etat_camions.blade.php` | Partial autonome (CSS préfixé `ec-`, HTML, module JS `EtatCamions`). Réutilisable tel quel dans un onglet. |
| `public/inc/haut.inc.php` | Entrée de menu « État des camions ». |

## Groupes (ordre d'affichage)

1. **Retour vers la centrale**, trié par heure d'arrivée estimée à la centrale (la plus proche d'abord).
2. **Vidange**, puis **Attente sur chantier** : le camion qui y est depuis le plus longtemps d'abord.
3. **En route vers le chantier** : par arrivée chantier estimée.
4. **Chargement**, avec « En préparation ».
5. **Non défini** : statut `statut-indefini`, chargement décroché depuis plus de 15 min. Affiché seulement s'il y en a.
6. **À la centrale, prochain départ** : camion sans BL en cours (rentré, ou pas encore parti) qui a un tour suivant ; trié par heure de départ.
7. **Inactifs** : camion présent sans BL en cours et sans tour suivant.

## Règles de calcul

- **Camions pris en compte** : véhicules présents ce jour-là sur les centrales filtrées. La présence vient de `t_vehicule_presence_centrale` ou, si aucune présence n'existe pour la date, de la centrale de la fiche véhicule, comme le planning. Il faut aussi `Vehicule_Actif_Beton = 1` et `Vehicule_Definir_Production = 1`. S'y ajoutent les véhicules qui ont un BL du jour sur ces centrales.
- **Statut** : celui du dernier BL du véhicule (`determiner_statut`, même logique que le suivi de livraison et la carte). Le camion est rentré si `bl_heure_arr_centrale` est atteinte (`etape_atteinte`).
- **Tour suivant** : premier tour du planning réel (`t_planning`) du jour, pour ce véhicule, pas encore produit. Un tour est non produit si `numero_bl` est NULL (valeur du legacy), vide ou 0 (`tour_non_produit()`). Son départ doit être postérieur :
  - pour un camion en tour : au départ du tour en cours (ligne `t_planning` dont `numero_bl` = `bl_code`, sinon `bl_heure_fab`) ;
  - pour un camion à la centrale : à maintenant − 60 min, ce qui permet de voir un départ en retard.
- **Repli sur le prévisionnel** : si le réel ne donne aucun tour suivant, on prend le premier tour de `t_planning_prev` du jour pour ce véhicule.
  - Les blocages (`planning_blocage` = 1) et les OF déjà livrés (`planning_of_livre` = 1) sont exclus.
  - Le départ du tour doit être postérieur à la même référence que pour le réel, et aussi au dernier départ prévu au réel pour ce camion. Le réel du jour remplace le prévisionnel sur sa période, ce qui évite de reproposer un tour prévisionnel déjà repris au réel, même décalé de quelques minutes.
  - Sur la carte, un badge « prév. » en pointillé suit l'heure (`tour_suivant.source` = `prev`). La marge est calculée de la même façon.
  - Requête commune aux deux tables : `requete_tours_du_jour()`.
- **Heures estimées** (`estimer_heure`) : on prend la dernière étape atteinte du BL et on y ajoute l'écart prévu au planning entre cette étape et l'étape visée (arrivée chantier ou retour centrale). Sans ligne de planning, on utilise l'heure théorique du BL. L'estimation n'est jamais antérieure à maintenant.
- **Marge** (pastille du tour suivant) :
  - camion en tour : départ suivant − retour estimé ;
  - camion à la centrale : départ suivant − maintenant.
  - Vert si la marge est ≥ 10 min, orange en dessous (constante JS `SEUIL_MARGE_JUSTE`), rouge en cas de retard.
- **Sélection des centrales** : mêmes puces que `planning_laravel`.
  - Centrales de production de l'utilisateur, en sélection multiple.
  - La zone est repliable, avec un résumé « x / y affichées ».
  - Aucune puce cochée = toutes les centrales de l'utilisateur.
  - Paramètre envoyé : `centrales[]`.
  - Dès que plusieurs centrales sont affichées, chaque carte porte la pastille de sa centrale.
  - La sélection et le repli sont retenus dans le navigateur (`localStorage` : `etat_camions_centrales`, `etat_camions_centrales_masquees`).
  - La carte des livraisons garde sa liste déroulante. `ids_centrales_filtrees()` prend désormais un tableau d'ids.
- **Rafraîchissement** : toutes les 20 s, uniquement si la zone est visible et la fenêtre au premier plan.

## Intégrer plus tard dans un onglet

Dans la page qui accueille l'onglet (ex. `suivi_livraison/index.blade.php`), il suffit de :

```blade
@include('suivi_livraison._etat_camions')
```

Mettre cet appel dans le panneau de l'onglet. Ajouter ensuite `$('a[href="#onglet_camions"]').on('shown.bs.tab', EtatCamions.charger);` pour actualiser l'affichage à l'ouverture de l'onglet. La vue doit recevoir `$centrales`. Les ids `ec_*` ne doivent pas être dupliqués : le partial ne peut être inclus qu'une seule fois par page.

## Limites connues

- Les blocages ne sont filtrés que dans le prévisionnel : `t_planning` n'en porte pas (ils sont uniquement en `t_planning_prev`).
- Le repli sur le prévisionnel ne s'applique qu'après le dernier départ prévu au réel. Un tour prévisionnel placé entre deux tours réels n'est donc jamais proposé.
- Le passage de minuit n'est pas géré dans les calculs de minutes.

## Affichage des cartes
- En-tête, à gauche sur deux lignes : code du véhicule, puis son libellé (`Vehicule_Libelle`, tronqué si trop long, complet au survol).
- En-tête, à droite : pastille de centrale en haut (seulement si plusieurs centrales sont affichées), heure clé du statut en 2e ligne. Libellés abrégés : « Arr. Centrale », « Arr. Chantier », « Dép. prévu ».
- Corps : chauffeur en première ligne avec une icône volant (SVG inline, Font Awesome 5.0.13 n'en a pas), puis client et chantier avec l'icône personne (`fa-user`).
