---
suivi: 1169
date: 2026-08-03
sujet: Commercial — UI rattachement / détachement multi-lots (brique 3/3)
chantier: commercialisation
type: feature
statut: poussé
hash: 66d33d5d
fichiers:
  - app/Services/ReservationAcquereurUpdateService.php
  - app/Support/Commercial/ReservationLotsSync.php
  - app/Support/Commercial/RemisesAccordeesCalculator.php
  - app/Services/SharePointService.php
  - app/Support/ReservationHistoriquePresenter.php
  - app/Http/Controllers/ReservationController.php
  - app/Http/Controllers/AcquereurController.php
  - app/Http/Controllers/CommercialisationController.php
  - routes/web.php
  - resources/js/Components/Commercialisation/LotsGrillePanel.vue
  - resources/js/Pages/Programmes/Acquereur/Show.vue
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1169_commercial_ui_multi_lots.md
---

## PROMPT ENVOYÉ

SUIVI #1169 brique 3/3 — l’écran : rattachement / détachement UI (modale +
grille), marqueur groupe, fiche lots, listes annulation multi-lots,
garde-fou AF factorisé, SharePoint nom combinaison à la création uniquement.

## SYNTHÈSE

### Fiches lues
- `SUIVI_1154` / `SUIVI_1161` — contexte multi-lots / prix.
- `SUIVI_1167` — pivot dual-write ; cohérence 0 anomalie.
- `SUIVI_1168` — prix pivot + total dérivé + frais KPI une fois ; LEÇON
  frais une fois/résa avant UI.

### Entrées UI (D6)
- Modale réserver : `+ Ajouter un lot` (sélecteur stock/vente même programme,
  prix par lot, total lecture seule).
- Grille : sélection lignes + « Rattacher à une réservation » ; sélection
  vidée au changement filtre/recherche (#1158).
- Fiche acquéreur : liste lots + prix + principal / détacher / rattacher.

### Détachement
- Lot → `en_vente`, prix NULL, pivot retiré, total recalculé.
- Seul lot : refus. Principal : désignation d’un nouveau (dialog si >1).
- Changer principal sans détacher (PATCH).

### Garde-fou AF (#1162 factorisé)
- `assertRattachementLotAutorise` via `compterAppelsFondsBloquants`
  (nb + montant). Même message chiffré attache / détache.

### Affichage
- Marqueur `Groupe ×N` + tooltip numéros sur chaque ligne concernée.
- Annulation / suppression hors annulation : liste tous les lots libérés.

### SharePoint (D5)
- Format création : `A002 + B014 — NOM Prenom` (sanitize `\/:*?"<>|#%`).
- **Aucun renommage** des dossiers existants à l’ajout d’un lot.

### Migration
- Aucune — structure complète depuis #1167/#1168.

## DÉPLOIEMENT-TEST

1. `php tools/diag/diag_remises_kpi_1168.php` avant / après (107 304,48 €)
2. `git pull` ; `php artisan optimize:clear` ; `view:clear` ; `journal:sync`
3. `php artisan commercial:coherence-reservation-lots` → 0 anomalie
4. Tests manuels 1–16 du prompt (AF refus chiffré, marqueur, KPI filtre)

## LEÇON

Rattacher change le total → les snapshots AF deviennent faux : bloquer
attache ET détache dès qu’il existe un AF (#1043). SharePoint : ne jamais
renommer un dossier déjà stocké en base (liens + documents).
