# Suivi — Notifications riches (Abonnements, Fréquences, User Data)

Etat: en cours — Option A validée (PERSONALIZED: un épisode max/run), purge Admin livrée

## Journal
- [init] Plan validé et consigné (PLAN.md)
- [css] Modale "rich": overflow contrôlé, preview sertie (height/max-height)

## Checklist (DoD synthétique)
- [x] DDL appliqué (categories, notifications_rich.sequence_index NOT NULL, user_subscriptions, NUS.available_at/delivered_at, user_data)
- [x] Validations UI + back (422): fréquences/param, personalized×immediate bloqué (Admin + back)
- [x] Lecture unique via available_at<=now + audience + états
- [x] Scheduler (CLI) BROADCAST (delta) & PERSONALIZED (progression 1 épisode/run), idempotent, DST (slots) à valider par tests
- [x] Admin Catégories étendue (audience/mode/fréquence/ancre/override)
- [ ] Admin Fiche utilisateur (stats, abonnements, progression, features/Q/R/trophées)
- [ ] Compte “Mes abonnements” (toggle + override si autorisé)
- [ ] Tests unit/int/e2e au vert

## Phasage — tâches

### Phase 1 — DDL + surfaces (en attente GO)
- [x] SchemaManager: ALTER/CREATE tables & colonnes
- [x] Étendre Admin Catégories (UI + API) + validations strictes
- [x] GET /api/notifications/rich → audience + available_at<=now

### Phase 2 — Scheduler (CLI)
- [x] Impl. next_slot (tz Europe/Paris → UTC) — tools/scheduler/notifications-digest.php
- [x] BROADCAST: curseur persisté, delta only, idempotence, advisory locks
- [x] PERSONALIZED: cycle_anchor_ts, last_delivered_notification_id, progression (1 épisode/run)

### Phase 3 — Fiche utilisateur / Compte
- [x] GET /api/admin/users/:id/data (agrégé)
- [x] UI Admin “Fiche utilisateur” (lecture seule)
- [x] /account “Mes abonnements” + commands User.*

### Phase 4 — Stats & succès
- [ ] Hooks bus → user_data.stats.*
- [ ] Règles succès → user_achievements

### Phase ultérieure — Option produit (Backfill BROADCAST)
- [ ] Choix du mode par catégorie (NONE/IMMEDIATE/STAGED) et/ou job dédié
- [ ] Implémentation IMMEDIATE (K items, `available_at=now()`)
- [ ] Implémentation STAGED (ancre + progression par abonné)
## Réalisations supplémentaires (post‑plan)

- Ajout index performance `ix_us_cat_sub (category_id, subscribed)` sur `user_subscriptions` (SchemaManager).
- Suppression catégorie (Admin) = purge transactionnelle complète (NUS → notifications_rich → user_subscriptions → scheduler_meta → catégorie) + rapport détaillé en 200 OK.
- Reset DEV étendu: TRUNCATE des tables V4 notifications (`notification_categories`, `notifications_rich`, `notification_user_state`, `user_subscriptions`, `scheduler_meta`).
