# Carte des chantiers et toupies du jour

Nouvelle page `/suivi_livraison/carte` (route `suivi_livraison.carte`). Elle affiche sur une carte OpenStreetMap (Leaflet 1.9.4 via unpkg) les centrales de l'utilisateur, les chantiers livrés aujourd'hui et la position estimée de chaque toupie.

## Accès

- Menu **Suivi > Carte des livraisons** (`public/inc/haut.inc.php`), sous « Suivi livraison », avec le même droit `profil_bl`.
- Bouton **Carte** à côté de « Plan de charge » dans les trois plannings (`public/planning/index.php`, `public/planning_prev/index.php`, `public/planning_prev_reel/index.php`). Il ouvre la carte dans un nouvel onglet, comme le plan de charge.

## Données (`suivi_livraison_controller::carte_donnees`)

- **BL pris en compte** : date de livraison = aujourd'hui, `bl_annule = 0`, `bl_prefa = 0`, centrale parmi les centrales de l'utilisateur (`t_user_centrale`), filtre centrale optionnel. Les BL des commandes portant une zone « sous centrale » sont exclus, comme dans `data()`.
- **Chantiers** : un point par chantier ayant au moins un BL du jour. Volume = `SUM(bl_qte_livraison)` (même champ que le suivi de livraison et le dashboard) et nombre de BL. Coordonnées : `chantier_latitude` / `chantier_longitude`.
- **Toupies** : pour chaque véhicule, le BL le plus récent du jour. Le statut réutilise `determiner_statut()` du suivi de livraison, plus « Rentrée » quand `bl_heure_arr_centrale` est atteinte (même règle `etape_atteinte()` que `data()`).
- **Coordonnées** : 0, vide ou hors bornes = non géolocalisé (`coordonnee()`).

## Position des toupies

Aucun véhicule n'a de position GPS en base (`Vehicule_Derniere_Position_GPS` vide). La position est donc déduite du statut :

| Statut | Position sur la carte |
|---|---|
| En préparation, Chargement, Rentrée | Centrale |
| En route, Retour centrale | Mi-chemin centrale ↔ chantier, avec le trajet en pointillé |
| Attente sur chantier, Vidange | Chantier |
| Non défini | Non placée (listée dans le panneau) |

Plusieurs toupies au même endroit sont empilées. Le panneau de droite liste les toupies par statut ; un clic centre la carte sur la toupie.

## Coordonnées des centrales

`t_centrale` n'avait pas de coordonnées. Migration `2026_10_18_1500_V905001_NB_t_centrale_latitude_longitude.php` : `centrale_latitude` et `centrale_longitude` en `decimal(10,7)` nullable, après `centrale_pays`. Champs ajoutés dans la fiche centrale (bloc Adresse) et validés dans `centrale_controller::enregistrer()`. Sans coordonnées, la centrale est placée d'après son adresse (voir ci-dessous) ; si l'adresse est vide ou introuvable, elle n'apparaît pas et un avertissement le signale.

## Position d'après l'adresse

Si une centrale ou un chantier n'a pas de coordonnées GPS exploitables, sa position est estimée à partir de son adresse (adresse 1 + adresse 2, code postal, ville) :

- Service `app/Services/geocodage_adresse_service.php`, qui interroge le géocodage de l'IGN (`https://data.geopf.fr/geocodage/search`, successeur gratuit et sans clé de api-adresse.data.gouv.fr). Le code postal est passé en filtre quand il a 5 chiffres. Une adresse sans code postal ni ville n'est pas géocodée.
- Cache Laravel : 30 jours si l'adresse est trouvée, 1 jour si elle est introuvable, 10 minutes si le service ne répond pas. Au plus 30 appels à l'API par chargement de la carte ; les adresses restantes sont traitées aux rafraîchissements suivants (toutes les 60 s).
- Rien n'est écrit en base : les coordonnées saisies sur les fiches restent prioritaires.
- Sur la carte, une position estimée a un contour en pointillé, l'info-bulle porte la mention « Position estimée d'après l'adresse », et l'avertissement sous le panneau indique combien de points sont concernés. Le champ `source` du JSON vaut `gps`, `adresse` ou null.
- **Prérequis serveur** : PHP doit avoir des certificats racine (`curl.cainfo` dans `php.ini`) pour appeler l'API en HTTPS. Sinon l'appel échoue (« SSL certificate problem »), l'erreur est journalisée et les points sans GPS restent non placés.

## Performance

La requête BL utilise `where('bl_date_livraison', …)` et non `whereDate()`, pour profiter de l'index sur cette colonne DATE (2,1 s → 0,08 s en local).

## Affichage

- Centrale : étiquette à son code, à la couleur `centrale_couleur`.
- Chantier : cercle à la couleur de sa centrale, taille selon le volume du jour, info-bulle avec client, adresse, m³, BL et toupies présentes.
- Toupie : étiquette à son code, couleur selon le statut ; info-bulle avec BL, m³, heure de la dernière étape et nombre de rotations.
- Rafraîchissement toutes les 60 s ; le cadrage automatique n'est fait qu'au premier chargement ou au changement de centrale.

## Fichiers

- `app/Http/Controllers/suivi_livraison_controller.php` : `carte()`, `carte_donnees()`, `position()`, `coordonnee()`.
- `app/Services/geocodage_adresse_service.php` : nouveau service de géocodage d'adresse.
- `routes/web/suivi_livraison.php` : routes `carte` et `carte_donnees` (`auth:sanctum`, `interne`).
- `resources/views/suivi_livraison/carte.blade.php` : nouvelle vue.
- `database/migrations/2026_10_18_1500_V905001_NB_t_centrale_latitude_longitude.php` : nouvelle migration.
- `resources/views/centrale/form.blade.php`, `app/Http/Controllers/centrale_controller.php` : champs Latitude / Longitude.
- `public/inc/haut.inc.php` : entrée de menu.
- `public/planning/index.php`, `public/planning_prev/index.php`, `public/planning_prev_reel/index.php` : bouton Carte.

## Limites connues

- Les coordonnées de chantier existantes sont parfois imprécises (valeurs entières, ou hors de France) : elles sont affichées telles quelles.
- La carte ne montre que les chantiers qui ont déjà un BL aujourd'hui, pas les commandes du jour pas encore livrées.
- Les tuiles OpenStreetMap demandent un accès Internet depuis le poste.

## Page plein écran, sans en-tête ni menus

- **Mise en page** : la vue `suivi_livraison/carte.blade.php` utilise `planning_laravel/layout.blade.php` à la place de `base.blade.php`, comme le Planning Laravel. Pas de `haut.inc.php` ni de menu.
- **Hauteur** : la page est en flex sur toute la hauteur de la fenêtre. La carte et le panneau des toupies prennent la place restante sous l'en-tête et la légende (au moins 450 px). Ils remplacent l'ancien `calc(100vh - 260px)`, qui tenait compte du menu.
- **Bouton « Plein écran »** : il utilise la Fullscreen API, comme le planning. Échap ou le même bouton pour sortir. La carte est redimensionnée (`invalidateSize`).
- **Nouvel onglet** :
  - l'entrée de menu **Suivi > Carte des livraisons** (`public/inc/haut.inc.php`) a `target="_blank"` ;
  - les boutons Carte des plannings ouvraient déjà un nouvel onglet ;
  - le bouton « Suivi de livraison » de la carte ouvre aussi un nouvel onglet, puisque la page n'a plus de menu.

## Couleurs des statuts alignées sur le suivi de livraison

Les statuts des toupies utilisent les couleurs des puces de légende de `suivi_livraison/index.blade.php`. Cela vaut pour les marqueurs, les badges du panneau, les info-bulles, la légende et les trajets en pointillé.

| Statut | Couleur | Texte |
|---|---|---|
| En préparation | `#adb5bd` | blanc |
| Chargement | `#0dcaf0` | foncé |
| En route | `#007bff` | blanc |
| Attente sur chantier | `#fd7e14` | blanc |
| Vidange | `#6f42c1` | blanc |
| Retour centrale | `#ffd400` | foncé |
| Non défini | `#6c757d` | blanc |
| Rentrée (propre à la carte) | `#28a745` | blanc |

Le texte est foncé sur les couleurs claires, pour rester lisible. La fonction `style_statut()` applique le fond et la couleur du texte.
