louispaulb
|
1f74194419
|
feat(events): sélecteur d'audience (liste clients filtrée OU CSV) + aperçu + choix de modèle
Dialogue « Envoyer une invitation » → bascule Test / Envoi de masse. Mode masse :
- Choix du MODÈLE de courriel (défaut « Invitation Fête 20 ans (TARGO) » + modèles de
/campaigns/templates) — rend le module réutilisable.
- Audience par FILTRES liste clients (clients actifs / abonnement actif) OU IMPORT CSV
(email seul obligatoire ; firstname/lastname/language/customer_id/phone optionnels, alias FR/EN).
- Bouton « Aperçu de l'audience » → décompte live + échantillon (ex. 7943 clients actifs avec
courriel, 759 sans courriel écartés). Choix canal Mailjet (suivi)/Gmail.
Hub : resolveAudience({mode,filters,csv}) (recherche aveugle clients via erp.list + Service
Subscription pour « abonnement actif » ; dédup + courriel requis) + POST /events/:id/audience.
Filtre territoire retiré (champ ERPNext non peuplé → 0 résultat, éviter la confusion).
⚠️ L'ENVOI DE MASSE réel (création campagne + blast + suivi) reste GATÉ/non branché — bannière
« dernière étape à activer ». Test-à-soi inchangé. 29/29 tests unitaires. Déployé hub + SPA.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-07-06 13:39:22 -04:00 |
|
louispaulb
|
e4a8990711
|
feat(events): inscription (RSVP) événement + page admin Ops — Fête Targo 20 ans
Nouvelle fonctionnalité « Événements » (aucun courriel envoyé — moteur d'envoi prêt mais gaté).
Hub (services/targo-hub) :
- lib/events.js : config événement semée (fete-20-ans, bilingue FR/EN) ; page
PUBLIQUE festive GET /rsvp/:id[?t=<jwt>&lang] (n° client · combien · courriel ·
allergies ; ?t pré-remplit + rattache via magic-link) ; POST /rsvp/:id/submit
(résout le client au mieux via portal-auth.lookupCustomer, valide, stocke clé-par-
client → re-soumission = mise à jour, pas de doublon) ; endpoints STAFF GET /events,
GET /events/:id/rsvps (+ décompte total de personnes), DELETE ; helpers lien perso
(generateCustomerToken) + courriel d'invitation bilingue. Réutilise les patrons rating.js.
- server.js : dispatch /rsvp + /events → lib/events ; /rsvp/ ajouté à PUBLIC (page +
soumission anonymes) ; /events ajouté à ALWAYS_ENFORCE (vue staff = PII → token requis).
Ops (apps/ops) :
- pages/EventsPage.vue (/evenements) : bandeau événement, KPIs (inscriptions / personnes
attendues = total food truck / à vérifier), lien public copiable (affiche/QR/réseaux),
carte invitation courriel (envoi gaté), table filtrable (DynamicFilter) + export CSV +
suppression. Réutilise PageHeader/StatCard/DataTable/DynamicFilter/useCsvExport.
- api/events.js (client hub), route /evenements, entrée menu « Événements » (PartyPopper).
Vérifié : 30/30 tests unitaires hub (offline) ; page Ops rend proprement à 375px+desktop,
0 erreur console, dégradation gracieuse tant que le hub n'est pas déployé.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-07-06 09:41:24 -04:00 |
|