---
suivi: 1750
date: 2026-09-30
sujet: Couleur des lignes et tri bilan de la liste des marchés
chantier: programmes
type: evolution
statut: poussé
hash:
fichiers:
  - app/Support/MarcheListeAvancement.php
  - app/Http/Controllers/MarcheController.php
  - resources/js/Pages/Marches/Index.vue
  - tests/Unit/MarcheListeAvancement1750Test.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1750_marches_couleurs_tri_bilan.md
---

# SUIVI #1750 — Marchés : couleurs et ordre du bilan

## PROMPT ENVOYÉ

Sur Programme → Chantier → Marchés, colorer toute la ligne selon l'avancement (marché HT à 0 : blanc ; dépassement facturé ou payé : orange très pâle ; payé = marché à 1 € : vert ; facturé = marché et payé inférieur : bleu). Tri par défaut : rubrique puis poste dans l'ordre du bilan, fournisseur alphabétique, référence. Clic sur Rubrique ou Poste : cet ordre, pas l'alphabet. Filtre Rubrique dans l'ordre du bilan. Calcul serveur, le front applique la clé et l'ordre reçu.

## FICHES LUES

- #1347 : colonnes et ligne cliquable. Les montants de colonnes ne sont pas recalculés ici.
- #1349 : `total_paye_ht` est déjà dans le payload liste. La couleur le lit, elle ne le recalcule pas.
- #1749 : la liste fournisseurs du dialogue de création. Non touchée.

## CONSTAT

- Requête liste : `MarcheController::indexProps` (`app/Http/Controllers/MarcheController.php` ligne 94). Eager load `marches` ligne 97, `orderBy('reference')` ligne 107. Pas de GROUP BY.
- Marché + avenant HT : `transformMarche` ligne 3197, `montant_total_ht` = montant du marché + avenants signés ou en cours.
- Facturé HT : ligne 3200, `total_facture_ht` du lot de dépôts (`totauxHtDepotsListeMarches`, ligne 117).
- Payé HT : même lot, clé `total_paye_ht`, recopié ligne 3244.
- Ordre nomenclature : table `rubriques_bilan`, colonne `ordre` (`database/migrations/2026_05_04_133836_create_rubriques_bilan_table.php` ligne 18). Postes : `postes_budgetaires_types.ordre_affichage` (`database/migrations/2026_04_18_100100_create_postes_budgetaires_types_table.php` ligne 27).
- Tri d'avant : SQL par `reference` (ligne 107), puis DataTable sur les libellés `poste_rubrique_libelle` / `poste_bilan_libelle`. Filtre Rubrique : `localeCompare` dans `Marches/Index.vue`.

## SYNTHÈSE

`MarcheListeAvancement` décide `couleur_ligne` (`orange`, `vert`, `bleu` ou null) avec une tolérance de 1 €, et compare les lignes. `indexProps` trie la collection en PHP (rubrique, poste, fournisseur, référence). Le tableau applique la classe et trie Rubrique / Poste sur `rubrique_ordre` / `poste_ordre`. Légende sous le tableau.

Écran unique : `SuiviChantier/Index.vue` importe `Marches/Index.vue`. Compte de prorata et CIE ont leurs propres tableaux : inchangés. Fiche marché : inchangée. Cartes, onglets, recherche, montants : inchangés.

## DÉPLOIEMENT-TEST

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

1. MCH-2026-001 (payé 1 463 189 / marché 1 890 000, facturé ni égal ni au-dessus) : ligne blanche.
2. Un marché payé au montant : vert. Facturé au montant, payé en dessous : bleu. Facturé ou payé au-dessus de plus de 1 € : orange. Marché à 0 € : blanc.
3. Rubriques dans l'ordre du bilan, postes dans cet ordre à l'intérieur, fournisseurs A à Z dans un même poste.
4. Filtre Rubrique dans le même ordre. Clic sur Rubrique ou Poste : croissant / décroissant sur cet ordre.

## LEÇON

La couleur ne se recalcule pas dans le `.vue` : une clé serveur, une classe. Le tri alphabétique des libellés (« 10 » avant « 2 ») n'est pas l'ordre du bilan : ce sont `rubriques_bilan.ordre` et `postes_budgetaires_types.ordre_affichage`. Le tri PHP sur la collection déjà chargée évite un GROUP BY sous `only_full_group_by`.
