---
suivi: 1070
date: 2026-07-29
sujet: Correctif filtres programme/projet Mes tâches
chantier: taches_suivi
type: fix
statut: poussé
hash: 0e3f5a83
fichiers:
  - resources/js/Pages/MesTaches/Index.vue
  - resources/css/mes-taches.css
  - app/Http/Controllers/MesTachesController.php
  - app/Models/User.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1070_fix_filtres_programme_projet.md
  - docs/suivi/SUIVI_1068_filtres_programme_projet_mes_taches.md
  - public/build/
---

## PROMPT ENVOYÉ

SUIVI #1070 — correctif #1068 : « Tous » non persisté ; options qui s’appauvrissent ;
rapport POINT 3 (case périmètre) + affordance ; parade C1 ; pas d’élargissement visibilité.

## SYNTHÈSE

### BUG 1 — cause exacte
Deux causes cumulées :
1. Option Select « Tous » en `value: null` — PrimeVue ne sélectionne pas proprement null →
   l’UI revient à la valeur précédente ; l’effacement n’est pas fiable côté client.
2. Front envoyait `filtre_*_id=''` ; le back effaçait via `setPreference(null)` en **gardant
   la clé à null**. Distinguo fragile. Surtout : sans sentinelle stable, un param omis
   (= absente) **rechargeait** la préférence.

Mécanisme #1070 :
- Front envoie toujours `filtre_*_id=0` pour « Tous » (jamais omettre la clé).
- Back : `query->has` → présent + `0`/`tous`/vide → `setPreference(null)` qui **unset** la clé.
- Clé absente = aucun filtre (équivalent « pas de préférence » / « Tous choisi »).
- Clé présente avec id > 0 = filtre actif.
- Select : `FILTRE_TOUS = 0` (plus de `value: null`).

### Audit autres préférences
- `mes_taches_inclure_perimetre_programme` : front envoie toujours `0|1` — OK. Attention :
  query `''` est traité comme **absent** (restaure la préférence) — pas corrigé ici (front
  n’envoie jamais vide). Défaut `false` si jamais posée — OK.
- `programmes_filtre_enseigne` (#1059) : stocke explicitement `hectare|envol|tous` — **pas
  d’ambiguïté** null/absent. RAS.

### BUG 2 — options
Source = `mergedList` (payload visible ops+suivi), **hors** filtres d’affichage (onglet,
terminées, étiquette, programme, projet). Parade C1 + virtuelles #1051. Préférence obsolète
→ option orpheline « … (aucune tâche visible) » + « Tous » toujours possible.

### POINT 3
- Contrôle existe (#1058), fonctionne (scope inchangé, défaut `false` si jamais posé).
- Bouton-bascule ambigu (classe `.on` bleue sans libellé d’état) → remplacé par **Checkbox**
  (+ idem terminées). Comportement / scope / policies : **non modifiés**.

### Visibilité
Inchangée. Accès `/taches-suivi/{id}` intact. Compteurs resume BACK inchangés.

## DÉPLOIEMENT-TEST

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

## LEÇON
- Préférence : distinguer « valeur vide choisie » / « pas de valeur enregistrée ».
- Options de filtre : depuis le jeu **visible**, pas le jeu **déjà filtré**.
