9.6 KiB
📧 Personnalisation Email Signature Salarié avec Prénom
Date: 16 octobre 2025
🎯 Objectif
Personnaliser l'email de signature électronique envoyé aux salariés en utilisant leur prénom dans la salutation "Bonjour [Prénom]". Le prénom est récupéré depuis la colonne prenom de la table salaries dans Supabase.
✨ Fonctionnalité
Comportement
Lorsqu'un email de signature électronique est envoyé à un salarié :
- Si la Lambda fournit le prénom → Utilisé directement
- Si le prénom n'est pas fourni → Recherche dans la table
salariesde Supabase- Recherche par
matricule(priorité) ouadresse_mail - Filtre par
employer_idsi disponible
- Recherche par
- Si aucun prénom trouvé → Fallback sur "Salarié"
Email généré
Bonjour Jean,
Nous vous invitons à signer votre contrat de travail ci-dessous...
🔧 Implémentation
Fichier modifié
/app/api/emails/signature-salarie/route.ts
Étape 1 : Renommer le paramètre firstName
const {
employeeEmail,
signatureLink,
reference,
firstName: providedFirstName, // ← Renommé pour clarté
organizationName,
matricule,
// ...
} = data;
Étape 2 : Récupération depuis Supabase
// 3. Récupération du prénom depuis Supabase si non fourni
let firstName = providedFirstName;
if (!firstName && (matricule || employeeEmail)) {
console.log('🔍 Récupération du prénom depuis la table salaries...');
try {
const supabase = createSbServiceRole();
// Recherche par matricule ou email
let query = supabase
.from('salaries')
.select('prenom')
.limit(1);
if (organizationId) {
query = query.eq('employer_id', organizationId);
}
// Priorité au matricule
if (matricule) {
query = query.or(`code_salarie.eq.${matricule},num_salarie.eq.${matricule}`);
} else if (employeeEmail) {
query = query.eq('adresse_mail', employeeEmail);
}
const { data: salaryData, error: salaryError } = await query;
if (!salaryError && salaryData && salaryData[0]?.prenom) {
firstName = salaryData[0].prenom;
console.log('✅ Prénom trouvé dans Supabase:', firstName);
} else {
console.warn('⚠️ Prénom non trouvé dans Supabase');
}
} catch (err) {
console.error('⚠️ Erreur lors de la récupération du prénom:', err);
}
}
Étape 3 : Utilisation du prénom
// 4. Préparation des données de l'email
const emailData: EmailDataV2 = {
firstName: firstName || 'Salarié', // ← Fallback si toujours vide
organizationName: organizationName,
// ...
};
Étape 4 : Logging amélioré
console.log('📧 Préparation de l\'envoi de l\'email:', {
to: employeeEmail,
type: 'signature-request-salarie',
subject: `Signez votre contrat ${organizationName}`,
firstName: emailData.firstName // ← Affiche le prénom utilisé
});
🔄 Flux de données
Cas 1 : Lambda fournit le prénom (DynamoDB)
Lambda AWS (DynamoDB)
↓ firstName: "Jean"
API /api/emails/signature-salarie
↓ Utilise "Jean"
Email envoyé avec "Bonjour Jean,"
Cas 2 : Lambda ne fournit pas le prénom
Lambda AWS (DynamoDB)
↓ firstName: null/undefined
API /api/emails/signature-salarie
↓ Recherche dans Supabase
Supabase table salaries
↓ prenom: "Marie"
API utilise "Marie"
↓
Email envoyé avec "Bonjour Marie,"
Cas 3 : Aucun prénom disponible
Lambda AWS (DynamoDB)
↓ firstName: null
API /api/emails/signature-salarie
↓ Recherche dans Supabase
Supabase table salaries
↓ Aucun résultat
API utilise fallback "Salarié"
↓
Email envoyé avec "Bonjour Salarié,"
📊 Table Supabase utilisée
Table: salaries
Colonnes consultées
| Colonne | Type | Description | Utilisation |
|---|---|---|---|
prenom |
text |
Prénom du salarié | ✅ Récupéré pour personnalisation |
code_salarie |
text |
Code matricule | 🔍 Critère de recherche |
num_salarie |
text |
Numéro salarié | 🔍 Critère de recherche (alternative) |
adresse_mail |
text |
Email du salarié | 🔍 Critère de recherche (fallback) |
employer_id |
uuid |
ID de l'employeur | 🔍 Filtre (si disponible) |
Requête SQL équivalente
SELECT prenom
FROM salaries
WHERE employer_id = 'uuid-org-id'
AND (code_salarie = 'MAT123' OR num_salarie = 'MAT123')
LIMIT 1;
🧪 Tests
Test 1 : Prénom fourni par Lambda
Payload envoyé à l'API :
{
"employeeEmail": "jean.dupont@example.com",
"signatureLink": "https://...",
"reference": "CDDU-2025-001",
"firstName": "Jean",
"organizationName": "Théâtre National",
"matricule": "SAL001"
}
Résultat attendu :
- ✅ Email envoyé avec "Bonjour Jean,"
- 📝 Log :
firstName: emailData.firstName→ "Jean"
Test 2 : Prénom non fourni, recherche réussie
Payload envoyé à l'API :
{
"employeeEmail": "marie.martin@example.com",
"signatureLink": "https://...",
"reference": "CDDU-2025-002",
"firstName": null,
"organizationName": "Opéra de Paris",
"matricule": "SAL002",
"organizationId": "uuid-org"
}
Logs attendus :
🔍 Récupération du prénom depuis la table salaries...
✅ Prénom trouvé dans Supabase: Marie
📧 Préparation de l'envoi de l'email: { firstName: "Marie", ... }
Résultat attendu :
- ✅ Email envoyé avec "Bonjour Marie,"
Test 3 : Aucun prénom disponible
Payload envoyé à l'API :
{
"employeeEmail": "nouveau@example.com",
"signatureLink": "https://...",
"reference": "CDDU-2025-003",
"firstName": null,
"organizationName": "Comédie Française",
"matricule": "UNKNOWN"
}
Logs attendus :
🔍 Récupération du prénom depuis la table salaries...
⚠️ Prénom non trouvé dans Supabase
📧 Préparation de l'envoi de l'email: { firstName: "Salarié", ... }
Résultat attendu :
- ✅ Email envoyé avec "Bonjour Salarié,"
- ⚠️ Message générique mais email toujours envoyé
📝 Template Email
Le template utilise Handlebars pour la personnalisation :
lib/emailTemplateService.ts
'signature-request-salarie': {
subject: 'Signez votre contrat {{organizationName}}',
title: 'Demande de signature électronique',
greeting: '{{#if firstName}}Bonjour {{firstName}},{{/if}}', // ← Utilise firstName
mainMessage: 'Nous vous invitons à signer votre contrat de travail ci-dessous...',
// ...
}
🔒 Sécurité
Authentification
L'API /api/emails/signature-salarie est protégée par API Key :
const apiKey = request.headers.get('X-API-Key');
const validApiKey = ENV.LAMBDA_API_KEY;
if (!apiKey || apiKey !== validApiKey) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
Permissions Supabase
Utilise createSbServiceRole() pour accéder à la table salaries avec des permissions élevées :
const supabase = createSbServiceRole();
📋 Checklist de déploiement
- Modification de
/app/api/emails/signature-salarie/route.ts - Ajout de la récupération du prénom depuis Supabase
- Gestion du fallback "Salarié"
- Logging amélioré avec
firstNameaffiché - Aucune modification nécessaire dans la Lambda (rétrocompatible)
- Aucune modification nécessaire dans le template email (déjà configuré)
✅ Avantages
- Rétrocompatible : Si la Lambda envoie déjà le prénom, il est utilisé directement
- Fallback automatique : Recherche dans Supabase si le prénom n'est pas fourni
- Robuste : Gestion des erreurs sans bloquer l'envoi d'email
- Logging détaillé : Suivi clair du prénom utilisé dans les logs
- Personnalisation améliorée : Meilleure expérience utilisateur pour les salariés
🐛 Dépannage
Le prénom n'apparaît pas dans l'email
Vérifier :
-
Les logs de l'API :
📦 Données reçues: { firstName: null, matricule: "SAL001", ... } 🔍 Récupération du prénom depuis la table salaries... ✅ Prénom trouvé dans Supabase: Jean -
La table
salariesdans Supabase :- Le salarié existe avec ce matricule ?
- La colonne
prenomest bien remplie ? - L'
employer_idcorrespond ?
-
Le template email :
greeting: '{{#if firstName}}Bonjour {{firstName}},{{/if}}'
Erreur de requête Supabase
⚠️ Erreur lors de la récupération du prénom: [Error details]
Actions :
- Vérifier que
SUPABASE_SERVICE_ROLE_KEYest bien configuré - Vérifier les permissions RLS sur la table
salaries - Vérifier que
createSbServiceRole()utilise bien le service role
📚 Fichiers liés
| Fichier | Rôle |
|---|---|
/app/api/emails/signature-salarie/route.ts |
API recevant la demande d'envoi email |
/lib/emailTemplateService.ts |
Configuration du template avec greeting |
/templates-mails/signature-electronique-salarie.html |
Template HTML (utilise Handlebars) |
/LAMBDA_SIGNATURE_SALARIE_UPDATED.js |
Code de la Lambda AWS |
Table salaries (Supabase) |
Source de données pour le prénom |
🎉 Résultat
Les emails de signature électronique sont maintenant personnalisés avec le prénom du salarié :
Objet : Signez votre contrat Théâtre National
Bonjour Jean,
Nous vous invitons à signer votre contrat de travail ci-dessous.
[Signer le contrat]
Au lieu de :
Objet : Signez votre contrat Théâtre National
Un document nécessite votre signature électronique.
[Signer le contrat]