diff --git a/packages/features/bookings/lib/handleConfirmation.ts b/packages/features/bookings/lib/handleConfirmation.ts index 6af8f7b5f5..8ffb3cba78 100644 --- a/packages/features/bookings/lib/handleConfirmation.ts +++ b/packages/features/bookings/lib/handleConfirmation.ts @@ -338,7 +338,67 @@ export async function handleConfirmation(args: { ); }) ); + await Promise.all(promises); + + if (paid) { + let paymentExternalId: string | undefined; + const subscriberMeetingPaid = await getWebhooks({ + userId: triggerForUser ? booking.userId : null, + eventTypeId: booking.eventTypeId, + triggerEvent: WebhookTriggerEvents.BOOKING_PAID, + teamId: booking.eventType?.teamId, + }); + const bookingWithPayment = await prisma.booking.findFirst({ + where: { + id: bookingId, + }, + select: { + payment: { + select: { + id: true, + success: true, + externalId: true, + }, + }, + }, + }); + const successPayment = bookingWithPayment?.payment?.find((item) => item.success); + if (successPayment) { + paymentExternalId = successPayment.externalId; + } + + const paymentMetadata = { + identifier: "cal.com", + bookingId, + eventTypeId: booking.eventType?.id, + bookerEmail: evt.attendees[0].email, + eventTitle: booking.eventType?.title, + externalId: paymentExternalId, + }; + const bookingPaidSubscribers = subscriberMeetingPaid.map((sub) => + sendPayload(sub.secret, WebhookTriggerEvents.BOOKING_PAID, new Date().toISOString(), sub, { + ...evt, + ...eventTypeInfo, + bookingId, + eventTypeId: booking.eventType?.id, + status: "ACCEPTED", + smsReminderNumber: booking.smsReminderNumber || undefined, + paymentId: bookingWithPayment?.payment?.[0].id, + metadata: { + ...(paid ? paymentMetadata : {}), + }, + }).catch((e) => { + console.error( + `Error executing webhook for event: ${WebhookTriggerEvents.BOOKING_PAID}, URL: ${sub.subscriberUrl}`, + e + ); + }) + ); + + // I don't need to await for this + Promise.all(bookingPaidSubscribers); + } } catch (error) { // Silently fail console.error(error); diff --git a/packages/features/webhooks/lib/sendPayload.ts b/packages/features/webhooks/lib/sendPayload.ts index 200f6b0939..e0211a6a71 100644 --- a/packages/features/webhooks/lib/sendPayload.ts +++ b/packages/features/webhooks/lib/sendPayload.ts @@ -18,7 +18,7 @@ export type EventTypeInfo = { export type WebhookDataType = CalendarEvent & EventTypeInfo & { - metadata?: { [key: string]: string }; + metadata?: { [key: string]: string | number | boolean | null }; bookingId?: number; status?: string; smsReminderNumber?: string; @@ -28,6 +28,7 @@ export type WebhookDataType = CalendarEvent & triggerEvent: string; createdAt: string; downloadLink?: string; + paymentId?: number; }; function getZapierPayload( diff --git a/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts b/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts index dc0f28781a..84bd5d76e5 100644 --- a/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts +++ b/packages/trpc/server/routers/viewer/eventTypes/update.handler.ts @@ -241,13 +241,13 @@ export const updateHandler = async ({ ctx, input }: UpdateOptions) => { } } - if (input?.price || input.metadata?.apps?.stripe?.price) { - data.price = input.price || input.metadata?.apps?.stripe?.price; + if (input.metadata?.apps?.stripe?.price) { + data.price = input.metadata?.apps?.stripe?.price; const paymentCredential = await ctx.prisma.credential.findFirst({ where: { userId: ctx.user.id, type: { - contains: "_payment", + equals: "stripe_payment", }, }, select: { @@ -260,6 +260,22 @@ export const updateHandler = async ({ ctx, input }: UpdateOptions) => { const { default_currency } = stripeDataSchema.parse(paymentCredential.key); data.currency = default_currency; } + } + + if (input.metadata?.apps?.paypal?.price) { + data.price = input.metadata?.apps?.paypal?.price; + const paymentCredential = await ctx.prisma.credential.findFirst({ + where: { + userId: ctx.user.id, + type: { + equals: "paypal_payment", + }, + }, + select: { + type: true, + key: true, + }, + }); if (paymentCredential?.type === "paypal_payment" && input.metadata?.apps?.paypal?.currency) { data.currency = input.metadata?.apps?.paypal?.currency.toLowerCase(); }