---
suivi: 1420
date: 2026-09-03
sujet: Avis d'imposition — socle table inline filtrable
chantier: foncier
type: feature
statut: poussé
hash: 1420a0b1
fichiers:
  - app/Http/Controllers/Foncier/AvisImpositionController.php
  - app/Models/AvisImposition.php
  - app/Models/AvisImpositionHistorique.php
  - database/migrations/2026_09_03_150000_create_avis_impositions_table.php
  - database/migrations/2026_09_03_150100_create_avis_imposition_historique_table.php
  - resources/js/Pages/Foncier/Patrimoine/AvisImposition/Index.vue
  - resources/js/Layouts/AppShell.vue
  - routes/web.php
  - tests/Unit/AvisImposition1420SourceTest.php
  - public/build/
---

# SUIVI #1420 — Avis d'imposition (socle) : table filtrable + édition inline

## PROMPT ENVOYÉ

Créer le socle ERP pour la page « Avis d'imposition » (remplacement Excel) :
migration additive + modèle + endpoints (accès groupes M365, ajout ligne vide, patch inline champ unique, soft delete) + page Vue (table pleine largeur filtrable, en-têtes sticky, colonne Adresse figée) + build Vite + fiche de suivi.

## SYNTHÈSE

- **Schéma**
  - Table `avis_impositions` avec 20 champs (structure/département/TLVH + adresse/commune/interlocuteur + totaux 2025→2021 + avis + montants/date + observation + numéro avis 2024 + commentaire).
  - Soft deletes + traçabilité (`deleted_by_user_id`, `deleted_reason`) + verrouillage (`verrouille`, `verrouille_par_user_id`, `verrouille_at`).
  - Table d’audit `avis_imposition_historique` : action (creation/modifie/suppression) + `champs_modifies` (avant/apres) + auteur et impersonation.

- **Serveur**
  - Contrôleur `AvisImpositionController` sous `/patrimoine`.
  - Accès réservé via `m365GroupNames()` en brut (liste autorisée incluant `GS_GEMME_PDG` sans dépendre de son existence).
  - `PATCH /patrimoine/avis-imposition/{id}` : whitelist champ modifiable inline + validation par type + journalisation avant/après.
  - `DELETE /patrimoine/avis-imposition/{id}` : soft delete + confirmation côté UI + journalisation.
  - `POST /patrimoine/avis-imposition` : création d’une ligne vide (import et pièces = #1421).

- **Front**
  - Page Vue `Foncier/Patrimoine/AvisImposition/Index` avec PrimeVue `DataTable`.
  - Filtrage par colonne en ligne et totaux calculés sur les lignes filtrées (nombre de lignes affichées + sommes sur colonnes montants).
  - En-têtes sticky + colonne Adresse figée (CSS `position: sticky`), scroll horizontal en `overflow-x-auto`.
  - Edition inline via `InlineEditableField` (sauvegarde champ par champ, feedback erreur, envoi `PATCH` unique).

- **Menu**
  - Ajout du lien « Avis d'imposition » dans la section « Patrimoine » du `AppShell`.

## DÉPLOIEMENT-TEST

1. `git pull origin main`
2. `php artisan view:clear`
3. Ouvrir `/patrimoine/avis-imposition`
4. Vérifier : table pleine largeur, filtres, ajout/suppression/édition inline.

## LEÇON

- Le socle privilégie l’édition champ unique + journalisation cohérente avec les patterns du projet (sans import #1421).

