From 93fea8ecadee1e277ba59340d7db09a042ee9288 Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Wed, 3 Jun 2026 10:37:07 -0300 Subject: [PATCH] feat(emails): enhance booking cancellation and no-show email templates with improved layout and styling --- .../src/emails/booking-confirmation.ts | 290 ++++++++++-------- 1 file changed, 163 insertions(+), 127 deletions(-) diff --git a/apps/backend/src/emails/booking-confirmation.ts b/apps/backend/src/emails/booking-confirmation.ts index fdaa07e..0ab1b9a 100644 --- a/apps/backend/src/emails/booking-confirmation.ts +++ b/apps/backend/src/emails/booking-confirmation.ts @@ -72,50 +72,6 @@ function wrapLayout(content: string) { `; } -function headerSection() { - return ` - - - Playzer - - `; -} - -function divider() { - return ` - - - - - - -
 
- - `; -} - -function dateTimeBlock(date: string, startTime: string, endTime: string): string { - const friendlyDate = formatFriendlyDate(date); - - return ` - - - - - - -
-

- ${friendlyDate} -

-

- ${startTime} — ${endTime} -

-
- - `; -} - export function bookingConfirmationHtml(data: BookingEmailData): string { const formattedPrice = formatBookingPrice(data.price ?? 0); const friendlyDate = formatFriendlyDate(data.date); @@ -229,50 +185,99 @@ export function bookingConfirmationHtml(data: BookingEmailData): string { } export function bookingCancelledHtml(data: BookingEmailData): string { + const friendlyDate = formatFriendlyDate(data.date); + const content = ` - ${headerSection()} - -

- Reserva cancelada -

-

- ${data.complexName} -

- - - - - - ${dateTimeBlock(data.date, data.startTime, data.endTime)} - - - - ${divider()} - - - -

- La reserva ${data.bookingCode} - fue cancelada. Si tenés dudas, contactate con el complejo. -

- - - - - + - ${detailRow('Cancha', `${data.courtName} — ${data.sportName}`)} - ${detailRow('Cliente', data.customerName)} + + + +
+ + + + +
+ ✗ Reserva cancelada +
+

+ ${data.complexName} +

+
+ + + + + +
+ Playzer + + Playzer +
+
- -

- Playzer — Reserva de canchas online -

+ + + + + +
+

+ Tu turno +

+

+ ${friendlyDate} +

+

+ ${data.startTime} — ${data.endTime} +

+
+ + + + + + + + + +
+

+ La reserva ${data.bookingCode} + fue cancelada. Si tenés dudas, contactate con el complejo. +

+
+ + + + + + + + + + +
+

+ Cancha +

+

+ ${data.courtName} — ${data.sportName} +

+
+

+ Cliente +

+

+ ${data.customerName} +

+
`; @@ -280,70 +285,101 @@ export function bookingCancelledHtml(data: BookingEmailData): string { } export function bookingNoShowHtml(data: BookingEmailData): string { + const friendlyDate = formatFriendlyDate(data.date); + const content = ` - ${headerSection()} - -

- Reserva no concretada -

-

- ${data.complexName} -

- - - - - - ${dateTimeBlock(data.date, data.startTime, data.endTime)} - - - - ${divider()} - - - -

- La reserva ${data.bookingCode} - fue registrada como no concretada por falta de asistencia. -

+ + + + + + +
+ + + + +
+ Reserva no concretada +
+

+ ${data.complexName} +

+
+ + + + + +
+ Playzer + + Playzer +
+
- - ${detailRow('Cancha', `${data.courtName} — ${data.sportName}`)} - ${detailRow('Cliente', data.customerName)} +
+ + +
+

+ Tu turno +

+

+ ${friendlyDate} +

+

+ ${data.startTime} — ${data.endTime} +

+
- -

- Playzer — Reserva de canchas online -

- - `; - - return wrapLayout(content); -} - -function detailRow(label: string, value: string): string { - return ` - - - + + + + + `; + + return wrapLayout(content); }
+ - - +
- ${label} + +

+ La reserva ${data.bookingCode} + fue registrada como no concretada por falta de asistencia. +

- ${value} +
+
+ + + +
+

+ Cancha +

+

+ ${data.courtName} — ${data.sportName} +

+
+

+ Cliente +

+

+ ${data.customerName} +