_sachin | 2025-01-28 19:37:01 UTC | #1
Hi All,
We have copied the Apex class code(StatusSyncManager) from here:Status Sync and replaced the ids with Genesys and Salesforce Sync Ids but getting below error:
"duplicate value found: <unknown> duplicates value on record with id: <unknown>"
Could anyone please suggest how to fix this issue:
Apex class code(StatusSyncManager):
// ATTENTION: You will need to find the Genesys presence ids that exist in your org.
// ATTENTION: You will need to find the Salesforce status ids that exist in your org. // Run this query in your Salesforce org to get the status ids specific to your org. You can use 15 or 18 digit ids. // SELECT DeveloperName,Id,IsDeleted,MasterLabel FROM ServicePresenceStatus
global with sharing class TestExtension implements genesyscloud.GenesysSCVExtension.Status { public String onSalesforceStatusChange(String data) { IncomingStatusChange statusUpdate = (IncomingStatusChange) JSON.deserialize(data, IncomingStatusChange.class); // ----------------------------------------------------------------------------------------------------------------------------------- // Examples of how to get current Salesforce Status Variables: // String salesforceCurrentStatusApiName = statusUpdate.salesforceStatus.currentStatus.statusApiName; // String salesforceCurrentStatusId = statusUpdate.salesforceStatus.currentStatus.statusId; // String salesforceCurrentStatusName = statusUpdate.salesforceStatus.currentStatus.statusName;
// Examples of how to get target Salesforce Status Variables: // String salesforceTargetStatusApiName = statusUpdate.salesforceStatus.targetStatus.statusApiName; String salesforceTargetStatusId = statusUpdate.salesforceStatus.targetStatus.statusId; String salesforceTargetStatusName = statusUpdate.salesforceStatus.targetStatus.statusName; // ----------------------------------------------------------------------------------------------------------------------------------- // Examples of how to get current Genesys Status Variables: // String genesysCurrentId = statusUpdate.genesysCloudStatus.currentStatus.id; // String genesysCurrentSystemPresence = statusUpdate.genesysCloudStatus.currentStatus.systemPresence;
// Examples of how to get target Genesys Status Variables: String genesysTargetId = statusUpdate.genesysCloudStatus.targetStatus.id; // String genesysTargetSystemPresence = statusUpdate.genesysCloudStatus.targetStatus.systemPresence; // -----------------------------------------------------------------------------------------------------------------------------------
// These are the variables that will be changed to update the agent's status. // These are default values to be sent back if no changes are made to the target statuses. // NOTE: If these values are NOT handled below, NO CHANGES will be made to the target statuses. String salesforceResponseTargetStatusId = salesforceTargetStatusId; String genesysResponseTargetStatusId = genesysTargetId;
if (String.isNotEmpty(salesforceTargetStatusName)) { salesforceTargetStatusName = salesforceTargetStatusName.toUpperCase(); }
switch on salesforceTargetStatusName { when 'AVAILABLE FOR VOICE' { //genesysResponseTargetStatusId = 'd2390a99-8546-bad9-8f0a-219548e8aeb0'; } when 'On Queue' { genesysResponseTargetStatusId = 'e08eaf1b-ee47-4fa9-a231-1200e284798f'; } when 'Direct Calls Only' { genesysResponseTargetStatusId = '6a3af858-942f-489d-9700-5f9bcdcdae9b'; } when null { // Agent clicked Offline in Omni-Channel genesysResponseTargetStatusId = 'ccf3c10a-aa2c-4845-8e8d-f59fa48c58e5'; } when else { System.debug(logginglevel.WARN, 'Salesforce status NOT HANDLED: ' + salesforceTargetStatusName); } }
// ----------------------------------------------------------------------------------------------------------------- // Form response object... shouldn't need to be touched. return JSON.serialize(new Response(genesysResponseTargetStatusId, salesforceResponseTargetStatusId)); }
public String onGenesysCloudStatusChange(String data) { IncomingStatusChange statusUpdate = (IncomingStatusChange) JSON.deserialize(data, IncomingStatusChange.class); // ----------------------------------------------------------------------------------------------------------------------------------- // Examples of how to get current Salesforce Status Variables: // String salesforceCurrentStatusApiName = statusUpdate.salesforceStatus.currentStatus.statusApiName; // String salesforceCurrentStatusId = statusUpdate.salesforceStatus.currentStatus.statusId; // String salesforceCurrentStatusName = statusUpdate.salesforceStatus.currentStatus.statusName;
// Examples of how to get target Salesforce Status Variables: // String salesforceTargetStatusApiName = statusUpdate.salesforceStatus.targetStatus.statusApiName; String salesforceTargetStatusId = statusUpdate.salesforceStatus.targetStatus.statusId; // String salesforceTargetStatusName = statusUpdate.salesforceStatus.targetStatus.statusName; // ----------------------------------------------------------------------------------------------------------------------------------- // Examples of how to get current Genesys Status Variables: // String genesysCurrentId = statusUpdate.genesysCloudStatus.currentStatus.id; // String genesysCurrentSystemPresence = statusUpdate.genesysCloudStatus.currentStatus.systemPresence;
// Examples of how to get target Genesys Status Variables: String genesysTargetId = statusUpdate.genesysCloudStatus.targetStatus.id; String genesysTargetSystemPresence = statusUpdate.genesysCloudStatus.targetStatus.systemPresence; // -----------------------------------------------------------------------------------------------------------------------------------
// These are the variables that will be changed to update the agent's status. // These are default values to be sent back if no changes are made to the target statuses. // NOTE: If these values are NOT handled below, NO CHANGES will be made to the target statuses. String salesforceResponseTargetStatusId = salesforceTargetStatusId; String genesysResponseTargetStatusId = genesysTargetId;
if (String.isNotEmpty(genesysTargetSystemPresence)) { genesysTargetSystemPresence = genesysTargetSystemPresence.toUpperCase(); }
switch on genesysTargetSystemPresence { when 'AVAILABLE' { salesforceResponseTargetStatusId = '0N5As0000000iaXKAQ'; } when 'ON_QUEUE' { salesforceResponseTargetStatusId = '0N5As0000000j3ZKAQ'; } when 'AWAY' { salesforceResponseTargetStatusId = '0N5As0000000j5BKAQ'; } when 'BUSY' { // Sets agent to Offline in Omni-Channel salesforceResponseTargetStatusId = '0'; } when else { System.debug(logginglevel.WARN, 'Genesys Cloud status NOT HANDLED: ' + genesysTargetSystemPresence); } }
// ----------------------------------------------------------------------------------------------------------------- // Form response object... shouldn't need to be touched. return JSON.serialize(new Response(genesysResponseTargetStatusId, salesforceResponseTargetStatusId)); }
// No need to change below -------------------------------------------------------------------------------------------------------- //#region Response Obj public class Response { public ResponseGenesysCloudStatusObj genesysCloudStatus; public ResponseSalesforceStatusObj salesforceStatus; public Response(String genesysResponseTargetStatusId, String salesforceResponseTargetStatusId) { this.genesysCloudStatus = new ResponseGenesysCloudStatusObj(genesysResponseTargetStatusId); this.salesforceStatus = new ResponseSalesforceStatusObj(salesforceResponseTargetStatusId); } } public class ResponseGenesysCloudStatus { public String id; public ResponseGenesysCloudStatus(String id) { this.id = id; } } public class ResponseGenesysCloudStatusObj { public ResponseGenesysCloudStatus targetStatus; public ResponseGenesysCloudStatusObj(String genesysResponseTargetStatusId) { this.targetStatus = new ResponseGenesysCloudStatus(genesysResponseTargetStatusId); } } public class ResponseSalesforceStatus { public String statusId; public ResponseSalesforceStatus(String statusId) { this.statusId = statusId; } } public class ResponseSalesforceStatusObj { public ResponseSalesforceStatus targetStatus; public ResponseSalesforceStatusObj(String salesforceResponseTargetStatusId) { this.targetStatus = new ResponseSalesforceStatus(salesforceResponseTargetStatusId); } } //#endregion Response Obj
//#region IncomingStatusChange Obj public class IncomingStatusChange { public IncomingSalesforceStatus salesforceStatus; public IncomingGenesysCloudStatus genesysCloudStatus; } public class IncomingSalesforceStatusObj { public String statusApiName; public String statusId; public String statusName; } public class IncomingSalesforceStatus { public IncomingSalesforceStatusObj targetStatus; public IncomingSalesforceStatusObj currentStatus; } public class IncomingGenesysCloudStatusObj { public String id; public String systemPresence; } public class IncomingGenesysCloudStatus { public IncomingGenesysCloudStatusObj targetStatus; public IncomingGenesysCloudStatusObj currentStatus; } //#endregion IncomingStatusChange Obj // ----------------------------------------------------------------------------------------------------------------- }
system | 2025-02-28 19:37:16 UTC | #2
This topic was automatically closed 31 days after the last reply. New replies are no longer allowed.
This post was migrated from the old Developer Forum.
ref: 31451