9.9 KiB
9.9 KiB
Système de notifications pour les tickets support
✨ Résumé des fonctionnalités
Modal de confirmation avant envoi
- Apparence moderne : Modal inspiré du système de signatures électroniques groupées
- Informations affichées :
- Adresse email personnelle du destinataire
- Nom complet de l'utilisateur
- Prévisualisation complète du message
- Note explicative sur l'envoi à l'adresse personnelle
- Actions : Boutons d'annulation et de confirmation avec états de chargement
- Comportement intelligent : Notes internes envoyées directement sans modal
Envoi à l'adresse personnelle
⚠️ Particularité importante : L'email de notification est envoyé à l'adresse email personnelle de l'utilisateur qui a créé le ticket (récupérée via auth.users), et non à l'adresse générale de l'organisation. Cela garantit que la bonne personne reçoit la notification.
📧 Notifications par email
Fonctionnalité
Lorsqu'un membre du staff répond à un ticket support, le client reçoit automatiquement un email de notification avec :
- Le nom du membre du staff qui a répondu
- Le message de réponse
- Un lien direct vers le ticket pour continuer la conversation
Aperçu de l'email
┌──────────────────────────────────────────────────────────┐
│ ODENTAS PAIE │
├──────────────────────────────────────────────────────────┤
│ │
│ Réponse à votre ticket │
│ ════════════════════ │
│ │
│ Bonjour [Prénom], │
│ │
│ Vous avez reçu une réponse à votre ticket support. │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ ℹ️ Informations │ │
│ │ │ │
│ │ Répondu par: [Nom du staff] │ │
│ │ Sujet du ticket: [Sujet] │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────┐ │
│ │ 💬 Message │ │
│ │ │ │
│ │ Réponse: [Message du staff] │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────┐ │
│ │ Voir le ticket │ │
│ └──────────────────────┘ │
│ │
│ Vous recevez cet e-mail suite à une réponse de │
│ notre équipe support. │
└──────────────────────────────────────────────────────────┘
Template email utilisé
Type: support-reply (système universel V2)
Caractéristiques :
- Design moderne avec card pour le message
- Affichage du nom du staff et du sujet du ticket
- Bouton CTA "Voir le ticket" qui redirige vers
/support/{ticketId} - Couleurs standardisées de la marque Odentas
Données du template
{
firstName?: string; // Prénom du client
ticketId: string; // ID du ticket
ticketSubject: string; // Sujet du ticket
staffName: string; // Nom du staff qui répond
staffMessage: string; // Message de réponse
ctaUrl: string; // URL vers le ticket
}
🔔 Quand les notifications sont envoyées
✅ Notifications envoyées dans ces cas :
- Un membre du staff répond à un ticket
- Le message n'est PAS marqué comme "interne"
❌ Notifications NON envoyées dans ces cas :
- Le message est marqué comme "Note interne" (checkbox cochée)
- Un client répond à son propre ticket
- Erreur lors de la récupération des informations
🎯 Affichage enrichi de la page staff
Page /staff/tickets/[id]
La page affiche maintenant en haut du ticket :
- Organisation : Le nom de l'organisation concernée
- Ouvert par : Le nom complet de l'utilisateur qui a ouvert le ticket
Logique de résolution du nom :
- Recherche dans
organization_memberspour récupérerfirst_nameetlast_name - Si trouvé : affiche "Prénom Nom" ou juste "Prénom"
- Sinon : affiche l'email de l'utilisateur
- En dernier recours : "Utilisateur inconnu"
📝 Implémentation technique
Fichiers modifiés
1. /lib/emailTemplateService.ts
- Ajout du type
'support-reply'dansEmailTypeV2 - Ajout des champs dans
EmailDataV2:ticketIdticketSubjectstaffNamestaffMessage
- Création du template email avec design de card moderne
2. /app/api/tickets/[id]/messages/route.ts
- Import de
sendUniversalEmailV2 - Logique d'envoi d'email après insertion du message
- Récupération des informations du ticket et de l'utilisateur créateur
- Gestion d'erreur non-bloquante (l'email échoue sans faire échouer la création du message)
3. /app/(app)/staff/tickets/[id]/page.tsx
- Récupération du nom de l'organisation depuis
organizations - Récupération du nom de l'utilisateur depuis
auth.usersetorganization_members - Affichage d'une card d'information avec l'organisation et le créateur
4. /components/staff/StaffTicketActions.tsx
- Import et utilisation de
TicketReplyConfirmationModal - Récupération des informations du destinataire via
/api/tickets/[id]/recipient-info - Gestion de l'état du modal (affichage/masquage)
- Envoi différencié : notes internes sans confirmation, réponses publiques avec modal
- Affichage du modal avant envoi avec email, nom et message
5. /components/staff/TicketReplyConfirmationModal.tsx
- Composant modal de confirmation d'envoi
- Affichage de l'email et du nom du destinataire
- Prévisualisation du message
- Note explicative sur l'envoi à l'adresse personnelle
- Boutons d'annulation et de confirmation
6. /app/api/tickets/[id]/recipient-info/route.ts
- Route API pour récupérer les informations du destinataire
- Retourne l'email et le nom de l'utilisateur qui a créé le ticket
- Accessible uniquement au staff
- Gestion sécurisée via
auth.admin.getUserById()
🚀 Utilisation
Pour le staff
- Aller sur un ticket :
/staff/tickets/{id} - Voir l'organisation et le créateur du ticket en haut
- Écrire une réponse dans le formulaire en bas
- Si vous cochez "Note interne" : Le message sera envoyé directement sans notification email
- Si vous NE cochez PAS "Note interne" : Un modal de confirmation s'affiche avec :
- L'adresse email personnelle du destinataire
- Le nom de l'utilisateur
- Votre message de réponse
- Un bouton pour confirmer ou annuler l'envoi
- Confirmer l'envoi → Le client reçoit automatiquement un email à son adresse personnelle
Spécificité importante
⚠️ L'email est envoyé à l'adresse personnelle de l'utilisateur qui a créé le ticket, et non à l'adresse générale de l'organisation. Cela garantit que la bonne personne reçoit la notification.
Pour le client
- Recevoir l'email de notification
- Cliquer sur "Voir le ticket"
- Être redirigé vers
/support/{id} - Voir la réponse et pouvoir continuer la conversation
🔍 Variables d'environnement requises
NEXT_PUBLIC_BASE_URL=https://paie.odentas.fr
AWS_SES_FROM=paie@odentas.fr
AWS_REGION=eu-west-3
🐛 Débogage
Logs à surveiller
✅ Notification email envoyée à {email} pour le ticket {id}
Erreurs possibles
- "Erreur lors de l'envoi de la notification email" : L'email n'a pas pu être envoyé mais le message est quand même créé
- Vérifier la console pour les détails de l'erreur SES
💡 Améliorations futures possibles
- Notifications en temps réel : Utiliser des WebSockets ou Server-Sent Events
- Préférences de notification : Permettre aux utilisateurs de désactiver les emails
- Notifications push : Ajouter des notifications push navigateur
- Résumé quotidien : Envoyer un email quotidien avec tous les tickets mis à jour
- Cache des noms : Mettre en cache les noms d'utilisateurs pour améliorer les performances
📊 Performance
- L'envoi d'email est non-bloquant : si l'email échoue, le message est quand même créé
- La résolution du nom utilise
maybeSingle()pour éviter les erreurs si aucun résultat - Les requêtes auth.admin sont nécessaires pour accéder aux emails (RLS)
🔒 Sécurité
- Vérification que l'utilisateur est bien staff avant d'envoyer
- Messages internes jamais envoyés par email (confidentialité)
- Utilisation de
auth.adminuniquement côté serveur - RLS respectée pour toutes les requêtes