137 lines
6.8 KiB
TypeScript
137 lines
6.8 KiB
TypeScript
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, "<")
|
||
.replace(/>/g, ">")
|
||
.replace(/"/g, """)
|
||
.replace(/'/g, "'");
|
||
}
|
||
|
||
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 d’un 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, à l’intérieur comme à l’exté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 à l’inté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 d’un 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, à l’intérieur comme à l’exté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 à l’inté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>`,
|
||
};
|
||
}
|