# PDF pesées V2 (calcul basé sur ImpPesee.cls)

## Contexte

Le PDF des pesées existant (bouton "Pdf" sur `resources/views/pesee/index.blade.php`) est généré par
`pesee_pdf_service::construireHtml2Pdf()` + `resources/views/pesee/pdf.blade.php`.

Un nouveau bouton "PdfV2" a été ajouté pour reproduire fidèlement la logique de calcul de l'ancienne
classe VB6 `ImpPesee.cls` (module d'impression des pesées d'un autre programme), fournie en référence
(`ClassPusImpPesee.cls` / fonction `PUFimppes`). Les champs de la base de l'ancien programme
(`Tconsommations`, recordset VB6) ne correspondent pas un à un aux colonnes actuelles de `t_pesee` ; le
mapping a été déduit du code existant de `pdf.blade.php` (déjà une adaptation partielle de cette
logique) et de la lecture du VB6.

## Fichiers ajoutés / modifiés

- `app/Services/pesee_pdf_service_v2.php` (nouveau) — mêmes requêtes que `pesee_pdf_service`, plus le
  calcul du volume réel total des gâchées (`totalGacheeVolumeReelle`).
- `resources/views/pesee/pdf_v2.blade.php` (nouveau) — copie de `pesee/pdf.blade.php` avec les 3
  corrections ci-dessous.
- `app/Http/Controllers/pesee_controller.php` — méthode `imprimer_pdf_v2()`.
- `routes/web.php` — route `pesee.imprimer_pdf_v2` (`/pesee/imprimer_pdf_v2/{bl_id}`).
- `resources/views/pesee/index.blade.php` — bouton "PdfV2" à côté du bouton "Pdf" existant.

## Écarts de calcul corrigés par rapport à `pdf.blade.php` (v1)

1. **Consigne formule / masse volumique théorique** : v1 récupère la première ligne `t_pesee` (type
   0 ou 1, sans tri) pour la consigne d'un produit, et ne la compte que si elle est de type 0 — sinon
   0. Dans `ImpPesee.cls` (`initcolonne`), la consigne théorique d'une colonne n'est **jamais** initialisée
   depuis une ligne `type_donnee=1` (ajout manuel) ; seules les lignes `type_donnee=0` en portent une.
   V2 filtre donc explicitement `pesee_type_donnee = 0` pour cette valeur.
2. **Diviseur des lignes "Totaux" et "moyenne"** : v1 divise par `bl_qte_livraison` (volume **prévu**
   du BL). `PUFimppes` divise par `TotalGachee`, le volume **réellement exécuté**, cumulé gâchée par
   gâchée (avec priorité à la donnée de fin anormale `type_donnee` 6/7 sur la donnée normale
   `type_donnee` 4 pour une même gâchée). V2 calcule ce volume réel (`totalGacheeVolumeReelle`) et
   l'utilise comme diviseur. Sur une production normale sans écart, ce chiffre est identique à
   `bl_qte_livraison` ; il diverge en cas de fin anormale de production ou d'écarts de gâchées.
3. **Une colonne par produit** : la requête `$produits` (distinct sur `pesee_type_donnee`, `pesee_consigne`…)
   créait une 2e colonne pour un même produit dès qu'il avait un dosage manuel (`type_donnee 1`) —
   typiquement une colonne EAU en double, qui doublait aussi les totaux "+/-" et "HYGR" et la masse
   volumique. V2 dédoublonne sur `produit_formule_id` (ligne `type_donnee 0` prioritaire), comme
   `ImpPesee.cls` qui ne crée les colonnes que sur les lignes `type_donnee=0`.
4. **Ajouts** : un produit introuvable dans `t_produit` (ou dont `pesee_type_produit = 5`) est recherché
   dans `t_ajout` (`id_ajout = produit_formule_id`). Il est affiché avec le type "AUTRE2" (libellé VB6)
   et `ajout_code_execution` (ou `ajout_code`), unité toujours en kg. Un produit introuvable dans
   `t_produit` comme dans `t_ajout` est affiché avec le type "AUTRE". Auparavant ces colonnes
   n'avaient pas de code et héritaient par erreur du libellé de type de la colonne précédente
   (ex. "ADJUV").
5. **Masse volumique pondérée** (`PRSCalcDensité`) : coefficient 1 par défaut, `produit_densite` pour
   un adjuvant compté en litres (`pesee_no_voie >= 9`), 0 pour un ajout. Appliqué à la ligne
   théorique, à la ligne totaux et à la ligne moyenne. Arrondi à 1 décimale.
6. **Décimales** (alignées sur l'impression de référence) : adjuvants et ajouts à 2 décimales, eau à
   1 décimale (consignes, résultats, totaux, moyennes), colonne HYGR à 1 décimale.

La colonne "+/-" (`pesee_data_2`) et la colonne "HYGR" (`pesee_data_1` du produit eau) gardent les
intitulés de l'impression de référence de l'ancien programme.

Le reste de la logique (hygrométrie par granulat, écarts par produit, siccité, marqueur hors-tolérance
`#`) était déjà conforme à `ImpPesee.cls` et n'a pas été modifié.

## Vérifications effectuées

- Lint PHP (`php -l`) sur le service et le contrôleur : OK.
- Compilation Blade (`Blade::compileString`) + `php -l` sur `pdf_v2.blade.php` et `index.blade.php` :
  OK (un commentaire Blade `{{-- --}}` placé par erreur dans un bloc `@php` a été corrigé en
  commentaire PHP).
- Génération réelle du PDF via `pesee_pdf_service_v2::construireHtml2Pdf()` sur un BL existant
  (`bl_id=154022`) : OK, aucune erreur à l'exécution.

- Comparaison V1/V2 sur le BL local 151805 (dosage manuel d'adjuvant) : colonne PLAS25 en double
  supprimée, masse volumique 2369,2 kg/m3 (= 2367,621 + 1,322 × 1,18) au lieu de 2370,3 (adjuvant compté
  deux fois en V1).

## Points à valider

- Comparaison faite avec une impression de référence de l'ancien programme (BL C27014369, base de
  production queguinerbeton.myalfi-connect.com, non accessible en local).
- Recherche dans `t_ajout` : non testée sur un vrai ajout (aucun en base locale). Hypothèse :
  `produit_formule_id` contient `id_ajout` pour ces lignes.
- Écart restant avec la référence, non traité : ligne "absorption/eau th%" absente.
