Loading

Automazione del rinnovo dei contratti in Salesforce CPQ

Data pubblicazione: Sep 27, 2025
Descrizione
In Salesforce CPQ è possibile rinnovare i contratti e gli asset controllando manualmente i campi Renewal Forecast (Previsione rinnovo) o Renewal Quoted (Rinnovo con preventivo) del contratto. Se si desidera automatizzare il processo di rinnovo del contratto, seguire le best practice elencate di seguito per rinnovare i contratti tramite processi batch Apex pianificati.
 
Risoluzione
Per automatizzare il processo di rinnovo del contratto, si consiglia di eseguire questa operazione utilizzando una classe Apex pianificata, per eseguire una classe Apex batch sull'oggetto Contratto con una dimensione batch pari a 1. La classe Apex batch può interrogare tutti i record desiderati da rinnovare e impostare il campo SBQQ__RenewalForecast__c o SBQQ__RenewalQuoted__c. L'esempio seguente interroga tutti i contratti dell'organizzazione in cui non sono selezionati né SBQQ__RenewalForecast__c né SBQQ__RenewalQuoted__c. Quindi, imposta SBQQ__RenewalForecast__c di quei contratti su true, per generare opportunità di rinnovo. Inoltre, invia un'email all'utente che ha creato il batch per informarlo dello stato di elaborazione del batch.
 
///***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 });
	}
}

Una volta creata la classe Apex batch, è necessario creare una classe Apex pianificabile, per invocare automaticamente la classe Apex batch. Quando si invoca la classe Apex batch, è importante utilizzare una dimensione batch pari a 1 per evitare di incorrere in limiti di organizzazione per i singoli processi Apex.
 
//***Schedulable Apex Class***

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

Dopo aver creato la classe batch e la classe pianificabile per invocarla, si può scegliere di eseguire il batch di rinnovo ogni giorno utilizzando l'interfaccia standard di pianificazione Apex di Salesforce, che si trova facendo clic sul pulsante 'Pianifica Apex' nell'elenco delle classi Apex in Imposta. Tuttavia, se si desidera che il batch venga eseguito più frequentemente, è possibile eseguire una qualche forma del seguente codice. L'esempio che segue illustra come impostare la classe RenewSchedule di cui sopra in modo che venga eseguita ogni 10 minuti. Il batch viene impostato per essere eseguito ogni ora agli intervalli di 0, 10, 20, 30, 40 e 50 minuti.

Per maggiori informazioni sul metodo System.schedule, vedere questo articolo della documentazione per sviluppatori.
 
//***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);

Nota: si possono utilizzare le regole del flusso di lavoro basate sul tempo per eseguire il rinnovo automatico, per i clienti che non elaborano molti contratti. Tuttavia, se si cerca di rinnovare più contratti nella stessa automazione del flusso di lavoro, si rischia di incorrere nei limiti di Apex. L'esecuzione di processi batch di dimensione pari a 1 consente di aggirare i limiti di Apex. Quando si utilizzano regole del flusso di lavoro basate sul tempo, assicurarsi che l'utente di flusso di lavoro predefinito sia un amministratore di sistema o un utente che abbia il livello di accesso corretto agli oggetti e ai record CPQ. Individuare l'utente di flusso di lavoro predefinito dell'organizzazione Salesforce facendo clic sul link.
Non è consigliabile utilizzare un flusso pianificato per automatizzare il rinnovo. Il flusso pianificato restituisce un errore quando viene utilizzato per automatizzare il rinnovo. Un flusso pianificato utilizza un utente "interno" per eseguire il processo. L'utente è denominato Processo automatico. Questo utente non è accessibile né configurabile e non possiederà il livello di accesso corretto a CPQ. Gli utenti possono votare a favore di questa idea relativa all'utente Processo automatico.
Numero articolo Knowledge

000383568

 
Caricamento
Salesforce Help | Article