@@ -6,7 +6,7 @@ import { WorkflowRepository } from "@calcom/lib/server/repository/workflow";
6
6
import { getTimeFormatStringFromUserTimeFormat } from "@calcom/lib/timeFormat" ;
7
7
import { prisma } from "@calcom/prisma" ;
8
8
import { BookingStatus } from "@calcom/prisma/client" ;
9
- import { MembershipRole , SchedulingType , WorkflowActions } from "@calcom/prisma/enums" ;
9
+ import { MembershipRole , SchedulingType , WorkflowActions , WorkflowTriggerEvents } from "@calcom/prisma/enums" ;
10
10
import { EventTypeMetaDataSchema } from "@calcom/prisma/zod-utils" ;
11
11
import type { TrpcSessionUser } from "@calcom/trpc/server/trpc" ;
12
12
@@ -186,160 +186,164 @@ export const activateEventTypeHandler = async ({ ctx, input }: ActivateEventType
186
186
}
187
187
await removeSmsReminderFieldForEventTypes ( { activeOnToRemove : activeOn , workflowId, isOrg } ) ;
188
188
} else {
189
- // activate workflow and schedule reminders for existing bookings
190
-
191
- const bookingsForReminders = await prisma . booking . findMany ( {
192
- where : {
193
- eventTypeId : eventTypeId ,
194
- status : BookingStatus . ACCEPTED ,
195
- startTime : {
196
- gte : new Date ( ) ,
189
+ if (
190
+ eventTypeWorkflow . trigger == WorkflowTriggerEvents . BEFORE_EVENT ||
191
+ eventTypeWorkflow . trigger == WorkflowTriggerEvents . AFTER_EVENT
192
+ ) {
193
+ // activate workflow and schedule reminders for existing bookings
194
+ const bookingsForReminders = await prisma . booking . findMany ( {
195
+ where : {
196
+ eventTypeId : eventTypeId ,
197
+ status : BookingStatus . ACCEPTED ,
198
+ startTime : {
199
+ gte : new Date ( ) ,
200
+ } ,
197
201
} ,
198
- } ,
199
- include : {
200
- attendees : true ,
201
- eventType : {
202
- select : {
203
- schedulingType : true ,
204
- slug : true ,
205
- hosts : {
206
- select : {
207
- user : {
208
- select : {
209
- email : true ,
210
- destinationCalendar : {
211
- select : {
212
- primaryEmail : true ,
202
+ include : {
203
+ attendees : true ,
204
+ eventType : {
205
+ select : {
206
+ schedulingType : true ,
207
+ slug : true ,
208
+ hosts : {
209
+ select : {
210
+ user : {
211
+ select : {
212
+ email : true ,
213
+ destinationCalendar : {
214
+ select : {
215
+ primaryEmail : true ,
216
+ } ,
213
217
} ,
214
218
} ,
215
219
} ,
216
220
} ,
217
221
} ,
218
222
} ,
219
223
} ,
224
+ user : true ,
220
225
} ,
221
- user : true ,
222
- } ,
223
- } ) ;
226
+ } ) ;
224
227
225
- const bookerUrl = await getBookerBaseUrl ( ctx . user . organizationId ?? null ) ;
228
+ const bookerUrl = await getBookerBaseUrl ( ctx . user . organizationId ?? null ) ;
229
+
230
+ for ( const booking of bookingsForReminders ) {
231
+ const defaultLocale = "en" ;
232
+ const bookingInfo = {
233
+ uid : booking . uid ,
234
+ bookerUrl,
235
+ attendees : booking . attendees . map ( ( attendee ) => {
236
+ return {
237
+ name : attendee . name ,
238
+ email : attendee . email ,
239
+ timeZone : attendee . timeZone ,
240
+ language : { locale : attendee . locale || defaultLocale } ,
241
+ } ;
242
+ } ) ,
243
+ organizer : booking . user
244
+ ? {
245
+ name : booking . user . name || "" ,
246
+ email : booking ?. userPrimaryEmail ?? booking . user . email ,
247
+ timeZone : booking . user . timeZone ,
248
+ timeFormat : getTimeFormatStringFromUserTimeFormat ( booking . user . timeFormat ) ,
249
+ language : { locale : booking . user . locale || defaultLocale } ,
250
+ }
251
+ : { name : "" , email : "" , timeZone : "" , language : { locale : "" } } ,
252
+ startTime : booking . startTime . toISOString ( ) ,
253
+ endTime : booking . endTime . toISOString ( ) ,
254
+ title : booking . title ,
255
+ language : { locale : booking ?. user ?. locale || defaultLocale } ,
256
+ eventType : {
257
+ slug : booking . eventType ?. slug || "" ,
258
+ schedulingType : booking . eventType ?. schedulingType ,
259
+ hosts : booking . eventType ?. hosts ,
260
+ } ,
261
+ metadata : booking . metadata ,
262
+ } ;
263
+ for ( const step of eventTypeWorkflow . steps ) {
264
+ if (
265
+ step . action === WorkflowActions . EMAIL_ATTENDEE ||
266
+ step . action === WorkflowActions . EMAIL_HOST ||
267
+ step . action === WorkflowActions . EMAIL_ADDRESS
268
+ ) {
269
+ let sendTo : string [ ] = [ ] ;
226
270
227
- for ( const booking of bookingsForReminders ) {
228
- const defaultLocale = "en" ;
229
- const bookingInfo = {
230
- uid : booking . uid ,
231
- bookerUrl,
232
- attendees : booking . attendees . map ( ( attendee ) => {
233
- return {
234
- name : attendee . name ,
235
- email : attendee . email ,
236
- timeZone : attendee . timeZone ,
237
- language : { locale : attendee . locale || defaultLocale } ,
238
- } ;
239
- } ) ,
240
- organizer : booking . user
241
- ? {
242
- name : booking . user . name || "" ,
243
- email : booking ?. userPrimaryEmail ?? booking . user . email ,
244
- timeZone : booking . user . timeZone ,
245
- timeFormat : getTimeFormatStringFromUserTimeFormat ( booking . user . timeFormat ) ,
246
- language : { locale : booking . user . locale || defaultLocale } ,
271
+ switch ( step . action ) {
272
+ case WorkflowActions . EMAIL_HOST :
273
+ sendTo = [ bookingInfo . organizer ?. email ] ;
274
+ const schedulingType = bookingInfo . eventType ?. schedulingType ;
275
+ const hosts = bookingInfo . eventType . hosts
276
+ ?. filter ( ( host ) =>
277
+ bookingInfo . attendees . some ( ( attendee ) => host . user . email === attendee . email )
278
+ )
279
+ . map ( ( { user } ) => user . destinationCalendar ?. primaryEmail ?? user . email ) ;
280
+ if (
281
+ ( schedulingType === SchedulingType . ROUND_ROBIN ||
282
+ schedulingType === SchedulingType . COLLECTIVE ) &&
283
+ hosts
284
+ ) {
285
+ sendTo = sendTo . concat ( hosts ) ;
286
+ }
287
+ break ;
288
+ case WorkflowActions . EMAIL_ATTENDEE :
289
+ sendTo = bookingInfo . attendees
290
+ . map ( ( attendee ) => attendee . email )
291
+ . filter ( ( email ) : email is string => ! ! email ) ;
292
+ break ;
293
+ case WorkflowActions . EMAIL_ADDRESS :
294
+ sendTo = step . sendTo ? [ step . sendTo ] : [ ] ;
295
+ break ;
247
296
}
248
- : { name : "" , email : "" , timeZone : "" , language : { locale : "" } } ,
249
- startTime : booking . startTime . toISOString ( ) ,
250
- endTime : booking . endTime . toISOString ( ) ,
251
- title : booking . title ,
252
- language : { locale : booking ?. user ?. locale || defaultLocale } ,
253
- eventType : {
254
- slug : booking . eventType ?. slug || "" ,
255
- schedulingType : booking . eventType ?. schedulingType ,
256
- hosts : booking . eventType ?. hosts ,
257
- } ,
258
- metadata : booking . metadata ,
259
- } ;
260
- for ( const step of eventTypeWorkflow . steps ) {
261
- if (
262
- step . action === WorkflowActions . EMAIL_ATTENDEE ||
263
- step . action === WorkflowActions . EMAIL_HOST ||
264
- step . action === WorkflowActions . EMAIL_ADDRESS
265
- ) {
266
- let sendTo : string [ ] = [ ] ;
267
297
268
- switch ( step . action ) {
269
- case WorkflowActions . EMAIL_HOST :
270
- sendTo = [ bookingInfo . organizer ?. email ] ;
271
- const schedulingType = bookingInfo . eventType ?. schedulingType ;
272
- const hosts = bookingInfo . eventType . hosts
273
- ?. filter ( ( host ) =>
274
- bookingInfo . attendees . some ( ( attendee ) => host . user . email === attendee . email )
275
- )
276
- . map ( ( { user } ) => user . destinationCalendar ?. primaryEmail ?? user . email ) ;
277
- if (
278
- ( schedulingType === SchedulingType . ROUND_ROBIN ||
279
- schedulingType === SchedulingType . COLLECTIVE ) &&
280
- hosts
281
- ) {
282
- sendTo = sendTo . concat ( hosts ) ;
283
- }
284
- break ;
285
- case WorkflowActions . EMAIL_ATTENDEE :
286
- sendTo = bookingInfo . attendees
287
- . map ( ( attendee ) => attendee . email )
288
- . filter ( ( email ) : email is string => ! ! email ) ;
289
- break ;
290
- case WorkflowActions . EMAIL_ADDRESS :
291
- sendTo = step . sendTo ? [ step . sendTo ] : [ ] ;
292
- break ;
298
+ await scheduleEmailReminder ( {
299
+ evt : bookingInfo ,
300
+ triggerEvent : eventTypeWorkflow . trigger ,
301
+ action : step . action ,
302
+ timeSpan : {
303
+ time : eventTypeWorkflow . time ,
304
+ timeUnit : eventTypeWorkflow . timeUnit ,
305
+ } ,
306
+ sendTo,
307
+ emailSubject : step . emailSubject || "" ,
308
+ emailBody : step . reminderBody || "" ,
309
+ template : step . template ,
310
+ sender : step . sender ,
311
+ workflowStepId : step . id ,
312
+ } ) ;
313
+ } else if ( step . action === WorkflowActions . SMS_NUMBER && step . sendTo ) {
314
+ await scheduleSMSReminder ( {
315
+ evt : bookingInfo ,
316
+ reminderPhone : step . sendTo ,
317
+ triggerEvent : eventTypeWorkflow . trigger ,
318
+ action : step . action ,
319
+ timeSpan : {
320
+ time : eventTypeWorkflow . time ,
321
+ timeUnit : eventTypeWorkflow . timeUnit ,
322
+ } ,
323
+ message : step . reminderBody || "" ,
324
+ workflowStepId : step . id ,
325
+ template : step . template ,
326
+ sender : step . sender ,
327
+ userId : booking . userId ,
328
+ teamId : eventTypeWorkflow . teamId ,
329
+ } ) ;
330
+ } else if ( step . action === WorkflowActions . WHATSAPP_NUMBER && step . sendTo ) {
331
+ await scheduleWhatsappReminder ( {
332
+ evt : bookingInfo ,
333
+ reminderPhone : step . sendTo ,
334
+ triggerEvent : eventTypeWorkflow . trigger ,
335
+ action : step . action ,
336
+ timeSpan : {
337
+ time : eventTypeWorkflow . time ,
338
+ timeUnit : eventTypeWorkflow . timeUnit ,
339
+ } ,
340
+ message : step . reminderBody || "" ,
341
+ workflowStepId : step . id ,
342
+ template : step . template ,
343
+ userId : booking . userId ,
344
+ teamId : eventTypeWorkflow . teamId ,
345
+ } ) ;
293
346
}
294
-
295
- await scheduleEmailReminder ( {
296
- evt : bookingInfo ,
297
- triggerEvent : eventTypeWorkflow . trigger ,
298
- action : step . action ,
299
- timeSpan : {
300
- time : eventTypeWorkflow . time ,
301
- timeUnit : eventTypeWorkflow . timeUnit ,
302
- } ,
303
- sendTo,
304
- emailSubject : step . emailSubject || "" ,
305
- emailBody : step . reminderBody || "" ,
306
- template : step . template ,
307
- sender : step . sender ,
308
- workflowStepId : step . id ,
309
- } ) ;
310
- } else if ( step . action === WorkflowActions . SMS_NUMBER && step . sendTo ) {
311
- await scheduleSMSReminder ( {
312
- evt : bookingInfo ,
313
- reminderPhone : step . sendTo ,
314
- triggerEvent : eventTypeWorkflow . trigger ,
315
- action : step . action ,
316
- timeSpan : {
317
- time : eventTypeWorkflow . time ,
318
- timeUnit : eventTypeWorkflow . timeUnit ,
319
- } ,
320
- message : step . reminderBody || "" ,
321
- workflowStepId : step . id ,
322
- template : step . template ,
323
- sender : step . sender ,
324
- userId : booking . userId ,
325
- teamId : eventTypeWorkflow . teamId ,
326
- } ) ;
327
- } else if ( step . action === WorkflowActions . WHATSAPP_NUMBER && step . sendTo ) {
328
- await scheduleWhatsappReminder ( {
329
- evt : bookingInfo ,
330
- reminderPhone : step . sendTo ,
331
- triggerEvent : eventTypeWorkflow . trigger ,
332
- action : step . action ,
333
- timeSpan : {
334
- time : eventTypeWorkflow . time ,
335
- timeUnit : eventTypeWorkflow . timeUnit ,
336
- } ,
337
- message : step . reminderBody || "" ,
338
- workflowStepId : step . id ,
339
- template : step . template ,
340
- userId : booking . userId ,
341
- teamId : eventTypeWorkflow . teamId ,
342
- } ) ;
343
347
}
344
348
}
345
349
}
0 commit comments