---
suivi: 1527
date: 2026-09-11
sujet: Modification d’une saisie historique
chantier: depot-factures / saisie-historique
type: feature
statut: poussé
hash: a836e26f
fichiers:
  - app/Support/SaisieHistoriqueEdition.php
  - app/Support/DepotRetenuesNv1Lock.php
  - app/Http/Controllers/ComptabilisationController.php
  - app/Http/Controllers/DepotFactureController.php
  - app/Http/Controllers/FactureController.php
  - tests/Unit/SaisieHistoriqueEdition1527Test.php
  - tests/Unit/SaisieHistoriqueEdition1527SourceTest.php
  - tests/Unit/DepotRetenuesNv1LockTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1527_modification_saisie_historique.md
---

# SUIVI #1527 — PHASE 2 : modification d’une saisie historique

## PROMPT ENVOYÉ

Lever la garde d’enregistrement mal placée (#1524). Saisie historique
modifiable sur tous ses champs. Droits COMPTA + Admin ERP + DG
(m365GroupNames brut). Remplacer le bandeau Sage, pas le supprimer.
Après save : upsertHistorique + collecter CP. Pas de reprise auto des
12. Pas de touche aux gardes Sage L133 / L422. Formulaire Vue #1525
non modifié.

## BASE GIT

HEAD local = `origin/main` = `cfca1159` (chore hash fiche #1526)
avant tout changement. Aucun rebase (déjà à jour). #1525 a touché
`DepotFactureController` + `DepotFactureSaisieForm.vue` ; #1526 n’a
touché aucun applicatif.

## FICHES LUES

- **#1524 LEÇON** — abort PATCH L218 protège l’enregistrement ERP, pas
  Sage. Lever B sans `upsertHistorique` écrit le JSON et laisse les
  états à 0 €. Impact : sync miroirs obligatoire au save.
- **#1522 LEÇON** — MRES RG payée lit `retenues_garantie`, pas le JSON.
- **#1525 LEÇON** — `lectureSeuleIntegrale` sur le formulaire ; ne pas
  y toucher. Impact : Enregistrer reste sur PATCH compta
  (`depotUpdateUrl`) → on lève L218 plutôt que de rerouter le Vue.
- **#1275 / #658** — post-`estComptabiliseeOuAuDela` = Admin ERP seul
  (Sage). Ne pas élargir ce cran ; exception locale historique.

## CHOIX — VOIE RETENUE

Neutraliser **uniquement** l’abort de `ComptabilisationController::update`
(ex-L218). Le front (#1525) envoie encore
`PATCH /factures/comptabilisation/{uuid}` dès que `facture_id` est posé
(`workflowDejaEngage`). Rerouter vers `PATCH /depot-factures/{uuid}`
aurait exigé de modifier `DepotFactureSaisieForm.vue`, interdit par le
lot.

Gardes Sage **inchangées** : `findDepotComptabilisation` L133,
`reponseSiComptaNonPretPourAction` L422. `estEligibleComptabilisation`
et `promouvoirPourComptabilisation` inchangés.

`update()` n’instancie pas `IntacctService` ; les miroirs RG/CP non plus.

## FIX

1. `SaisieHistoriqueEdition` — groupes brut, bandeau dédié, commentaire
   d’historique sans texte Sage.
2. `canEditDepot` / `applyDepotSaisieFromValidated` /
   `abortIfSaisieComptabiliseeVerrouillee` / `DepotRetenuesNv1Lock` :
   exception historique COMPTA+Admin+DG. Non-historique Sage : #658
   inchangé.
3. Bandeau via `propsBandeau` (payload serveur) : le Vue affiche
   `edit_override_admin_warning` sans modification de formulaire.
4. Après apply + `logHistoriqueIfSaisieChanged` : `upsertHistorique` +
   `collecter(..., 'cp')`. `normaliserRetenuesSelonPourcentagesMarche`
   reste inactif sur `STATUT_PAYE`.
5. Abort PATCH historique : 403 droits, plus 404 Intacct.

## DÉPLOIEMENT-TEST

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

Pas de migrate. Pas de `route:clear`. Pas de npm (aucun .vue).

1. Saisie historique payée, GS_COMPTABILITE → Enregistrer OK
2. RG 0 % → 5 % → états marché + plafond libération
3. Logs : aucun appel Intacct
4. Compte hors périmètre → 403 serveur
5. Facture Sage comptabilisée → bandeau #658 inchangé
6. Ligne `facture_historique` après modification

## LEÇON

Quand le formulaire est gelé (lot voisin), on corrige l’URL serveur
déjà tapée par le front plutôt que de rerouter le Vue. Un abort
« pas d’Intacct » sur PATCH données reste le piège #138 : le lever
sans rejouer `upsertHistorique` laisse MRES à 0 €.
