diff --git a/apps/web/public/static/locales/en/common.json b/apps/web/public/static/locales/en/common.json index 6ae9da149c..06e4989743 100644 --- a/apps/web/public/static/locales/en/common.json +++ b/apps/web/public/static/locales/en/common.json @@ -2720,6 +2720,7 @@ "attendee_timezone_info": "Attendee Timezone", "event_start_time_in_attendee_timezone_info": "Event Start Time In Attendee Timezone", "event_end_time_in_attendee_timezone_info": "Event End Time In Attendee Timezone", + "salesforce_create_event_on_contact": "Create event on contact, if it exists. Else fallback to lead", "salesforce_owner_name_to_change": "Owner name to change", "ADD_NEW_STRINGS_ABOVE_THIS_LINE_TO_PREVENT_MERGE_CONFLICTS": "↑↑↑↑↑↑↑↑↑↑↑↑↑ Add your new strings above here ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑" } diff --git a/packages/app-store/salesforce/components/EventTypeAppCardInterface.tsx b/packages/app-store/salesforce/components/EventTypeAppCardInterface.tsx index 9fe63b17f2..c6d37c7427 100644 --- a/packages/app-store/salesforce/components/EventTypeAppCardInterface.tsx +++ b/packages/app-store/salesforce/components/EventTypeAppCardInterface.tsx @@ -27,6 +27,7 @@ const EventTypeAppCard: EventTypeAppCardComponent = function EventTypeAppCard({ const createEventOn = getAppData("createEventOn") ?? SalesforceRecordEnum.CONTACT; const onBookingWriteToEventObject = getAppData("onBookingWriteToEventObject") ?? false; const onBookingWriteToEventObjectMap = getAppData("onBookingWriteToEventObjectMap") ?? {}; + const createEventOnLeadCheckForContact = getAppData("createEventOnLeadCheckForContact") ?? false; const onBookingChangeRecordOwner = getAppData("onBookingChangeRecordOwner") ?? false; const onBookingChangeRecordOwnerName = getAppData("onBookingChangeRecordOwnerName") ?? []; const { t } = useLocale(); @@ -93,6 +94,18 @@ const EventTypeAppCard: EventTypeAppCardComponent = function EventTypeAppCard({ /> ) : null} + {createEventOnSelectedOption.value === SalesforceRecordEnum.LEAD ? ( +
+ { + setAppData("createEventOnLeadCheckForContact", checked); + }} + /> +
+ ) : null} {createEventOnSelectedOption.value === SalesforceRecordEnum.ACCOUNT ? ( <>
diff --git a/packages/app-store/salesforce/lib/CrmService.ts b/packages/app-store/salesforce/lib/CrmService.ts index d7c8e4fffb..f6ec791f61 100644 --- a/packages/app-store/salesforce/lib/CrmService.ts +++ b/packages/app-store/salesforce/lib/CrmService.ts @@ -342,9 +342,27 @@ export default class SalesforceCRMService implements CRM { } const results = await conn.query(soql); - if (!results || !results.records.length) return []; + let records: ContactRecord[] = []; - const records = results.records as ContactRecord[]; + // If falling back to contacts, check for the contact before returning the leads or empty array + if ( + appOptions.createEventOn === SalesforceRecordEnum.LEAD && + appOptions.createEventOnLeadCheckForContact + ) { + // Get any matching contacts + const contactSearch = await conn.query( + `SELECT Id, Email, OwnerId FROM ${SalesforceRecordEnum.CONTACT} WHERE Email IN ('${emailArray.join( + "','" + )}')` + ); + + if (contactSearch && contactSearch.records.length > 0) + records = contactSearch.records as ContactRecord[]; + } else if (!results || !results.records.length) { + return []; + } + + if (!records.length) records = results.records as ContactRecord[]; if (includeOwner || forRoundRobinSkip) { const ownerIds: Set = new Set(); diff --git a/packages/app-store/salesforce/zod.ts b/packages/app-store/salesforce/zod.ts index 512d6614e9..ad3eb41e12 100644 --- a/packages/app-store/salesforce/zod.ts +++ b/packages/app-store/salesforce/zod.ts @@ -15,6 +15,7 @@ export const appDataSchema = eventTypeAppCardZod.extend({ createLeadIfAccountNull: z.boolean().optional(), onBookingWriteToEventObject: z.boolean().optional(), onBookingWriteToEventObjectMap: z.record(z.any()).optional(), + createEventOnLeadCheckForContact: z.boolean().optional(), onBookingChangeRecordOwner: z.boolean().optional(), onBookingChangeRecordOwnerName: z.string().optional(), });