Initial local backup snapshot
This commit is contained in:
commit
acd9e14ba5
367 changed files with 118038 additions and 0 deletions
137
server/salleReservationEmails.ts
Normal file
137
server/salleReservationEmails.ts
Normal file
|
|
@ -0,0 +1,137 @@
|
|||
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>`,
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue