# Planning Laravel (Réel, Prévisionnel, Réel/Prév)

Portage Laravel des trois plannings legacy (`public/planning/`, `public/planning_prev/`, `public/planning_prev_reel/`), avec une interface refaite d'après la maquette validée. Les fonctionnalités et les règles métier sont celles du legacy.

## Accès

- Uniquement par l'URL : `/planning_laravel/reel`, `/planning_laravel/prev`, `/planning_laravel/prev_reel`, avec `?date=AAAA-MM-JJ` en option.
- Le menu et les boutons existants pointent toujours vers le legacy. Rien n'a été modifié côté legacy.
- Le préfixe `planning_laravel` évite le conflit avec le dossier physique `public/planning/`.
- Middleware : `auth:sanctum` + `interne`.

## Fichiers

| Fichier | Rôle |
| --- | --- |
| `routes/web/planning_laravel.php` | Routes |
| `app/Http/Controllers/planning_laravel_controller.php` | Véhicules, tours, fiche de détail, commandes, ajout et déplacement de tours, blocages |
| `resources/views/planning_laravel/index.blade.php` | Page : en-tête, filtres, calendrier, légende, tiroir des commandes, fenêtres |
| `resources/views/planning_laravel/script.blade.php` | JavaScript (FullCalendar v4 de `public/inc/planning/`) |
| `resources/views/planning_laravel/blocage.blade.php` | Fenêtre de blocage (Prévisionnel) |

## Routes

| Méthode | URL | Équivalent legacy |
| --- | --- | --- |
| GET | `/planning_laravel/{reel\|prev\|prev_reel}` | `index.php` |
| GET | `/planning_laravel/vehicules` | `vehicule*.php` (dont la création automatique des présences) |
| GET | `/planning_laravel/{type}/evenements` | `ordre_fabrication*.php` |
| GET | `/planning_laravel/description` | `description.php` (réel ou prév selon `source`) |
| GET | `/planning_laravel/commandes` | `liste_commande_table_tr.php` |
| POST | `/planning_laravel/{reel\|prev}/ajouter_commande` | `ajouter_commande*.php` |
| POST | `/planning_laravel/{reel\|prev}/modifier` | `modifier_planning*.php` |
| GET, POST, DELETE | `/planning_laravel/blocage` | `blocage_tour_affiche`, `_valider`, `_supprimer` |

Le double-clic sur un tour prévisionnel ouvre toujours la planification manuelle existante (`commande_laravel/commande_recherche?fiche_recherche=planification_commande_manuel&planning_prev=1`). La page fournit les éléments `#filtre`, `#rafraichir_planning_prev` et `#message` attendus par cette vue.

## Fonctionnalités conservées

- Filtres : date, heures de début et de fin, pas (2 à 30 min), recherche de véhicule, centrales.
- Liens vers Présence véhicule, Plan de charge et Carte, ouverts dans un nouvel onglet.
- Changement d'écran Réel / Prévisionnel / Réel-Prév en gardant la date.
- Véhicules :
  - un véhicule par ligne, s'il est présent à la date ;
  - regroupés par centrale de présence (ordre d'affichage du planning), puis par type de véhicule ;
  - les présences manquantes sont créées à l'affichage.
- Tours :
  - bandeau à la couleur du moyen de déchargement ;
  - barre des 4 phases (aller, attente, vidange à la couleur de la centrale, retour), avec 25/0/50/25 si les heures sont incohérentes ;
  - croix si un BL existe (réel) ou si « Of livré » est coché (prév) ;
  - bordure noire et verrou si le tour est réel ;
  - en Réel/Prév : prévisionnel en pointillés rouges à 50 % d'opacité, tout en lecture seule.
- Fiche de détail au clic : centrale, BL, commande, client, chantier, véhicule, chauffeur, 6 horaires, formule, services, quantité sur la quantité commandée, état.
- Glisser-déposer et redimensionnement (aussi par le début) :
  - mêmes recalculs d'heures ;
  - en prévisionnel, le chauffeur suit le véhicule ;
  - les blocages n'ont pas de phases ;
  - traçabilité `t_tracabilite_envoi` en réel.
- Dépôt d'une commande sur un véhicule (Réel et Prév). Mêmes contrôles qu'avant :
  - commande OF ou complète selon l'écran ;
  - quantité limitée à la capacité du véhicule ;
  - pas de chevauchement avec un autre tour du véhicule.
- Blocages (Prévisionnel) :
  - double-clic sur un véhicule pour en créer un, une ligne par jour de la plage ;
  - double-clic sur un blocage pour le modifier ou le supprimer ;
  - le type de blocage fixe la couleur.
- Commandes du jour :
  - filtre par centrale ;
  - heure en orange (départ dépassé), en rouge (livraison dépassée), en tomate (à confirmer) ;
  - pastille de position de compte, client comptant en bleu ;
  - badges Sous-centrale, Adjuvant/ajout, En cours, Soldée, « … à confirmer » ;
  - cubage Livré / Reste / Planifié.
- Actualisation automatique toutes les 5 minutes, et bouton Rafraîchir.

## Différences avec le legacy

- Toutes les requêtes passent par des paramètres liés. Le legacy concaténait `$_GET` et `$_POST` dans le SQL.
- **Client et chantier d'un tour réel** : ceux du BL, et à défaut ceux de la commande. Le legacy affichait un bandeau vide pour un tour non produit.
- **Couleur « heure à confirmer »** : elle s'affiche maintenant. Une faute de frappe la rendait invisible dans le legacy (`DT_confirmerHeureColor`).
- **Contrôles serveur ajoutés** :
  - un tour réel produit ne peut pas être déplacé ;
  - la suppression d'un blocage ne touche qu'une ligne de blocage.
- **Réordonnancement des lignes de commandes** : non repris, il n'était enregistré nulle part.
- **Code mort non repris** : le dépôt cassé du Réel/Prév et `modifier_planning_prev_reel.php`, qui était entièrement commenté.
- **Délai de la recherche de véhicule** : 0,8 s au lieu de 2 s.
- **Trait « maintenant »** sur l'heure en cours (`nowIndicator`).

## Documentation

`Architecture.md` : nouvelle section §6quaterdecies, et une entrée « véhicule absent d'un planning » dans l'aide-mémoire (§10).

## Vérifications faites

Script lancé sur la base locale avec un utilisateur connecté. Les écritures ont été annulées en fin de script.

- Les 3 pages répondent en 200.
- 46 véhicules et 103 tours le 14/09/2026.
- Fiche de détail, liste des commandes.
- Ajout et déplacement d'un tour réel, avec ses 2 lignes de traçabilité.
- Refus d'ajouter une commande OF en prévisionnel.
- Blocage sur 3 jours, déplacement et suppression.

**Affichage vérifié dans Chrome sans interface** : page de test hors session, avec les données réelles du 14/09/2026 injectées. On obtient 46 véhicules, 19 groupes centrale + type et 99 tours, sans erreur JavaScript.

**Non vérifié** : les interactions (glisser-déposer, redimensionnement, doubles-clics, fiche de détail), à tester dans le navigateur.

## Correctif après livraison : un seul véhicule affiché

- **Symptôme** : un seul véhicule s'affichait et le regroupement par type manquait.
- **Cause** : le rendu de la colonne « Véhicule » remplaçait tout le contenu de la cellule et supprimait l'icône d'expansion. FullCalendar (`SpreadsheetRow.updateExpanderIcon`, `resource-timeline/main.js`) plantait alors au premier véhicule et arrêtait l'affichage.
- **Correction** : seul le `.fc-cell-text` est remplacé ; les icônes d'indentation et d'expansion restent dans le DOM, masquées en CSS. Le groupe affiche toujours le type de véhicule, « Sans type » s'il n'est pas renseigné.

## Ajustement de la barre de filtres

- Le pas (2, 5, 10, 15, 30 min) est une liste déroulante (`#duree_interval`), et non plus une rangée de boutons.
- L'heure d'actualisation, Rafraîchir et Commandes sont sur la première ligne, à droite du filtre Véhicule. Les centrales passent sur la ligne suivante.

## Zone des centrales repliable

- Les centrales sont dans leur propre zone, sous la barre de filtres. Un clic sur l'en-tête de la zone la replie ou la déplie.
- L'en-tête rappelle le nombre de centrales affichées (« 4 / 5 affichées »). Si une partie seulement est cochée, il donne aussi leurs noms, ce qui reste lisible zone repliée.
- L'état replié ou déplié est retenu dans le navigateur (`localStorage`, clé `planning_laravel_centrales_masquees`).

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

- **Mise en page dédiée** : les trois écrans utilisent `resources/views/planning_laravel/layout.blade.php` à la place de `base.blade.php`, donc sans `haut.inc.php` ni le menu, comme les plannings legacy.
  - Elle charge jQuery 3.5.1, jQuery UI, Bootstrap 4.1, Font Awesome 5, `inc/css/style.css` et DataTables, utilisés par les vues chargées dans les fenêtres (planification manuelle).
  - Elle reprend le `#message` et la redirection en cas de session expirée (401 / 419).
  - Le lien Font Awesome n'a pas d'attribut `integrity` : avec celui de `haut.inc.php`, les icônes ne se chargeaient pas.
- **Bouton « Plein écran »** dans l'en-tête : il utilise la Fullscreen API du navigateur et masque aussi la barre d'adresse et les onglets. Échap ou le même bouton pour sortir. Le calendrier se redimensionne.
- **Hauteur du calendrier** : elle est relue à chaque redimensionnement (fonction `height`), au lieu de `'parent'`, figé au premier rendu.
- **Libellé de centrale dans la zone planning** : la ligne de groupe (centrale + type de véhicule) affiche aussi son libellé, centré, dans la partie planning. Ce n'est pas seulement dans la colonne Véhicules. FullCalendar crée cette cellule vide : `resourceGroupRender` la remplit juste après le rendu, en la retrouvant par la position de la ligne (classe `groupe-centrale-planning`).
- **Date en gros dans l'en-tête** : entre les onglets Réel / Prév et les liens (Présence véhicule…), la date affichée apparaît en gros, ex. « Mardi 23 juin 2026 » (`#date_entete`). Elle est mise à jour avec `#libelle_date` à chaque changement de date.
