Loading

Automatisation du renouvellement des contrats dans Salesforce CPQ

Date de publication: Sep 27, 2025
Description
Dans Salesforce CPQ, vous pouvez renouveler vos contrats et actifs  en vérifiant manuellement les champs de prévision de renouvellement ou les champs de devis de renouvellement du contrat. Pour automatiser le processus de renouvellement de votre contrat, suivez les meilleures pratiques ci-dessous pour renouveler les contrats en utilisant des tâches par lot Apex planifiées.
 
Résolution
Pour automatiser le processus de renouvellement du contrat, il est recommandé d’exécuter cette tâche en utilisant une classe Apex planifiée pour exécuter une classe Apex par lot sur l’objet Contrat avec une taille de lot de 1. La classe Apex par lot peut interroger tous les enregistrements souhaités pour renouveler et définir le champ SBQQ__RenewalForecast__c ou SBQQ__RenewalQuoted__c. L’exemple ci-dessous interroge tous les contrats dans l’organisation dans lesquels ni le champ SBQQ__RenewalForecast__c ni le champ SBQQ__RenewalQuoted__c n’est sélectionné. Ensuite, il définit SBQQ__RenewalForecast__c sur ces contrats sur true de façon à générer des opportunités de renouvellement. Il envoie également un e-mail à l’utilisateur qui a créé le lot pour l’informer du statut du traitement par lots.
 
///***Batch Apex Class***

global class RenewContractsBatch implements Database.Batchable<SObject>, Database.Stateful {
	global Integer recordsProcessed = 0;

	global Database.QueryLocator start(Database.BatchableContext bc){
		return Database.getQueryLocator(
			//This is where you input the conditions for the records which you wish to set renewal for 
			'SELECT SBQQ__RenewalForecast__c, SBQQ__RenewalQuoted__c, Id FROM Contract WHERE SBQQ__RenewalForecast__c = FALSE AND SBQQ__RenewalQuoted__c = FALSE'
		);
	}
	global void execute(Database.BatchableContext bc, List<Contract> scope){
		for(Contract contract:scope){
			contract.SBQQ__RenewalForecast__c = TRUE;
			recordsProcessed = recordsProcessed + 1;
		}
		update scope;
	}
	global void finish(Database.BatchableContext bc){
       // Get the ID of the AsyncApexJob representing this batch job
       // from Database.BatchableContext.
       // Query the AsyncApexJob object to retrieve the current job's information.
       AsyncApexJob a = [SELECT Id, Status, NumberOfErrors, JobItemsProcessed,
          TotalJobItems, CreatedBy.Email
          FROM AsyncApexJob WHERE Id =
          :BC.getJobId()];
       // OPTIONAL: Send an email to the Apex job's submitter notifying of job completion.
       Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
       String[] toAddresses = new String[] {a.CreatedBy.Email};
       mail.setToAddresses(toAddresses);
       mail.setSubject('Contract Renewal Batch ' + a.Status);
       mail.setPlainTextBody
       ('The batch Apex job processed ' + a.TotalJobItems +
       ' batches with '+ a.NumberOfErrors + ' failures.');
       Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
	}
}

Avec la classe Apex par lot créée, une classe Apex Schedulable doit être créée pour invoquer la classe Apex par lot automatiquement. Lorsque vous invoquez la classe Apex par lot, il est important d’utiliser une taille de lot de 1 afin d’éviter de se heurter aux limites de l’organisation pour des processus Apex individuels.
 
//***Schedulable Apex Class***

global class RenewSchedule implements Schedulable {
    global void execute(SchedulableContext ctx) {
        RenewContractsBatch batchObject = new RenewContractsBatch();
		Id batchId = Database.executeBatch(batchObject, 1);
    }
}

Une fois que vous avez créé votre classe par lot et la classe Schedule pour l’invoquer, vous pouvez exécuter votre lot de renouvellement quotidiennement à l’aide de l’interface standard Schedule Apex de Salesforce en cliquant sur le bouton « Planifier Apex » sur la liste Classes Apex dans Configuration. Cependant, si vous souhaitez exécuter votre lot plus souvent, vous pouvez exécuter le code suivant. L’exemple ci-dessous permet de définir l’exécution de la classe RenewSchedule précédente toutes les 10 minutes. Le lot est défini pour être exécuté toutes les heures à 0, 10, 20, 30, 40, et 50 minutes.

Pour plus d’informations sur la méthode System.schedule, consultez cet article de la documentation développeur.
 
//***Anonymous Apex to Set Up Scheduled Apex Execution***

RenewSchedule c = new RenewSchedule();
String sch0 = '0 0 * * * ?';
System.schedule('Renew Contracts 0', sch0, c);

String sch1 = '0 10 * * * ?';
System.schedule('Renew Contracts 10', sch1, c);

String sch2 = '0 20 * * * ?';
System.schedule('Renew Contracts 20', sch2, c);

String sch3 = '0 30 * * * ?';
System.schedule('Renew Contracts 30', sch3, c);

String sch4 = '0 40 * * * ?';
System.schedule('Renew Contracts 40', sch4, c);

String sch5 = '0 50 * * * ?';
System.schedule('Renew Contracts 50', sch5, c);

Remarque : Les règles de workflow temporelles peuvent être utilisées pour un renouvellement automatique pour les clients qui ne traitent pas de nombreux contrats. Néanmoins, si vous tentez de renouveler plusieurs contrats dans la même automatisation de workflow, vous risquez de vous heurter aux limites Apex. Exécutez des tâches par lot avec une taille de 1 pour contourner les limites Apex. Lorsque vous utilisez des règles de workflow temporelles, vérifiez que l’utilisateur de workflow par défaut est un administrateur système ou un utilisateur qui dispose de l’accès approprié aux enregistrements et objets CPQ. Identifiez l’utilisateur de workflow par défaut de votre organisation Salesforce en cliquant sur le lien.
Il est recommandé d’utiliser un flux planifié pour automatiser le renouvellement. Le flux planifié renvoie une erreur lorsqu’il est utilisé pour automatiser le renouvellement. Un flux planifié utilise un utilisateur « interne » pour exécuter le processus. L’utilisateur est appelé Processus automatisé. Cet utilisateur n’est ni accessible ni configurable et ne disposera pas de l’accès approprié à CPQ. Vous pouvez voter cette Idée concernant l’utilisateur Processus automatisé.
Numéro d’article de la base de connaissances

000383568

 
Chargement
Salesforce Help | Article