---
suivi: 1276
date: 2026-08-11
sujet: Droits modification dépôt R1-R6 + CIE motif / dues
chantier: depot-factures
type: feature
statut: poussé
hash: 22125c37
fichiers:
  - app/Http/Controllers/DepotFactureController.php
  - resources/js/Pages/DepotFactures/DepotFactureSaisieForm.vue
  - tools/diag/verif_droits_modification_1276.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1276_droits_modification_depot.md
---

# SUIVI #1276 — Droits modification dépôt (R1–R6) + CIE

## PROMPT ENVOYÉ

Phase 2 après diag #1275. Aligner `canEditDepot` sur `FactureValidationPermissions::canValidateNiveau` (NV1/NV2). Motif CIE jamais muet. Pas de code AdminERP (R3 déjà OK). R4 = `a_comptabiliser` sans élargir post-Sage.

## R1–R6

Voir prompt (acquis Robin). R6 : pas de repartition NV1 ; historisation obligatoire.

## OBJET 1 — Case CIE grisée (analyse)

Ordre d’exécution attendu : montage form → props (`depot`, `readonly`, marche/fournisseur hydratés) → `watch([marche_id, fournisseur_id, uuid], {immediate})` → `refreshCieDues` → HTTP `cie-retenue-dues` → `cieLignes` → `cieCaseActivatable`.

| Hypothèse | Verdict | Preuve |
|---|---|---|
| a) watch / appel ne part pas | **possible partiel** | Early-return si `!uuid` ou `!peutSaisirRetenuesMarche` ou marche/fournisseur absents au 1er tick ; le watch **re-fire** quand les ids arrivent. Instrumentation `cieDuesDiag.phase=skipped` + détail. |
| b) appel échoue (403 CIE read web) | **possible** (pas pour Lahouari GS_ENVOL en théorie) | `authorizeCieRead` L4684 ; CLI ≠ web. Diag affiche HTTP + message. |
| c) mapping `dues` | **écartée si HTTP 200** | Contrôleur renvoie `dues` ; front lit `data.dues`. Diag `n` lignes. |
| d) `depotRetenuesModifiables` faux alors que RG éditable | **RETENUE (cause structurelle)** | RG/CP : `:disabled="readonly \|\| …"`. Index : `readonly = (can_edit === false)` (**racine**). Ancien `depotRetenuesModifiables` exigeait `depot.can_edit === true` **ou** `can_enregistrer` **ou** `!workflowDejaEngage`. Si divergence → `cieCaseActivatable` short-circuit **avant** `cieLignes.length` (L3850) → case grisée **même avec dues**. |
| e) `isCieHistorique` à tort | **écartée si montant_cie=0** | Exige `!depotRetenuesModifiables && montant_cie>0.009`. Diag 1230 : montant_cie=0. |

**Correctifs** : simplifier `depotRetenuesModifiables` = `!readonly` hors statuts figés ; ne plus forcer `showCIE=false` dans `syncMontantsMarchePanelsSansMarche` si dues présentes ; bandeau `cieDuesDiag` + motifs toujours visibles.

## OBJET 2 — Silence

`cieCaseMotif` : plus jamais `''` pendant loading / erreur / non-modifiable / non-activable. Ligne diag HTTP + n lignes.

## OBJET 3 — `canEditDepot`

Réutilise `FactureValidationPermissions::canValidateNiveau`. Supprime `return false` NV2. NV1 : déposant + validateur désigné + canValidateNiveau.

### Tableau (théorique / conforme R1–R4)

Légende : A=avant, P=après, Δ=change, R=conforme R1–R4. Profils : Dep=déposant, V1, V2, Resp=responsable programme, C=GS_COMPTABILITE, Adm=GS_ADMIN_ERP, L=lambda.

| statut | Dep | V1 | V2 | Resp | C | Adm | L |
|---|---|---|---|---|---|---|---|
| depose/analyse/en_cours | A oui / P oui | A oui* / P oui | A non / P non | A non† / P non | A oui / P oui | A oui / P oui | A non / P non |
| en_validation_nv1 | A oui / P oui | A étroit‡ / **P=canValidate Δ** | A non / P non | A non / **P si canValidate Δ** | A oui / P oui | A oui / P oui | A non / P non |
| en_validation_nv2 | A non / P non | A non / P non | A **non** / **P oui Δ** | A non / P non | A oui / P oui | A oui / P oui | A non / P non |
| a_comptabiliser | A non§ / P non | A non / P non | A non / P non | A non / P non | A oui / P oui (R4) | A oui / P oui | A non / P non |
| comptabilisee/paye | A non / P non | A non / P non | A non / P non | A non / P non | A non / P non | A oui / P oui | A non / P non |
| rejete | A non§ / P non | … | … | … | A oui / P oui (existant) | A oui / P oui | A non / P non |

\* via `utilisateurEstValidateurDesigneDepot` en brouillon.  
† sauf si aussi V1 désigné.  
‡ email colonne strict avant.  
§ sauf déjà C/DG/Adm.

**R3** : aucun code ajouté. **R4** : C déjà autorisé via `array_intersect(GS_COMPTABILITE)` avant les branches NV ; **rien ajouté**, frontière post-compta déjà `estComptabiliseeOuAuDela`.

## OBJET 5 — Changement de marché + CIE

`syncPrelevementsPourDepot([], …)` **annule** les prélèvements actifs du dépôt. Au save après changement de marché sans nouvelles `cie_lignes`, les anciens prélèvements sont annulés. **Arbitrage restant** : faut-il un confirm UI explicite avant save si prélèvements existent et marché change ? Non tranché (comportement serveur déjà géré). Enveloppe / `sans_marche` : inchangé (`peutSaisirRetenuesMarche`, `assertRattachementProgrammeBudgetValide`).

## OBJET 6 — Chemins d’écriture saisie

| Chemin | Historise |
|---|---|
| `DepotFactureController::update` → `applyDepotSaisieFromValidated` | **oui** `logHistoriqueIfSaisieChanged` |
| `applyDepotModificationEngageeDepuisRequete` (Enregistrer / Valider engagé) | **oui** |
| `ComptabilisationController::update` | **oui** |
| `valider` (envoi NV1, écriture ocr_raw dédiée) | **oui** via `logHistorique('envoye_nv1'|…)` (pas le diff saisie) |
| `validerHistorique` | **oui** actions dédiées |

Aucun chemin `applyDepotSaisieFromValidated` sans historisation — **rien à brancher de plus**.

## LEÇON

Deux sources de « modifiable » (readonly vs depotRetenuesModifiables) cassent CIE alors que RG passe. Court-circuiter `cieCaseActivatable` avant les dues masque 592,50 € dus. Soft-delete CIE : toujours joindre `cie_operations.deleted_at IS NULL`.

## Vérification

**Lecture de code** + build local. **Pas d’écran réel ERP** dans cette session — tests Robin obligatoires (liste prompt).

## DÉPLOIEMENT

```bash
git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan journal:sync
php -d display_errors=1 tools/diag/verif_droits_modification_1276.php
```
