---
suivi: 1325
date: 2026-08-13
sujet: reprise_siwi_page_arbitrage
chantier: marches_reprise
type: feature
statut: poussé
hash: bf2f3e19
fichiers:
  - app/Policies/SiwiImportPolicy.php
  - app/Services/SiwiImportPageService.php
  - app/Http/Controllers/SiwiImportController.php
  - app/Providers/AppServiceProvider.php
  - routes/web.php
  - config/siwi.php
  - resources/js/Pages/SiwiImport/Index.vue
  - public/build/
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1325_reprise_siwi_page.md
---

## PROMPT ENVOYÉ

LOT C #1325 — page d’import SIWI (filtres, avancement, en-tête programme,
liste groupée, dépliage sur place). Pas de création ERP (lot E).

## SYNTHÈSE

### Fiches lues
- `#1324` : tables `siwi_*`, commande import, SOURCE/TRAVAIL, qualification.
  Approche : page lit le staging ; écritures TRAVAIL seulement ; pas de migration
  furtive. Colonnes absentes signalées (`programme_hectarion_id`, `entite_id`,
  `sharepoint_status`).

### Accès
Route `/siwi-import` hors menu. Policy `SiwiImportPolicy` : `GS_GROUPE` via
`m365GroupNames()` brut + `abort_unless` avant `authorize` (piège Gate::before).
Hors groupe → HTTP 403 explicite.

### Communes
Table `communes` présente mais **0 ligne** en local → saisie libre département /
commune. Dit dans le payload `communes_referentiel_disponible=false`.

### Dépliage
Payload marché+documents chargé avec le programme (`?operation_code=`).
`toggleExpand` ne fait aucune requête.

### Dettes / lots suivants
- Créer / Rattacher / Hors périmètre / Écarter ligne : UI seule (lot E).
- Colonnes programme ERP / entité / SharePoint absentes (#1324).
- Dettes #1323 inchangées (MRES / Bilan / soft delete reprise).

### Vérification écran
**NON faite en navigation privée** — pas de session M365 / serveur web local
utilisable depuis Cursor pour ouvrir `/siwi-import` en conditions réelles.
Lot **non validé écran**. Preuves : payload service + policy + filtres peuplés
(échantillon SYNTHÉTIQUE).

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan journal:sync
# URL : /siwi-import (GS_GROUPE)
```

## LEÇON

Une URL hors menu n’est pas une ACL : `abort_unless` + `m365GroupNames()` brut
avant `authorize`, sinon `Gate::before` admin rend tout positif. Un dépliage
qui refetch par ligne rend la page inutilisable à 1 400 marchés : charger par
programme. Des colonnes manquantes pour le déblocage programme → le dire et
griser avec message, ne pas inventer de migration.
