/** * 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 invitation Outlook */ export async function sendInscriptionConfirmation(params: { apprenantEmail: string; apprenantNom: string; apprenantPrenom: string; formationNom: string; sessionNom: string; dateDebut: Date; dateFin: Date; lieu: string; statut: 'confirmee' | 'liste_attente'; }): Promise { const isConfirmed = params.statut === 'confirmee'; const content = `

Confirmation d'inscription

Bonjour ${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}

Session : ${params.sessionNom}

Date de début : ${params.dateDebut.toLocaleDateString('fr-FR', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' })}

Date de fin : ${params.dateFin.toLocaleDateString('fr-FR', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' })}

Lieu : ${params.lieu}

${isConfirmed ? `

Une invitation Outlook est jointe à cet email. Merci de l'ajouter à votre calendrier pour bloquer votre agenda.

Important : Les inscriptions seront bloquées 15 jours avant le début de la session. 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 !

`; const attachments = isConfirmed ? [{ filename: 'invitation.ics', content: generateFormationICS({ formationNom: params.formationNom, sessionNom: params.sessionNom, dateDebut: params.dateDebut, dateFin: params.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 session */ export async function sendTeaserEmail(params: { apprenantEmail: string; apprenantPrenom: string; formationNom: string; sessionNom: string; dateDebut: Date; }): Promise { const content = `

Votre formation approche !

Bonjour ${params.apprenantPrenom},

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

Session : ${params.sessionNom}

Date : ${params.dateDebut.toLocaleDateString('fr-FR', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric' })}

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; formationNom: string; sessionNom: string; dateDebut: Date; lieu: string; }): Promise { const content = `

Rappel : Votre formation dans 7 jours

Bonjour ${params.apprenantPrenom},

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

Informations pratiques

Session : ${params.sessionNom}

Date : ${params.dateDebut.toLocaleDateString('fr-FR', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: '2-digit', minute: '2-digit' })}

Lieu : ${params.lieu}

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 session */ export async function sendGroupEmail(params: { recipients: Array<{ email: string; prenom: string }>; formationNom: string; sessionNom: string; type: 'teaser' | 'rappel'; dateDebut: Date; 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, formationNom: params.formationNom, sessionNom: params.sessionNom, dateDebut: params.dateDebut, }); } else { await sendRappelJ7Email({ apprenantEmail: recipient.email, apprenantPrenom: recipient.prenom, formationNom: params.formationNom, sessionNom: params.sessionNom, dateDebut: params.dateDebut, lieu: params.lieu || '', }); } sent++; } catch (error) { console.error(`Erreur envoi email à ${recipient.email}:`, error); failed++; } } return { sent, failed }; }