diff --git a/packages/app-store/salesforce/lib/CrmService.ts b/packages/app-store/salesforce/lib/CrmService.ts index 1ec270b3ed..5e6a2a13c4 100644 --- a/packages/app-store/salesforce/lib/CrmService.ts +++ b/packages/app-store/salesforce/lib/CrmService.ts @@ -609,17 +609,21 @@ export default class SalesforceCRMService implements CRM { if (error.name === "DUPLICATES_DETECTED") { const existingId = this.getExistingIdFromDuplicateError(error); if (existingId) { - console.log("Using existing record:", existingId); + log.info("Using existing record:", existingId); createdContacts.push({ id: existingId, email: attendee.email }); } } else { - console.error("Error creating lead:", error); + log.error("Error creating lead:", error); } } } } } + if (createdContacts.length === 0) { + // This should never happen + log.error(`No contacts created for these app options ${safeStringify(appOptions)}`); + } return createdContacts; } @@ -816,6 +820,7 @@ export default class SalesforceCRMService implements CRM { } private async ensureFieldsExistOnObject(fieldsToTest: string[], sobject: string) { + const log = logger.getSubLogger({ prefix: [`[ensureFieldsExistOnObject]`] }); const conn = await this.conn; const fieldSet = new Set(fieldsToTest); @@ -835,7 +840,7 @@ export default class SalesforceCRMService implements CRM { return foundFields; } catch (e) { - console.error(e); + log.error(`Error ensuring fields ${fieldsToTest} exist on object ${sobject} with error ${e}`); return []; } } @@ -1039,6 +1044,7 @@ export default class SalesforceCRMService implements CRM { bookingUid, organizerEmail, calEventResponses, + contactId, }); this.log.info( @@ -1065,6 +1071,7 @@ export default class SalesforceCRMService implements CRM { bookingUid, organizerEmail, calEventResponses, + contactId, }: { existingFields: Field[]; personRecord: Record; @@ -1073,15 +1080,26 @@ export default class SalesforceCRMService implements CRM { bookingUid?: string | null; organizerEmail?: string; calEventResponses?: CalEventResponses | null; + contactId: string; }): Promise> { + const log = logger.getSubLogger({ prefix: [`[buildRecordUpdatePayload] ${contactId}`] }); const writeOnRecordBody: Record = {}; for (const field of existingFields) { const fieldConfig = onBookingWriteToRecordFields[field.name]; + if (!fieldConfig) { + log.error(`No field config found for field ${field.name}`); + continue; + } + + log.info( + `Processing field ${field.name} with type ${field.type} and config ${JSON.stringify(fieldConfig)}` + ); + // Skip if field should only be written when empty and already has a value if (fieldConfig.whenToWrite === WhenToWriteToRecord.FIELD_EMPTY && personRecord[field.name]) { - this.log.info( + log.info( `Field ${field.name} on contactId ${personRecord?.Id} already exists with value ${ personRecord[field.name] }` @@ -1113,6 +1131,7 @@ export default class SalesforceCRMService implements CRM { }); if (extractedText) { writeOnRecordBody[field.name] = extractedText; + continue; } } else if (field.type === SalesforceFieldType.DATE && startTime && organizerEmail) { const dateValue = await this.getDateFieldValue( @@ -1123,9 +1142,16 @@ export default class SalesforceCRMService implements CRM { ); if (dateValue) { writeOnRecordBody[field.name] = dateValue; + continue; } } } + + log.error( + `No value found for field ${field.name} with value ${ + personRecord[field.name] + }, field config ${JSON.stringify(fieldConfig)} and Salesforce config ${JSON.stringify(field)}` + ); } return writeOnRecordBody; @@ -1412,6 +1438,7 @@ export default class SalesforceCRMService implements CRM { existingFields, personRecord, onBookingWriteToRecordFields: writeToRecordObject, + contactId: personRecord.Id, }); await conn .sobject(recordType) diff --git a/packages/lib/EventManager.ts b/packages/lib/EventManager.ts index ec138cacae..82bb4e9ba5 100644 --- a/packages/lib/EventManager.ts +++ b/packages/lib/EventManager.ts @@ -1046,7 +1046,7 @@ export default class EventManager { const crm = new CrmManager(credential, currentAppOption); let success = true; - const createdEvent = await crm.createEvent(event, currentAppOption).catch((error) => { + const createdEvent = await crm.createEvent(event).catch((error) => { success = false; // We don't know the type of the error here, so for an Error instance we can read message but otherwise we stringify the error const errorMsg = error instanceof Error ? error.message : JSON.stringify(error); diff --git a/packages/lib/crmManager/crmManager.ts b/packages/lib/crmManager/crmManager.ts index 01e8f290d3..baffa81693 100644 --- a/packages/lib/crmManager/crmManager.ts +++ b/packages/lib/crmManager/crmManager.ts @@ -27,7 +27,7 @@ export default class CrmManager { return crmService; } - public async createEvent(event: CalendarEvent, appOptions?: any) { + public async createEvent(event: CalendarEvent) { const crmService = await this.getCrmService(this.credential); if (!crmService) return; const { skipContactCreation = false, ignoreGuests = false } = crmService.getAppOptions() || {};