---
suivi: 1323
date: 2026-08-13
sujet: reprise_siwi_prerequis_techniques
chantier: marches_reprise
type: feature
statut: poussé
hash: 435dac01
fichiers:
  - app/Models/Marche.php
  - app/Models/MarcheRepriseLigne.php
  - app/Http/Controllers/MarcheController.php
  - app/Http/Controllers/MarcheRepriseLigneController.php
  - resources/js/Pages/Marches/Show.vue
  - database/migrations/2026_08_13_150000_create_marche_reference_sequences_table.php
  - database/migrations/2026_08_13_150100_add_reference_siwi_to_marches_table.php
  - database/migrations/2026_08_13_150200_add_retenues_reprise_ht_to_marche_reprise_lignes_table.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1323_reprise_siwi_prerequis.md
---

## PROMPT ENVOYÉ

LOT A #1323 — prérequis techniques reprise SIWI (verrou référence, colonne
SIWI, colonnes retenues reprise HT, message Reprise, diag modules). Pas d’écran
d’import.

## SYNTHÈSE

### Fiches / deps
- `#1320`–`#1322` présents sur `origin/main` (libération RG).
- `#1307` (diag) : structure `marche_reprise_lignes`, soft delete absent.

### Objet 1 — nextReference
Table `marche_reference_sequences` + `lockForUpdate` dans une transaction.
Format `MCH-AAAA-NNN` inchangé. Seed depuis MAX existant à la 1ʳᵉ allocation
de l’année. Preuve : 8 processus × 15 = 120 refs uniques, 0 collision.

### Objet 2 — reference_siwi
`marches.reference_siwi` varchar(32) NULL UNIQUE. Décision UNIQUE (D22 : 1 SIWI
→ ≤1 marché). Collision non-NULL → erreur SQL (lot import B). Lecture seule
fiche Résumé. Hors fillable / hors whitelist update. Longueur : classeur absent
du workspace → borne 32 documentée (pattern lettre+chiffres).

### Objet 3 — colonnes reprise HT
`montant_rg_reprise_ht`, `montant_finitions_reprise_ht`, `montant_cp_reprise_ht`,
`montant_cie_reprise_ht` (NULLABLE, HT). **Aucun branchement agrégat.**
`MarcheRetenuesEtatsService` **ne lit pas** `marche_reprise_lignes` (grep vide)
→ RG reprise n’apparaît ni Retenues ni plafond #1320 : **défaut signalé**,
correction hors lot. Soft delete toujours **absent** (signalé, non ajouté).

### Objet 4 — message
Texte corrigé : frise/indicateurs alimentés ; bilan **non** alimenté
(`BilanFinancierService` : seule occurrence = commentaire KPI, pas de lecture
`marche_reprise_lignes`).

### Objet 5 — modules (diag)
HECTARE : CP/CIE/NF habitat false ; ENVOL true ; GEMME gestion_locative.
Hardcodes `=== 'HECTARE'` listés sans correction.

### Dette ouverte
- Bilan non alimenté par les reprises.
- `marche_reprise_lignes` sans soft delete.
- MRES ne consomme pas la RG reprise.

### Vérification écran
**NON** — pas de marché utilisable pour parcours UI complet en local.
Lot **non validé** écran (tests 4/5/7/11).

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php artisan migrate --force
php artisan optimize:clear
php artisan view:clear
php artisan journal:sync
```

## LEÇON

MAX+1 sans verrou + unique = collision certaine sous import de masse. Une
séquence verrouillée réserve le NNN avant INSERT. Une colonne de retenue HT
sans branchement MRES ne change rien à l’écran Retenues — le dire explicitement.
