---
suivi: 1349
date: 2026-08-14
sujet: marches_colonne_paye
chantier: suivi_chantier
type: feat
statut: poussé
hash: 6ea63736
fichiers:
  - resources/js/Pages/Marches/Index.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1349_marches_colonne_paye.md
---

## PROMPT ENVOYÉ

SUIVI #1349 — ajouter UNE colonne « Payé » en dernière position des
colonnes monétaires du tableau marchés programme (après « Reste à
facturer »). Même format HT/TTC. Sommer dans la ligne TOTAL #1342 sur
les lignes affichées. Établir d’abord si le payé est déjà dans le
payload. Pas de « Reste à payer ». Pas de nouveau calcul. Pas de N+1.

## FICHES LUES

- `SUIVI_1347` — LEÇON : « Reste à facturer » = actualisé − facturé
  (affichage), pas `reste_a_regler_ht`. Conservé tel quel. Ligne
  cliquable / survol / `groupedMarches` / `sort-mode="multiple"`
  intacts. Mapping colonnes repris + 8e colonne Payé.
- `SUIVI_1342` — LEÇON : ne pas aligner TOTAL tableau et KPI du haut.
  Footer HT+TTC, somme de `filteredMarches`. Étendu : `paye_ht` /
  `paye_ttc` via `total_paye_ht` déjà en payload.
- `SUIVI_1343` — LEÇON : payé liste = `totauxHtDepotsListeMarches`
  (batch) puis `transformMarche`. KPI haut = autre formule
  (`sommeMontantHtDepotsProgramme` + reprise programme). Écart attendu,
  ne pas corriger.
- `SUIVI_1344` — `enrichirTotauxListeMarches` ajoute déjà la reprise au
  `total_paye_ht` de liste. Aucun PHP métier touché ici.
- `SUIVI_1069` / `SUIVI_1218` — fichier identifié ; formules reste hors
  sujet.
- `SUIVI_1340` / `SUIVI_1341` — non touchés.

## SYNTHÈSE

Champ **déjà dans le payload** : `total_paye_ht`
(`MarcheController::transformMarche` L3198, alimenté par
`totauxHtDepotsListeMarches` en une requête pour toute la liste,
puis `enrichirTotauxListeMarches`). Lot **100 % front**. Aucune classe
PHP modifiée. Clause d’arrêt non déclenchée.

### Mapping colonnes

| En-tête affiché | Champ payload | Sommée |
|---|---|---|
| Réf. | `reference` | N |
| Rubrique | `poste_rubrique_libelle` | N |
| Poste | `poste_bilan_libelle` | N |
| Fournisseur | `fournisseur.nom` | N |
| Marché + Avenant | `montant_total_ht` | O |
| Facturé | `total_facture_ht` | O |
| Reste à facturer | calcul front `montant_total_ht − total_facture_ht` | O |
| Payé | `total_paye_ht` (déjà en payload) | O |

Format Payé = `formatEuros` HT + `montantTtc` TTC gris (existants).
`toMontant` : 0 € (ex. MCH-2026-042) → 0, pas NaN.

### KPI vs TOTAL colonne

KPI « PAYÉ À DATE HT » = `kpis.total_paye_ht` =
`sommeMontantHtDepotsProgramme(PAYE+VALIDE)` + reprise programme
(tous dépôts du programme, indépendamment des filtres tableau).

TOTAL « Payé » = Σ `total_paye_ht` des **lignes affichées**.

Ce ne sont pas les mêmes grandeurs. Ne pas les aligner.

### Preuve chiffres (MySQL local)

127.0.0.1:3306 refusé. MariaDB :3307 `erp_immo` = stub (pas de
`marches`). `erp_immo_migrate_1113` : 3 programmes / 1 marché / 0
dépôt. Payé HT de 3 marchés (dont MCH-2026-029), TOTAL colonne,
écart vs 2 052 736 €, et lignes payé > facturé : **à coller en prod**.

SQL AVANT / APRÈS : identique (aucun PHP). Pas de N+1 : le batch
`totauxHtDepotsListeMarches` existait déjà.

Ligne cliquable + survol #1347 : `onMarcheRowClick` / `marcheRowClass`
non modifiés.

## 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, filtre Tous) :

1. Colonnes : Réf., Rubrique, Poste, Fournisseur, Marché + Avenant,
   Facturé, Reste à facturer, **Payé** (dernière monétaire).
2. Noter le payé HT de 3 marchés dont MCH-2026-029.
3. TOTAL Payé (lignes affichées) vs KPI « PAYÉ À DATE HT »
   (2 052 736 €) : noter l’écart, ne pas corriger.
4. Signaler toute ligne où Payé > Facturé (anomalie métier, pas un
   fix de ce lot).
5. MCH-2026-042 : 0 €, pas NaN, pas de ligne fantôme.
6. Clic ligne → fiche ; survol → fond teinté + pointer.
7. Onglets / recherche / Rubrique : TOTAL Payé suit les lignes
   visibles.

## LEÇON

`total_paye_ht` était déjà dans le payload liste (`transformMarche` +
batch dépôts). Un KPI de haut de page n’implique pas l’absence du
champ ligne : vérifier le payload avant d’ouvrir un service financier.
Le TOTAL de colonne (lignes filtrées, agrégat liste + reprise par
marché) n’a pas à égaler « PAYÉ À DATE HT » (somme dépôts
`programme_id` brute + reprise programme).
