Loading
Образец кода для обновления соотнесения несинхронизированных типов контрактов

Образец кода для обновления соотнесения несинхронизированных типов контрактов

При удалении, добавлении или изменении соотнесения типов записей с типом контакта изменения применяются только к новым контрактам. Чтобы обновить несинхронизированные контракты, системный администратор может запустить настраиваемый код.

Системный администратор может использовать этот образец кода для изменения соотнесения контрактов для существующих контрактов. Откройте Developer Console, перейдите в «Отладка» «Открыть» «Выполнить анонимное окно», вставьте образец кода и нажмите «Выполнить». Дополнительные сведения об использовании класса Apex см. в Руководстве разработчика Apex.

Сценарий использования: Тип контракта «Здоровье» соответствует типам записей «Стационарное лечение» и «Амбулаторное лечение». Существует 1000 записей контрактов, содержащих это соотнесение. Измените соотнесение для типа записи «Стационарное лечение» на тип контракта «Доход». Из существующих 1000 записей 500 типов записей «Стационарное лечение» ссылаются на тип контракта «Здоровье». Строки контракта продолжат отображать тип контракта как Health, а тип записи как Stailary Care, поскольку приложение Salesforce Contracts не обновляет автоматически записи контрактов, содержащие тип записи Stailary Care с типом контракта Revenue. Только системный администратор может применить изменения посредством образца кода. Однако, при создании нового контракта с типом записи «Стационарное лечение», типом контракта будет «Доход».

Примечание
Примечание Поле «Тип контракта» в объекте контракта по умолчанию доступно только для чтения для всех профилей, не являющихся администраторами. На уровне профиля, в зависимости от безопасности поля, пользователи могут обновить несинхронизированный тип контракта в объекте контракта вручную или посредством кода Apex.

Пример кода извлекает список типов контрактов. Вы можете передать любое количество типов контрактов и настроить соотнесение. Вы можете отредактировать запрос для внесения изменений и извлечения контрактов с определенными статусами, например, «Черновик», «Контракт истек», «Отменено» и т. д.

public class SyncContractTypes {
   
	// use-case1 : sync contracts when existing RecordType that's associated with contracts is newly mapped to a existing ContractType
	// use-case2 : sync contracts when existing RecordType that's associated with contracts is removed from ContractType object - ContractType, SubType mapping
	// use-case3 : sync contracts when existing RecordType that's associated with contracts is removed from ContractType object - ContractType, SubType mapping  and mapped to existing ContractType, SubType
   
	public static void syncOutOfSyncContractTypes(List<String> contractTypes) {
       
    	Map<String,String> contractTypeSubtypeMap = new Map<String,String>();
    	Map<String,String> subtypeContractTypeMap = new Map<String,String>();
       
    	if(contractTypes != null && !contractTypes.isEmpty()) {
       	// Here we are querying all the contractTypes to support a use-case2
       	// where a SubType is removed from a contractType and mapped to another existing contractType
       	// If customers don't want to update when existing subType is mapped to another existing contractType they can
       	// restrict this by adding a where condition, WHERE MasterLabel IN :contractTypes
        	List<ContractType> contractTypeList = [SELECT MasterLabel,SubTypes FROM ContractType];
           
        	if(contractTypeList!= null && !contractTypeList.isEmpty()) {
            	for( ContractType c : contractTypeList) {
                	contractTypeSubtypeMap.put(c.MasterLabel, c.SubTypes);
                	if(c.subTypes != null) {
                    	for(String s : c.subTypes.split(',')) {
                        	subtypeContractTypeMap.put(s, c.MasterLabel);
                    	}
                	}
            	}
        	}
           
        	for(String ct : contractTypes) {
           
            	String contractType = (contractTypeSubtypeMap.containsKey(ct)) ? ct : '';
               
            	List<String> subTypesList = (contractTypeSubtypeMap.get(ct) != null) ? contractTypeSubtypeMap.get(ct).split(',') : new List<String>();
               
            	// we are applying basic filters here, please modify them accordingly to your use case
            	List<Contract> contracts = [
                	SELECT Id, ContractType, Name, RecordType.Name
                	FROM Contract
                	WHERE (ContractType =: contractType OR RecordType.Name IN :subTypesList)
                        	AND IsAssociatedWithCLM = true
                        	AND (NOT (ContractType =: contractType AND RecordType.Name IN : subTypesList))];
               
            	List<Contract> contractsToUpdate = new List<Contract>();
            	// check if any of the contracts are out of sync and update them
            	for(Contract c : contracts) {
                	String RecordTypeName = c.RecordType.Name;
                	if(subTypesList.contains(RecordTypeName) && c.ContractType != contractType) {
                    	c.ContractType = contractType;
                    	contractsToUpdate.add(c);
                	} else if(!subTypesList.contains(RecordTypeName) ){
                    	// check to see if any other ContractTypes has this RecordType as SubType
                    	c.ContractType = (subtypeContractTypeMap.get(RecordTypeName) != null) ? subtypeContractTypeMap.get(RecordTypeName) : '';
                    	contractsToUpdate.add(c);
                	}
                   
            	}           
            	if(contractsToUpdate != null && !contractsToUpdate.isEmpty()) {
                   
                	Database.SaveResult[] saveResult = Database.Update(contractsToUpdate, false);
                	for (Database.SaveResult sr : saveResult) {
                    	if (sr.isSuccess()) {
                        	// Operation was successful, so get the ID of the record that was processed
                        	System.debug('Successfully updated contract. Contract ID: ' + sr.getId());
                    	}
               	     else {
                        	// Operation failed, so get all errors               
                        	for(Database.Error err : sr.getErrors()) {
                            	System.debug('The following error has occurred.');    	            
                            	System.debug(err.getStatusCode() + ': ' + err.getMessage());
                            	System.debug('Contract fields that affected this error: ' + err.getFields());
                        	}
                   	}
                	}
            	}
        	}
  	}
	}
}
 
Загрузка
Salesforce Help | Article