Loading
Exempelkod för att uppdatera mappning av kontrakttyp som inte är synkroniserad

Exempelkod för att uppdatera mappning av kontrakttyp som inte är synkroniserad

Om du tar bort, lägger till eller ändrar en posttypmappning med en kontakttyp gäller ändringarna endast för de nya kontrakten. För att uppdatera kontrakt som inte är synkroniserade kan systemadministratören köra en egen kod.

Systemadministratörer kan använda denna exempelkod för att ändra kontraktmappningen för befintliga kontrakt. Öppna Developer Console, gå till Debug (Felsökning)Open Execute Anonymous Window (Öppna fönstret Kör anonym), klistra in exempelkoden och klicka på Execute (Kör). Mer information om att använda Apex Class finns i Apex Developer Guide.

Användningsfall: Kontrakttypen Hälsa motsvarar posttyperna slutenvård och öppenvård. Det finns 1000 kontraktposter som har denna mappning. Du ändrar mappningen för posttypen slutenvård till kontrakttypen intäkter och av de befintliga 1000 posterna finns 500 posttyper för slutenvård som pekar mot kontrakttypen hälsa. Kontraktraderna kommer att fortsätta visa kontrakttypen som Hälsa och posttypen som Slutenvård eftersom Salesforce Contracts inte automatiskt uppdaterar kontraktposterna som har posttypen Slutenvård med kontrakttypen Intäkter. Endast systemadministratören kan tillämpa ändringarna med en exempelkod. När ett nytt kontrakt skapas med posttypen Slutenvård kommer kontrakttypen dock att vara Intäkter.

Anteckning
Anteckning Fältet Kontrakttyp i kontraktobjektet är som standard skrivskyddat för alla icke-administratörsprofiler. På profilnivå, baserat på fältnivåsäkerhet, kan användare uppdatera kontrakttypen som inte är synkroniserad i kontraktobjektet manuellt eller med en Apex kod.

Exempelkoden hämtar en lista över kontrakttyper. Du kan skicka valfritt antal kontrakttyper och justera mappningen. Du kan redigera sökfrågan för att göra ändringar och hämta kontrakt med specifika statusar som Utkast, Kontrakt löpt ut, Avbruten, etc.

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());
                        	}
                   	}
                	}
            	}
        	}
  	}
	}
}
 
Laddar
Salesforce Help | Article