---
suivi: 1510
date: 2026-09-10
sujet: Page création parcelle unitaire (saisie complète)
chantier: foncier / parcelles / create
type: feature
statut: poussé
hash: 4207f542
fichiers:
  - app/Services/Foncier/ParcelleCreationUnitaireService.php
  - app/Http/Controllers/Foncier/ParcelleController.php
  - app/Http/Controllers/Foncier/ActeFoncierController.php
  - resources/js/Pages/Foncier/Parcelles/Create.vue
  - resources/js/Pages/Foncier/Prospection/Index.vue
  - routes/web.php
  - tests/Unit/Parcelle1510SourceTest.php
  - tests/Feature/Foncier/FoncierParcelleUnitaire1510Test.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1510_page_creation_parcelle_unitaire.md
---

# SUIVI #1510 — page création parcelle unitaire

## PROMPT ENVOYÉ

Décision Robin : page dédiée « Nouvelle parcelle » (saisie complète,
quatre sections) en complément de la modale « Ajouter multiparcelle »
(#1509). Deux points d’entrée. Transaction atomique parcelle ± acte
± pivot ± propriétaire. Push direct `origin/main`.

## BASE GIT

HEAD de départ `73cd0b62` (chore hash fiche #1509). Prompt citait
`e1c45252` (#1508) avec #1509 en cours : #1509 déjà sur `origin/main`
(`a15cc73f` + `73cd0b62`) au rebase. Modale et `ParcelleCreationService`
non touchés. `Index.vue` : second bouton seulement.

## FICHES LUES

- **#1463 LEÇON** — paliers 860 / 1280 ; Show.vue société détentrice
  si `source === 'acte'`, `:editable="false"`. Impact : fiche **non
  modifiée** ; page Create reprend les options du référentiel (bornage,
  constructible, type foncier) et le sélecteur propriétaires existant.
- **#1509 LEÇON** — `etat_foncier` obligatoire, pas de repli `reperee` ;
  source `FoncierReferentiels::ETATS_FONCIERS` (13 + placeholder
  « Choisir… ») ; `overflow-x-hidden` interdit. Impact : mêmes 5 champs
  d’identification ; `validateAndPrepare(..., true)` réutilisé ; bouton
  `label="Nouvelle parcelle"` (sans « + ») pour ne pas casser le test
  #1509 `label="+ Nouvelle parcelle"` absent.

## SYNTHÈSE

Deux CTA sur `/foncier/parcelles` (Prospection, mode parcelle), à
droite du sélecteur de mode : « Ajouter multiparcelle » puis
« Nouvelle parcelle » → `GET /foncier/parcelles/create`.

Création : `POST /foncier/parcelles/saisie-complete` (`storeUnitaire`).
`store()` historique inchangé (saisie courte / inline, repli `reperee`).

Atomicité : une `DB::transaction` dans `ParcelleCreationUnitaireService`.
Nouvel acte via `ActeAcquisitionService::creer` (pas `ActeFoncierController::store`,
qui exige `parcelle_ids` déjà existants). Rattachement : `attach` sans
filtre `verrouille`. Propriétaire externe après l’acte (R5 clôture les
détentions courantes dans `creer()`).

Création propriétaire à la volée : **non embarquée** — lien vers
`/foncier/proprietaires/create`, création inline reste sur la fiche.

Droit : `foncier.gestion` (middleware + `assertGestion`), identique à
`store` / `storeBatch`.

## 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 migration. JAMAIS npm/composer/optimize/config:cache sur OVH.

Contrôle visuel Robin (agent sans navigateur) : 1440 / 1100 / 800 px ;
état vide refusé ; groupe + acte Non refusé.

## LEÇON

`ActeFoncierController::store` ne peut pas créer l’acte avant la
parcelle (`parcelle_ids` required). Réutiliser `ActeAcquisitionService::creer`
dans la transaction unitaire. Effet de bord R5 : `etat_foncier` forcé
`acquise` + société détentrice = acquéreur. Recherche d’actes : endpoint
nouveau justifié (aucun n’existait) ; promesses `verrouille=false` ≠ actes.
Ne pas logger un `proprietaire_access_logs.action` sans arbitrage DPO
(`varchar(32)`). sqlite skipped ≠ preuve MySQL.
