function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
JsinghJsingh 

Add Opportunity product from Quote line item


hi
 I have custom object for Quote,opportunitylineitem,product and so on....
my requirement is to -1.only one quote should be synced with opportunity.
                      2.first delete the opportunity product list than add the line item
                        of synced Quote.
                      3.The quote line item for that(synced) quote should be populated
                        into the related opportunity product(opplineitem)

Relation ship in my objects are
 Quote-----Opportunity--Masterdetail and lookup
 Quote----Quotelineitem--Master Detail
Quotelineitem----Opportunity-- lookup
OpportunityProduct-------Quotelineitem--look up
OpportunityProduct----Opportunity--Masterdetail
OpportunityProduct-----Product-- lookup

i had achieved first(1) and second(2) but not third(3).i had written code for third condition also
but it is not working.
my handler and trigger is here

                                  HANDLER
public class Mytestclassforupdatelineitem {
   
    public static void UpdateSyncedOpportunity(List<Quote__c> lstQuotes) {    
        system.debug('lstQuotes : ' +lstQuotes);
       
        List<Opportunity__c> lstOpportunitiesToUpdate = new List<Opportunity__c>();
       
        Set<string> setOpportunityIDs = new Set<string>();
        List<OpportunitylineItem__c> lstOppLineItems = new List<OpportunitylineItem__c>();
       
        for(Quote__c quote: lstQuotes) {    
            Opportunity__c opp = new Opportunity__c();
            opp.Id = quote.Opportunity__c;              
            opp.SyncedQuote__c = quote.id;
            lstOpportunitiesToUpdate.add(opp);            
           
            setOpportunityIDs.add(quote.Opportunity__c);
        }
       
        if(lstOpportunitiesToUpdate.size() > 0){
            update lstOpportunitiesToUpdate;
        }
       
        system.debug('setOpportunityIDs : ' +setOpportunityIDs);
       
        if(setOpportunityIDs.size() > 0){
            lstOppLineItems = [select id, name, Quantity__c from OpportunitylineItem__c where Opportunityproducts__c =: setOpportunityIDs ];            
        }
       
        if(lstOppLineItems != null && lstOppLineItems.size() > 0){
            delete lstOppLineItems;
        }
    }    
       
    public static void UpdateSyncedOpportunityLineItems(List<Quote__c> lstQuotes) {
        system.debug('lstQuotes in UpdateSyncedOpportunityLineItems : ' +lstQuotes);
       
        // set to store the opportunity id's for associated quotes on which sync is set as true
        Set<Id> setOpportunityIDs = new Set<Id>();  
        Set<Id> setSyncedQuoteIDs = new Set<Id>();  
        List <Quote__c> lstAllAssociatedQuotes = new List<Quote__c>();
        for(Quote__c quote: lstQuotes) {
            setOpportunityIDs.add(quote.Opportunity__c);
            setSyncedQuoteIDs.add(quote.id);
        }
        system.debug('setOpportunityIDs : ' +setOpportunityIDs);
       
        if(setOpportunityIDs.size() > 0){
            lstAllAssociatedQuotes = [select id, Name, Opportunity__c,IsSyncing__c from Quote__c where Opportunity__c =: setOpportunityIDs];
        }
       
        System.debug('lstAllAssociatedQuotes  :'+lstAllAssociatedQuotes);
        List<Quote__c> lstQuotesToUpdate = new List<Quote__c>();
        if(lstAllAssociatedQuotes.size() > 0){
            for(Quote__c qt : lstAllAssociatedQuotes){
                for(Quote__c syncedqt : lstQuotes){
                    if(syncedqt.Opportunity__c == qt.Opportunity__c &&
                       syncedqt.id != qt.id && qt.IsSyncing__c == true){
                           qt.IsSyncing__c = false;
                           lstQuotesToUpdate.add(qt);
                       }
                }                
            }
        }
       
        if(lstQuotesToUpdate.size() > 0){
            update lstQuotesToUpdate;
        }
       
                        //code to add opportunity line item from quoteline item        
       
       
        List<OpportunitylineItem__c> lstofoppitems = new List<OpportunitylineItem__c>(); //list for opportunitylineitem
       
        List<Quote_Line_Items__c> lstofQlineitem = New List<Quote_Line_Items__c>();//list for quotelineitem
       
        if(setSyncedQuoteIDs.size() > 0){
            lstofQlineitem=[Select ID,Name,Opportunity__c,Quote_Name__c,Product__c,Quantity__c,UnitPrice__c From Quote_Line_Items__c where Id =:setSyncedQuoteIDs];
        }
       
        //store the the lineitems which are associated with synced quote
        system.debug('listofquotelineitem:'+lstofQlineitem);
       
        //creating instance for quotelineitem and paas the list of associated quotelineitem with synced quote and
        // in for loop create the instance for opplineitem and assign value in opportunity line item
       
        if(lstofQlineitem != null && lstofQlineitem.size() > 0){
            for(Quote_Line_Items__c quotelineitems : lstofQlineitem){
                system.debug('quotelineitems'+ quotelineitems);
               
                OpportunitylineItem__c opplineitem = new OpportunitylineItem__c();
               
                opplineitem.UnitPrice__c = quotelineitems.UnitPrice__c;
                opplineitem.Name = quotelineitems.Name;
                opplineitem.Quantity__c =  quotelineitems.Quantity__c;
                opplineitem.ProductCode__c = quotelineitems.Product__c;
                opplineitem.Opportunityproducts__c= quotelineitems.Opportunity__c;
                opplineitem.QuoteLineItems__c = quotelineitems.id;
            }
           
            if( lstofoppitems == null && lstofoppitems.size() > 0){
                insert lstofoppitems;
                system.debug('listofopportunitylineitem:'+ lstofoppitems);
            }
        }
    }
}



                                 Trigger

trigger mytesttriggerforupdatelineitem on Quote__c (after update) {
   
    if (trigger.isAfter && trigger.isUpdate ){// check if trigger is isAfter and isUpdate
        List <Quote__c> lstToBeModifiedQuotes = new List<Quote__c>();
       
        for(Quote__c qt : trigger.new){ // check for value change of isSynced
           
            Quote__c oldquote = trigger.OldMap.get(qt.id);//get the quote with old values
           
            if(qt.IsSyncing__c != oldquote.IsSyncing__c && qt.IsSyncing__c == true){ //check with oldvalues and new values
                lstToBeModifiedQuotes.add(qt);                
            }
        }
       
        system.debug('lstToBeModifiedQuotes : ' +lstToBeModifiedQuotes);
        if(lstToBeModifiedQuotes.size() > 0){
            Mytestclassforupdatelineitem.UpdateSyncedOpportunity(lstToBeModifiedQuotes);
            Mytestclassforupdatelineitem.UpdateSyncedOpportunityLineItems(lstToBeModifiedQuotes);
        }
    }
}

Thanks