Legacy Dev Forum Posts

 View Only

Sign Up

CX Cloud from from Salesforce and Genesys: Enhanced Status Sync Error

  • 1.  CX Cloud from from Salesforce and Genesys: Enhanced Status Sync Error

    Posted 06-05-2025 19:05

    _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