# Checksum sur le transfert des formules

Contrôle de cohérence entre l'en-tête formule et sa composition, dans les deux sens de transfert.

**Checksum** = somme des `composition_quantite` de la variante active, pour la formule et la centrale, en millièmes (`round(q*1000)` sur chaque ligne), complétée par des zéros à gauche sur 10 caractères.
Exemple : 850 kg + 320 kg → `0001170000`.

## Web → centrale (extraction)

`public/trans/action_trans_formule.php?action=extraction` ajoute en **dernière position** du JSON la clé `formule_checksum`.
La centrale l'ajoute en fin de trame formule, recalcule la somme des lignes reçues de `action_trans_formule_composition.php?action=extraction` et rejette la formule si les deux valeurs diffèrent.

## Centrale → web (intégration)

1. `action_trans_formule.php?action=integration` avec le nouveau paramètre `checksum` (10 caractères, encodé en JSON comme les autres paramètres).
   - Le checksum est stocké dans `t_formule_detail.formule_checksum_attendu`, avec le statut `ATTENTE`.
   - Les traitements du groupe centrale formule sont **différés** : pas de suppression des compositions des autres centrales, pas de mise à jour de leur `t_formule_centrale`.
2. `action_trans_formule_composition.php?action=integration`, une fois par ligne, sans changement côté centrale.
   - Si le statut vaut `ATTENTE`, la ligne n'est enregistrée que pour la centrale source : pas de recopie vers le groupe, pas de `t_tracabilite_envoi`.
3. **Nouveau** `action_trans_formule_composition.php?action=controle_checksum` (`code_formule`, `code_centrale`), appelé par la centrale après la dernière ligne.
   - OK : statut `OK`, puis `propager_formule_groupe_centrale()`. Pour chaque centrale du groupe : mise à jour de `t_formule_centrale`, remplacement de la composition par celle de la source, et **une seule** `t_tracabilite_envoi` par centrale (l'ancien fonctionnement en créait une par ligne).
   - KO : statut `KO`, réponse `erreur=1` avec les valeurs attendue et calculée. **Aucune recopie ni renvoi automatique vers les autres centrales** : leurs compositions restent intactes.
   - Réponse JSON : `message`, `erreur`, `checksum_attendu`, `checksum_calcule`.

**Compatibilité** : si le paramètre `checksum` n'est pas envoyé (ancien client centrale, `public/cbao/integrer_cbao.php`), le fonctionnement historique reste identique : recopie ligne par ligne, statut `NULL`.

## Fichiers

- `database/migrations/2026_09_29_1000_V905000_NB_t_formule_detail_formule_checksum.php` : ajoute `formule_checksum_attendu` varchar(10) et `formule_checksum_statut` varchar(10) (NULL / ATTENTE / OK / KO) à `t_formule_detail`.
- `public/inc/fonction.inc.php` : `calculer_checksum_composition()`, `formater_checksum_composition()`, `propager_formule_groupe_centrale()`.
- `public/trans/action_trans_formule.php` : paramètre `checksum` en intégration, `formule_checksum` en extraction.
- `public/trans/action_trans_formule_composition.php` : recopie groupe conditionnée, nouvelle action `controle_checksum`.
- `helpers/Modele_helpers.php` : propriétés ajoutées sur `formule_detail`.

## À faire côté programme centrale

- Envoi : ajouter `checksum` à la trame formule, puis appeler `controle_checksum` après les lignes de composition et traiter `erreur=1`.
- Réception : lire `formule_checksum` et comparer avec la somme des lignes reçues.

## Tests réalisés (base dev, formule temporaire ZZCHK01, centrales 01/07 mises en groupe puis remises à 0)

- Checksum OK : composition recopiée sur la centrale 07, 1 `t_tracabilite_envoi`.
- Checksum KO (une ligne à 321 kg au lieu de 320) : statut KO, centrale 07 inchangée, aucune nouvelle `t_tracabilite_envoi`.
- Sans checksum : fonctionnement historique conservé.
- Extraction : dernière clé `formule_checksum = 0001170000`.
