---
suivi: 1260
date: 2026-08-07
sujet: Lot B — listes documents confirmées serveur (3 composants optimistes)
chantier: documents / uploads
type: fix
statut: poussé
hash: b6f25660
fichiers:
  - resources/js/Components/Commercialisation/LotsGrillePanel.vue
  - resources/js/Components/DepotFactures/DocumentsJointsPanel.vue
  - resources/js/Components/ProgrammeChronologieEtapesPanel.vue
  - app/Http/Controllers/DocumentFactureController.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1260_depot_documents_refresh_serveur.md
  - public/build/
---

# SUIVI #1260 — Lot B : refresh listes documents (serveur)

## PROMPT ENVOYÉ

Suite inventaire #1259 (clause d’arrêt). Lot B seul : trois composants qui
ajoutaient / mutaient la liste côté client sans s’appuyer exclusivement sur la
confirmation serveur (`LotsGrillePanel`, `DocumentsJointsPanel`,
`ProgrammeChronologieEtapesPanel`). Règle : une ligne n’apparaît que si le
serveur confirme ; échec HTTP / MIME / taille → aucune ligne + message ;
ne pas toucher aux 13 autres, ni `DepotFactureSaisieForm`, ni SharePointService.

## FICHES LUES

- `#1259` — inventaire 16 zones ; Lot B = surfaces « optimistes » ; lots A/C/D
  restent à faire. Chemins exacts repris ici.
- `#1226` — `FileCaptureZone` jamais extrait ; pattern refresh serveur.
- Zones communes : `DepotFactureSaisieForm` / commercialisation — pas de reload
  Inertia large sur dépôt facture ; commercialisation `index()` résout un
  sous-dossier SP → **pas** de `router.reload({ only:['lots'] })` (Graph).

## OBJET 1 — CONSTAT AVANT MODIFICATION

| composant | route | verbe | réponse serveur AUJOURD’HUI | suffit à reconstruire la ligne ? | erreur HTTP |
|---|---|---|---|---|---|
| `LotsGrillePanel.vue` | `POST …/reservations/{id}/documents` | POST | `success`, `fichier_url`, `document_id`, `document` (model fresh), `message` ; SP KO → **502** sans MAJ base | **oui** (`document`) | toast erreur ; pas de mutation locale |
| `DocumentsJointsPanel.vue` | `POST /depot-factures/{uuid}/documents` | POST | `{ document: DocumentFacturePresenter }` (201) ; pas de liste complète | **oui** pour 1 ligne ; **non** pour liste entière sans risque de doublon/dérive | toast ; pas de push |
| `ProgrammeChronologieEtapesPanel.vue` | `POST …/etapes/{id}/justificatif` | POST | `{ message, etape: serializeEtape }` (justificatif inclus) ; SP KO → **422** sans MAJ base | **oui** (`etape`) | toast ; pas de patch |

Cas « base OK / SP KO avec ligne + état sync » : **non applicable** aujourd’hui sur résa / étape (échec SP = pas d’écrit base + HTTP erreur). Documents joints = stockage local, pas SP. Comportement d’erreur **non modifié** (#1260 enrichit seulement le JSON documents joints).

## SYNTHÈSE — CORRECTIF

| composant | voie choisie | justification |
|---|---|---|
| LotsGrillePanel | JSON `data.document` → `splice` de la ligne checklist | Réponse déjà complète ; reload Inertia commercialisation appellerait Graph (`resolveProgrammeSubfolderId`) |
| DocumentsJointsPanel | Enrichir JSON (`documents` liste) + remplacer `documents.value` | Pas de reload Inertia (saisie facture intacte) ; fin du `push` local |
| Chronologie | JSON `data.etape` via `hydrateFromServer` ; suppression du patch partiel + du `router.reload` | Payload déjà suffisante ; conserve ligne dépliée / sélection |

## LEÇON

« Mutation locale après axios 2xx » n’est pas toujours de l’optimiste pur, mais
reste une dérive si on merge / push sans remplacer par la payload serveur.
Sur commercialisation, un `only:['lots']` **n’évite pas** les appels Graph du
contrôleur — la voie JSON est obligatoire.

## DÉPLOIEMENT / TESTS ROBIN

Après `git pull` : `php artisan optimize:clear` + `view:clear` + `journal:sync`.
Pas de migrate. Pas de npm sur OVH.

Scénarios (chaque composant) : dépôt OK → ligne unique ; 2e dépôt → 2 lignes ;
refus MIME/taille → 0 ligne + toast ; réseau coupé → 0 ligne + toast ; F5 →
identique ; DocumentsJoints + saisie facture non enregistrée → saisie intacte ;
onglet réseau → 0 appel Graph au refresh liste.

Lots A, C, D de #1259 **restent à faire**.
