---
suivi: 1342
date: 2026-08-14
sujet: marches_programme_ligne_totaux
chantier: suivi_chantier
type: feat
statut: poussé
hash: ff2fdd6a
fichiers:
  - resources/js/Pages/Marches/Index.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1342_marches_programme_ligne_totaux.md
---

## PROMPT ENVOYÉ

SUIVI #1342 — ligne TOTAL en bas du tableau marchés programme
(`/programmes/{id}/marches`, ex. HERMIONE 36 marchés). Sommer Marché /
Total / Facturé / Reste (HT + TTC) sur les lignes affichées après
filtres. Ne pas recalculer côté serveur. Ne pas aligner de force avec
les KPI du haut.

## FICHES LUES

- `SUIVI_1069` — `Marches/Index.vue` (création) ; LEÇON intitulé : hors
  sujet ici, fichier identifié.
- `SUIVI_1218` — LEÇON : colonne / KPI « Reste » = `reste_a_regler_ht`
  déjà en payload ; **sommer ces valeurs**, ne pas changer la formule
  ni `recalculer()`.
- `SUIVI_1340` / `SUIVI_1341` — SIWI PDF / recherche commune : **non
  touchés**.
- Aucune fiche antérieure « totaux tableau marchés programme ».

## SYNTHÈSE

Ligne de pied PrimeVue (`ColumnGroup` `type="footer"`) sur
`resources/js/Pages/Marches/Index.vue`. Totaux = somme des champs déjà
présents sur `filteredMarches` (`montant_marche_ht`, `montant_total_ht`,
`total_facture_ht`, `reste_a_regler_ht` + TTC via `montantTtc` existant,
par ligne donc par `taux_tva`). Recalcul Vue quand onglet / recherche /
rubrique change.

Compteur `N marchés en cours · N marchés au total` conservé sous le
tableau. Colonnes non sommables (Réf. porte le libellé TOTAL, Rubrique,
Poste, Fournisseur, Avenant, Statut, Actions) vides. Avenant non sommé
(libellés). Marché à 0 € : ligne comptée, +0 €, pas de NaN
(`toMontant` + `Number.isFinite`).

KPI haut de page inchangés. Services financiers / `recalculer` /
`getBilan` non appelés.

### Écart KPI « ENGAGÉ TOTAL HT »

Formule KPI (`computeKpis`, non modifié) : Σ `montant_total_ht` des
marchés **hors résiliés**. Colonne Marché du tableau : Σ
`montant_marche_ht` des **lignes affichées** (filtre Tous = tous
statuts, sans avenants). Les deux totaux ne sont pas la même grandeur.
Chiffre d’écart programme 5 : MySQL local refusé ici (127.0.0.1:3306) ;
à coller en prod (voir DÉPLOIEMENT-TEST).

### Vérification écran

**NON faite** (MySQL local refusé, pas de session prod M365).

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php artisan optimize:clear && php artisan view:clear
php artisan journal:sync
```

Pas de migrate. Pas de `route:clear`.

Sur `/programmes/5/marches` (HERMIONE) :

1. Filtre Tous / En cours / Soldé / Résilié : noter nb de lignes et les
   4 totaux HT. Compteur global inchangé. Si 0 ligne (Soldé / Résilié),
   message « Aucun résultat » — pas de ligne TOTAL fantôme.
2. Recherche texte + filtre Rubrique : les 4 totaux doivent changer.
3. Marché 0 € (ex. MCH-2026-042) : ligne présente, totaux numériques
   (pas NaN).
4. Comparer TOTAL colonne Marché (filtre Tous) et carte ENGAGÉ TOTAL HT
   (2 879 775 €). **Noter l’écart, ne pas le corriger.**

Preuve locale 0 € / NaN (hors prod) :

```
{"marche_ht":100,"total_ht":120,"facture_ht":50,"reste_ht":70}
finite true
nb 3
```

(une ligne à 0 € + une ligne nulle/NaN n’introduisent ni NaN ni ligne
fantôme ; elles ajoutent 0.)

## LEÇON

Ne pas rapprocher la ligne TOTAL du tableau et les KPI du haut : le KPI
ENGAGÉ somme `montant_total_ht` hors résiliés ; la colonne Marché somme
`montant_marche_ht` des lignes visibles. Un écart n’est pas un bug de
la ligne de totaux.
