Use Multi-Org Plugin
As a Salesforce Administrator, use the Multi Org Plugin to filter records by the Currency field in Account or Opportunity objects. Customize the org selection process with the IMultiOrgSelectionPlugin interface.
- Create a global plugin interface that implements zqu.MultiOrgSelectionPlugin.IMultiOrgSelectionPlugin.
- Register and activate the plugin.
- Navigate to Zuora Config > Quote Studio Settings > Plugins.
- Enable the Multi Org Plugin toggle and add the class name of your custom plugin.
- Click Save.
Sample code
The following sample code filters the orgs based on the Currency field in Accounts and Opportunity objects, assuming these objects have a Currency field./* Sample code is created with assumption that Account and Opportunity object has a Currency field */ global class SampleMultiOrgPlugin implements zqu.MultiOrgSelectionPlugin.IMultiOrgSelectionPlugin { global List<sobject> getOrganizations(zqu.MultiOrgSelectionPlugin.PluginContext pluginContext) { List<sobject> filteredOrgs = new List<Sobject>(); system.debug('pluginContext.opportunityId :'+pluginContext.opportunityId); system.debug('pluginContext.sfdcAccountId :'+pluginContext.accountId); if(pluginContext.opportunityId != null && pluginContext.opportunityId != '') { String oppId = pluginContext.opportunityId; List<Opportunity> oppList = [select id, zqu__Currency__c from Opportunity where Id = :oppId]; if(oppList.size() > 0){ for (Sobject sobj : pluginContext.organizations) { if (sobj.get('Zuora__Functional_Currency__c') == oppList[0].zqu__Currency__c)//Field that is being filtered should be in selection list of multi org list on popup(Zuora__Multi_Org_Display_Fields) { filteredOrgs.add(sobj); } } } } else if(pluginContext.accountId != null && pluginContext.accountId != '') { String accountId = pluginContext.accountId; List<Account> accList = [select id, zqu__Currency__c from Account where Id = :accountId]; if(accList.size() > 0){ for (Sobject sobj : pluginContext.organizations) { if (sobj.get('Zuora__Functional_Currency__c') == accList[0].zqu__Currency__c) { filteredOrgs.add(sobj); } } } } return filteredOrgs; } }
Test Class for Sample Code@isTest public class SampleMultiOrgPluginTest { @testSetup private static void setup() { Zuora__Organization__c zuoraOrg = new Zuora__Organization__c(); zuoraOrg.Name = 'Test Org'; zuoraOrg.Zuora__External_Id__c = 'org-123'; zuoraOrg.Zuora__Functional_Currency__c = 'USD'; insert zuoraOrg; Account acct = new Account(Name = 'test Account'); insert acct; Opportunity opp = new Opportunity(Name = 'test Opp', AccountId = acct.Id); opp.StageName = 'Closed Won'; opp.CloseDate = System.today(); insert opp; } @IsTest public static void testGetAvailableOrgOpp(){ String oppId = [select id from Opportunity limit 1].Id; List<Zuora__Organization__c> lstOrgRecords = [select id,Zuora__Functional_Currency__c from Zuora__Organization__c]; SampleMultiOrgPlugin pluginObj = new SampleMultiOrgPlugin(); MultiOrgSelectionPlugin.PluginContext pluginContext = new MultiOrgSelectionPlugin.PluginContext(); pluginContext.accountId = null; pluginContext.opportunityId = oppId; pluginContext.organizations = lstOrgRecords; pluginObj.getOrganizations(pluginContext); } @IsTest public static void testGetAvailableOrg(){ String accountId = [select id from Account limit 1].Id; List<Zuora__Organization__c> lstOrgRecords = [select id,Zuora__Functional_Currency__c from Zuora__Organization__c]; SampleMultiOrgPlugin pluginObj = new SampleMultiOrgPlugin(); MultiOrgSelectionPlugin.PluginContext pluginContext = new MultiOrgSelectionPlugin.PluginContext(); pluginContext.accountId = accountId; pluginContext.opportunityId = null; pluginContext.organizations = lstOrgRecords; pluginObj.getOrganizations(pluginContext); } }