portail-associations/server/salleReservationEmails.ts

137 lines
6.8 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { CONDITIONS_FINANCIERES_SALLE_TEXT, SALLE_FREQUENCY_LABELS, SALLE_USAGE_TYPE_LABELS, type SallePricingSummary } from "@shared/sallePricing";
function escapeHtml(value: string) {
return value
.replace(/&/g, "&")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#39;");
}
function formatCurrency(cents: number) {
return new Intl.NumberFormat("fr-FR", { style: "currency", currency: "EUR" }).format(cents / 100);
}
export function generateSalleQuoteEmail(input: {
associationName: string;
requestTitle: string;
pricing: SallePricingSummary;
acceptUrl: string;
refuseUrl: string;
decisionText: string;
}) {
const total = formatCurrency(input.pricing.totalAmountCents);
const conditionLines = CONDITIONS_FINANCIERES_SALLE_TEXT.split("\n").filter(Boolean);
const decisionLines = input.decisionText.split("\n").filter(Boolean);
const isBilled = input.pricing.totalAmountCents > 0;
const subject = isBilled
? `Validation du devis - ${input.requestTitle}`
: `Validation de la mise à disposition - ${input.requestTitle}`;
const intro = isBilled
? `Bonjour ${input.associationName},\n\nVous trouverez ci-joint le devis, les conditions financières et la décision administrative prioritaire relatives à votre demande de réservation.`
: `Bonjour ${input.associationName},\n\nVous trouverez ci-joint les conditions financières et la décision administrative prioritaire relatives à votre demande de réservation.`;
const amountBlock = isBilled
? `Type d'usage : ${SALLE_USAGE_TYPE_LABELS[input.pricing.usageType]}
Fréquence : ${SALLE_FREQUENCY_LABELS[input.pricing.frequency]}
Montant calculé automatiquement : ${total}`
: `Type d'usage : ${SALLE_USAGE_TYPE_LABELS[input.pricing.usageType]}
Fréquence : ${SALLE_FREQUENCY_LABELS[input.pricing.frequency]}
Mise à disposition sans facturation.`;
const text = `${intro}
${amountBlock}
Pour poursuivre le traitement de votre dossier, merci d'utiliser l'un des liens suivants :
- J'accepte : ${input.acceptUrl}
- Je refuse : ${input.refuseUrl}
Conditions financières :
${conditionLines.join("\n")}
Décision administrative :
${decisionLines.join("\n")}
Maison de la Jeunesse des Savanes - Mélissa ALVES`;
const html = `
<div style="font-family:Arial,sans-serif;color:#1f2937;line-height:1.5">
<p>Bonjour ${escapeHtml(input.associationName)},</p>
<p>${escapeHtml(isBilled
? "Vous trouverez ci-joint le devis, les conditions financières et la décision administrative prioritaire relatives à votre demande de réservation."
: "Vous trouverez ci-joint les conditions financières et la décision administrative prioritaire relatives à votre demande de réservation.")}</p>
<div style="border:1px solid #dbe4f0;border-radius:10px;padding:16px;background:#f8fbff;margin:16px 0">
<p style="margin:0 0 8px 0;"><strong>Type d'usage :</strong> ${escapeHtml(SALLE_USAGE_TYPE_LABELS[input.pricing.usageType])}</p>
<p style="margin:0 0 8px 0;"><strong>Fréquence :</strong> ${escapeHtml(SALLE_FREQUENCY_LABELS[input.pricing.frequency])}</p>
<p style="margin:0;"><strong>${escapeHtml(isBilled ? "Montant calculé automatiquement :" : "Conditions financières :")}</strong> ${escapeHtml(isBilled ? total : "Mise à disposition sans facturation")}</p>
</div>
<p>Merci de nous confirmer votre position :</p>
<div style="margin:18px 0;">
<a href="${input.acceptUrl}" style="display:inline-block;background:#18753c;color:#fff;text-decoration:none;padding:12px 18px;border-radius:8px;margin-right:10px;">J'accepte le devis</a>
<a href="${input.refuseUrl}" style="display:inline-block;background:#ce0500;color:#fff;text-decoration:none;padding:12px 18px;border-radius:8px;">Je refuse</a>
</div>
<p style="font-size:13px;color:#475569">Si les boutons ne fonctionnent pas, utilisez directement ces liens :<br />${escapeHtml(input.acceptUrl)}<br />${escapeHtml(input.refuseUrl)}</p>
<hr style="border:none;border-top:1px solid #e5e7eb;margin:24px 0" />
<p style="font-size:13px;color:#475569;margin:0">Maison de la Jeunesse des Savanes - Mélissa ALVES</p>
</div>
`;
return { subject, text, html };
}
export function generateSalleFinalEmail(input: {
associationName: string;
datesLabel: string;
pricingTotalCents: number;
billed: boolean;
}) {
const subject = input.billed
? `Réservation validée - location de salle`
: `Réservation validée - mise à disposition de salle`;
const text = input.billed
? `Bonjour ${input.associationName},
Votre demande de réservation dun espace pour le ${input.datesLabel} a reçu un avis favorable.
Nous vous confirmons que votre événement se tiendra au sein de la Maison de la Jeunesse des Savanes « Mélissa ALVES ».
Le montant de la location sélève à ${formatCurrency(input.pricingTotalCents)} conformément à la tarification en vigueur et au devis validé.
Nous vous rappelons que vous êtes seule responsable de tout ce qui se passera dans les locaux, à lintérieur comme à lextérieur, concernant les participants et le public durant la période de lévénement.
Merci de bien vouloir nous transmettre une attestation de responsabilité civile couvrant cette journée, ainsi que le règlement du montant indiqué selon les modalités précisées dans le devis.
Il est formellement interdit de manger à lintérieur des espaces utilisés et nous vous demandons de veiller à ce que les lieux soient laissés aussi propres à la fin de lévénement quà votre arrivée.
Vous trouverez en pièce jointe :
- le devis validé
- la décision administrative
- le formulaire signé
- la facture à régler
Bien cordialement,
Maison de la Jeunesse des Savanes - Mélissa ALVES`
: `Bonjour ${input.associationName},
Votre demande de réservation dun espace pour le ${input.datesLabel} a reçu un avis favorable.
Nous vous confirmons que votre événement se tiendra au sein de la Maison de la Jeunesse des Savanes « Mélissa ALVES ».
Nous vous rappelons que vous êtes seule responsable de tout ce qui se passera dans les locaux, à lintérieur comme à lextérieur, concernant les participants et le public durant la période de lévénement.
Merci de bien vouloir nous transmettre une attestation de responsabilité civile couvrant cette journée.
Il est formellement interdit de manger à lintérieur des espaces utilisés.
Nous vous demandons également de veiller à laisser les lieux propres et en bon état à la fin de votre événement.
Vous trouverez en pièce jointe le formulaire validé et signé.
Bien cordialement,
Maison de la Jeunesse des Savanes - Mélissa ALVES`;
return {
subject,
text,
html: `<div style="font-family:Arial,sans-serif;white-space:pre-line;color:#1f2937">${escapeHtml(text)}</div>`,
};
}