---
suivi: 1279
date: 2026-08-11
sujet: CIE — cie_lignes non lues au PATCH enregistrement
chantier: cie_compte_interentreprises
type: fix
statut: poussé
hash: e12b373b
fichiers:
  - app/Http/Controllers/DepotFactureController.php
  - resources/js/Pages/DepotFactures/DepotFactureSaisieForm.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1279_cie_lignes_non_postees.md
---

# SUIVI #1279 — `cie_lignes` stripées au PATCH d’enregistrement

## PROMPT ENVOYÉ

Enregistrement CIE refusé (« indiquer les répartitions (cie_lignes) ») alors que l’UI montre une ligne cochée (340,50 HT) et une reconstitution juste. Gardien `assertCieRetenueServeur` correct — ne pas l’assouplir. Commun Index (`use-ajax`) et Show.

## OBJET 1 — Écart nommé

### a) Front (déjà correct sur le brouillon)

`buildDraftPayload` poste :

- `cie_lignes: [{ repartition_id, montant_ht }, …]` depuis `cieLignes` (filtrées `checked` et montant > 0)
- `cie_montant_ht` = somme HT cochées
- `montant_cie` = TTC (form)

### b) Serveur attendu

Validation `cie_lignes` / `*.repartition_id` / `*.montant_ht` présentes dans **`depotFactureValiderValidationRules`** seulement.

`assertCieRetenueServeur` : si `montant_cie` ou HT > 0 et `cieLignesDepuisValidated` vide → 422.

### c) ÉCART (preuve)

**`depotDraftSaisieValidationRules` (PATCH `/depot-factures/{uuid}` et `/factures/comptabilisation/{uuid}`) ne whitelistait PAS `cie_lignes` ni `cie_montant_ht`.**

Laravel `$request->validate($rules)` ne renvoie que les clés des règles → ces champs sont **stripés** malgré le JSON front. `montant_cie` (whitelisté) reste → assert voit TTC > 0 + lignes vides → message exact constaté.

Dépôt 1230 engagé (`facture_id`) → `depotUpdateUrl()` route vers PATCH comptabilisation, mêmes règles draft.

### d) Autres champs CIE

| Champ | Front | Draft rules avant | Effet |
|---|---|---|---|
| `montant_cie` | oui | oui | survit → déclenche assert |
| `cie_montant_ht` | oui | **non** | stripé |
| `cie_lignes` | oui | **non** | stripé |
| `cie_montant_ttc` | n/a | n/a | non utilisé |

### e) Chemins d’enregistrement

| Chemin | Écran | cie_lignes avant | Structure | Corrigé |
|---|---|---|---|---|
| `saveDraftAjax` → PATCH depot / compta (`buildDraftPayload`) | Index + Show engagé | postées puis **stripées serveur** | `{repartition_id, montant_ht}` | **oui** (whitelist draft) |
| `saveDraftWithConfirm` → Inertia patch (`buildDraftPayload`) | Show non-ajax non engagé | idem | idem | **oui** |
| `buildValiderPayload` (valider / historique / envoi) | les deux | `...data` = `form.cie_lignes` **périmé** | pouvait poster `[]` | **oui** (override live) |
| Valider (règles `depotFactureValiderValidationRules`) | les deux | règles OK côté serveur | — | front aligné |

`assertCieRetenueServeur` / `CieService::syncPrelevementsPourDepot` : **inchangés** (sauf libellé message).

## OBJET 2–3

- Whitelist `cie_lignes` + `cie_montant_ht` dans `depotDraftSaisieValidationRules`.
- `buildCieLignesPayload()` + sync `form.cie_lignes` dans `syncMontantCieTtcDepuisLignes`.
- `buildValiderPayload` écrase les champs CIE depuis l’UI live.
- Message : « cochez au moins une opération due et saisissez le montant HT retenu sur chacune. »
- Toasts affichent `errors.cie_lignes`.

Après correctif, le refus « lignes manquantes » ne doit plus survenir si l’UI montre une ligne cochée (le payload arrive intact). Il reste légitime si montant CIE > 0 sans aucune ligne (requête forgée / bug UI).

## LEÇON

Un changement de contrat de charge utile (#1268 : `cie_lignes`) doit être reporté sur **toutes** les listes de règles de validation (`draft` / `patch` / `valider`), pas seulement sur le chemin testé à l’époque. Un champ posté mais non whitelisté est silencieux côté Laravel et se manifeste comme un refus métier trompeur.

## DÉPLOIEMENT

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

Vérification agent : **lecture de code** (Index + Show / chemins ajax). Pas d’écran réel.
