# Table et fiche Badge (t_badge_bascule)

Table reprise du fichier `T_Badge.xlsx` (en-têtes seulement) et fiche liste + formulaire sur le modèle des fiches diverses.

## Fichiers ajoutés

| Fichier | Rôle |
|---|---|
| `database/migrations/2026_10_13_1330_V905001_NB_t_badge_bascule.php` | Création de `t_badge_bascule` |
| `app/Models/badge_bascule.php` | Modèle, `$timestamps = false`, tri sur `badge_bascule_code`, relations `lier_client`, `lier_chantier`, `lier_vehicule`, `lier_benne`, `lier_transporteur`, `lier_chauffeur`, `lier_zone`, `lier_produit` |
| `app/Http/Controllers/badge_bascule_controller.php` | `index`, `data_table`, `afficher_formulaire`, `enregistrer`, `supprimer` |
| `routes/web/badge_bascule.php` | Groupe `/badge_bascule` |
| `resources/views/badge_bascule/index.blade.php` | Liste (code, libellé, véhicule, benne, client, chantier, produit, transporteur, chauffeur, zone) |
| `resources/views/badge_bascule/form.blade.php` | Formulaire en surimpression |

## Structure de la table

`id_badge_bascule` (clé primaire), `client_id`, `chantier_id`, `vehicule_id`, `benne_id`, `transporteur_id`, `chauffeur_id`, `zone_id`, `produit_id` (integer, défaut 0, sans contrainte de clé étrangère comme le reste du projet), `badge_bascule_code` varchar(12) unique, `badge_bascule_libelle` varchar(50). Pas de `created_at` / `updated_at`.

## Recherche dans les zones de saisie

Même fonctionnement que la fiche commande (`resources/views/commande/commande_client.blade.php`) : zone de saisie + `datalist` + champ caché `xxx_id`. À partir de 2 caractères, la liste est alimentée en AJAX par la route `liste_groupe` de l'entité ; le choix d'une ligne renseigne l'id, une saisie libre remet l'id à 0. Pas de bouton de recherche (demandé).

Le code est factorisé dans une fonction JS `recherche_dans_saisie()` du formulaire. Le chantier est filtré sur le client choisi (comme dans la commande) et remis à zéro au changement de client.

Routes `liste_groupe` ajoutées pour l'occasion (méthode `liste_groupe` dans le contrôleur, calquée sur celle de la zone, 20 résultats max) :

| Route | Recherche sur |
|---|---|
| `vehicule.liste_groupe` (`vehicule_a_chercher`) | `Vehicule_Code`, `Vehicule_Libelle` |
| `transporteur.liste_groupe` (`transporteur_a_chercher`) | `transporteur_code`, `transporteur_libelle` |
| `chauffeur.liste_groupe` (`chauffeur_a_chercher`) | `chauffeur_code`, `chauffeur_nom`, `chauffeur_prenom` |
| `benne.liste_groupe` (`benne_a_chercher`) | `benne_code`, `benne_libelle` |

Client, chantier, zone et produit réutilisent les routes `liste_groupe` existantes.

`produit_controller::liste_groupe` filtrait toujours sur `centrale_id` (recherche d'article de la ligne de commande). Le filtre ne s'applique plus que si `centrale_id` est envoyé : la commande l'envoie toujours (comportement inchangé), le badge ne l'envoie pas et cherche dans tous les produits.

Produits limités aux **granulats** (`produit_type = 0`) : le badge envoie `produit_type: 0` à `produit.liste_groupe`, qui ne filtre sur le type que si ce paramètre est envoyé (la commande ne l'envoie pas, comportement inchangé). À l'enregistrement, `badge_bascule_controller::enregistrer` refuse un produit renseigné qui n'est pas un granulat (« Le produit doit être un granulat ! »).

## Autres

- Droits `profil_fichier_divers`, traçabilité « Badge », bouton Traçabilité filtré sur la fiche.
- `#affiche_badge_bascule` ajouté dans `public/inc/css/style.css`.
- Pas d'entrée de menu (demandé) : accès par l'URL `/badge_bascule`.
- La suppression d'une benne est refusée si elle est utilisée par un badge (voir `docs/t_benne_creation.md`).

## Tare véhicule / benne affichée dans le badge

- Zones Véhicule et Benne raccourcies ; à côté, la **tare** du véhicule / de la benne choisi(e), en lecture seule avec l'unité « t ». Elle n'est pas saisissable, pas envoyée à l'enregistrement, et **aucune colonne tare n'est ajoutée à `t_badge_bascule`**.
- La tare vient de la ligne choisie dans la recherche : `vehicule.liste_groupe` renvoie `vehicule_tare`, `benne.liste_groupe` renvoie `benne_tare`. La fonction JS `recherche_dans_saisie()` a un paramètre facultatif `au_choix(item)` appelé au choix d'une ligne (ou avec `null` si la saisie ne correspond à rien).
- À l'ouverture d'un badge existant, la tare est lue via `lier_vehicule` / `lier_benne`.

### Tare du véhicule (nouveau champ)

- Migration `2026_10_13_1400_V905001_NB_t_vehicule_vehicule_tare.php` : `t_vehicule.vehicule_tare` decimal(10,3), défaut 0, et `t_vehicule.vehicule_date_tare` date nullable.
- Fiche véhicule : champs « Tare » et « Date tare » (`resources/views/vehicule/form.blade.php`), validés `numeric|nullable|min:0` et `nullable|date` dans `vehicule_controller::enregistrer` ; tare vidée => 0, date vidée => NULL. Si le champ n'est pas envoyé (API BHP), la tare n'est pas modifiée.

### Tare de la benne en décimal

- `t_benne.benne_tare` passe de integer à decimal(10,3) (migration benne modifiée, non déployée ; rejouée en local, tables vides). Fiche benne : saisie au pas de 0,001, validation `numeric`.
