generated from gitea_admin/default
372 lines
13 KiB
JavaScript
372 lines
13 KiB
JavaScript
import nodemailer from "nodemailer"
|
||
|
||
let transporter
|
||
|
||
function isSmtpConfigured(config) {
|
||
return Boolean(
|
||
config.smtpHost &&
|
||
config.smtpPort &&
|
||
config.smtpUser &&
|
||
config.smtpPassword &&
|
||
config.smtpFromEmail
|
||
)
|
||
}
|
||
|
||
function getTransporter() {
|
||
if (transporter) {
|
||
return transporter
|
||
}
|
||
|
||
const config = useRuntimeConfig()
|
||
|
||
if (!isSmtpConfigured(config)) {
|
||
return null
|
||
}
|
||
|
||
transporter = nodemailer.createTransport({
|
||
host: config.smtpHost,
|
||
port: Number(config.smtpPort),
|
||
secure: String(config.smtpSecure).toLowerCase() === "true",
|
||
connectionTimeout: 10000,
|
||
greetingTimeout: 10000,
|
||
socketTimeout: 15000,
|
||
auth: {
|
||
user: config.smtpUser,
|
||
pass: config.smtpPassword,
|
||
},
|
||
})
|
||
|
||
return transporter
|
||
}
|
||
|
||
function escapeHtml(value) {
|
||
return String(value)
|
||
.replaceAll("&", "&")
|
||
.replaceAll("<", "<")
|
||
.replaceAll(">", ">")
|
||
.replaceAll('"', """)
|
||
.replaceAll("'", "'")
|
||
}
|
||
|
||
export async function sendParcDemandEmails(payload) {
|
||
const config = useRuntimeConfig()
|
||
const mailer = getTransporter()
|
||
|
||
if (!mailer || !config.parcRequestRecipientEmail) {
|
||
return false
|
||
}
|
||
|
||
const from = config.smtpFromName
|
||
? `"${config.smtpFromName}" <${config.smtpFromEmail}>`
|
||
: config.smtpFromEmail
|
||
|
||
const adminSubject = `WONDIF - Formulaire de demande Parc instrumental - ${payload.name}`
|
||
const adminText = [
|
||
"Une nouvelle demande a été envoyée depuis le formulaire du Parc instrumental.",
|
||
"",
|
||
`Type de demande : ${payload.requestType}`,
|
||
`Nom : ${payload.name}`,
|
||
`Email : ${payload.email}`,
|
||
`Telephone : ${payload.phone}`,
|
||
`Structure : ${payload.organization}`,
|
||
"",
|
||
"Message :",
|
||
payload.message,
|
||
].join("\n")
|
||
|
||
const userSubject = "ONDIF - Confirmation de votre demande - Parc instrumental"
|
||
const userText = [
|
||
`Bonjour ${payload.name},`,
|
||
"",
|
||
"Votre demande a bien été transmise à l'équipe du Parc instrumental.",
|
||
"Nous reviendrons vers vous dans les meilleurs délais.",
|
||
"",
|
||
"Recapitulatif :",
|
||
`Type de demande : ${payload.requestType}`,
|
||
`Structure : ${payload.organization}`,
|
||
`Telephone : ${payload.phone}`,
|
||
"",
|
||
"Votre message :",
|
||
payload.message,
|
||
].join("\n")
|
||
|
||
await Promise.all([
|
||
mailer.sendMail({
|
||
from,
|
||
to: config.parcRequestRecipientEmail,
|
||
replyTo: payload.email,
|
||
subject: adminSubject,
|
||
text: adminText,
|
||
}),
|
||
mailer.sendMail({
|
||
from,
|
||
to: payload.email,
|
||
subject: userSubject,
|
||
text: userText,
|
||
}),
|
||
])
|
||
|
||
return true
|
||
}
|
||
|
||
function formatProjetLyceePriority(priority) {
|
||
if (priority === null || priority === undefined) return "Non renseigné"
|
||
if (priority === 0) return "Non souhaité"
|
||
return `Priorité ${priority}`
|
||
}
|
||
|
||
function getProjetLyceeSummary(payload) {
|
||
const projectWishes = [
|
||
["Concert-rencontre", payload.concertRencontrePriority],
|
||
["Parcours Entrer dans la peau d'un professionnel du spectacle", payload.immersionPriority],
|
||
["Parcours EAC", payload.eacPriority],
|
||
["Concert commente", payload.concertCommentePriority],
|
||
]
|
||
.filter(([, priority]) => priority >= 1 && priority <= 4)
|
||
.map(([label, priority]) => `${label} : ${formatProjetLyceePriority(priority)}`)
|
||
|
||
return [
|
||
`Etablissement scolaire : ${payload.schoolName}`,
|
||
`Departement : ${payload.department}`,
|
||
`Ville : ${payload.city}`,
|
||
`Enseignant coordinateur : ${payload.coordinatorName}`,
|
||
`Email : ${payload.email}`,
|
||
`Telephone : ${payload.phone}`,
|
||
`Discipline enseignee : ${payload.discipline}`,
|
||
`Niveau de classe : ${payload.classLevel}`,
|
||
`Nombre probable d'eleves concernes : ${payload.studentCount}`,
|
||
...(projectWishes.length ? ["", "Souhaits de projet :", ...projectWishes] : []),
|
||
"",
|
||
"Periode souhaitée :",
|
||
payload.projectPeriod,
|
||
].join("\n")
|
||
}
|
||
|
||
export async function sendProjetLyceeEmails(payload) {
|
||
const config = useRuntimeConfig()
|
||
const mailer = getTransporter()
|
||
|
||
if (!mailer) {
|
||
console.warn("Email projet lycée non envoyé: configuration SMTP incomplète.")
|
||
return false
|
||
}
|
||
|
||
if (!config.scolaireRequestRecipientEmail) {
|
||
console.warn("Email projet lycée non envoyé: destinataire scolaire manquant.")
|
||
return false
|
||
}
|
||
|
||
const from = config.smtpFromName
|
||
? `"${config.smtpFromName}" <${config.smtpFromEmail}>`
|
||
: config.smtpFromEmail
|
||
|
||
const summary = getProjetLyceeSummary(payload)
|
||
|
||
const adminSubject = `WONDIF - Candidature projet lycee - ${payload.schoolName}`
|
||
const adminText = [
|
||
"Une nouvelle candidature a été envoyée depuis le formulaire Projet lycée.",
|
||
"",
|
||
summary,
|
||
].join("\n")
|
||
|
||
const userSubject = "ONDIF - Confirmation de votre candidature - Projet lycée"
|
||
const userText = [
|
||
`Bonjour ${payload.coordinatorName},`,
|
||
"",
|
||
"Votre candidature à un projet avec l'Orchestre national d'Île-de-France a bien été transmise.",
|
||
"L'équipe d'action culturelle reviendra vers vous d'ici fin juin 2026 afin de vous informer de la suite donnée à votre candidature.",
|
||
"",
|
||
"Recapitulatif :",
|
||
summary,
|
||
].join("\n")
|
||
|
||
await Promise.all([
|
||
mailer.sendMail({
|
||
from,
|
||
to: config.scolaireRequestRecipientEmail,
|
||
replyTo: payload.email,
|
||
subject: adminSubject,
|
||
text: adminText,
|
||
}),
|
||
mailer.sendMail({
|
||
from,
|
||
to: payload.email,
|
||
subject: userSubject,
|
||
text: userText,
|
||
}),
|
||
])
|
||
|
||
return true
|
||
}
|
||
|
||
function formatAcademieDiploma(diploma, index) {
|
||
if (!diploma?.type && !diploma?.discipline && !diploma?.year && !diploma?.establishment) {
|
||
return `Diplome ${index + 1} : Non renseigne`
|
||
}
|
||
|
||
return [
|
||
`Diplome ${index + 1} :`,
|
||
`Type : ${diploma.type || "Non renseigne"}`,
|
||
diploma.type === "Autre" ? `Autre type : ${diploma.otherType || "Non renseigne"}` : null,
|
||
`Discipline : ${diploma.discipline || "Non renseignee"}`,
|
||
`Annee : ${diploma.year || "Non renseignee"}`,
|
||
`Etablissement : ${diploma.establishment || "Non renseigne"}`,
|
||
].filter(Boolean).join("\n")
|
||
}
|
||
|
||
function getProjetAcademieSummary(payload) {
|
||
return [
|
||
"Identite :",
|
||
`Nom : ${payload.lastName}`,
|
||
`Prenom : ${payload.firstName}`,
|
||
`Genre : ${payload.gender}`,
|
||
`Date de naissance : ${payload.birthDate}`,
|
||
`Lieu de naissance : ${payload.birthPlace}`,
|
||
`Nationalite : ${payload.nationality}`,
|
||
"",
|
||
"Coordonnees :",
|
||
`Email : ${payload.email}`,
|
||
`Telephone : ${payload.phone}`,
|
||
`Adresse : ${payload.address}`,
|
||
`Ville : ${payload.city}`,
|
||
`Code postal : ${payload.postalCode}`,
|
||
`Pays de residence : ${payload.country}`,
|
||
"",
|
||
"Parcours musical :",
|
||
`Instrument : ${payload.instrument}`,
|
||
`A deja participe a l'academie : ${payload.previousAcademyParticipation}`,
|
||
payload.previousAcademyParticipation === "oui"
|
||
? `Nombre de participations : ${payload.previousAcademyParticipationCount}`
|
||
: null,
|
||
"",
|
||
"Formation :",
|
||
`Niveau - cycle actuel 2026-2027 : ${payload.trainingLevel}`,
|
||
payload.trainingLevel === "Autre" ? `Autre formation : ${payload.otherTrainingLevel}` : null,
|
||
`Conservatoire 2026-2027 : ${payload.conservatory}`,
|
||
payload.conservatory === "Autre" ? `Autre conservatoire : ${payload.otherConservatory}` : null,
|
||
`Professeur d'instrument : ${payload.teacherName}`,
|
||
"",
|
||
"Diplomes musicaux :",
|
||
...payload.diplomas.map(formatAcademieDiploma),
|
||
"",
|
||
"Contact d'urgence :",
|
||
`Nom : ${payload.emergencyLastName}`,
|
||
`Prenom : ${payload.emergencyFirstName}`,
|
||
`Lien : ${payload.emergencyRelation}`,
|
||
`Telephone : ${payload.emergencyPhone}`,
|
||
`Mail : ${payload.emergencyEmail}`,
|
||
"",
|
||
`Reglement accepte : ${payload.acceptRules ? "Oui" : "Non"}`,
|
||
].filter((line) => line !== null).join("\n")
|
||
}
|
||
|
||
export async function sendProjetAcademieEmails(payload) {
|
||
const config = useRuntimeConfig()
|
||
const mailer = getTransporter()
|
||
|
||
if (!mailer) {
|
||
console.warn("Email projet académie non envoyé: configuration SMTP incomplète.")
|
||
return false
|
||
}
|
||
|
||
if (!config.academieRequestRecipientEmail) {
|
||
console.warn("Email projet académie non envoyé: destinataire académie manquant.")
|
||
return false
|
||
}
|
||
|
||
const from = config.smtpFromName
|
||
? `"${config.smtpFromName}" <${config.smtpFromEmail}>`
|
||
: config.smtpFromEmail
|
||
|
||
const summary = getProjetAcademieSummary(payload)
|
||
const fullName = `${payload.lastName} ${payload.firstName}`
|
||
const dropboxUrl = "https://www.dropbox.com/scl/fo/nu76b9k860kxkczlgpvwc/AO3pMAvoG9EVcsiRWcRk4cE?rlkey=rjnsqvgl9v1topm8mno3uns4a&e=2&st=dsrnbdca&dl=0"
|
||
const siteUrl = process.env.NUXT_PUBLIC_SITE_URL || "https://www.orchestre-ile.com"
|
||
const academieUrl = new URL("/mediation/academie", siteUrl).toString()
|
||
|
||
const adminSubject = `WONDIF - Candidature Academie d'orchestre - ${fullName}`
|
||
const adminText = [
|
||
"Une nouvelle candidature a été envoyée depuis le formulaire Académie d'orchestre.",
|
||
"",
|
||
summary,
|
||
].join("\n")
|
||
|
||
const userSubject = "ONDIF - Confirmation de votre candidature - Académie d'orchestre"
|
||
const userText = [
|
||
`Bonjour ${payload.firstName} ${payload.lastName},`,
|
||
"",
|
||
`Nous vous confirmons que votre inscription à l’Académie d’Orchestre 2027 a bien été prise en compte pour l’instrument suivant : ${payload.instrument}.`,
|
||
"",
|
||
"Afin de préparer les auditions, vous trouverez ci-dessous un lien vers les cahiers de traits d’orchestre à travailler :",
|
||
`Lien traits d’orchestre (Dropbox) - ${dropboxUrl}`,
|
||
"",
|
||
"Vous pourrez accéder au cahier correspondant à l’instrument présenté aux auditions et commencer votre préparation dès à présent.",
|
||
`Ce lien est également accessible depuis la page Académie 2027 du site de l’Orchestre national d’Île-de-France : ${academieUrl}`,
|
||
"",
|
||
"Une fois les inscriptions clôturées, vous recevrez une convocation pour les auditions, qui se dérouleront entre le 2 et le 16 novembre 2026. Cette convocation vous sera envoyée début octobre.",
|
||
"",
|
||
"Nous vous remercions de bien vouloir apporter le jour des auditions :",
|
||
"- la lettre d’engagement signée",
|
||
"- le formulaire de droit à l’image, complété et signé",
|
||
"",
|
||
"Vous trouverez ces deux documents en pièces jointes de ce message.",
|
||
"",
|
||
"Pour toute question ou besoin de renseignement complémentaire, vous pouvez contacter Zoe Crampon :",
|
||
"par mail : zoe.crampon@orchestre-ile.com",
|
||
"par téléphone : 06 82 73 65 01",
|
||
"",
|
||
"Nous vous remercions de votre inscription et vous souhaitons une excellente préparation.",
|
||
"",
|
||
"Bien cordialement,",
|
||
"L’équipe d’action culturelle de l’Orchestre national d’Île-de-France",
|
||
].join("\n")
|
||
const userHtml = [
|
||
`<p>Bonjour ${escapeHtml(payload.firstName)} ${escapeHtml(payload.lastName)},</p>`,
|
||
`<p>Nous vous confirmons que votre inscription à l’Académie d’Orchestre 2027 a bien été prise en compte pour l’instrument suivant : ${escapeHtml(payload.instrument)}.</p>`,
|
||
"<p>Afin de préparer les auditions, vous trouverez ci-dessous un lien vers les cahiers de traits d’orchestre à travailler :</p>",
|
||
`<p><a href="${dropboxUrl}">Lien traits d’orchestre (Dropbox)</a></p>`,
|
||
"<p>Vous pourrez accéder au cahier correspondant à l’instrument présenté aux auditions et commencer votre préparation dès à présent.</p>",
|
||
`<p>Ce lien est également accessible depuis la page <a href="${academieUrl}">Académie 2027</a> du site de l’Orchestre national d’Île-de-France.</p>`,
|
||
"<p>Une fois les inscriptions clôturées, vous recevrez une convocation pour les auditions, qui se dérouleront entre le 2 et le 16 novembre 2026. Cette convocation vous sera envoyée début octobre.</p>",
|
||
"<p>Nous vous remercions de bien vouloir apporter le jour des auditions :</p>",
|
||
"<ul><li>la lettre d’engagement signée</li><li>le formulaire de droit à l’image, complété et signé</li></ul>",
|
||
"<p>Vous trouverez ces deux documents en pièces jointes de ce message.</p>",
|
||
"<p>Pour toute question ou besoin de renseignement complémentaire, vous pouvez contacter Zoe Crampon :<br>par mail : zoe.crampon@orchestre-ile.com<br>par téléphone : 06 82 73 65 01</p>",
|
||
"<p>Nous vous remercions de votre inscription et vous souhaitons une excellente préparation.</p>",
|
||
"<p>Bien cordialement,<br>L’équipe d’action culturelle de l’Orchestre national d’Île-de-France</p>",
|
||
].join("\n")
|
||
|
||
await Promise.all([
|
||
mailer.sendMail({
|
||
from,
|
||
to: config.academieRequestRecipientEmail,
|
||
replyTo: payload.email,
|
||
subject: adminSubject,
|
||
text: adminText,
|
||
}),
|
||
mailer.sendMail({
|
||
from,
|
||
to: payload.email,
|
||
subject: userSubject,
|
||
text: userText,
|
||
html: userHtml,
|
||
attachments: [
|
||
{
|
||
filename: "Lettre d'engagement - Académie 2027.pdf",
|
||
path: "public/contenus/lettre_engagement_academie_2027.pdf",
|
||
},
|
||
{
|
||
filename: "Droit à l'image - majeur.pdf",
|
||
path: "public/contenus/droit_image_majeur.pdf",
|
||
},
|
||
{
|
||
filename: "Droit à l'image - mineur.pdf",
|
||
path: "public/contenus/droit_image_mineur.pdf",
|
||
},
|
||
],
|
||
}),
|
||
])
|
||
|
||
return true
|
||
}
|