---
suivi: 1835
date: 2026-10-09
sujet: Actes fonciers, modification, historique et mémoire des effets
chantier: foncier
type: evolution
statut: poussé
hash: c062ed5fa
fichiers:
  - database/migrations/2026_10_09_120000_create_acte_effet_parcelle_table.php
  - app/Models/ActeEffetParcelle.php
  - app/Models/ActeFoncier.php
  - app/Services/Foncier/ActeFoncierAcces.php
  - app/Services/Foncier/ActeReferenceDoublon.php
  - app/Services/Foncier/ActeEffetMemoireService.php
  - app/Services/Foncier/ActeModificationService.php
  - app/Services/Foncier/ActeHistoriquePresenter.php
  - app/Services/Foncier/ActeAcquisitionService.php
  - app/Services/Foncier/ActeVenteService.php
  - app/Services/Foncier/ParcelleCreationUnitaireService.php
  - app/Services/Foncier/ActeRepartitionService.php
  - app/Services/Foncier/FieldAuditService.php
  - app/Http/Middleware/EnsureActeFoncierLecture.php
  - app/Http/Controllers/Foncier/ActeFoncierController.php
  - app/Http/Controllers/Foncier/ParcelleController.php
  - app/Http/Middleware/HandleInertiaRequests.php
  - bootstrap/app.php
  - routes/web.php
  - resources/js/Pages/Foncier/ActesFonciers/Show.vue
  - resources/js/Pages/Foncier/ActesFonciers/Create.vue
  - resources/js/Pages/Foncier/Parcelles/Show.vue
  - resources/js/Components/Foncier/ActeOptionsForm.vue
  - resources/js/Layouts/AppShell.vue
  - resources/js/titresOnglet.js
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - tests/Feature/Foncier/FoncierActeModification1835Test.php
  - public/build/manifest.json
  - docs/suivi/SUIVI_1835_modification_acte_foncier.md
---

# SUIVI #1835 — modification d'un acte foncier

## PROMPT ENVOYÉ

Phase 2, lot 1/3, suite du diagnostic #1826. Droits de modification, formulaire, historique champ par champ, mémoire des effets, blocage des doublons de référence. Pas de corbeille (lot 2), pas de correction du cas 0A 0540 (lot 3). Aucune suppression d'acte, aucun document modifié. Prix d'achat affiché inchangé. Estimé et cible jamais recalculés depuis le prix d'acte. Le sens n'est jamais modifiable.

## Fiches lues

- #1826 : diagnostic actes, pas de fiche dans le dépôt. La section 9 du rapport n'est pas dans le repo. Les recalculs suivent le prompt : répartition, détentions groupe et personnes via la mémoire, promesse, statut via ParcelleStatutService.
- #1830 LEÇON : à l'achat, ne pas clôturer le propriétaire dont l'entité est la société acquéreuse, et écrire l'acte sur la détention personne. Cette clôture est conservée. La photo des détentions closes est prise avant l'update, avec la société qui sera appliquée.
- #1834 : autre écran (liste Parcelles). Rien à réutiliser sur l'acte, sinon le rappel de sérialiser AppShell avant le build.

## SYNTHÈSE

GS_JURIDIQUE n'a pas foncier.gestion ni foncier.lecture. Le groupe d'écrans foncier exigeait foncier.lecture, donc le juridique ne pouvait ouvrir ni la liste ni la fiche. La lecture des actes (liste, fiche, recherches, édition) passe par un middleware dédié : foncier.lecture ou GS_JURIDIQUE lu dans m365GroupNames(). Les parcelles et les dossiers restent derrière foncier.lecture. Le menu Foncier n'est pas ouvert : un lien « Actes » apparaît seul quand le module est actif, que le menu Foncier est masqué, et que l'utilisateur est juridique. Le téléchargement des documents de l'acte reste sur foncier.lecture.

Le droit de modifier (R1) lit m365GroupNames(), jamais hasM365Group. Créateur avec foncier.gestion, ou GS_JURIDIQUE, ou GS_ADMIN_ERP. Sans créateur : juridique ou admin seulement. GS_DSI n'est pas dans R1 : un DSI non créateur est refusé même avec foncier.gestion. Un DSI créateur de l'acte et titulaire de foncier.gestion passe par la règle créateur. La répartition existante exige R1 en plus de foncier.prix.

Un acte a une mémoire s'il a au moins une ligne acte_effet_parcelle. Les actes déjà en base n'en ont pas : date, société, parcelles et promesse sont grisés (« Acte antérieur au suivi des effets : pour changer ce champ, contactez la DSI ») et refusés s'ils sont postés. Référence, notaire, dossier, options, prix et répartition restent modifiables. Un acte créé après ce lot (achat, vente, rattachement unitaire) écrit la mémoire dans la même transaction que les effets. Une modification qui change date, société ou parcelles défait puis réapplique via cette mémoire. Un autre acte strictement plus récent (date, puis id) sur une parcelle concernée bloque la modification structurante.

La création et la modification refusent une référence déjà portée, espaces et casse ignorés, avec le message « Un acte portant ce numéro existe déjà » et le lien vers l'acte existant. L'historique réutilise entity_field_audits. Le prix est masqué sans foncier.prix, y compris dans l'historique.

Le rattachement unitaire appelle désormais la répartition : montant_ventile est rempli. Cette répartition recalcule toutes les parcelles de l'acte pour que la somme égale le prix.

## Mapping

| Bouton ou champ affiché | Route ou valeur postée | Droit | Effet en base |
| --- | --- | --- | --- |
| Modifier (fiche acte, à côté de Liste) | GET foncier.actes-fonciers.edit | R1 | aucun |
| Modifier (carte Actes de la fiche parcelle) | GET foncier.actes-fonciers.edit | R1 | aucun |
| Enregistrer | PUT foncier.actes-fonciers.update | R1 | champs autorisés, pivots, mémoire, historique |
| Référence | reference_acte | R1, contrôle de doublon | actes_fonciers.reference_acte |
| Date | date_acte | R1 et mémoire | date, puis effets rejoués |
| Société acquéreuse (achat) | societe_acquereur_id | R1 et mémoire | société, détentions, statut |
| Acquéreurs (vente) | acquereur_ids | R1 et mémoire | pivot acquéreurs, détentions |
| Notaire | notaire_fournisseur_id | R1 | notaire |
| Dossier | dossier_foncier_id | R1 | dossier |
| Promesse | promesse_id | R1 et mémoire | promesse verrouillée ou restaurée |
| Options | options | R1 | options de l'acte |
| Prix | prix_numeraire | R1 et foncier.prix | prix, puis répartition |
| Parcelles | parcelle_ids | R1 et mémoire | pivot, détentions, statut, mémoire |
| Répartition par parcelle | repartition, ou PUT foncier.actes-fonciers.repartition.update | R1 et foncier.prix | acte_parcelle.montant_ventile |
| Sens | non posté | jamais | aucun |
| Bandeau acte sans mémoire | affichage si aucune ligne acte_effet_parcelle | lecture | aucun |

## DÉPLOIEMENT-TEST

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

Tests : FoncierActeModification1835Test, 8 tests, schéma sqlite minimal (pas de RefreshDatabase : une migration métier est en SQL MySQL). FoncierControllersIntegritySourceTest : 7 tests.

## LEÇON

La portée de visibilité des parcelles s'applique à la relation de l'acte. Une mise à jour lue à travers ce filtre ne voit qu'une partie des parcelles et réécrit les effets sur ce sous-ensemble. La modification et la répartition lisent les parcelles de l'acte sans ce filtre.

La mémoire se photographie avant les effets, dans la même transaction. Une ligne ajoutée ensuite ne porte pas l'instantané de promesse : la restauration de la promesse ignore les lignes sans promesse.

hasM365Group traite l'admin comme membre de chaque groupe. Le droit de modifier un acte lit m365GroupNames().
