---
suivi: 1211
date: 2026-08-05
sujet: Tâches dossier — Mes tâches, retard, digest 9h
chantier: foncier / taches
type: feature
statut: poussé
hash: 43117047
fichiers:
    - app/Services/MesTachesResumeService.php
    - app/Http/Controllers/MesTachesController.php
    - app/Services/Assistant/AssistantTacheSuiviRetrievalService.php
    - app/Support/TacheSuiviPresenter.php
    - resources/js/Components/TachesSuivi/TacheSuiviProgrammeTag.vue
    - resources/css/mes-taches.css
    - tests/Unit/MesTachesResumeDossier1211Test.php
    - tools/diag/diag_mes_taches_queries_1211.php
    - database/data/journal_mises_a_jour_post_2026_06_12.php
    - docs/suivi/SUIVI_1209_taches_dossier_foncier_morph.md
    - docs/suivi/SUIVI_1211_taches_dossier_mes_taches_digest.md
    - public/build/
---

# SUIVI #1211 — Mes tâches / retard / digest pour tâches dossier

## PROMPT ENVOYÉ

Brique 2/2 après #1209 : faire remonter les tâches morph dossier dans Mes tâches,
compteurs de retard et digest 9h, sans fuite ACL (D62 stricte). Tag
`Dossier {reference}` cliquable. Pas de migration. Corriger la mention #1210→#1211
dans la fiche #1209.

## Fiches lues

- #1206 (diag) — 5 points de fuite ; digest via PHP-FPM.
- #1209 — morph + scope D62 + panneau synthèse (Show.vue non retouché ici).
- #1210 — diag import Excel (numérotation : cette brique n’est pas #1210).

## OBJET 1 — Tableau consommateurs (avant → après)

| Consommateur | Fichier / méthode | Passait par le scope ? | Corrigé ? |
|--------------|-------------------|------------------------|-----------|
| Mes tâches liste | `MesTachesController::index` | **OUI** (`visiblePourUtilisateur`) | Partiel : eager `attachable` + origines (tag) |
| Badge / compteurs retard | `MesTachesResumeService::queryTachesSuivi{Manage,Assigne,Digest}` | **NON** (créateur∪pivot seuls) | **OUI** — `+ visiblePourUtilisateur` |
| Digest 9h | idem + `construireMessageDigest` | **NON** | **OUI** + regroupement `Dossier {ref}` / programme |
| GET `/taches-suivi/{id}` | `TacheSuiviPolicy` → `estVisiblePar` | **OUI** | Non requis |
| Aktor retrieval | `AssistantTacheSuiviRetrievalService::topTachesVisibles` | **OUI** | Eager `attachable` uniquement |

Point de vérité unique : `TacheSuivi::scopeVisiblePourUtilisateur` (pas de 2e règle ACL).

## SYNTHÈSE

### Mes tâches
- Eager `attachable` (constrain `DossierFoncier` : `id`, `reference`).
- `serializeTacheSuiviListRow` utilise `serializeOriginesPourListe` (ne plus écraser).
- Tag dossier cliquable → `/foncier/dossiers/{id}?onglet=synthese` (`@click.stop`).
- Filtre programme existant : ignore `type=dossier` (tâche reste dans « sans programme »
  du filtre) — pas de filtre « par dossier » dans ce lot.

### Retard / digest
- Union perso ∩ scope : créateur/assigné **et** visible (ACL dossier).
- Digest : headers `Dossier REF` / libellé programme seulement s’il y a une origine ;
  sinon liste plate identique à avant (pas de section vide).
- Déclencheur `DeclencheDigestQuotidien` inchangé (PHP-FPM).

### Notifications
- Assignation Teams : pas de référence dossier dans le message (#1209 refuse déjà
  non-habilité en 422) — confirmé.

### Non-régression
- `ProgrammeDashboardController` non touché.
- `attachable NULL` : même intersection créateur∪pivot ∩ scope (= comportement
  historique pour ces tâches).

## DÉPLOIEMENT-TEST

```
git pull origin main
php artisan view:clear
php artisan journal:sync
```

(Pas de migrate.)

Diag queries OVH : `php tools/diag/diag_mes_taches_queries_1211.php`

## LEÇON

Badge/digest construits « à côté » du scope = fuite cloisonnement dès qu’une tâche
existe hors créateur∪pivot ou que le créateur n’a plus l’ACL. Toujours intersecter
`visiblePourUtilisateur` ; ne jamais re-coder D62.
