/** * Service d'envoi d'emails pour les formations * Utilise le système de notification Manus pour envoyer des emails */ import { generateFormationICS } from "./icsGenerator"; import { notifyOwner } from "./_core/notification"; interface EmailParams { to: string; subject: string; html: string; attachments?: Array<{ filename: string; content: string; contentType: string; }>; } /** * Envoie un email en utilisant le système de notification Manus * Note: Pour un envoi SMTP réel, intégrer un service comme SendGrid ou Mailgun */ async function sendEmail(params: EmailParams): Promise { console.log('=== EMAIL ENVOYÉ ==='); console.log('To:', params.to); console.log('Subject:', params.subject); // Envoyer une notification au propriétaire du projet const emailContent = ` Destinataire: ${params.to} Sujet: ${params.subject} ${params.html.replace(/<[^>]*>/g, '').substring(0, 500)}... ${params.attachments ? `Pièces jointes: ${params.attachments.map(a => a.filename).join(', ')}` : ''}`; try { await notifyOwner({ title: `Email envoyé: ${params.subject}`, content: emailContent, }); console.log('✓ Email traité avec succès'); } catch (error) { console.error('Erreur lors de l\'envoi de la notification:', error); } console.log('==================='); return true; } /** * Template HTML de base pour les emails */ function getEmailTemplate(content: string): string { return `

Formation Manager Itinova

${content}
`.trim(); } /** * Envoie un email de confirmation d'inscription avec invitations Outlook pour toutes les dates */ export async function sendInscriptionConfirmation(params: { apprenantEmail: string; apprenantNom: string; apprenantPrenom: string; apprenantFonction: string; formationNom: string; sequenceNom: string; dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; lieu: string; statut: 'confirmee' | 'liste_attente'; }): Promise { const isConfirmed = params.statut === 'confirmee'; const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' : params.apprenantFonction === 'chef_service' ? 'Chef de service' : 'Autre'; // Générer la liste des dates const datesHTML = params.dates.map(date => `
Date ${date.ordre} :
Du ${date.dateDebut.toLocaleDateString('fr-FR', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' })}
au ${date.dateFin.toLocaleDateString('fr-FR', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' })}
`).join(''); const content = `

Confirmation d'inscription

Bonjour ${fonctionLabel} ${params.apprenantPrenom} ${params.apprenantNom},

${isConfirmed ? '

Votre inscription a été confirmée !

' : '

Vous avez été ajouté à la liste d\'attente.

' }

Détails de la formation

Formation : ${params.formationNom}

Séquence : ${params.sequenceNom}

Lieu : ${params.lieu}

Dates de formation (${params.dates.length} séance${params.dates.length > 1 ? 's' : ''}) :

${datesHTML}
${isConfirmed ? `

Des invitations Outlook sont jointes à cet email pour chaque date de formation. Merci de les ajouter à votre calendrier pour bloquer votre agenda.

Important : Les inscriptions seront bloquées 15 jours avant le début de la séquence. Après cette date, aucune modification ne sera possible.

` : '

Nous vous contacterons dès qu\'une place se libère.

' }

À bientôt pour cette formation !

`; // Générer une invitation ICS pour chaque date const attachments = isConfirmed ? params.dates.map((date, index) => ({ filename: `invitation_date_${date.ordre}.ics`, content: generateFormationICS({ formationNom: params.formationNom, sessionNom: `${params.sequenceNom} - Date ${date.ordre}`, dateDebut: date.dateDebut, dateFin: date.dateFin, lieu: params.lieu, apprenantNom: params.apprenantNom, apprenantPrenom: params.apprenantPrenom, apprenantEmail: params.apprenantEmail, }), contentType: 'text/calendar', })) : undefined; return sendEmail({ to: params.apprenantEmail, subject: isConfirmed ? `Confirmation d'inscription - ${params.formationNom}` : `Liste d'attente - ${params.formationNom}`, html: getEmailTemplate(content), attachments, }); } /** * Envoie un email teaser pour une séquence */ export async function sendTeaserEmail(params: { apprenantEmail: string; apprenantPrenom: string; apprenantNom: string; apprenantFonction: string; formationNom: string; sequenceNom: string; dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; }): Promise { const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' : params.apprenantFonction === 'chef_service' ? 'Chef de service' : ''; const salutation = fonctionLabel ? `${fonctionLabel} ${params.apprenantPrenom} ${params.apprenantNom}` : params.apprenantPrenom; const datesHTML = params.dates.map(date => `
Date ${date.ordre} : ${date.dateDebut.toLocaleDateString('fr-FR', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })}
`).join(''); const content = `

Votre formation approche !

Bonjour ${salutation},

Nous sommes ravis de vous accueillir prochainement pour la formation ${params.formationNom}.

Séquence : ${params.sequenceNom}

Dates :

${datesHTML}

Préparez-vous à vivre une expérience enrichissante qui vous permettra de développer vos compétences managériales.

À très bientôt !

`; return sendEmail({ to: params.apprenantEmail, subject: `Votre formation ${params.formationNom} approche !`, html: getEmailTemplate(content), }); } /** * Envoie un email de rappel J-7 */ export async function sendRappelJ7Email(params: { apprenantEmail: string; apprenantPrenom: string; apprenantNom: string; apprenantFonction: string; formationNom: string; sequenceNom: string; dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; lieu: string; }): Promise { const fonctionLabel = params.apprenantFonction === 'directeur' ? 'Directeur' : params.apprenantFonction === 'chef_service' ? 'Chef de service' : ''; const salutation = fonctionLabel ? `${fonctionLabel} ${params.apprenantPrenom} ${params.apprenantNom}` : params.apprenantPrenom; const datesHTML = params.dates.map(date => `
Date ${date.ordre} :
${date.dateDebut.toLocaleDateString('fr-FR', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' })}
`).join(''); const content = `

Rappel : Votre formation dans 7 jours

Bonjour ${salutation},

Nous vous rappelons que votre formation ${params.formationNom} commence dans 7 jours.

Informations pratiques

Séquence : ${params.sequenceNom}

Lieu : ${params.lieu}

Dates :

${datesHTML}

Merci de vous présenter à l'heure indiquée.

Si vous avez des questions, n'hésitez pas à contacter le service RH.

À très bientôt !

`; return sendEmail({ to: params.apprenantEmail, subject: `Rappel J-7 : ${params.formationNom}`, html: getEmailTemplate(content), }); } /** * Envoie des emails groupés à tous les inscrits d'une séquence */ export async function sendGroupEmail(params: { recipients: Array<{ email: string; prenom: string; nom: string; fonction: string }>; formationNom: string; sequenceNom: string; type: 'teaser' | 'rappel'; dates: Array<{ dateDebut: Date; dateFin: Date; ordre: number }>; lieu?: string; }): Promise<{ sent: number; failed: number }> { let sent = 0; let failed = 0; for (const recipient of params.recipients) { try { if (params.type === 'teaser') { await sendTeaserEmail({ apprenantEmail: recipient.email, apprenantPrenom: recipient.prenom, apprenantNom: recipient.nom, apprenantFonction: recipient.fonction, formationNom: params.formationNom, sequenceNom: params.sequenceNom, dates: params.dates, }); } else { await sendRappelJ7Email({ apprenantEmail: recipient.email, apprenantPrenom: recipient.prenom, apprenantNom: recipient.nom, apprenantFonction: recipient.fonction, formationNom: params.formationNom, sequenceNom: params.sequenceNom, dates: params.dates, lieu: params.lieu || '', }); } sent++; } catch (error) { console.error(`Erreur envoi email à ${recipient.email}:`, error); failed++; } } return { sent, failed }; }