metallkart-erp/BLOC-1-RAPPORT-FINAL.md
louis 6f9a99344a feat(engagement): SPEC-BLOC-1H — 25 E2E tests engagement + docs + rapport final BLOC-1
25 nouveaux tests Playwright (6 decisions + 5 reminders + 5 agenda + 4 router-admin + 5 pwa-cross).
3 bugs backend corriges (Prisma relation logs→log, CalendarConfig field mapping, seed options).
Documentation: MANUAL-VALIDATION-BLOC-1.md, cleanup-demo-engagement.sh, BLOC-1-RAPPORT-FINAL.md.
47/47 engagement E2E green, 0 regressions.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-28 09:36:43 +04:00

8.6 KiB

BLOC-1-RAPPORT-FINAL.md — Engagement Layer Complet

Date: 2026-05-28 Sessions: 139-145 (SPEC-BLOC-1A a SPEC-BLOC-1H) Statut: COMPLET


1. Perimetre livre

Le Bloc 1 "Engagement Layer" est un socle transversal qui ajoute 5 modules fonctionnels a l'ERP MetallKart:

Module Description Route
Tasks Gestion de taches (liste + Kanban + drawer) /tasks
Decisions Decisions structurees (BINARY / MULTI_CHOICE) /decisions
Reminders Rappels planifies (SCHEDULED / SENT / ACKNOWLEDGED) /reminders
Agenda Calendrier unifie (jour/semaine/mois) /agenda
PWA Application installable + Web Push manifest + SW

2. Backend — Modeles et services

2.1 Modeles Prisma (11 tables)

Modele Description
Task Taches avec statut, priorite, assignation
TaskDependency Dependances entre taches (blocksTaskId/dependsOnTaskId)
TaskEntityLink Liens taches <-> entites ERP
Decision Decisions avec kind BINARY/MULTI_CHOICE
DecisionLog Journal des evenements decision
DecisionEntityLink Liens decisions <-> entites ERP
Reminder Rappels planifies multi-canal
EngagementAutoRule Regles automatiques (8 seedees)
UserMemory Preferences utilisateur (PREFERENCE -> CONSTRAINT)
AgendaCalendarConfig Configuration calendrier par utilisateur
NotificationDelivery Suivi livraison notifications multi-canal

2.2 Services (7)

Service Responsabilite
TasksService CRUD + status transitions + recherche
DecisionsService CRUD + decide + escalate + cancel + reopen
RemindersService CRUD + acknowledge + liste filtree
AgendaService Aggregation taches+decisions par plage
CalendarConfigService Config calendrier par user (upsert)
UserMemoryService Preferences utilisateur CRUD
EngagementRouterService Auto-rules CRUD + toggle

2.3 Routes (7 fichiers, ~30 endpoints)

Fichier Prefix Endpoints
tasks.routes.ts /engagement/tasks CRUD + status + search
decisions.routes.ts /engagement/decisions CRUD + decide + escalate + cancel + reopen
reminders.routes.ts /engagement/reminders CRUD + acknowledge
agenda.routes.ts /engagement/agenda GET agenda + GET/PUT config
user-memory.routes.ts /engagement/user-memory CRUD
router.routes.ts /engagement/router auto-rules list + toggle
engagement.routes.ts /engagement (barrel) Registre tous les sous-modules

2.4 Hooks et Crons

Hook/Cron Declencheur
reminder-dispatch.cron Toutes les 5 min, envoie les rappels SCHEDULED echus
decision-escalation.cron Toutes les 15 min, escalade les decisions en retard
engagement-auto-rules seed Au demarrage, upsert 8 regles referentiel

3. Frontend — Composants

3.1 Tasks (frontend/src/modules/engagement/tasks/)

Composant Role
TasksPage Page principale (liste + Kanban toggle)
TaskListView Tableau AntD avec filtres et pagination
TaskKanbanView Vue colonnes drag & drop
TaskCreateModal Modal creation tache
TaskDetailDrawer Drawer detail tache (720px)
store.ts Zustand state management

3.2 Decisions (frontend/src/modules/engagement/decisions/)

Composant Role
DecisionsPage Page principale avec KPI cards
DecisionCreateModal Modal creation (BINARY / MULTI_CHOICE)
DecisionDetailDrawer Drawer detail avec log et reminders
DecisionDecideModal Modal pour decider (boutons / radio)
store.ts Zustand state management

3.3 Agenda (frontend/src/modules/engagement/agenda/)

Composant Role
AgendaPage Page calendrier avec stats
AgendaDayView / WeekView / MonthView 3 vues calendrier

3.4 PWA

Composant Role
sw.ts Service Worker (push + notificationclick)
PwaInstallPrompt Banniere installation PWA
NotificationOptInBanner Opt-in push dans AgendaPage

4. Auth — Migration HTTPOnly Cookies

Avant (BLOC-1E) Apres (BLOC-1F)
JWT dans localStorage Cookie mk_erp_token HTTPOnly 15min
Bearer header explicite Cookie auto-envoye par navigateur
Refresh via body Cookie mk_erp_refresh HTTPOnly 7d path=/api/v1/auth/refresh
Bearer fallback preserve pour E2E Playwright
SameSite=Strict, Secure conditionnel HTTPS_ENABLED

5. Tests automatises

5.1 Vitest (backend)

Module Tests
BLOC-1A (schemas + foundation) 12
BLOC-1B (services + routes) 30
Total 42

5.2 Playwright E2E

Fichier spec Tests Description
engagement-tasks.spec.ts 22 Liste, Kanban, filtres, CRUD, drawer, statut
engagement-decisions.spec.ts 6 Display, filtrage, create API, decide BINARY/MULTI
engagement-reminders.spec.ts 5 Display, filtrage statut, acknowledge, create API
engagement-agenda.spec.ts 5 Vues jour/semaine/mois, items, multi-user, config API
engagement-router-admin.spec.ts 4 Auto-rules list, toggle, structure, auth guard
engagement-pwa-cross.spec.ts 5 Manifest, SW, sidebar, deep-links, auth cookies
Total engagement 47

5.3 Total E2E projet (avant BLOC-1)

~200 tests existants. Objectif: 0 regression. Suite complete executee et validee.

6. Seed E2E (seed-test.ts)

Donnees ajoutees au seed E2E pour le module engagement:

Entite Quantite Details
Tasks 4 TODO, IN_PROGRESS, DONE, CANCELLED
Decisions 3 BINARY PENDING, MULTI_CHOICE PENDING, BINARY DECIDED
Reminders 2 SCHEDULED, SENT
AgendaCalendarConfig 1 Admin, defaultView WEEK
EngagementAutoRules 8 Seedees via referentiel

7. Bugs decouverts et corriges

Bug Cause Correction
GET /decisions/:id retourne 500 Prisma include logs au lieu de log (nom relation) decisions.service.ts: logs -> log
CalendarConfig enableReminders undefined toDto() lisait c.enableReminders au lieu de c.showReminders calendar-config.service.ts: mapping corrige
Decision BINARY options vides Seed manquait le champ options seed-test.ts: ajout options approve/reject
Dropdown AntD ne se ferme pas getByText('Напоминания').click() bloque par overlay Remplace par page.keyboard.press('Escape')
Prisma validation reminders relation Include target nommage relation "ReminderTarget" Fix dans BLOC-1C via targetUser -> target

8. Architecture — Decisions cles

Decision Justification
Zustand (pas Redux/Context) Leger, pas de boilerplate, store isole par module
Cookie HTTPOnly (pas Bearer) Securite XSS, pas de token en JS accessible
Bearer fallback E2E Playwright ne peut pas injecter des cookies same-site facilement
API-based E2E pour create/decide DatePicker AntD v6 unreliable avec fill(), API plus stable
engagement_auto_rules = referentiel Jamais tronque par seed, upsert idempotent

9. Fichiers cles

prisma/schema.prisma                        # 11 modeles engagement
src/modules/engagement/                      # Backend complet
  services/ (7 fichiers)
  routes/ (7 fichiers)
  schemas/ (5 fichiers)
  helpers/entity-resolver.ts
  crons/ (2 fichiers)
frontend/src/modules/engagement/             # Frontend complet
  tasks/ (6 composants + store)
  decisions/ (5 composants + store)
  agenda/ (4 composants)
frontend/src/sw.ts                           # Service Worker PWA
tests/e2e/engagement-*.spec.ts              # 6 fichiers, 47 tests
tests/e2e/seed-test.ts                      # Seed engagement
MANUAL-VALIDATION-BLOC-1.md                 # Checklist manuelle
scripts/cleanup-demo-engagement.sh          # Purge donnees demo

10. Metriques finales

Metrique Valeur
Modeles Prisma ajoutes 11
Enums ajoutes 17
Services backend 7
Routes backend ~30 endpoints
Composants frontend ~20
Vitest 42
Playwright E2E 47
Bugs corriges 5
Erreurs TS 0
Regressions E2E 0

11. Livraison

  • BLOC-1A: Foundation (11 modeles, 17 enums, 10 Zod, 12 Vitest)
  • BLOC-1B: Backend services + routes + hooks + crons (30 Vitest)
  • BLOC-1C: Frontend Tasks (Liste + Kanban + Drawer + Modal)
  • BLOC-1D: E2E Tasks (22 tests)
  • BLOC-1E: Router wiring + deep-links + cron migration
  • BLOC-1F: PWA + Web Push + Auth HTTPOnly cookies (5 Vitest)
  • BLOC-1H: E2E Decisions/Reminders/Agenda/Router/PWA (25 tests) + docs + rapport