diff --git a/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts b/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts index c2a5bc0d33..1d15d6254d 100644 --- a/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts +++ b/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts @@ -55,16 +55,11 @@ export const scheduleEmailReminder = async ( const name = action === WorkflowActions.EMAIL_HOST ? evt.organizer.name : evt.attendees[0].name; const attendeeName = action === WorkflowActions.EMAIL_HOST ? evt.attendees[0].name : evt.organizer.name; + const timeZone = action === WorkflowActions.EMAIL_HOST ? evt.organizer.timeZone : evt.attendees[0].timeZone; switch (template) { case WorkflowTemplates.REMINDER: - const emailTemplate = emailReminderTemplate( - startTime, - evt.title, - evt.attendees[0].timeZone, - attendeeName, - name - ); + const emailTemplate = emailReminderTemplate(startTime, evt.title, timeZone, attendeeName, name); emailSubject = emailTemplate.subject; emailBody = emailTemplate.body; break; diff --git a/apps/web/ee/lib/workflows/reminders/smsReminderManager.ts b/apps/web/ee/lib/workflows/reminders/smsReminderManager.ts index 659899ecaf..79ab2abc80 100644 --- a/apps/web/ee/lib/workflows/reminders/smsReminderManager.ts +++ b/apps/web/ee/lib/workflows/reminders/smsReminderManager.ts @@ -20,7 +20,7 @@ export enum timeUnitLowerCase { export type BookingInfo = { uid?: string | null; attendees: { name: string; email: string; timeZone: string }[]; - organizer: { name: string; email: string }; + organizer: { name: string; email: string; timeZone: string }; startTime: string; title: string; }; @@ -48,12 +48,12 @@ export const scheduleSMSReminder = async ( const name = action === WorkflowActions.SMS_ATTENDEE ? evt.attendees[0].name : ""; const attendeeName = action === WorkflowActions.SMS_ATTENDEE ? evt.organizer.name : evt.attendees[0].name; + const timeZone = + action === WorkflowActions.SMS_ATTENDEE ? evt.attendees[0].timeZone : evt.organizer.timeZone; switch (template) { case WorkflowTemplates.REMINDER: - message = - smsReminderTemplate(evt.startTime, evt.title, evt.attendees[0].timeZone, attendeeName, name) || - message; + message = smsReminderTemplate(evt.startTime, evt.title, timeZone, attendeeName, name) || message; break; } diff --git a/apps/web/ee/lib/workflows/reminders/templates/emailReminderTemplate.ts b/apps/web/ee/lib/workflows/reminders/templates/emailReminderTemplate.ts index 55ed3ba0f4..60368f797a 100644 --- a/apps/web/ee/lib/workflows/reminders/templates/emailReminderTemplate.ts +++ b/apps/web/ee/lib/workflows/reminders/templates/emailReminderTemplate.ts @@ -3,15 +3,19 @@ import dayjs from "@calcom/dayjs"; const emailReminderTemplate = ( startTime: string, eventName: string, - attendeeTimeZone: string, + timeZone: string, attendee: string, name: string ) => { - const templateSubject = `Reminder: ${eventName} at ${dayjs(startTime).format("YYYY MMM D h:mmA")}`; + const templateSubject = `Reminder: ${eventName} at ${dayjs(startTime) + .tz(timeZone) + .format("YYYY MMM D h:mmA")}`; - const templateBody = `Hi ${name},\n\n this is a reminder that your meeting (${eventName}) with ${attendee} is on ${dayjs( + const templateBody = `Hi ${name},\n\nThis is a reminder that your meeting (${eventName}) with ${attendee} is on ${dayjs( startTime - ).format("YYYY MMM D")} at ${dayjs(startTime).format("h:mmA")} ${attendeeTimeZone}.`; + ) + .tz(timeZone) + .format("YYYY MMM D")} at ${dayjs(startTime).tz(timeZone).format("h:mmA")} ${timeZone}.`; const emailContent = { subject: templateSubject, body: templateBody }; diff --git a/apps/web/ee/lib/workflows/reminders/templates/smsReminderTemplate.ts b/apps/web/ee/lib/workflows/reminders/templates/smsReminderTemplate.ts index 0b60915198..466255cfa4 100644 --- a/apps/web/ee/lib/workflows/reminders/templates/smsReminderTemplate.ts +++ b/apps/web/ee/lib/workflows/reminders/templates/smsReminderTemplate.ts @@ -3,21 +3,21 @@ import dayjs from "@calcom/dayjs"; const smsReminderTemplate = ( startTime: string, eventName: string, - attendeeTimeZone: string, + timeZone: string, attendee: string, name?: string ) => { const templateOne = `Hi${name ? ` ${name}` : ``}, this is a reminder that your meeting (${eventName}) with - ${attendee} is on ${dayjs(startTime).format("MMM D")} at ${dayjs(startTime).format( - "h:mmA" - )} ${attendeeTimeZone}`; + ${attendee} is on ${dayjs(startTime).tz(timeZone).format("MMM D")} at ${dayjs(startTime) + .tz(timeZone) + .format("h:mmA")} ${timeZone}`; //Twilio recomments message to be no longer than 320 characters if (templateOne.length <= 320) return templateOne; - const templateTwo = `Hi, this is a reminder that your meeting with ${attendee} is on ${dayjs( - startTime - ).format("MMM D")} at ${dayjs(startTime).format("h:mmA")}`; + const templateTwo = `Hi, this is a reminder that your meeting with ${attendee} is on ${dayjs(startTime) + .tz(timeZone) + .format("MMM D")} at ${dayjs(startTime).tz(timeZone).format("h:mmA")} ${timeZone}`; //Twilio supports up to 1600 characters if (templateTwo.length <= 1600) return templateTwo; diff --git a/apps/web/ee/pages/api/cron/workflows/scheduleEmailReminders.ts b/apps/web/ee/pages/api/cron/workflows/scheduleEmailReminders.ts index 255430f6d5..4dabde6756 100644 --- a/apps/web/ee/pages/api/cron/workflows/scheduleEmailReminders.ts +++ b/apps/web/ee/pages/api/cron/workflows/scheduleEmailReminders.ts @@ -87,12 +87,17 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { ? reminder.booking?.user?.name : reminder.booking?.attendees[0].name; + const timeZone = + reminder.workflowStep.action === WorkflowActions.EMAIL_ATTENDEE + ? reminder.booking?.attendees[0].timeZone + : reminder.booking?.user?.timeZone; + switch (reminder.workflowStep.template) { case WorkflowTemplates.REMINDER: emailTemplate = emailReminderTemplate( reminder.booking?.startTime.toISOString() || "", reminder.booking?.eventType?.title || "", - reminder.booking?.attendees[0].timeZone || "", + timeZone || "", attendeeName || "", name || "" ); diff --git a/apps/web/ee/pages/api/cron/workflows/scheduleSMSReminders.ts b/apps/web/ee/pages/api/cron/workflows/scheduleSMSReminders.ts index 6da4f1a2af..9492f865c8 100644 --- a/apps/web/ee/pages/api/cron/workflows/scheduleSMSReminders.ts +++ b/apps/web/ee/pages/api/cron/workflows/scheduleSMSReminders.ts @@ -66,13 +66,18 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { ? reminder.booking?.user?.name : reminder.booking?.attendees[0].name; + const timeZone = + reminder.workflowStep.action === WorkflowActions.SMS_ATTENDEE + ? reminder.booking?.attendees[0].timeZone + : reminder.booking?.user?.timeZone; + let message: string | null = reminder.workflowStep.reminderBody; switch (reminder.workflowStep.template) { case WorkflowTemplates.REMINDER: message = smsReminderTemplate( reminder.booking?.startTime.toISOString() || "", reminder.booking?.eventType?.title || "", - reminder.booking?.attendees[0].timeZone || "", + timeZone || "", attendeeName || "", userName ); diff --git a/apps/web/server/routers/viewer/workflows.tsx b/apps/web/server/routers/viewer/workflows.tsx index f95177c2a4..1319b6f047 100644 --- a/apps/web/server/routers/viewer/workflows.tsx +++ b/apps/web/server/routers/viewer/workflows.tsx @@ -334,8 +334,12 @@ export const workflowsRouter = createProtectedRouter() return { name: attendee.name, email: attendee.email, timeZone: attendee.timeZone }; }), organizer: booking.user - ? { name: booking.user.name || "", email: booking.user.email } - : { name: "", email: "" }, + ? { + name: booking.user.name || "", + email: booking.user.email, + timeZone: booking.user.timeZone, + } + : { name: "", email: "", timeZone: "" }, startTime: booking.startTime.toISOString(), title: booking.title, }; @@ -485,8 +489,12 @@ export const workflowsRouter = createProtectedRouter() return { name: attendee.name, email: attendee.email, timeZone: attendee.timeZone }; }), organizer: booking.user - ? { name: booking.user.name || "", email: booking.user.email } - : { name: "", email: "" }, + ? { + name: booking.user.name || "", + email: booking.user.email, + timeZone: booking.user.timeZone, + } + : { name: "", email: "", timeZone: "" }, startTime: booking.startTime.toISOString(), title: booking.title, }; @@ -578,8 +586,12 @@ export const workflowsRouter = createProtectedRouter() return { name: attendee.name, email: attendee.email, timeZone: attendee.timeZone }; }), organizer: booking.user - ? { name: booking.user.name || "", email: booking.user.email } - : { name: "", email: "" }, + ? { + name: booking.user.name || "", + email: booking.user.email, + timeZone: booking.user.timeZone, + } + : { name: "", email: "", timeZone: "" }, startTime: booking.startTime.toISOString(), title: booking.title, };