---
suivi: 1732
date: 2026-09-28
sujet: Dupliquer un scénario de faisabilité
chantier: module-foncier
type: feature
statut: poussé
hash:
fichiers:
  - app/Services/Foncier/ScenarioDuplicationService.php
  - app/Http/Controllers/Foncier/ScenarioFaisabiliteController.php
  - app/Models/ScenarioFaisabilite.php
  - resources/js/Pages/Foncier/Scenarios/Show.vue
  - routes/web.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - tests/Feature/Foncier/ScenarioDuplication1732Test.php
  - tests/Unit/ScenarioDuplication1732SourceTest.php
  - public/build/manifest.json
  - docs/suivi/SUIVI_1732_dupliquer_scenario_faisabilite.md
---

# SUIVI #1732 — dupliquer un scénario de faisabilité

Bouton Dupliquer sur la page scénario, mêmes droits que la modification. Copie profonde sous un nouveau libellé et le prochain numéro S. Statut de départ En cours. Départ `1c2723ba` (#1731).

## PROMPT ENVOYÉ

Dupliquer un scénario : copie identique, seul le nom change. Assiette, fiche, grille, étude, taux forcés (y compris direction), mode. Pas l’historique, les commentaires, les documents, les verrous. Statut de départ, jamais Retenue. Historique des deux côtés. Ouvrir la copie. KPI identiques au centime avant toute modification.

## FICHES LUES

- **#1660** — `etude` est le statut de départ (libellé En cours). `reduireAutresRetenus` ramène les autres retenus vers `etude`. La copie ne passe pas par cette méthode : elle est créée en `etude`, l’original retenu reste le seul.
- **#1142** — noms de tables figés, `prochainVersion` sous `lockForUpdate`, audit de création via `FieldAuditService::recordChange`. Les créations d’enfants n’écrivent pas d’historique (le trait n’écoute que mise à jour et suppression).

## SYNTHÈSE

Un seul service, une transaction. Nouvelles clés. Les parcelles et propriétaires restent les mêmes entités ; les lignes de liaison sont neuves. La tranche est une colonne du lot, pas une table. La concurrence est celle du dossier : la copie reste sur le même dossier et la voit déjà, sans recopier les lignes.

Le bouton n’apparaît que si `peut_gestion` et scénario non gelé. La route exige `foncier.gestion`, `authorize('update')` et scénario non gelé.

Les totaux n’ont pas été mesurés : `pdo_sqlite` est absent et MySQL local a refusé la connexion (`SQLSTATE[HY000] [2002]`). Aucun centime inventé. Le test fonctionnel est écrit et ignoré pour cette raison.

Bundle page `Show-NHUY-m4y.js`. App `app-B0Q-tvc8.js`, CSS `app-CIS5hCxh.css` et `app-JQn_WnY8.css`.

## DÉPLOIEMENT

git pull origin main
php artisan view:clear
php artisan route:clear
php artisan journal:sync

## LEÇON

La concurrence n’a pas de `scenario_id`. La recopier doublerait le module du dossier. `tranche` est un varchar sur `scenario_lots` : rien à remapper. Ne pas appeler `initialiserPourScenario` si la source a déjà des paramètres, sinon les taux forcés peuvent diverger. Ne pas enregistrer l’original : l’entrée « Dupliqué en » est un insert d’historique seul.
