Loading
Eksempel på kode for å oppdatere tilordning av ikke-synkronisert kontrakttype

Eksempel på kode for å oppdatere tilordning av ikke-synkronisert kontrakttype

Hvis du sletter, legger til eller endrer en posttypetilordning med en kontakttype, gjelder endringene bare for de nye kontraktene. For å oppdatere de ikke-synkroniserte kontraktene kan systemadministratoren kjøre en tilpasset kode.

Systemadministrator kan bruke denne eksempelkoden til å endre kontrakttilordningen for eksisterende kontrakter. Åpne Developer Console, gå til DebugOpen Execute Anonymous Window, lim inn eksempelkoden og klikk Utfør. Hvis du vil ha mer informasjon om hvordan du bruker Apex-klasse, kan du se Apex Developer Guide.

Brukstilfelle: Kontrakttypen Helse tilsvarer posttypene Pasientbehandling og Optopasientbehandling. Det er 1000 kontraktposter som har denne tilordningen. Du endrer tilordningen for posttypen Inpatient Care til kontrakttypen Revenue, og av de eksisterende 1000 postene er det 500 Inpatient Care-posttyper som peker til Contract Type Health. Kontraktsradene vil fremdeles vise kontrakttypen Tilstand og posttypen Pasientbehandling fordi Salesforce Contracts ikke automatisk oppdaterer kontraktspostene som har posttypen Pasientbehandling med kontrakttypen Omsetning. Bare systemadministratoren kan bruke endringene ved bruk av en eksempelkode. Men når en ny kontrakt opprettes med posttypen Inpatient Care, blir kontrakttypen Omsetning.

Merk
Merk Kontrakttype-feltet i kontraktsobjektet er som standard skrivebeskyttet for alle ikke-administratorprofiler. På profilnivå, basert på feltnivåsikkerhet, kan brukere oppdatere den usynkroniserte kontrakttypen i kontraktsobjektet manuelt eller med en Apex.

Eksempelkoden trekker ut en liste over kontrakttyper. Du kan overføre et hvilket som helst antall kontrakttyper og justere tilordningen. Du kan redigere spørringen for å gjøre endringer og trekke ut kontrakter med bestemte statuser som Utkast, Kontrakt utløpt, Kansellert og så videre.

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