Introduction
I want to adjust contract if we have a product with a minimum list price of a certain amounts. How to do it?
Custom field you need in contract


Apex
public class ContractFlagger {
// Invocable method to check quotelines for products linked to specific Contract IDs
@InvocableMethod(
label='CheckForProducts'
description='Check quotelines for products linked to specific Contract IDs.'
category='Account'
)
public static void CheckForProductsToFlag() {
// Map to store the relationship between Quote IDs and Contracts
Map<String, Contract> ContractToQuote = new Map<String, Contract>();
// List to store Quote IDs
List<String> Quotesids = new List<String>();
// List to store Quote IDs that need to be flagged
List<String> QuotesToFlag = new List<String>();
// Query Contracts based on the provided Contract IDs
List<Contract> contracts = [SELECT Id, SBQQ__Quote__c, ValidForRegularisation__c FROM Contract WHERE Status ='Activated' AND SBQQ__Quote__c != NULL];
// Lists to track Contracts that need to be updated
List<Contract> contractToUpdate = new List<Contract>();
List<Contract> contractTUpdate = new List<Contract>();
// Map Contracts with associated Quote IDs
for (Contract co : contracts) {
ContractToQuote.put(co.SBQQ__Quote__c, co);
Quotesids.add(co.SBQQ__Quote__c);
}
// Query quotelines based on the collected Quote IDs
List<SBQQ__QuoteLine__c> qls = [SELECT id, SBQQ__ListPrice__c, SBQQ__Quote__c FROM SBQQ__QuoteLine__c WHERE SBQQ__Quote__c = :Quotesids];
// Check quotelines with a list price greater than 10 and add their Quote IDs to the flag list
for (SBQQ__QuoteLine__c ql : qls) {
if (ql.SBQQ__ListPrice__c > 10) {
QuotesToFlag.add(ql.SBQQ__Quote__c);
}
}
// If there are Quote IDs to flag, identify the corresponding Contracts
if (QuotesToFlag != null) {
for (String qt : QuotesToFlag) {
contractToUpdate.add(ContractToQuote.get(qt));
}
}
// If there are Contracts to update, set the ValidForRegularisation__c field to true and perform the update
if (contractToUpdate != null) {
for (Contract ct : contractToUpdate) {
ct.ValidForRegularisation__c = true;
contractTUpdate.add(ct);
}
update contractTUpdate;
}
}
}
public class ContractsRegularization {
// Invocable method to check quotelines for products linked to specific Contracts IDS.
@InvocableMethod(label='RegularizationContracts' description='Check quotelines for products linked to specific Contracts IDS.' category='Account')
public static void RegularizationContracts (){
// Retrieve a limited set of contracts for regularization
List<Contract> scope = [SELECT Id, AdjustedQuotation__c, SBQQ__Quote__c, SBQQ__Opportunity__c FROM Contract WHERE ValidForRegularisation__c = true LIMIT 20];
// Maps to store relationships between Contracts and Quotes
Map<String, Contract> ContractToQuote = new Map<String, Contract>();
Map<String, Contract> newContractToQuote = new Map<String, Contract>();
Map<Id, SBQQ__Quote__c> oldQtonewQ = new Map<Id, SBQQ__Quote__c>();
// Lists to store Quote IDs
List<String> Quotesids = new List<String>();
List<String> newQuotesids = new List<String>();
// Lists for new quotelines and old quotelines to update
List<SBQQ__QuoteLine__c> newQlis = new List<SBQQ__QuoteLine__c>();
List<SBQQ__QuoteLine__c> oldQlistoUpdate = new List<SBQQ__QuoteLine__c>();
// Placeholder Contract object
Contract cont = new Contract();
// List to store Contracts to be updated
List<Contract> contractToUpdate = new List<Contract>();
// Lists for new quotes and old quotes to update
List<SBQQ__Quote__c> newQts = new List<SBQQ__Quote__c>();
// Populate ContractToQuote map and Quotesids list
for (Contract co : scope) {
ContractToQuote.put(co.SBQQ__Quote__c, co);
Quotesids.add(co.SBQQ__Quote__c);
}
// Query to retrieve quotelines related to the selected contracts
String query = 'SELECT SBQQ__Description__c, SBQQ__Product__c, SBQQ__Quote__c, SBQQ__Group__c FROM SBQQ__QuoteLine__c WHERE SBQQ__Quote__c IN :Quotesids';
List<SBQQ__QuoteLine__c> qls = Database.query(query);
System.debug('@@@ Quotelines' + qls);
// Query to retrieve information from original quotes
String query2 = 'SELECT SBQQ__ShippingCity__c, SBQQ__ShippingStreet__c, SBQQ__BillingCity__c, SBQQ__BillingStreet__c, CreatedById, CreatedDate FROM SBQQ__Quote__c WHERE Id IN :Quotesids';
List<SBQQ__Quote__c> ogQuotes = Database.query(query2);
System.debug('@@@ Quotelines' + ogQuotes);
// Clone original quotes to create new quotes
for (SBQQ__Quote__c qo : ogQuotes) {
SBQQ__Quote__c newqo = qo.clone(false, true, false, false);
System.debug('Quote in new Quote id : ' + newqo.id);
System.debug('Quote in OLD Quote id : ' + qo.id);
newQuotesids.add(newqo.id);
newQts.add(newqo);
oldQtonewQ.put(qo.id, newqo);
}
// Insert new quotes
insert newQts;
// Update contracts with adjusted quotation IDs
for (SBQQ__Quote__c qo : ogQuotes) {
SBQQ__Quote__c newqo = oldQtonewQ.get(qo.id);
if (newqo != null) {
cont = ContractToQuote.get(qo.id);
cont.AdjustedQuotation__c = newqo.id;
contractToUpdate.add(cont);
}
}
// Clone and update quotelines
for (SBQQ__QuoteLine__c ql : qls) {
SBQQ__Quote__c newqo = oldQtonewQ.get(ql.SBQQ__Quote__c);
if (newqo != null) {
SBQQ__QuoteLine__c newql = ql.clone(false, true, false, false);
oldQlistoUpdate.add(ql);
newql.SBQQ__Quote__c = newqo.id;
newQlis.add(newql);
System.debug('Quote in new QLI : ' + newql.SBQQ__Quote__c);
}
}
// Set quantity to 0 for old quotelines and 1 for new quotelines
for (SBQQ__QuoteLine__c oqli : oldQlistoUpdate) {
oqli.SBQQ__Quantity__c = 0;
}
for (SBQQ__QuoteLine__c nqli : newQlis) {
nqli.SBQQ__Quantity__c = 1;
}
// Try to insert new quotelines, update old quotelines, and update contracts
try {
insert newQlis;
update oldQlistoUpdate;
System.debug('Contracts TO UPDATE: ' + contractToUpdate);
update contractToUpdate;
} catch (DmlException e) {
System.debug('The following exception has occurred: ' + e.getMessage());
}
}
}
Flow




Result




Here the github: https://github.com/AourLegacy/AourFactory/tree/regularization
Comments