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
Jakub MužíkJakub Mužík 

Advanced Apex Specialist Step 7 Error

Hi,
I am trying to solve Step 7, but I'm still getting following error:
Challenge Not yet complete... here's what's wrong: 
Ensure that you implement all the pagination methods using the corresponding StandardSetController methods.
I've tried to copy code, that i've found on this website, but it still doesn't let me pass the challenge even though the vs page is working as expected ..
Please help me..

My code:
class OrderExtension:

/**
 * @name OrderExtension
 * @description This class is provided for you to facilitate the Super Badge
**/
public class OrderExtension {

    public Order orderRecord {get;set;}
    public List<OrderItem> orderItemList {get;set;}
    public String selectedFamily {get;set;}
    public List<chartHelper.chartData> pieData {get;set;}
    public Decimal total {get;set;}

    public Map<Id,OrderItem> orderItemMap;
    ApexPages.StandardSetController standardSetController;

    public OrderExtension(ApexPages.StandardController standardController){
        orderRecord = (Order)standardController.getRecord();
        orderItemMap = new Map<id,OrderItem>();
        orderItemList = new List<OrderItem>();
        
        if ( orderRecord.Id != null ){
            orderRecord = queryOrderRecord(orderRecord.Id);
            if (!orderRecord.orderitems.isEmpty()) {
                pieData = new List<chartHelper.chartData>();
                total =0;
                for (orderItem o: orderRecord.orderItems) {
                    orderItemMap.put(o.Product2Id, o);
                    pieData.add(new ChartHelper.ChartData(o.Product2.Name, o.Quantity * o.UnitPrice));
                    total += o.Quantity * o.UnitPrice;
                    
                }
            }
            
        } 
        refresh(null);
        loadData();
    }
    
    public void refresh(String family) {
        if (family == null || family == Constants.SELECT_ONE) {
            List<pricebookentry> p = [SELECT Product2.Family, Product2.Name, Product2.Quantity_Remaining__c, UnitPrice, Product2Id FROM pricebookentry WHERE isActive=true];
            standardSetController = new ApexPages.StandardSetController(p);
            standardSetController.setPageSize(Constants.DEFAULT_ROWS);
        } else {
            List<pricebookentry> p = [SELECT Product2.Family, Product2.Name, Product2.Quantity_Remaining__c, UnitPrice, Product2Id FROM pricebookentry WHERE isActive=true AND Product2.Family =: selectedFamily];
            standardSetController = new ApexPages.StandardSetController(p);
            standardSetController.setPageSize(Constants.DEFAULT_ROWS);
          
        }
    }

    //ToDo: Implement your own method to populate orderItemList
    //  that you will call after pagination and/or family selection
    public void loadData() {

            orderItemList.clear();
            
            for (sObject so: standardSetController.getRecords()) {
                pricebookentry oe = (pricebookentry)so;
                
                if (orderItemMap.containsKey(oe.Product2Id)) {
                    orderItemList.add(orderItemMap.get(oe.Product2Id));
                } else {
                    orderItemList.add(new orderItem(product2Id = oe.Product2Id, product2 = oe.Product2, UnitPrice = oe.UnitPrice, Quantity =0));
                    //orderItemMap.put(oe.Product2Id, oe.orderItem);
                }
            }
        
    }

    /**
     * @name OnFieldChange
     * @description
    **/
    public void OnFieldChange(){
        pieData = new List<chartHelper.chartData>();
        total = 0;
        for (OrderItem o: orderItemList) {
            orderItemMap.put(o.Product2Id, o);
            if (o.Quantity > 0) {
                pieData.add(new ChartHelper.ChartData(o.Product2.Name, o.Quantity * o.UnitPrice));
                total += o.Quantity * o.UnitPrice;
            }
        }
    }

    /**
     * @name SelectFamily
     * @description
    **/
    public void SelectFamily(){
        //ToDo: Implement logic to filter based on the selected product family
        refresh(selectedFamily);
        loadData();
    }

    /**
     * @name Save
     * @description
    **/
    public void Save(){
        //ToDo: Implement logic to save the Order and populated OrderItems
        Savepoint sp = Database.setSavepoint();
        
        if (orderRecord.Id != null) {
            List<OrderItem> old = [SELECT Id, Quantity,Product2Id FROM OrderItem WHERE OrderId =: orderRecord.Id];
            List<OrderItem> toDelete = new List<OrderItem>();
            List<OrderItem> toSave = new List<OrderItem>();
            for (OrderItem o: old) {
                if (orderItemMap.get(o.Product2Id).Quantity == 0 && o.Quantity!=0) {
                    toDelete.add(o);
                }
            }
            for (orderItem o: orderItemMap.values()) {
                if (o.Quantity > 0) {
                    toSave.add(o);
                }
            }
            Try {
                update orderRecord;
                if (!toDelete.isEmpty()) {
                    delete toDelete;
                }
                upsert toSave;
            } catch(Exception e) {
                apexPages.addMessage(new ApexPages.message(ApexPages.Severity.ERROR, Constants.ERROR_MESSAGE));
            
                Database.rollback(sp);
            }
        } else {
            Order order = new Order(AccountId = orderRecord.AccountId, Name = OrderRecord.Name,EffectiveDate= orderRecord.EffectiveDate,
                                  Status= orderRecord.Status);
            
            List<OrderItem> toSave = new List<OrderItem>();
            for (orderItem o: orderItemList) {
                if (o.Quantity > 0) {
                    toSave.add(o);
                }
            }
            
            Try {
                insert order;
                if(!toSave.isEmpty()) {
                    insert toSave;
                }
            } catch(Exception e) {
                apexPages.addMessage(new ApexPages.message(ApexPages.Severity.ERROR, Constants.ERROR_MESSAGE));
            
                Database.rollback(sp);
            }
        }
       // Order order = new Order()

    }


    /**
     * @name First
     * @description
    **/
    public void First(){
        standardSetController.first();
        loadData();
    }


    /**
     * @name Next
     * @description
    **/
    public void Next(){
        standardSetController.next();
        loadData();
    }


    /**
     * @name Previous
     * @description
    **/
    public void Previous(){
        standardSetController.previous();
        loadData();
    }

    /**
     * @name Last
     * @description
    **/
    public void Last(){
        standardSetController.last();
        loadData();
    }

    /**
     * @name GetHasPrevious
     * @description
    **/
    public Boolean GetHasPrevious(){
        return standardSetController.getHasPrevious();
    }

    /**
     * @name GetHasNext
     * @description
    **/
    public Boolean GetHasNext(){
        return standardSetController.getHasNext();
    }

    /**
     * @name GetTotalPages
     * @description
    **/
    public Integer GetTotalPages(){
        return (Integer)Math.ceil(standardSetController.getResultSize() / (Decimal)Constants.DEFAULT_ROWS);
    }

    /**
     * @name GetPageNumber
     * @description
    **/
    public Integer GetPageNumber(){
        return standardSetController.getPageNumber();
    }

    /**
     * @name GetFamilyOptions
     * @description
    **/
    public List<SelectOption> GetFamilyOptions(){
        List<SelectOption> familyOptions = new List<SelectOption>();
        familyOptions.add(new SelectOption(Constants.SELECT_ONE, Constants.SELECT_ONE));
        
        for( Schema.PicklistEntry f : Constants.PRODUCT_FAMILY)
        {
            familyOptions.add(new SelectOption(f.getLabel(), f.getValue()));
        }       
        return familyOptions;
    }

    /**
     * @name QueryOrderRecord
     * @description
    **/
    public static Order QueryOrderRecord(Id orderId){
        return [
            SELECT Id, AccountId, EffectiveDate, Name, Status, Pricebook2Id,
                (
                    SELECT Id, OrderId, Quantity, UnitPrice, PricebookEntryId, Product2Id,
                         Product2.Name, Product2.Family, Product2.Quantity_Remaining__c
                    FROM OrderItems
                )
            FROM Order
            WHERE Id = :orderId
        ];
    }

}

Thanks.