Loading
Exemple de code pour mettre à jour le mappage de type de contrat désynchronisé

Exemple de code pour mettre à jour le mappage de type de contrat désynchronisé

Si vous supprimez, ajoutez ou modifiez un mappage de type d'enregistrement avec un type de contact, les modifications s'appliquent uniquement aux nouveaux contrats. Pour mettre à jour les contrats désynchronisés, l'administrateur système peut exécuter un code personnalisé.

L'administrateur système peut utiliser cet exemple de code pour modifier le mappage des contrats existants. Ouvrez la Developer Console, accédez à Déboguer Ouvrir la fenêtre Exécuter anonyme, collez l'exemple de code, puis cliquez sur Exécuter. Pour plus d'informations sur l'utilisation de la classe Apex, consultez le Apex Developer Guide.

Cas d'utilisation : Le type de contrat Santé correspond aux types d'enregistrement Soins hospitaliers et Soins ambulatoires. 1000 enregistrements de contrat ont ce mappage. Vous changez le mappage du type d'enregistrement Soins hospitaliers avec le type de contrat Revenu. Sur les 1000 enregistrements existants, 500 types d'enregistrement Soins hospitaliers pointent vers Type de contrat Santé. Les lignes de contrat continuent d'afficher le type de contrat Santé et le type d'enregistrement Soins hospitaliers, car l'application Salesforce Contracts ne met pas automatiquement à jour les enregistrements de contrat qui ont un type d'enregistrement Soins hospitaliers avec un type de contrat Revenu. Seul l'administrateur système peut appliquer les modifications en utilisant un exemple de code. Cependant, lorsqu'un nouveau contrat est créé avec un type d'enregistrement Soins hospitaliers, le type de contrat est Revenu.

Remarque
Remarque Par défaut, le champ Type de contrat de l'objet contrat est en lecture seule pour tous les profils non administrateurs. Au niveau du profil, en fonction de la sécurité au niveau du champ, les utilisateurs peuvent mettre à jour manuellement le type de contrat désynchronisé dans l'objet contrat ou en utilisant un code Apex.

L'exemple de code extrait une liste de Types de contrat. Vous pouvez transmettre n'importe quel nombre de Types de contrat et ajuster le mappage. Vous pouvez modifier la requête pour apporter des modifications et extraire des contrats avec des statuts spécifiques tels que Brouillon, Contrat expiré, Annulé, 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());
                        	}
                   	}
                	}
            	}
        	}
  	}
	}
}
 
Chargement
Salesforce Help | Article