---
suivi: 1337
date: 2026-08-13
sujet: reprise_siwi_pdf_popup_controle
chantier: marches_reprise
type: fix
statut: poussé
hash: c113ec0c
fichiers:
  - resources/js/Pages/SiwiImport/Index.vue
  - app/Http/Controllers/SiwiImportController.php
  - app/Services/SiwiImportPageService.php
  - routes/web.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1337_reprise_siwi_pdf_popup_controle.md
---

## PROMPT ENVOYÉ

SUIVI #1337 — aperçu PDF en popup (Dialog existant) + verrouillage
en-tête après « Programme contrôlé » (option C), annulation du contrôle,
refus serveur.

## SYNTHÈSE

### Fiches lues
- `#1336` : route `document-pdf`, messages explicites fichier absent /
  index — consommés dans la modale via `fetch` + texte d’erreur.
- `#1300` : Dialog PrimeVue `appendTo="body"` (retenues) — même mécanisme.
- `#1335` : hors périmètre actionnable — non défait.

### OBJET 1 — PDF popup
- Réutilise `primevue/dialog` déjà importé dans `SiwiImport/Index.vue`
  (mêmes Dialog que non-repris / RG / rattacher — pas de nouveau mécanisme,
  pas de `DocumentPreviewDialog` dédié, pas de Teleport nu).
- Route unique `siwi-import.document-pdf` ; URL construite seulement si
  `^\d+$` depuis le payload.
- États : idle / loading / affiche / erreur ; lien « Ouvrir dans un onglet » ;
  focus restauré sur l’icône œil.

### OBJET 2 — Contrôle verrouille l’en-tête
- Lecture seule : entité, département, commune, note, Enregistrer
  localisation / note.
- Actifs : Créer / Rattacher / Hors périmètre / Écarter / lot / suggestions /
  notes ligne (et créer/rattacher programme).
- Route **créée** `POST …/annuler-controle` (`siwi-import.annuler-controle`)
  — n’existait pas (vérifié `route:list`).
- Refus serveur localisation/note : **HTTP 422** + message
  « Programme contrôlé : … ».

### Vérification écran
**NON faite** (pas de session M365 / navigateur privé prod). Lot
**non validé écran**.

## DÉPLOIEMENT-TEST

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

Pas de migrate.

## LEÇON

Un `window.open` casse le contexte d’arbitrage : Dialog + `fetch` permet
d’afficher aussi les messages texte du #1336. Un verrou UI sans `abort(422)`
ne protège pas un PATCH forgé.
