---
suivi: 1822
date: 2026-10-07
sujet: Reste à payer engagé, retenues, refonte liste marchés et bilan
chantier: marches
type: correctif
statut: poussé
hash: b24649bc9
fichiers:
  - app/Support/MarcheVentilationReglement.php
  - app/Support/MarcheListeAvancement.php
  - app/Services/MarcheSyntheseFinanciereService.php
  - app/Services/BilanFinancierService.php
  - app/Http/Controllers/MarcheController.php
  - resources/js/Pages/Marches/Index.vue
  - resources/js/Pages/Bilan/Index.vue
  - tests/Unit/MarcheVentilationReglement1822Test.php
  - tests/Unit/BilanRestePayer1822SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
---

# SUIVI #1822 — reste à payer (engagé) + présentation bilan / liste marchés

## PROMPT ENVOYÉ

PHASE 2 après diagnostic #1821. Refonte des restes (R1–R8) sur Programme > Chantier > Marchés et Programme > Financier > Bilan. Nouveau reste à payer = Engagé − Payé − déductions définitives (CP+OPC+CIE+pénalités). Ancien reste à payer renommé « avec retenues ». Cartes KPI, colonnes, couleurs, pleine largeur bilan ≥1366 px. Ne pas casser marges, Dashboard, plafond #1295, DepotFacture, Marche::recalculer.

## Fiches lues

- #1821 (diagnostic, conversation) : localise MarcheVentilationReglement, MarcheController, BilanFinancierService, Index.vue marchés/bilan ; `montant_facture_en_attente` = NV1 total (double compte si sommé avec payé).
- #1801 LEÇON : reste à payer = facturé − payé − retenues ; sans plafond → reste à facturer 0.
- #1805 : colonnes retenues liste.
- Règle zones-communes : Marches/Index + BilanFinancierService sérialisés.

## SYNTHÈSE

### Constat R2 (brut)

Avant #1822, `montant_facture_en_attente` / `par_poste.facture` = somme NV1 complète (payés inclus). Le sommer avec `montant_facture_valide` (payé) aurait double-compté. Affichage historique « Facturé » montrait le NV1 seul, « Facturé Payé » le payé.

Correctif affichage : `montant_facture_en_attente` = max(0, NV1 − payé) ; `montant_facture` = payé + unpaid (+ HF/DM dans valide). `totaux_charges.facture_en_attente` reste le NV1 total pour `calculerMarges` (bandeau inchangé).

### Back

- `reste_a_payer_engage_ht` (R5) + `deductions_definitives_*` dans MarcheVentilationReglement ; `reste_a_payer_ht` (R7) inchangé.
- Cartes liste : Engagé, Facturé, Payé, Σ R5, Σ R7 — plus de « Reste à régler » sur cet écran.
- Bilan poste : facture, paye, restes, retenues, `delta_engage_etude_fi`, `couleur_ligne` ; sous-totaux = somme des postes.

### Front

- Marches/Index : 11 colonnes, 5 cartes, 3 dernières teintées, survol retenues, TTC conservé.
- Bilan/Index : 13 colonnes, suppression Facturé Payé / Bilan réel / Prévisionnel, Étude fi initiale « — », table-fixed pleine largeur, pas de sous-ligne TTC, `recomputeTotaux` sur `montant_engage`.

## DÉPLOIEMENT-TEST

1. `git pull origin main`
2. `php artisan optimize:clear` / `view:clear`
3. `php artisan journal:sync`
4. Manuel Robin : programme 6 LOU MARQUES — liste marchés + bilan, poste CONSTRUCTION - VRD.

## LEÇON

- Deux « restes à payer » coexistent : R5 (engagé) et R7 (facturé − retenues). Ne jamais réutiliser `reste_a_payer_ht` pour R5 — alias #1295 / plafond.
- `totaux_charges.facture_en_attente` ≠ colonne affichage unpaid : la clé marge garde le NV1 total.
- `recomputeTotaux` front ne doit jamais remplacer l’engagé par `montant_marche_signe` seul (budgets).
