---
suivi: 1051
date: 2026-07-29
sujet: Fix regroupement programme — tâches opérationnelles Mes tâches
chantier: taches_suivi
type: fix
statut: poussé
hash: a7fe19d7
fichiers:
  - app/Http/Controllers/MesTachesController.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1051_fix_regroupement_programme_taches_operationnelles.md
---

## PROMPT ENVOYÉ

SUIVI #1051 — PHASE 2 après diag #1047 (H2). Option A figée : étiquette programme
virtuelle dans `serializeTaskRow` (pas de modif `mesTachesGrouping.js`). Inclure verdict
projet. Eager load programme, pas de N+1, pas de migration/Vue/rebuild, journal #412.
Ne pas toucher bilan, dépôt, Aktor, #1048 acquis.

## SYNTHÈSE

### Cause (#1047 H2)
Regroupement front lit `item.etiquettes[]` ; ops n’en avaient pas malgré
`factures.programme_id` déjà chargé.

### Correctif (option A)
`serializeTaskRow` émet `etiquettes: [{ id: null, type: 'programme', programme_id, libelle, virtuelle: true }]`
quand la facture a un `programme_id` ; sinon `[]` → « Sans programme ».
Eager : `Facture::with(['fournisseur', 'programme:id,libelle'])` — batch, pas de N+1.
`mesTachesGrouping.js` inchangé. Aucune écriture `etiquettes` / pivot.

### Structure étiquette
Attendue (suivi) : `{ id, type, programme_id, libelle }` — libelle depuis `programmes.libelle`.
Produite (ops virtuelle) : même clés + `virtuelle: true`, `id: null`.

### Projet
`tasks` n’a ni `projet_id` ni chemin de déduction → « Sans projet » est CORRECT.
Payload explicite `projet_id: null`, `projet: null`. Rien d’artificiel.

### UI / mutabilité
Cartes ops (`MesTachesOperationalListItem`, `TacheSuiviKanbanCard`) n’affichent pas les
étiquettes → virtuelle non modifiable/supprimable. DnD prog-* déjà refusé (#1042).

### Visibilité
`Task::visiblePourUtilisateur` inchangé (assignee / groupe). Compte visible identique.
Libellé programme : l’utilisateur voit déjà la facture (fiche_url) — risque faible, signalé
comme acceptable.

### Requêtes factures batch
Avant : factures + fournisseurs (2). Après : + programmes (3). Toujours O(1) vs N tâches.

## DÉPLOIEMENT-TEST

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

Pas de migrate / npm / composer / optimize.
Tests : task#866 → colonne LES TRITONS (prog-2) ; suivi non-régression ; console JS vide.

## LEÇON

Deux univers (`tasks` vs `taches_suivi`) rattachent le programme différemment (facture vs
étiquette typée). Une fonction de regroupement partagée qui ne connaît qu’un modèle produit
un classement silencieusement faux — pas une erreur, un mauvais résultat crédible.
