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
SFDC pvSFDC pv 

Getting System.ListException: List index out of bounds: 0 Can someone help. Thanks.

My controller :
public class CreateContractController {
    
    public static void CreateContract(list<Proposal__C> listOfProp,Map<Id, Proposal__C> propOldMap) {
        Id OBSContractRecTypeId = Schema.SObjectType.Contract__c.getRecordTypeInfosByDeveloperName().get('OBS_Signature_Required_By_Customer').getRecordTypeId();
        
        System.debug('value of Proposal :' +listOfProp);
        List<Contract__c> contrList = new List<Contract__c>();
        Set<Id> propId = new Set<Id>();
        
        for(Proposal__c pr : listOfProp){
            propId.add(pr.Id);
            System.debug('PropId'+propId);
        }
        for(Proposal__c prop : [SELECT Id,Name,Account__c,Parent_Contract_ID__c,Previous_Contract_ID__c,Commercial_TC__c,Domestic_Annual_Share__c,International_Annual_Share__c,Opportunity__c,Contact__c,Account__r.OBS_Corporate_Identifier__c,
                                OBS_Annual_Expenditure__c,Status__c,Valid_From_Date__c,Valid_To_Date__c,Standard__c,Additional_Change_Details__c,Deal_Type__c,MCA_Routes_Annual_Share__c,EK_Stock__c,Group_Booking__c,
                                Agent_Name__c,Agent_Fax__c,Agent_Email__c,Agent_Address__c,OBS_Club_Discount__c,Forecast_Group_Booking_Expenditure__c,Group_Travel_Discount__c,Group_Travel_Offer__c,
                                OBS_Club_Join_Discount_Offer__c,OBS_Club_Discount_Offer__c,TMC_Code__c,Type__c,Proposal_Start_Date__c,Proposal_End_Date__c,Opportunity__r.Owner.Country,Opportunity__r.Type,Opportunity__r.Sub_Type_Level_1__c,Opportunity__r.Sub_Type_Level_2__c,Opportunity__r.Category__c                                            
                                FROM Proposal__c where Id =:propId AND Type__c = 'OBS' AND Status__c = 'Approved']) {
                                    
                                    list<Contract__c> existingContractList = [SELECT Id,Status__c,Proposal__c FROM Contract__c where Proposal__c =: propId AND Type__c = 'OBS'];
                                    system.debug('Existing contract list'+existingContractList);
                                    //Validate the contract exists scenario
                              /*     if(!existingContractList.isEmpty()){
                                        for(Contract__c eachContract : existingContractList){
                                            if(eachContract.Status__c != 'Rejected – Legal' && eachContract.Status__c != 'Rejected - Customer'){
                                                System.debug('Inside existing if');
                                                propNewMap.get(eachContract.Proposal__c).addError('Please note Contract already exists for this Proposal');
                                            }
                                        }
                                    }    */
                                    
                                    
                                   if (prop.Status__c == 'Approved' && prop.Status__c != propOldMap.get(prop.Id).Status__c)
                                    {
                                        System.debug('prop value :'+prop);                                    
                                        Contract__c createContract = new Contract__c();
                                        createContract.Name = prop.Name;
                                        createContract.Account__c = prop.Account__c;
                                        createContract.Parent_Contract__c = prop.Parent_Contract_ID__c;
                                        createContract.PreviousContract__c = prop.Previous_Contract_ID__c;
                                        createContract.Commercial_TC__c = prop.Commercial_TC__c;
                                        createContract.Contact__c = prop.Contact__c;
                                        createContract.Domestic_Annual_Share__c = prop.Domestic_Annual_Share__c;
                                        createContract.International_Annual_Share__c = prop.International_Annual_Share__c;
                                        createContract.Opportunity__c = prop.Opportunity__c;
                                        createContract.OBS_Annual_Expenditure__c = prop.OBS_Annual_Expenditure__c;
                                        createContract.Proposal__c = prop.Id;
                                        createContract.Type__c = prop.Type__c;
                                        createContract.Eligible_for_EK_ticket_stock__c = prop.EK_Stock__c;
                                        createContract.Group_Booking__c = prop.Group_Booking__c;
                                        createContract.Standard__c = prop.Standard__c;
                                        createContract.Additional_Change_Details__c = prop.Additional_Change_Details__c;
                                        createContract.Status__c = 'Signature Required by Customer';
                                        createContract.Deal_Type__c = prop.Deal_Type__c;
                                        createContract.MCA_Routes_Annual_Share__c = prop.MCA_Routes_Annual_Share__c;
                                        createContract.Agent_Name__c = prop.Agent_Name__c;
                                        createContract.Agent_Fax__c = prop.Agent_Fax__c;
                                        createContract.Agent_Email__c = prop.Agent_Email__c;
                                        createContract.Agent_Address__c = prop.Agent_Address__c;
                                        createContract.OBS_Club_Discount__c = prop.OBS_Club_Discount__c;
                                        createContract.OBS_Club_Join_Discount_Offer__c = prop.OBS_Club_Join_Discount_Offer__c;
                                        createContract.OBS_Club_Discount_Offer__c = prop.OBS_Club_Discount_Offer__c;
                                        createContract.TMC_Code__c = prop.TMC_Code__c;
                                        createContract.contract_Start_Date__c = prop.Proposal_Start_Date__c;
                                        createContract.contract_End_Date__c = prop.Proposal_End_Date__c; 
                                        createContract.Forecast_Group_Booking_Expenditure__c = prop.Forecast_Group_Booking_Expenditure__c;
                                        createContract.RecordTypeId = OBSContractRecTypeId;
                                        contrList.add(createContract);
                                        system.debug('Contract list'+contrList);
                                    }
                                }
        try {
            if(!contrList.isEmpty()){  
                insert contrList;
            }
        }
        catch(DMLException e){
            System.debug(e.getMessage());
        }
        // Contract Fare Discount creation done here
        list<Contract_Discount_List__c> createCFDiscountList = new list<Contract_Discount_List__c>();
        System.debug('prop id:'+propid); 
        for(Discount_List__c eachPFD : [SELECT Id, Proposal__c,FareStructure__c,Approval_Comment_Pricing__c, Approval_Comment_NAM__c,Comment__c, Discount__c,Route_Origin__c,Route_Destination__c,Fare_Combination__c FROM Discount_List__c WHERE Proposal__r.Active__c = True AND Proposal__r.Status__c = 'Approved' AND Proposal__r.Type__c = 'OBS' AND Proposal__c = :propId]){
            System.debug('Discount list :'+eachPFD);                        
            Contract_Discount_List__c contFareDisc = new Contract_Discount_List__c();
            contFareDisc.Approval_Comment_NAM__c = eachPFD.Approval_Comment_NAM__c;
            contFareDisc.Approval_Comment_Pricing__c = eachPFD.Approval_Comment_Pricing__c;
            contFareDisc.FareStructure__c = eachPFD.FareStructure__c;
            contFareDisc.Comment__c = eachPFD.Comment__c;
            contFareDisc.Contract__c = contrList[0].id;
            contFareDisc.Discount__c = eachPFD.Discount__c;
            contFareDisc.Fare_Combination__c = eachPFD.Fare_Combination__c;
            contFareDisc.Route_Origin__c    = eachPFD.Route_Origin__c;
            contFareDisc.Route_Destination__c   = eachPFD.Route_Destination__c;
            createCFDiscountList.add(contFareDisc);
            system.debug('createCFDiscountList'+createCFDiscountList);
        }    
        try {
            if(!createCFDiscountList.isEmpty()){        
                insert createCFDiscountList;            
            }
        }
        catch(DMLException e){
            System.debug(e.getMessage());
        }
    }
}

Test class:-
@isTest
public class CreateContractController_Test {

    @isTest 
    public static void CreateContractTest() {
        
        String accRTId = Schema.SObjectType.Account.getRecordTypeInfosByName().get('Customer Account').getRecordTypeId();
        String OppRTId = Schema.SObjectType.Opportunity.getRecordTypeInfosByDeveloperName().get('Business_and_Government').getRecordTypeId();
        Map<Id, Proposal__C> propOldMap = new Map<Id, Proposal__C>();
       // Map<Id, Proposal__C> propNewMap = new Map<Id, Proposal__C>(); 

        //Create Account
        Account testacc = new Account(Name = 'Sample', Active__c = true, Aquire__c = true, Type = 'Customer Account', 
                                      RecordTypeId = accRTId, Migrated__c = false, 
                                      Estimated_Total_Air_Travel_Spend__c = 0, Manual_Revenue_Update__c = false,
                                      Agency__c = 'N', Dealing_Flag__c = 'N', Aquire_Override__c = 'N');
        insert testacc;
        //Create Contact
        Contact testcon = new Contact(FirstName='Bob',LastName='Test',AccountId=testacc.id,Function__c = 'IT',Business_Types__c = 'Agency',Email = 'abc@test.com');
        insert testcon;        
        //Create Oppotunity
        Opportunity validOpp = new Opportunity(Name = 'Opp2'+testacc.Name , AccountId = testacc.Id,Proposed_Market_Share__c = 70,Proposed_International_Market_Share__c = 50,
                                               Amount = 500000, Category__c = 'OBS', CloseDate = Date.Today(),Proposed_MCA_Routes_Market_Share__c = 90,
                                               StageName = 'Qualify');
        insert validOpp;
        
        //Create Proposal
        List<Proposal__c> propList = new List<Proposal__c>();
        Proposal__c propErr = new Proposal__c(Name = 'Proposal0', Account__c = validOpp.AccountId, Opportunity__c = validOpp.Id,
                                              Active__c = True, Type__c = 'OBS', International_Annual_Share__c = 70,
                                              Domestic_Annual_Share__c = 90, Frequent_Flyer_Status_Upgrade__c = 'No',
                                              MCA_Routes_Annual_Share__c = 70, Valid_From_Date__c = Date.Today(),
                                              OBS_Annual_Expenditure__c = 500000, OBS_Club_Discount__c = 'No', Status__c = 'Draft'
                                             );
           propList.add(propErr);

        if(!propList.isEmpty())
        insert propList;
        for(Proposal__C  prop : propList) {
                     propOldMap.put(prop.Id,prop);   
                    system.debug('Old Map value of Prop'+propOldMap);
        }
        Test.startTest();
        propList[0].Status__c = 'Approved';
        Update propList;
        Test.stopTest();
        system.debug('Proposal list'+propList[0] );
        system.debug('Old Map value of Prop -1:'+propOldMap);
        //Create Contract
        Contract__c contr = new Contract__c(Name = propList[0].Name, Account__c = propList[0].Account__c, Opportunity__c = propList[0].Opportunity__c, Proposal__c = propList[0].Id,
                                            Active__c = true, Type__c = 'OBS', International_Annual_Share__c = 70,
                                            Domestic_Annual_Share__c = 90, Frequent_Flyer_Status_Upgrade__c = 'No', Contracted__c = false,
                                            MCA_Routes_Annual_Share__c = 70, Contract_Start_Date__c = Date.Today(), Contract_End_Date__c = Date.Today(),
                                            OBS_Annual_Expenditure__c = 500000, OBS_Club_Discount__c = 'No', Status__c = 'Signature Required by Customer'                                              
                                           );
        insert contr;         

        Fare_Structure__c fs = new Fare_Structure__c(Name = 'J', Active__c = true, Cabin__c = 'Business', 
                                                     Category__c = 'Mainline', Market__c = 'Australia', 
                                                     ProductCode__c = 'DOM-0001', OBS_Published_Airfare__c = 'JBUS',
                                                     Segment__c = 'Domestic'
                                                    );
        insert fs;

        // create a disc list
        Discount_List__c disc = new Discount_List__c(FareStructure__c = fs.Id, Proposal__c = propList[0].Id, 
                                                         OBS_Published_Airfare__c = fs.OBS_Published_Airfare__c, 
                                                         Fare_Combination__c = 'Mainline - H in B deal', Segment__c = fs.Segment__c,
                                                         Category__c = fs.Category__c, Network__c = fs.Network__c, 
                                                         Market__c = fs.Market__c, Cabin__c = fs.Cabin__c, 
                                                         Proposal_Type__c = propList[0].Type__c, Discount__c = 40
                                                        );

            insert disc;
         
        
        Contract_Discount_List__c contrFD = new Contract_Discount_List__c(FareStructure__c = fs.id,Contract__c=contr.id,Discount__c = 40,Comment__c = 'test');

        insert contrFD; 
        
        System.debug('Map value' +propOldMap );
        system.debug('Proplist'+propList);
    //    Test.StartTest();
            //Invoke the controller methods
               CreateContractController.CreateContract(propList,propOldMap);
    //    Test.StopTest(); 
    }
    
}

Class.CreateContractController.CreateContract: line 102, column 1
Class.CreateContractController_Test.CreateContractTest: line 85, column 1

Its not coming inside if
AnudeepAnudeep (Salesforce Developers) 
Hi, 

It appears that your list is empty. It is a  good practice to check whether there are records  in the list before accessing any element from that list.

This document will help fix the issue  https://help.salesforce.com/articleView?id=000329067&type=1&mode=1

Please accept my solution as Best Answer if my reply is helpful

Thanks, 
Anudeep

 
SFDC pvSFDC pv
Hi Anudeep, 

I have  checked whether the list is empty or not.. I checked the log as well the list is not empty it returns value. 
David Zhu 🔥David Zhu 🔥
can you highlight line 85 of Class.CreateContractController_Test.CreateContractTest?
SFDC pvSFDC pv
Hi David,

Createcontractcontroller.createcontract(proplist,propOldmap) is the place where it’s throwing error . Got 31% coverag
David Zhu 🔥David Zhu 🔥
In your test class, record in poplist has status "Draft"

        List<Proposal__c> propList = new List<Proposal__c>();
        Proposal__c propErr = new Proposal__c(Name = 'Proposal0', Account__c = validOpp.AccountId, Opportunity__c = validOpp.Id,
                                              Active__c = True, Type__c = 'OBS', International_Annual_Share__c = 70,
                                              Domestic_Annual_Share__c = 90, Frequent_Flyer_Status_Upgrade__c = 'No',
                                              MCA_Routes_Annual_Share__c = 70, Valid_From_Date__c = Date.Today(),
                                              OBS_Annual_Expenditure__c = 500000, OBS_Club_Discount__c = 'No', Status__c = 'Draft'
                                             );


In the controller, you are trying to get status "Approved"

for(Proposal__c prop : [SELECT Id,Name,Account__c,.....
                                FROM Proposal__c where Id =:propId AND Type__c = 'OBS' AND Status__c = 'Approved']) {...


The result of prop is null which causes the error.
 
SFDC pvSFDC pv
Hi David, 

While inserting have given status as draft after that am updating to Status Approved In order to satisfy the if condition I.e  Comparison of oldmap records and newmap records