---
suivi: 1042
date: 2026-07-29
sujet: Mes tâches — DnD inter-colonnes (statut/échéance) + marqueur Aktor
chantier: taches-suivi
type: feature
statut: poussé
hash: d7ce8aa1
fichiers:
  - app/Support/TacheSuiviKanbanMove.php
  - app/Services/TacheSuiviService.php
  - app/Http/Controllers/TacheSuiviController.php
  - app/Http/Controllers/MesTachesController.php
  - app/Http/Requests/TacheSuivi/KanbanMoveTacheSuiviRequest.php
  - routes/web.php
  - resources/js/utils/mesTachesGrouping.js
  - resources/js/Pages/MesTaches/Index.vue
  - resources/js/Components/TachesSuivi/TacheSuiviKanbanCard.vue
  - resources/js/Components/TachesSuivi/TacheSuiviListItem.vue
  - resources/css/mes-taches.css
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
---

## PROMPT ENVOYÉ

SUIVI #1042 — absorbe le brouillon #1030 jamais envoyé (DnD inter-colonnes).
Objectif A : réactiver le drop inter-colonnes en liste blanche (statut + échéance uniquement).
Objectif B : marqueur `pi-sparkles` sur carte/liste si proposition Aktor `a_cadrer`, réservé GS_ADMIN_ERP au niveau données.
Même commit, rebuild `public/build/`, journal OUI.

## SYNTHÈSE

### Absorption #1030
Ce lot reprend le contenu du brouillon « #1030 » (drag & drop inter-colonnes) jamais soumis à Cursor. Le numéro #1030 reste consommé et non réutilisé.

### Tableau regroupements (clés réelles `mesTachesGrouping`)

| Regroupement (clé) | Drop inter-colonnes | Champ modifié | Autorisé à | Justification |
|---|---|---|---|---|
| `echeance` → `late` | REFUSÉ | — | — | Poser une date passée est douteux |
| `echeance` → `upcoming` | AUTORISÉ | `date_echeance` = aujourd’hui | Créateur (`update`) | Seul bucket échéance admissible |
| `statut` → `statut-{7}` | AUTORISÉ | `statut` | Créateur + associé (`changeStatut`) ; `abandonne` = créateur seul (service) | Même règles formulaire |
| `statut` → `statut-op` | REFUSÉ | — | — | Colonne opérationnelles (onglet Tous) |
| `programme` → `prog-*` / `prog-none` | REFUSÉ | — | — | Rattacher = exposer (Option A projets/programmes) |
| `projet` → `projet-*` / `projet-none` | REFUSÉ | — | — | Idem visibilité projet |
| `aucun` → `all` | REFUSÉ | — | — | Pas de colonnes métier |

Réordonnancement vertical (#1028) inchangé dans toutes les colonnes (policy `reorder`).

### Tableau buckets échéance

| Colonne affichée | Date postée | Colonne DB | Libellé back |
|---|---|---|---|
| En retard (`late`) | — (drop refusé) | — | — |
| À venir (`upcoming`) | date du jour (`Y-m-d`) | `date_echeance` | `date_echeance` |

Pas de bucket « sans échéance » / « cette semaine » dans le code actuel — uniquement `late` / `upcoming`.

### Service métier
- `TacheSuiviService::deplacerKanbanColonne()` → appelle **`changerStatut()`** ou **`modifier()`** puis **`reordonner()`**.
- Aucun `DB::table()->update()` direct hors de ces méthodes.
- Journal « Champ : avant → après » + commentaire système via `journaliserDiff`.
- `termine` → `valider()` (renseigne `termine_at` + `termine_par_id`).
- `abandonne` → créateur seul (déjà dans `changerStatut`).
- Notifications Teams : **aucune** sur changement statut/échéance (seulement commentaires @mention / assignation). Pas de risque de spam DnD.

### Permissions
- Statut : `authorize('changeStatut')` (créateur \| associé).
- Échéance : `authorize('update')` (créateur seul).
- Policy `reorder` / endpoint reorder #1028 **non modifiés**.

### Position
Le drop inter-colonnes envoie `ordered_ids` de la colonne cible (index de dépôt) ; `reordonner()` réattribue les slots dans la même transaction enveloppe.

### Marqueur Aktor
- `withExists(assistantProposition as proposition_aktor_a_cadrer WHERE statut=a_cadrer)` **uniquement si** `$user->isAdminERP()`.
- Clé absente du payload pour les non-admin.
- Affichage Kanban + liste (`pi-sparkles`), pas la modale.
- 1 requête EXISTS jointe à la liste — pas de N+1.

### Front / build
Rebuild Vite après pull `main` à jour. Bundle MesTaches à confirmer dans la synthèse commit.

## DÉPLOIEMENT / TEST

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

Tests écran : DnD statut / échéance / refus programme-projet ; associé échéance refusée ; marqueur admin sur tâches 81–88.

## LEÇON

Liste blanche pour les actions qui mutent un champ métier : un early-return permissif laisse passer des changements d’exposition (programme/projet) qu’un formulaire rendrait explicites.
