---
suivi: 1224
date: 2026-08-05
sujet: saisie facture — retenues masquées selon % marché
chantier: depot-factures
type: feature
statut: poussé
hash: cd03ffd0
fichiers:
  - resources/js/Pages/DepotFactures/DepotFactureSaisieForm.vue
  - app/Http/Controllers/DepotFactureController.php
  - tools/diag/preuve_depot_428_retenues_1224.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1224_depot_retenues_selon_marche.md
---

# SUIVI #1224 — Retenues saisie selon % marché

## PROMPT ENVOYÉ

Masquer RG / CP / OPC si le % marché est 0 ; CIE via `applicable_cie` poste
(fiable) ; Finitions toujours ; pénalités / cagnotte CIE inchangés. Zéro seulement
si dépôt encore modifiable (`workflow_modification` / #1189). Historique en
lecture seule sinon. Pas de flags RG/CP poste (#1223 NON FIABLE). Pas de caution.
Pas de migration. Après #1222.

## FICHES LUES

- `#1223` LEÇON : flags RG/CP non fiables → % marché ; eager load partiel #1184 ;
  pas de 422 dur ; zéro borné aux non-figés.
- `#1222` : 5 sous-cartes ; sérialisation absolue SaisieForm avec #1224.
- `#1191` / `#1193` : `peutSaisirRetenuesMarche` + assert hors marché (conservés).
- `#1189` : frontière `workflow_modification` / `can_edit`.

## SYNTHÈSE

### Mapping conditions

| Retenue | Condition affichage | Source valeur | Mise à zéro si masquée |
|---------|---------------------|---------------|------------------------|
| RG | `peutSaisirRetenuesMarche` && `marche.retenue_garantie_pct` > 0 (ou historique) | % marché / saisie | oui si modifiable |
| Compte prorata | idem + `compte_prorata_pct` > 0 | % marché / saisie | oui si modifiable |
| OPC | idem + `taux_opc_pct` > 0 | % marché / saisie | oui si modifiable |
| CIE (`montant_cie`) | `applicable_cie` poste (pas de case UI dédiée) | saisie / OCR | oui si modifiable |
| Finitions | toujours si `peutSaisirRetenuesMarche` | montant saisie | non (toujours proposée) |
| Pénalités | garde #1191 inchangée | pénalités marché | inchangé |
| Cagnotte CP / CIE | hors `v-if` retenues (#1191) | association | **inchangé** |

### Payload anti-#1184 (colonnes chargées)

**Marché** (`get` + map) : `id`, `programme_id`, `poste_budgetaire_type_id`,
`reference`, `intitule`, `fournisseur_id`, montants, `taux_tva`,
`retenue_garantie_pct`, `compte_prorata_pct`, `taux_opc_pct`,
`rg_complementaire_pct` (#1224), `statut`, dates, avancement, + dérivés
`poste_bilan_*`, `applicable_cie` (depuis poste).

**Poste du marché** (eager) :
`posteBudgetaireType:id,libelle,compte_comptable_id,applicable_cie` +
`compteComptable:id,accountno`.

### `rg_complementaire_pct`
Présent côté **marché / caution** (`useMarcheRetenuesParPoste`) — **pas** une
retenue de dépôt. Chargé dans le payload pour transparence. **Non utilisé** pour
masquer/afficher RG en saisie (seul `retenue_garantie_pct` compte).

### Caution bancaire × RG
Hors périmètre. Coexistence caution + « RG à venir » normale. Aucun code
`applicable_caution_bancaire` dans la règle d’affichage des retenues dépôt.

### Dépôt 428
Statut `rejete` → hors `depotRetenuesPeuventEtreNormalisees` / hors
`depotRetenuesModifiables`. Script lecture :
`php tools/diag/preuve_depot_428_retenues_1224.php` (avant/après OVH).

## LEÇON

Conditionner l’UI dépôt sur le % marché observable, pas sur les flags poste RG/CP
bruyants. Eager load explicite des colonnes nécessaires. Zéro soft serveur aligné
sur les statuts figés pour ne jamais rétrocéder un rejeté.
