Vous êtes ici :
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.
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());
}
}
}
}
}
}
}
}
