Opportunity Line Item | Salesforce Developer Guide
An opportunity is a pending agreement with a monetary value attached to it. It denotes that if the Opportunity is closed successfully, the $ amount of income will be generated for your firm.
The Products that are associated with an Opportunity are called OpportunityLineItems.
A business can sell a variety of different things. All of these items are referred to as Products. When a product (or a group of Products) is associated with an Opportunity, the records are referred to as "OpportunityLineItem" records.
Because each Product (or OpportunityLineItem) has a $ value connected with it, the $ value attached to an Opportunity originates from the Products associated with that particular opportunity.
Example:- On Opportunity to alert the user when an Opportunity is being closed with no Opportunity line items in it.
Don't forget to check out: Concept of Virtual and Abstract Modifiers in Apex | Salesforce Developer Guide
Apex Class Code
public static void method1(List<Opportunity> listOfOpportunity){ //use map for take opportunity id and opportunity record List<Opportunity> listOfOpportunity1 = new List<Opportunity>(); map<Id,Opportunity> NewMapOfOpportunity = new map<Id,Opportunity>(); // take listof opportunity in new opportunity1 for(opportunity newOpportunity1 : listOfOpportunity){ //check wheather opp stage name is closedwon/closed lost if(newOpportunity1.StageName =='Closed Won' || newOpportunity1.StageName =='Closed Lost'){ //put the opp record id and opp record in map NewMapOfOpportunity.put(newOpportunity1.id,newOpportunity1); listOfOpportunity1.add(newOpportunity1); } } //check the above map size any opp record having the opp stage as closed won and closed lost if(NewMapOfOpportunity.size()>0){ //fetch the record of opp line item in OpportunityLineItemlist for(List<OpportunityLineItem> listOfOpportunityLineItem : [Select id,name,OpportunityId from OpportunityLineItem where OpportunityId !='' AND OpportunityId In :listOfOpportunity1] ) { //check no of product if(listOfOpportunityLineItem.size() < 1){ //if there is no any product then display a error msg listOfOpportunity[0].addError('You can not closed the oppprtunites'); } } } }
Trigger Code
trigger updateAccountType on Opportunity (after insert,after update) { if(!AvoidRecursivecalltrigger.firstCall){ AvoidRecursivecalltrigger.firstCall=true; if(Trigger.isAfter && (Trigger.isinsert || Trigger.isUpdate)){ OpportunityAmountUpdatetrigger.method1(Trigger.new); } } }
Check out another amazing blog by Arpit here: Test Classes In Apex Salesforce | The Developer Guide
Test Class Code
@istest public class OpportunityAmountUpdatetrigger_Test { @testSetup static void testmethod1(){ List<Account> listOfAccount =DataFactory.createAccountMethod('Test Account',1,'Test Client'); insert listOfAccount; List<Contact> listOfContact =DataFactory.createContactMethod(listOfAccount,1,false,'Test Client1'); insert listOfContact; List<Opportunity> listOfOpportunity =DataFactory.createOpportunityMethod(listOfAccount,1); insert listOfOpportunity; List<Product2> listOfProduct2 =DataFactory.createProductMethod(1); insert listOfProduct2; Id pricebookId = Test.getStandardPricebookId(); PricebookEntry standardPrice = new PricebookEntry( Pricebook2Id = pricebookId, Product2Id = listOfProduct2[0].Id, UnitPrice = 10000, IsActive = true); insert standardPrice; List<Pricebook2> listOfPriceBook =DataFactory.createPriceBookMethod(listOfProduct2[0],1); insert listOfPriceBook; List<PricebookEntry> listOfPriceBookEntry =DataFactory.createPricebookEntryMethod(listOfPriceBook,1,listOfProduct2); insert listOfPriceBookEntry; //List<Product2> listOfProduct2 =DataFactory.createProductMethod(listOfPriceBookEntry,1); //insert listOfProduct2; // List<Pricebook2> listOfPriceBook =DataFactory.createPriceBookMethod(listOfProduct2,1); //insert listOfPriceBook; List<OpportunityLineItem> listOfOpportunityLineItem =DataFactory.CreateOpportunityLineItemMethod(listOfOpportunity,1,listOfPriceBookEntry[0]); //insert listOfOpportunityLineItem; Test.startTest(); insert listOfOpportunityLineItem; Test.stopTest(); } @istest static void testmethod2(){ List<Opportunity> listOfOpportunity1 =[Select id,name,StageName,CloseDate,Amount from Opportunity limit 1]; listOfOpportunity1[0].Amount =10000; // listOfOpportunity1[0].Amount =1000; listOfOpportunity1[0].StageName='Closed Won'; Test.startTest(); update listOfOpportunity1 ; Test.stopTest(); // listOfOpportunity1[0].Name ='Update test 1'; // update listOfOpportunity1; } @istest static void testmethodForNegativeScnario(){ List<Opportunity> listOfOpportunity2 =[Select id,name,StageName,CloseDate,Amount from Opportunity limit 1]; listOfOpportunity2[0].Amount =10000; listOfOpportunity2[0].StageName='Need Analysis'; Test.startTest(); update listOfOpportunity2 ; Test.stopTest(); } @istest static void testMethodFromOpportunityLineItem(){ List<OpportunityLineItem> listOfOpportunityLineItem1 =[Select id,name,OpportunityId from OpportunityLineItem limit 1]; // // listOfOpportunityLineItem1[0].ListPrice =1000; // listOfOpportunityLineItem1.Product2Id =listOfProduct2.id; Test.startTest(); update listOfOpportunityLineItem1; Test.stopTest(); } }
Responses