---
suivi: 1476
date: 2026-09-07
sujet: Demandeur suiveur verrouillé + vocabulaire « Demandes aux suiveurs »
chantier: juridique / tâches opérationnelles
type: feature
statut: poussé
hash: fc17ed70
fichiers:
  - app/Services/DemandeJuridiqueService.php
  - app/Services/Juridique/DemandeJuridiqueSuiveurService.php
  - app/Support/Juridique/DemandeJuridiquePresenter.php
  - app/Services/Tasks/DemandePieceJuridiqueTaskSync.php
  - app/Http/Controllers/DemandeJuridiquePieceDemandeeController.php
  - app/Console/Commands/BackfillDemandeurSuiveurJuridiqueCommand.php
  - database/migrations/2026_09_07_180000_rename_demande_piece_juridique_task_type_libelle.php
  - resources/js/Pages/Juridique/Show.vue
  - resources/js/utils/tacheSuiviLabels.js
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - tests/Unit/DemandeurSuiveurVocabulaire1476Test.php
  - tests/Unit/DemandeurSuiveurVocabulaire1476SourceTest.php
  - public/build/
  - docs/suivi/SUIVI_1476_demandeur_suiveur_et_vocabulaire.md
---

# SUIVI #1476 — demandeur suiveur + vocabulaire actions

## PROMPT ENVOYÉ

Deux défauts prod (Robin) : (1) le demandeur n’est pas suiveur →
impossible de lui demander une action ; (2) vocabulaire « pièce » trop
restrictif. Options 1A + 2A + renommage libellés (couche technique inchangée).

## BASE GIT

```
git log --oneline -1 origin/main
e8ade4e7 chore(suivi): hash fiche #1475
```

## FICHES LUES

- **#1472** — socle `demande_juridique_pieces_demandees`, hook `suiveur_retire`,
  TaskSync, codes historique `piece_demandee*`.
- **#1474** — UI bloc, flags, rail PIÈCES, `fiche_url`.
- **#1475** — diag droits DG (aucun code touché ici).
- **#1451** — suiveurs Graph, `NotifierAjoutSuiveurDemandeJuridique`,
  `peutGererSuiveurs` via `m365GroupNames()` brut.
- **#1473** — tri défaut ListQuery (non touché).
- **#1469/#1471** — chronologie (libellés Presenter seulement).

## MESURES (étape 1)

1. **Création** — `DemandeJuridiqueController::store` →
   `DemandeJuridiqueDemandeurResolver::resolvePourStore` →
   `DemandeJuridiqueService::deposer($demandeur, …, $deposant)`.
   Champ porteur : `demandes_juridiques.demandeur_id` (`users.id`).
   Cas « via » : historique `user_id=demandeur`, `impersonator_id=deposant` ;
   c’est le DEMANDEUR qui devient suiveur, pas le déposant.
2. **Ajout suiveur** — `DemandeJuridiqueSuiveurService::ajouterSuiveur`
   (attach + historique + `NotifierAjoutSuiveur`). Dépôt utilise
   `suiveurs()->sync()` → **pas** de notif (neutralisation propre).
3. **Retrait** — route destroy suiveur ; croix si `peut_gerer_suiveurs &&
   peut_retirer` ; serveur refuse si demandeur.
4. **users.id** — le demandeur est toujours un `User` résolu (#1451 Graph
   à la volée). Backfill ignore `demandeur_id` null / relation absente.
5. **Hook `suiveur_retire`** — inchangé ; ne s’applique plus au demandeur
   (non retirable) ; reste actif pour suiveurs ordinaires.
6. **Sélecteur destinataire** — `demande.suiveurs` sans exclusion du
   demandeur (#1474). Une fois suiveur, il apparaît automatiquement.

## DÉCISIONS

- **Historique à la création** : PAS d’événement « suiveur ajouté » pour
  l’auto-ajout (bruit systématique).
- **Notification** : sync pivot à la création → `NotifierAjoutSuiveur`
  non appelé.
- **Backfill** : défaut = demandes OUVERTES seulement
  (`STATUTS_OUVERTS`) ; `--inclure-fermees` optionnel (fermer /
  legacy probablement inutiles — Robin tranche après dry-run).

## TABLEAUX

### 1. Ligne de suiveur

| Cas | Flag serveur | Croix UI | Retrait serveur |
|---|---|---|---|
| Demandeur | `est_demandeur=true`, `peut_retirer=false` | non | refusé |
| Suiveur ordinaire | `est_demandeur=false`, `peut_retirer=true` | oui (si `peut_gerer_suiveurs`) | oui + hook |
| Juriste aussi suiveur (≠ demandeur) | comme ordinaire | oui | oui |
| Juriste = demandeur | comme demandeur | non | refusé |

### 2–4

Voir livrable synthèse (renommage exhaustif, formulaire, backfill).

## COMMANDE BACKFILL

Signature LITTÉRALE : `juridique:backfill-demandeur-suiveur`
Options : `--apply`, `--inclure-fermees`. Dry-run par défaut.
**Ne pas exécuter `--apply` en prod sans validation Robin du dry-run.**

## DÉPLOIEMENT OVH (ordonné)

1. `git pull origin main`
2. `php artisan migrate --force`
3. `find app/ config/ database/ -name "*.php" -exec touch {} +`
4. `php artisan optimize:clear` puis `view:clear`
5. `php artisan journal:sync`
6. `php artisan juridique:backfill-demandeur-suiveur` (dry-run)
7. Après validation Robin : `… --apply`

JAMAIS npm / composer / optimize / config:cache sur OVH.

## LEÇON

- Auto-ajout via `sync` (pas `ajouterSuiveur`) pour éviter notif Teams.
- Flags `est_demandeur` / `peut_retirer` côté Presenter : le front ne
  compare pas les ids (#1428/#1447).
- Vocabulaire UI ≠ couche technique (code `demande_piece_juridique`
  conservé).
- Ne pas confondre avec le bloc « Pièces jointes ».
