---
suivi: 1172
date: 2026-08-04
sujet: Acquéreurs — grille enrichie (groupes, échéance, alertes)
chantier: commercialisation
type: feature
statut: poussé
hash: 2a6f93e4
fichiers:
  - resources/js/Components/Programmes/AcquereursGrillePanel.vue
  - resources/js/Pages/Programmes/Tma.vue
  - app/Http/Controllers/TMAController.php
  - app/Support/Commercial/AcquereursProchaineEcheance.php
  - app/Support/Commercial/AcquereursGrilleGroupSorter.php
  - tests/Unit/AcquereursGrille1172Test.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1172_acquereurs_grille_enrichie.md
---

## PROMPT ENVOYÉ

SUIVI #1172 — enrichir la grille onglet ACQUÉREURS (pas LotsGrillePanel) :
regroupement visuel multi-lots (D9), colonnes prix/financement/SRU/notaire/
prochaine échéance/alertes, recherche+filtres motif #1158, sélecteur colonnes
sans localStorage. Affichage seul, aucune migration.

## SYNTHÈSE

### Fiches lues
- `SUIVI_1154` — cartographie commercial / SRU / dates.
- `SUIVI_1158` — filtre client + compteur N/total ; KPI indépendants du filtre.
- `SUIVI_1160` — pivot `reservation_acquereurs` source de vérité (pas JSON co).
- `SUIVI_1161` / `SUIVI_1167` / `SUIVI_1168` — pivot lots / prix lot.
- `SUIVI_1170` — TMA hors réservation (ne pas réintroduire).

### Étape 0 — fichier réel
- **`resources/js/Components/Programmes/AcquereursGrillePanel.vue`** (~612 lignes)
  monté par `resources/js/Pages/Programmes/Tma.vue` (onglet GRILLE).
- Payload : `TMAController::index` → `lots_acquereurs` (enrichi).

### PRÉPARATION ACTES grisé
**Volontaire / à venir** : `disabledTabs` dans `Tma.vue` avec
`title="Fonctionnalité à venir"` — pas un droit manquant ni une page vide.

### Prochaine échéance (ordre)
1. Si statut acte|annulé → « — »
2. Sinon si `sru_statut` ∉ {purge, retracte} → « Fin délai SRU » + `date_sru_fin_delai`
3. Sinon si financement non comptant et pas `date_reelle_accord` → « Accord prêt » + `date_limite_obtention_accord`
4. Sinon si pas `date_envoi_notaire` → « Envoi au notaire »
5. Sinon si pas `date_rdv_signature` → « RDV acte à fixer »
6. Sinon si pas signature réelle ni date_acte → « Acte à signer » + `date_prev_signature_acte`
Financement pastille : obtenu / en_delai / depasse si dates présentes ; sinon type seul.

### Requêtes SQL (affichage complet grille)
1. `lots_commerciaux` (filtre reserve|acte)
2. `reservations` (+ contacts, acquereurs.contact, notaireFournisseur, reservationLots) via FK
3. `reservations` via pivot `reservation_lots` (même with)
4. Agrégat `appels_fonds` GROUP BY reservation_id
5. Agrégat `appels_de_fonds` GROUP BY lot_commercial_id (hors annulés)
≈ **5 requêtes** métier (+ relations eager imbriquées), **pas de N+1** ligne à ligne.

### Préférence colonnes
**Non persistée** (état Vue `ref`) — pas de localStorage ; pas d’écriture
`users.preferences` (lot affichage seul / aucune écriture).

### Tri groupes
`AcquereursGrilleGroupSorter` + miroir JS : tri des blocs sur la valeur du lot
**principal**, lots internes par `position`. Tests unitaires 5/5 OK.

### Cas multi-lots
Aucune réservation multi-lots en prod : valider manuellement via rattachement
#1169 (créer 2 lots sur une réservation de test), puis trier chaque colonne.

## DÉPLOIEMENT-TEST

1. `git pull` ; `optimize:clear` ; `view:clear` ; `journal:sync`
2. `php tools/diag/diag_remises_kpi_1168.php` → 107 304,48 €
3. `php artisan commercial:coherence-reservation-lots` → 0
4. Smoke liste tests 1–13 du prompt (dont groupe 2 lots + 17 alertes date acte inchangées)

## LEÇON

La grille Acquéreurs n’est **pas** LotsGrillePanel : oublier ce fichier = livrer
à côté. Tri DataTable natif éclate les groupes multi-lots — trier les **blocs**.
`date_sru_fin_delai` (Observer) ≠ `date_expir_reflexion` (0/61).
