feat: Add AssignmentReason to BOOKING_CREATED webhook (#21315)

* AssignmentREasonRecorder methods return the reason generated

* Add assignmentReason to `EventPayloadType`

* Pass `assignmentReason` to webhook payload data

* Undo constants commit
This commit is contained in:
Joe Au-Yeung authored and GitHub committed 2025-05-14 23:33:25 +00:00
1 parent a5639a8290
commit 8d675fd8b6
2 files changed
+36 -10

No files matched your search

@@ -68,6 +68,7 @@ import { getTranslation } from "@calcom/lib/server/i18n";
import { WorkflowRepository } from "@calcom/lib/server/repository/workflow";
import { getTimeFormatStringFromUserTimeFormat } from "@calcom/lib/timeFormat";
import prisma from "@calcom/prisma";
import type { AssignmentReasonEnum } from "@calcom/prisma/enums";
import { BookingStatus, SchedulingType, WebhookTriggerEvents } from "@calcom/prisma/enums";
import { CreationSource } from "@calcom/prisma/enums";
import {
@@ -1301,6 +1302,8 @@ async function handler(
})
);
let assignmentReason: { reasonEnum: AssignmentReasonEnum; reasonString: string } | undefined;
try {
if (!isDryRun) {
booking = await createBooking({
@@ -1341,7 +1344,7 @@ async function handler(
// If it's a round robin event, record the reason for the host assignment
if (eventType.schedulingType === SchedulingType.ROUND_ROBIN) {
if (reqBody.crmOwnerRecordType && reqBody.crmAppSlug && contactOwnerEmail && routingFormResponseId) {
await AssignmentReasonRecorder.CRMOwnership({
assignmentReason = await AssignmentReasonRecorder.CRMOwnership({
bookingId: booking.id,
crmAppSlug: reqBody.crmAppSlug,
teamMemberEmail: contactOwnerEmail,
@@ -1349,7 +1352,7 @@ async function handler(
routingFormResponseId,
});
} else if (routingFormResponseId && teamId) {
await AssignmentReasonRecorder.routingFormRoute({
assignmentReason = await AssignmentReasonRecorder.routingFormRoute({
bookingId: booking.id,
routingFormResponseId,
organizerId: organizerUser.id,
@@ -1885,6 +1888,7 @@ async function handler(
status: "ACCEPTED",
smsReminderNumber: booking?.smsReminderNumber || undefined,
rescheduledBy: reqBody.rescheduledBy,
...(assignmentReason ? { assignmentReason: [assignmentReason] } : {}),
};
if (bookingRequiresPayment) {
@@ -113,13 +113,21 @@ export default class AssignmentReasonRecorder {
}
}
const reasonEnum = AssignmentReasonEnum.ROUTING_FORM_ROUTING;
const reasonString = attributeValues.join(", ");
await prisma.assignmentReason.create({
data: {
bookingId: bookingId,
reasonEnum: AssignmentReasonEnum.ROUTING_FORM_ROUTING,
reasonString: attributeValues.join(", "),
reasonEnum,
reasonString,
},
});
return {
reasonEnum,
reasonString,
};
}
// Separate method to handle rerouting
@@ -148,13 +156,20 @@ export default class AssignmentReasonRecorder {
if (!crmRoutingReason || !crmRoutingReason.assignmentReason) return;
const { reasonEnum, assignmentReason } = crmRoutingReason;
await prisma.assignmentReason.create({
data: {
bookingId,
reasonEnum: crmRoutingReason.reasonEnum,
reasonString: crmRoutingReason.assignmentReason,
reasonEnum,
reasonString: assignmentReason,
},
});
return {
reasonEnum,
reasonString: assignmentReason,
};
}
static roundRobinReassignment = withReporting(
AssignmentReasonRecorder._roundRobinReassignment,
@@ -180,6 +195,11 @@ export default class AssignmentReasonRecorder {
},
});
const reasonEnum =
reassignmentType === RRReassignmentType.MANUAL
? AssignmentReasonEnum.REASSIGNED
: AssignmentReasonEnum.RR_REASSIGNED;
const reasonString = `Reassigned by: ${reassignedBy?.username || "team member"}. ${
reassignReason ? `Reason: ${reassignReason}` : ""
}`;
@@ -187,12 +207,14 @@ export default class AssignmentReasonRecorder {
await prisma.assignmentReason.create({
data: {
bookingId: bookingId,
reasonEnum:
reassignmentType === RRReassignmentType.MANUAL
? AssignmentReasonEnum.REASSIGNED
: AssignmentReasonEnum.RR_REASSIGNED,
reasonEnum,
reasonString,
},
});
return {
reasonEnum,
reasonString,
};
}
}