---
suivi: 1437
date: 2026-09-04
sujet: Avis d'imposition — Total 2026 + TLVH case à cocher
chantier: foncier
type: feature
statut: poussé
hash: a30389cb
fichiers:
  - database/migrations/2026_09_04_120000_add_total_avis_2026_to_avis_impositions.php
  - app/Models/AvisImposition.php
  - app/Http/Controllers/Foncier/AvisImpositionController.php
  - app/Services/Foncier/AvisImpositionCsvImporter.php
  - resources/js/Pages/Foncier/Patrimoine/AvisImposition/Index.vue
  - tests/Unit/AvisImposition1437SourceTest.php
  - tests/Unit/AvisImpositionImport1423SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
---

# SUIVI #1437 — Colonne Total Avis 2026 + TLVH en case à cocher

## PROMPT ENVOYÉ

Deux demandes Robin sur Avis d'imposition : colonne montant `total_avis_2026` (avant 2025,
NULL = pas d'avis) ; saisie TLVH en case à cocher sans changer le varchar(10). Dépend du #1435.

## FICHES LUES

- `SUIVI_1435` — contrat PATCH `{ champ, valeur }` scalaire ; vide → NULL ; scroll
  `overflow-x: scroll` ; ne pas défaire.
- `SUIVI_1421` — `->after()` interdit dans `Schema::create`, valide dans `Schema::table`.
- `SUIVI_1423` — import 20 colonnes ; montants vides = NULL ; 311 lignes intouchables.
- `SUIVI_1420` / `SUIVI_1434` — droits GS inchangés.
- `SUIVI_1271` — pas de `overflow-x-hidden`.

## SYNTHÈSE

### Prérequis
`origin/main` contenait le #1435 (`317a10c3` / `6ac70a36`) avant ce lot.

### Volet 1 — total_avis_2026
Migration additive `Schema::table` + `->after('interlocuteur')` (ALTER, pas CREATE).
`decimal(18,2)` NULLABLE. Whitelist + validation montant #1435. Totaux filtrés. Affichage
avant 2025.

SQL attendu :
ALTER TABLE `avis_impositions` ADD `total_avis_2026` DECIMAL(18, 2) NULL AFTER `interlocuteur`;

### Volet 2 — TLVH case à cocher
Type colonne inchangé (`varchar(10)`). Coché ⇔ valeur `'Oui'`. Décocher ⇔ **NULL**
(cohérent avec #1423/#1435 : vide = absence, pas chaîne vide). Filtre texte CONTAINS sur
la valeur stockée (`Oui…`) : taper « Oui » isole les 38 lignes. Tri inchangé (champ string).

Un booléen SQL serait plus propre ; non fait (arbitrage Robin). Harmonisation des 273
non-Oui vers NULL : requête fournie, non exécutée.

### Import #1423
La commande cassait si COLONNES passait à 21. Adaptée : accepte l’en-tête 20 col. (#1423,
`total_avis_2026` = NULL) et 21 col. (#1437, 2026 avant 2025).

## DÉPLOIEMENT-TEST

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

## LEÇON

Ajouter une colonne métier à un import figé = accepter l’ancien en-tête, pas casser le
CSV historique. Case à cocher sur varchar : garder la valeur métier (`Oui`/NULL) pour que
filtre CONTAINS et tri continuent de marcher.
