---
suivi: 1053
date: 2026-07-29
sujet: Checklist simple sur tâches de suivi (compteur carte 3/7)
chantier: taches_suivi
type: feature
statut: poussé
hash: f9ec541b
fichiers:
  - database/migrations/2026_07_29_140000_create_tache_suivi_checklist_items_table.php
  - app/Models/TacheSuiviChecklistItem.php
  - app/Models/TacheSuivi.php
  - app/Services/TacheSuiviService.php
  - app/Http/Controllers/TacheSuiviChecklistItemController.php
  - app/Http/Controllers/TacheSuiviController.php
  - app/Http/Controllers/MesTachesController.php
  - app/Http/Controllers/ProgrammeDashboardController.php
  - app/Support/TacheSuiviPresenter.php
  - routes/web.php
  - resources/js/Components/TachesSuivi/TacheSuiviChecklistPanel.vue
  - resources/js/Components/TachesSuivi/TacheSuiviDetailModal.vue
  - resources/js/Components/TachesSuivi/TacheSuiviKanbanCard.vue
  - resources/js/Components/TachesSuivi/TacheSuiviListItem.vue
  - resources/js/Pages/TachesSuivi/Show.vue
  - resources/css/mes-taches.css
  - public/build/
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1053_checklist_sous_taches.md
---

## PROMPT ENVOYÉ

SUIVI #1053 — checklist simple (libellé / fait / position) sur tâches de suivi, compteur
« 3/7 » sur carte/liste, droits créateur vs associé, pas de journal par coche, withCount
sans N+1, migration, rebuild Vite (rebase avant build). Pas d’ops (`tasks`).

## SYNTHÈSE

### Schéma
Table `tache_suivi_checklist_items` : tache_suivi_id (FK cascade hard-delete), libelle, fait,
position, fait_par_user_id, fait_at, timestamps. Index `(tache_suivi_id, position)`.
Soft-delete parent : lignes conservées (comme commentaires/docs) ; forceDelete → cascade.

### Droits
| Action | Créateur | Associé | Autre | Ability |
|---|---|---|---|---|
| Cocher / décocher | OUI | OUI | NON | `changeStatut` |
| Ajouter / renommer / supprimer / réordonner | OUI | NON | NON | `update` |
| Voir checklist | si tâche visible | idem | NON | `view` (visibilité tâche) |

### Journal
AUCUNE journalisation (ni coche ni structure). Justification : une checklist de N éléments
noierait le journal « Champ : avant → après ». Traçabilité coche = `fait_par_user_id` + `fait_at`.
`journaliserDiff` whitelist n’inclut pas la checklist → pas d’effet de bord.

### Perf
Mes tâches / dashboard programme : `withCount(['checklistItems', 'checklistItems as checklist_faits_count' => fait])`.
Avant : eager existants. Après : +2 agrégats SQL batch (pas N+1).

### UI
Compteur discret si nb_checklist > 0. Panel fiche + Show. DnD HTML5 natif désactivé tactile ;
boutons ↑↓. Endpoint distinct de `/taches-suivi/reorder`.

## DÉPLOIEMENT-TEST

```bash
git pull origin main
php artisan migrate --force
php artisan optimize:clear
php artisan view:clear
php artisan route:clear
find app/ -name "*.php" -exec touch {} +
php artisan journal:sync
```

Pas de npm/composer/optimize sur OVH (`public/build/` commité).

## LEÇON

Une checklist n’est pas une sous-tâche : éviter la hiérarchie `taches_suivi` (visibilité Option A,
droits). Compteur via `withCount` dans le payload liste, jamais une requête/carte.
