---
suivi: 1287
date: 2026-08-12
sujet: marches_etats_retenues
chantier: marches_compta
type: fix
statut: poussé
hash: 94c06eb9
fichiers:
  - app/Services/FactureStatutService.php
  - app/Services/MarcheRetenuesEtatsService.php
  - app/Services/MarcheSyntheseFinanciereService.php
  - app/Services/CieService.php
  - app/Http/Controllers/MarcheController.php
  - resources/js/Pages/Marches/Show.vue
  - resources/js/Components/Marches/MarcheSyntheseFinanciere.vue
  - tools/diag/verif_etats_retenues_1287.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
---

## PROMPT ENVOYÉ

FIX + harmonisation : deux états de retenue (Retenue / En cours de prélèvement) ; Synthèse réutilise les cumuls de Retenues & Pénalités ; plus de fausse DIVERGENCE sur lignes comptables vides. Suite #1284. Aucune migration.

## SYNTHÈSE

### Deux états (frontière code)
- **Retenue** : `FactureStatutService::estPayee` (`paye` / `payee` / `paiement_confirme` via normalize).
- **En cours de prélèvement** : `estAuDelaDeNv1Inclus` et non payée (NV1 inclus → payée exclusive).
- **Exclu** : `rejete` / `archive` (`estExcluDesRetenues`) ; avant NV1 aussi exclu des deux états.
- Source unique : `FactureStatutService::etatRetenue` — pas de liste de statuts recopiée dans Show / Synthèse / CIE.

### Service unique
`MarcheRetenuesEtatsService::pourMarche` alimente l’onglet Retenues & Pénalités et `cumuls_retenus` de la Synthèse (option A Robin).

### Correction conclusion #1263
Les écritures « figées » dans `ocr_raw.saisie.lignes_comptables` sont fiables pour les dépôts comptabilisés par l’ERP. **Faux pour les dépôts repris d’historique** (ex. dépôt 336 payé) : squelette de lignes à null → extracteur à zéro → fausse DIVERGENCE. #1287 ne compare que si au moins un montant non nul ; sinon « écritures non renseignées ». La RG marché 32 est bien retenue dans les cumuls : pas de défaut comptable métier. Défaut séparé signalé (ligne vide enregistrée) — non corrigé ici.

### CIE (OBJET 1e)
`cie_prelevements.statut=encaisse` n’est jamais écrit. **Fait foi : statut du dépôt porteur** via `CieService::depotPorteurEstEncaisse` → `FactureStatutService::estPayee`. Vocabulaire aligné Retenue (= encaissée) / En cours.

### Anomalies exposées (sans correction)
- Marché 32 : RG au-delà du théorique (~9 980 €) — alerte chiffrée.
- MCH-2026-060 : pénalités > HT facture — alerte.
- Centime CP SIT-05 : arrondi, mention seule.

### Ouvert
- Ligne comptable vide enregistrée dans le dépôt (saisie) — à traiter ailleurs.
- Libération des RG non modélisée dans l’ERP.

## DÉPLOIEMENT-TEST

1. `git pull origin main`
2. `php artisan optimize:clear` / `view:clear`
3. `php artisan journal:sync`
4. Écrans marché 109 / 32 / MCH-2026-060 (tests Robin listés au prompt)
5. `php -d display_errors=1 tools/diag/verif_etats_retenues_1287.php`

## LEÇON

Ne jamais recalculer en parallèle un cumul déjà produit par un autre onglet : divergence de périmètre déguisée en bug de formule. Les frontières d’état passent par un service de statuts unique. Ne pas traiter un squelette JSON (tous null) comme des écritures figées.
