• Mathieu Perrin 13
  • NEWBIE
  • 10 Points
  • Member since 2016

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 2
    Questions
  • 2
    Replies
I created a Background Utility Item component that uses empApi component to listen on capture data change. I need to have it aware of Page Context and able to get record id of current page. I tried to use force:hasRecordId interface with component.get("v.recordId") but it doesn't works. If I remove the lightning:backgroundUtilityItem interface and use it in Utility Bar, I am able to retrieve the record id. Do you know if it is by design or an issue from Salesforce ? Do you have any workaround ?
Thank you
 
<aura:component implements="flexipage:availableForAllPageTypes,lightning:backgroundUtilityItem,force:hasRecordId" access="global">
	<aura:attribute name="channel" type="String" required="true" default="/data/ChangeEvents" />
	<aura:attribute name="checkRecordId" type="Boolean" default="true" />
	<aura:attribute name="debug" type="Boolean" default="false" />
	<aura:handler name="SubscribeStreamingChannelEvent" event="c:SubscribeStreamingChannelEvent" action="{!c.handleSubscribeEvent}"/>
	<aura:handler name="destroy" value="{!this}" action="{!c.unsubscribe}"/>
	<c:StreamingChannelSubscriber channel="{!v.channel}" debug="{!v.debug}" />
</aura:component>
 
({
	handleSubscribeEvent : function(component, event, helper) {
		const debug = component.get("v.debug");
		const message = event.getParam('recordData');
        const eventType = message.payload.ChangeEventHeader.changeType;
        const entityName = message.payload.ChangeEventHeader.entityName;
        const userId = message.payload.ChangeEventHeader.commitUser.substring(0, 15); //15 digit id of transaction commit user
        const signedInUser= $A.get("$SObjectType.CurrentUser.Id").substring(0, 15); //15 digit id of logged in user
		const checkRecordId = component.get("v.checkRecordId");
        /**
         * Conditions:
         * - Change Type should not be create
         * - Record Id must present in modified recordIds
         * - User who modified the record should not be logged in user
         * */
        if(!(eventType === "CREATE")){
            //Condition 1 - Change type is not "created"
            Array.from(message.payload.ChangeEventHeader.recordIds).forEach( recordId => {
				if(debug && checkRecordId) console.log("Record Id on page = " + component.get("v.recordId") + " - Record Id in event = " + recordId);
                if(!checkRecordId || (checkRecordId && recordId === component.get("v.recordId"))){
                    //Condition 2 - Record Id match found &&
                    //Condition 3 - commit user is not logged in user
                    //Display console log with changed values
					if(debug) console.log(`${eventType} event captured on ${entityName} by user id ${userId}`);
                    if(debug) console.log("Values changed are:");
            	}
             });
        }
    }
})

 
Hello,

I created an Apex class to be launched after a sandbox refresh.
I am trying to implement the test class corresponding but I got the following error :
Method does not exist or incorrect signature: Test.testSandboxPostCopyScript(SandboxPostRefresh, Id, Id, String)
Someone already had this error ? My class is set on version 38.

Here is my test class :
@isTest
private class SandboxPostRefreshTest {
	
	@isTest static void testSandboxPostRefresh() {
		Test.startTest();
		SandboxPostRefresh ClassInstance = new SandboxPostRefresh();
		System.Test.testSandboxPostCopyScript(ClassInstance, UserInfo.getOrganizationId(), UserInfo.getOrganizationId(), 'sandboxName');
		Test.stoptest();
	}	
}

And my post refresh class :
global class SandboxPostRefresh {
	global void runApexClass(SandboxContext context) {
		NexthinkProvider np = NexthinkProvider.getInstance();
		String[] opportunityRecordTypes = new String[]{'New Customer','NBS','Services','Renewal','Upsell'};
		Schema.DescribeSObjectResult oSchema = Schema.SObjectType.Opportunity;
		Map<String,Schema.RecordTypeInfo> rtMapByName = oSchema.getRecordTypeInfosByName();

		// Create accounts
		List<Map<String, Object>> accountsProperties = new List<Map<String, Object>>();
		for (Integer i = 1; i <= 13; i++) {
			String industry = Randomizer.getRandomPickListValue(Account.sObjectType, null, 'Industry', false);
			Account a = new Account();
			Randomizer.getRandomPickListValue(null, a, 'Industry', false);
		    Map<String, Object> accountProperties = new Map<String, Object>();
		    if(i == 13) {
				accountProperties.put('Name', 'Direct');
		    }
		    else {
				accountProperties.put('Name', Randomizer.getRandomCompanyName());
			}
			accountProperties.put('Industry', Randomizer.getRandomPickListValue(Account.sObjectType, null, 'Industry', false));
			if(i <= 3) {
				accountProperties.put('Type', 'Potential Customer');
			}
			else if(i > 3 && i <= 6) {
				accountProperties.put('Type', 'Customer');
			}
			else if(i > 6 && i <= 9) {
				accountProperties.put('Type', 'Potential Partner');
				accountProperties.put('Industry', 'Technology');
			}
			else if(i > 9 && i <= 13) {
				accountProperties.put('Type', 'Partner');
				accountProperties.put('Industry', 'Technology');
			}
			accountProperties.put('CurrencyIsoCode', Randomizer.getRandomCurrency());
			accountProperties.put('Country__c', Randomizer.getRandomCountry());
			accountsProperties.add(accountProperties);
		}
		List<Account> accounts = np.createAccounts(accountsProperties);

		List<Account> partners = new List<Account>();
		for(Account a : accounts) {
			if(a.Type == 'Potential Partner' || a.Type == 'Partner') {
				partners.add(a);
			}
		}

		
		List<Map<String, Object>> contactsProperties = new List<Map<String, Object>>();
		List<Map<String, Object>> opportunitesProperties = new List<Map<String, Object>>();
		for(Account a : accounts) {
			// Create contacts
			Map<String, Object> contactProperties = new Map<String, Object>();
			contactProperties.put('FirstName', Randomizer.getRandomFirstname());
			contactProperties.put('LastName', Randomizer.getRandomLastname());
			contactProperties.put('Phone', Randomizer.getRandomPhoneNumber());
			contactProperties.put('AccountId', a.Id);
			String firstname = (String) contactProperties.get('FirstName');
			String lastname = (String) contactProperties.get('LastName');
			contactProperties.put('Email', firstname.toLowerCase() + '.' + lastname.toLowerCase() + '@' + a.Name.toLowerCase() + '.com');
			contactProperties.put('Country__c', a.Country__c);
			contactProperties.put('LeadSource', Randomizer.getRandomPickListValue(Contact.sObjectType, null, 'LeadSource', false));
			contactsProperties.add(contactProperties);
			if(a.Name != 'Direct' && a.Type != 'Partner' && a.Type != 'Potential Partner') {
				for (Integer i = 1; i <= 3; i++) {
					// Create opportunities
					Map<String, Object> opportunityProperties = new Map<String, Object>();
					
					String partnerName;
					if(Randomizer.getRandomBoolean()) {
						Account partner = partners.get(Randomizer.getRandomNumber(6));
						partnerName = partner.Name;
						opportunityProperties.put('Partner_Lookup__c', partner.Id);
					}
					else {
						partnerName = 'Direct';
					}

					Schema.RecordTypeInfo rt = rtMapByName.get(Randomizer.getRandomString(opportunityRecordTypes));
					opportunityProperties.put('RecordTypeId', rt.getRecordTypeId());
					opportunityProperties.put('Name', a.Name + '_' + partnerName + '_' + rt.getName());
					opportunityProperties.put('AccountId', a.Id);
					opportunityProperties.put('CurrencyIsoCode', a.CurrencyIsoCode);
					opportunityProperties.put('CloseDate', Date.today().addDays(Randomizer.getRandomNumber(90)));
					opportunityProperties.put('StageName', 'Unqualified');
					opportunityProperties.put('Probability', 11);
					opportunityProperties.put('LeadSource', Randomizer.getRandomPickListValue(Opportunity.sObjectType, null, 'LeadSource', false));
					opportunityProperties.put('Contract_Start_Date__c', ((Date) opportunityProperties.get('CloseDate')).addDays(1));
					String contractCommitment = Randomizer.getRandomPickListValue(Opportunity.sObjectType, null, 'Contract_Commitment__c', false);
					opportunityProperties.put('Contract_Commitment__c', contractCommitment);
					if(contractCommitment == '<1 Year') {
						opportunityProperties.put('Contract_End_Date__c', ((Date) opportunityProperties.get('Contract_Start_Date__c')).addDays(90));
					}
					else if(contractCommitment == '1 Year') {
						opportunityProperties.put('Contract_End_Date__c', ((Date) opportunityProperties.get('Contract_Start_Date__c')).addDays(Randomizer.getRandomNumber(365)));
					}
					else if(contractCommitment == '2 Years') {
						opportunityProperties.put('Contract_End_Date__c', ((Date) opportunityProperties.get('Contract_Start_Date__c')).addDays(365*2));
					}
					else if(contractCommitment == '3 Years') {
						opportunityProperties.put('Contract_End_Date__c', ((Date) opportunityProperties.get('Contract_Start_Date__c')).addDays(365*3));
					}
					else if(contractCommitment == '4 Years') {
						opportunityProperties.put('Contract_End_Date__c', ((Date) opportunityProperties.get('Contract_Start_Date__c')).addDays(365*4));
					}
					else if(contractCommitment == '5 Years') {
						opportunityProperties.put('Contract_End_Date__c', ((Date) opportunityProperties.get('Contract_Start_Date__c')).addDays(365*5));
					}
					else {
						opportunityProperties.put('Contract_End_Date__c', ((Date) opportunityProperties.get('Contract_Start_Date__c')).addDays(500));
					}
					opportunitesProperties.add(opportunityProperties);
				}
			}
		}
		List<Contact> contacts = np.createContacts(contactsProperties);
		List<Opportunity> opportunities = np.createOpportunities(opportunitesProperties);

		// Get all products
		Map<String, Product2> productsMap = new Map<String, Product2>(); 
		for(Product2 product : [SELECT Id, Name FROM Product2]) {
			productsMap.put(product.Name, product);
		}
        
        // Create OpportunityLineItem
		Map<Opportunity,List<Object>> olisMap = new Map<Opportunity,List<Object>>();
		for(Opportunity o : opportunities) {
			List<Object> tempList = new List<Object>();
			List<Product2> opportunityProductList = new List<Product2>();
			Map<String, Object> oliProperties = new Map<String, Object>();
			oliProperties.put('Description', 'SKU');
			
			if(o.RecordTypeId == rtMapByName.get('New Customer').getRecordTypeId() || o.RecordTypeId == rtMapByName.get('Upsell').getRecordTypeId()) {
				oliProperties.put('Quantity', 100);
				opportunityProductList.add(productsMap.get('Endpoint Collector - License'));
				if(Randomizer.getRandomBoolean()) {
					opportunityProductList.add(productsMap.get('Endpoint Collector - Maintenance 1yr'));
				}
				else {
					opportunityProductList.add(productsMap.get('Endpoint Collector - Subscription 1yr'));
				}
				if(Randomizer.getRandomBoolean()) {
					opportunityProductList.add(productsMap.get('Time & Material billed upon completion - per day'));
				}
			}
			if(o.RecordTypeId == rtMapByName.get('NBS').getRecordTypeId()) {
				oliProperties.put('Quantity', 5);
				opportunityProductList.add(productsMap.get('Baseline Service 1-Engine'));
			}
			if(o.RecordTypeId == rtMapByName.get('Renewal').getRecordTypeId()) {
				oliProperties.put('Quantity', 1000);
				if(Randomizer.getRandomBoolean()) {
					opportunityProductList.add(productsMap.get('Renewal Endpoint Collector - Subscription 1yr'));
				}
				else {
					opportunityProductList.add(productsMap.get('Renewal Endpoint Collector - Maintenance 1yr'));
				}
			}
			if(o.RecordTypeId == rtMapByName.get('Services').getRecordTypeId()) {
				oliProperties.put('Quantity', 10);
				Integer random = Randomizer.getRandomNumber(3);
				if(random == 1) {
					opportunityProductList.add(productsMap.get('Time & Material billed upon completion - per day'));
				}
				else if(random == 2) {
					opportunityProductList.add(productsMap.get('Service Fee Billed in Advance'));
				}
				else if(random == 3) {
					opportunityProductList.add(productsMap.get('Fixed fee billed upon milestone completion'));
				}
			}
			tempList.add(opportunityProductList);
			tempList.add(oliProperties);
			olisMap.put(o, tempList);
		}
		np.addProducts(olisMap);
	}
}

 
Hello,

I created an Apex class to be launched after a sandbox refresh.
I am trying to implement the test class corresponding but I got the following error :
Method does not exist or incorrect signature: Test.testSandboxPostCopyScript(SandboxPostRefresh, Id, Id, String)
Someone already had this error ? My class is set on version 38.

Here is my test class :
@isTest
private class SandboxPostRefreshTest {
	
	@isTest static void testSandboxPostRefresh() {
		Test.startTest();
		SandboxPostRefresh ClassInstance = new SandboxPostRefresh();
		System.Test.testSandboxPostCopyScript(ClassInstance, UserInfo.getOrganizationId(), UserInfo.getOrganizationId(), 'sandboxName');
		Test.stoptest();
	}	
}

And my post refresh class :
global class SandboxPostRefresh {
	global void runApexClass(SandboxContext context) {
		NexthinkProvider np = NexthinkProvider.getInstance();
		String[] opportunityRecordTypes = new String[]{'New Customer','NBS','Services','Renewal','Upsell'};
		Schema.DescribeSObjectResult oSchema = Schema.SObjectType.Opportunity;
		Map<String,Schema.RecordTypeInfo> rtMapByName = oSchema.getRecordTypeInfosByName();

		// Create accounts
		List<Map<String, Object>> accountsProperties = new List<Map<String, Object>>();
		for (Integer i = 1; i <= 13; i++) {
			String industry = Randomizer.getRandomPickListValue(Account.sObjectType, null, 'Industry', false);
			Account a = new Account();
			Randomizer.getRandomPickListValue(null, a, 'Industry', false);
		    Map<String, Object> accountProperties = new Map<String, Object>();
		    if(i == 13) {
				accountProperties.put('Name', 'Direct');
		    }
		    else {
				accountProperties.put('Name', Randomizer.getRandomCompanyName());
			}
			accountProperties.put('Industry', Randomizer.getRandomPickListValue(Account.sObjectType, null, 'Industry', false));
			if(i <= 3) {
				accountProperties.put('Type', 'Potential Customer');
			}
			else if(i > 3 && i <= 6) {
				accountProperties.put('Type', 'Customer');
			}
			else if(i > 6 && i <= 9) {
				accountProperties.put('Type', 'Potential Partner');
				accountProperties.put('Industry', 'Technology');
			}
			else if(i > 9 && i <= 13) {
				accountProperties.put('Type', 'Partner');
				accountProperties.put('Industry', 'Technology');
			}
			accountProperties.put('CurrencyIsoCode', Randomizer.getRandomCurrency());
			accountProperties.put('Country__c', Randomizer.getRandomCountry());
			accountsProperties.add(accountProperties);
		}
		List<Account> accounts = np.createAccounts(accountsProperties);

		List<Account> partners = new List<Account>();
		for(Account a : accounts) {
			if(a.Type == 'Potential Partner' || a.Type == 'Partner') {
				partners.add(a);
			}
		}

		
		List<Map<String, Object>> contactsProperties = new List<Map<String, Object>>();
		List<Map<String, Object>> opportunitesProperties = new List<Map<String, Object>>();
		for(Account a : accounts) {
			// Create contacts
			Map<String, Object> contactProperties = new Map<String, Object>();
			contactProperties.put('FirstName', Randomizer.getRandomFirstname());
			contactProperties.put('LastName', Randomizer.getRandomLastname());
			contactProperties.put('Phone', Randomizer.getRandomPhoneNumber());
			contactProperties.put('AccountId', a.Id);
			String firstname = (String) contactProperties.get('FirstName');
			String lastname = (String) contactProperties.get('LastName');
			contactProperties.put('Email', firstname.toLowerCase() + '.' + lastname.toLowerCase() + '@' + a.Name.toLowerCase() + '.com');
			contactProperties.put('Country__c', a.Country__c);
			contactProperties.put('LeadSource', Randomizer.getRandomPickListValue(Contact.sObjectType, null, 'LeadSource', false));
			contactsProperties.add(contactProperties);
			if(a.Name != 'Direct' && a.Type != 'Partner' && a.Type != 'Potential Partner') {
				for (Integer i = 1; i <= 3; i++) {
					// Create opportunities
					Map<String, Object> opportunityProperties = new Map<String, Object>();
					
					String partnerName;
					if(Randomizer.getRandomBoolean()) {
						Account partner = partners.get(Randomizer.getRandomNumber(6));
						partnerName = partner.Name;
						opportunityProperties.put('Partner_Lookup__c', partner.Id);
					}
					else {
						partnerName = 'Direct';
					}

					Schema.RecordTypeInfo rt = rtMapByName.get(Randomizer.getRandomString(opportunityRecordTypes));
					opportunityProperties.put('RecordTypeId', rt.getRecordTypeId());
					opportunityProperties.put('Name', a.Name + '_' + partnerName + '_' + rt.getName());
					opportunityProperties.put('AccountId', a.Id);
					opportunityProperties.put('CurrencyIsoCode', a.CurrencyIsoCode);
					opportunityProperties.put('CloseDate', Date.today().addDays(Randomizer.getRandomNumber(90)));
					opportunityProperties.put('StageName', 'Unqualified');
					opportunityProperties.put('Probability', 11);
					opportunityProperties.put('LeadSource', Randomizer.getRandomPickListValue(Opportunity.sObjectType, null, 'LeadSource', false));
					opportunityProperties.put('Contract_Start_Date__c', ((Date) opportunityProperties.get('CloseDate')).addDays(1));
					String contractCommitment = Randomizer.getRandomPickListValue(Opportunity.sObjectType, null, 'Contract_Commitment__c', false);
					opportunityProperties.put('Contract_Commitment__c', contractCommitment);
					if(contractCommitment == '<1 Year') {
						opportunityProperties.put('Contract_End_Date__c', ((Date) opportunityProperties.get('Contract_Start_Date__c')).addDays(90));
					}
					else if(contractCommitment == '1 Year') {
						opportunityProperties.put('Contract_End_Date__c', ((Date) opportunityProperties.get('Contract_Start_Date__c')).addDays(Randomizer.getRandomNumber(365)));
					}
					else if(contractCommitment == '2 Years') {
						opportunityProperties.put('Contract_End_Date__c', ((Date) opportunityProperties.get('Contract_Start_Date__c')).addDays(365*2));
					}
					else if(contractCommitment == '3 Years') {
						opportunityProperties.put('Contract_End_Date__c', ((Date) opportunityProperties.get('Contract_Start_Date__c')).addDays(365*3));
					}
					else if(contractCommitment == '4 Years') {
						opportunityProperties.put('Contract_End_Date__c', ((Date) opportunityProperties.get('Contract_Start_Date__c')).addDays(365*4));
					}
					else if(contractCommitment == '5 Years') {
						opportunityProperties.put('Contract_End_Date__c', ((Date) opportunityProperties.get('Contract_Start_Date__c')).addDays(365*5));
					}
					else {
						opportunityProperties.put('Contract_End_Date__c', ((Date) opportunityProperties.get('Contract_Start_Date__c')).addDays(500));
					}
					opportunitesProperties.add(opportunityProperties);
				}
			}
		}
		List<Contact> contacts = np.createContacts(contactsProperties);
		List<Opportunity> opportunities = np.createOpportunities(opportunitesProperties);

		// Get all products
		Map<String, Product2> productsMap = new Map<String, Product2>(); 
		for(Product2 product : [SELECT Id, Name FROM Product2]) {
			productsMap.put(product.Name, product);
		}
        
        // Create OpportunityLineItem
		Map<Opportunity,List<Object>> olisMap = new Map<Opportunity,List<Object>>();
		for(Opportunity o : opportunities) {
			List<Object> tempList = new List<Object>();
			List<Product2> opportunityProductList = new List<Product2>();
			Map<String, Object> oliProperties = new Map<String, Object>();
			oliProperties.put('Description', 'SKU');
			
			if(o.RecordTypeId == rtMapByName.get('New Customer').getRecordTypeId() || o.RecordTypeId == rtMapByName.get('Upsell').getRecordTypeId()) {
				oliProperties.put('Quantity', 100);
				opportunityProductList.add(productsMap.get('Endpoint Collector - License'));
				if(Randomizer.getRandomBoolean()) {
					opportunityProductList.add(productsMap.get('Endpoint Collector - Maintenance 1yr'));
				}
				else {
					opportunityProductList.add(productsMap.get('Endpoint Collector - Subscription 1yr'));
				}
				if(Randomizer.getRandomBoolean()) {
					opportunityProductList.add(productsMap.get('Time & Material billed upon completion - per day'));
				}
			}
			if(o.RecordTypeId == rtMapByName.get('NBS').getRecordTypeId()) {
				oliProperties.put('Quantity', 5);
				opportunityProductList.add(productsMap.get('Baseline Service 1-Engine'));
			}
			if(o.RecordTypeId == rtMapByName.get('Renewal').getRecordTypeId()) {
				oliProperties.put('Quantity', 1000);
				if(Randomizer.getRandomBoolean()) {
					opportunityProductList.add(productsMap.get('Renewal Endpoint Collector - Subscription 1yr'));
				}
				else {
					opportunityProductList.add(productsMap.get('Renewal Endpoint Collector - Maintenance 1yr'));
				}
			}
			if(o.RecordTypeId == rtMapByName.get('Services').getRecordTypeId()) {
				oliProperties.put('Quantity', 10);
				Integer random = Randomizer.getRandomNumber(3);
				if(random == 1) {
					opportunityProductList.add(productsMap.get('Time & Material billed upon completion - per day'));
				}
				else if(random == 2) {
					opportunityProductList.add(productsMap.get('Service Fee Billed in Advance'));
				}
				else if(random == 3) {
					opportunityProductList.add(productsMap.get('Fixed fee billed upon milestone completion'));
				}
			}
			tempList.add(opportunityProductList);
			tempList.add(oliProperties);
			olisMap.put(o, tempList);
		}
		np.addProducts(olisMap);
	}
}