top of page

Regularization (proactive amendment)

clementchotin

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






2 views0 comments

Recent Posts

See All
Campaign

Campaign

Comments

Rated 0 out of 5 stars.
No ratings yet

Add a rating
bottom of page