1

an amateur apex user here and I have a question which I've tried to distill below as much as I can. I have a class OrderTriggerHandlerV2 which fires when Order.OriginalContractedOrder__c gets filled in.

I build three maps to get all the data I need to use to build out the rest of the logic:

public class OrderTriggerHandlerV2 {
    public static void updatedAmendmentOrderProducts(Map<Id, Order> updatedOrderMap) {

        List<Order> gatherAmendmentOrderInfo = [SELECT Id, OriginalContractedOrder__c, EffectiveDate, (SELECT Id, Order.EffectiveDate, ServiceDate, EndDate, Original_Segment_Start_Date__c FROM OrderItems WHERE SBQQ__ChargeType__c = 'Recurring Fixed')
                                                FROM Order
                                                WHERE Id IN:updatedOrderMap.keySet()];

    
        Map<Id, Date> amendmentOrderWithEffectiveDate = new Map<Id, Date>();
        Map<Id, List<OrderItem>> amendmentOrderWithRecurringOrderProducts = new Map<Id, List<OrderItem>>();
        Map<Id, Id> amendmentOrderWIthOriginalOrder = new Map<Id, Id>();

        for(Order a: gatherAmendmentOrderInfo){
            amendmentOrderWithEffectiveDate.put(a.Id, a.EffectiveDate);
            amendmentOrderWithRecurringOrderProducts.put(a.Id, a.OrderItems);
            amendmentOrderWIthOriginalOrder.put(a.Id, a.OriginalContractedOrder__c);
        }

        System.debug('amendmentOrderWithEffectiveDate: '+amendmentOrderWithEffectiveDate);
        System.debug('amendmentOrderWithRecurringOrderProducts: '+amendmentOrderWithRecurringOrderProducts);
        System.debug('amendmentOrderWIthOriginalOrder: '+amendmentOrderWIthOriginalOrder);
}

When I physically fill in the field which fires the trigger in the sandbox, all the maps get filled:

enter image description here

But when I run my test class, I think I'm missing something as the child OrderItems don't seem to be being picked up. I'm very confused about this and would appreciate any insight into this or approaches I could take to troubleshoot. Thank you @cropredy for answering my post yesterday where I broached almost a similar question. The suggested hypothesis was that I was running into the SFDC test context limitation as it was a queueable class previously. I have changed it to be synchronous and still am hitting the same issue. I have since deleted my previous question to try see if I can get any other insight and so that there isn't a duplication with this - let me know if this goes against any guidelines.

enter image description here


Here is some additional information:

Trigger:

trigger OrderTrigger on Order (before update, after update) {
 if(Trigger.isAfter){
        if(Trigger.isUpdate){

            // OriginalContractedOrder__c gets filled in
            Map<Id, Order> mapOfOrderswhereOriginalContractedOrderChanges = new Map<Id, Order>();
            for(Order newOrder: Trigger.New){
                Order oldOrder = Trigger.OldMap.get(newOrder.Id);
                if((newOrder.OriginalContractedOrder__c!= oldOrder.OriginalContractedOrder__c)&&(newOrder.OriginalContractedOrder__c!=NULL)){
                    mapOfOrderswhereOriginalContractedOrderChanges.put(newOrder.Id, newOrder);
                }         
            }
}
}

Test Class

@isTest
public class OrderTriggerHandlerV2Test {
 @isTest public static void updatedAmendmentOrderProductsTest(){
        // create data
        Account testAcc = testDataFactory.accountCreator('testAcc');

        product2 testProd = testDataFactory.productCreator();

        Order order1 = testDataFactory.orderCreator4FFAmendment(testAcc, 'Draft', Date.newInstance(2020,01,01), 'New');
        insert order1;

        Order order2 = testDataFactory.orderCreator4FFAmendment(testAcc, 'Draft', Date.newInstance(2021,01,01), 'Amendment');
        insert order2;

        OrderItem orderItem4OrderOne = testDataFactory.orderItemCreator4FFAmendment(order1, testProd, Date.newInstance(2020,01,01), Date.newInstance(2022,12,31), 'Annual');
        insert orderItem4OrderOne;

        OrderItem orderItem4OrderTwo = testDataFactory.orderItemCreator4FFAmendment(order2, testProd, Date.newInstance(2021,01,01), Date.newInstance(2022,12,31), 'Annual');
        insert orderItem4OrderTwo;

        
        Order order2Update = [SELECT Id, OriginalContractedOrder__r.Id, EffectiveDate, 
                             (SELECT Id, Order.EffectiveDate, ServiceDate, EndDate, Original_Segment_Start_Date__c FROM OrderItems)
                             FROM Order
                             WHERE Id =:order2.Id];
        

        order2Update.OriginalContractedOrder__c = order1.Id;
        
        system.debug('order2Update:' + order2Update);


    
        // run test
        test.StartTest();

        update order2Update;

        test.StopTest();
}
}

TestDataFactory Class

public static Account accountCreator(string name){
    Account myAccount = new Account();
    myAccount.Name = name;
    insert myAccount;
    return myAccount;
}

public static product2 productCreator(){
    // 12 Month Subscription Product
    product2 testProd = new product2();
    testProd.Name = 'Test Product';
    testProd.isActive = True;
    testProd.SBQQ__SubscriptionPricing__c = 'Fixed Price';
    testProd.SBQQ__SubscriptionTerm__c = 12;
    testProd.SBQQ__SubscriptionType__c = 'Renewable';
    testProd.ProductCode = 'TST1';
    testProd.SBQQ__PricingMethod__c = 'List';
    testProd.QLE_Product_Group__c = 'CMBS';
    insert testProd;
    
    // Create Price book entry
    
    PricebookEntry testPBE = new PricebookEntry();
    testPBE.isActive = TRUE;
    testPBE.Product2Id = testProd.Id;
    testPBE.Pricebook2Id = test.getStandardPricebookId();
    testPBE.UnitPrice = 1000.00;
    
    insert testPBE;
    
    return testProd;

public static Order orderCreator4FFAmendment(Account a, String status, Date startDate, String orderType){
    Order newOrder = new Order();
    newOrder.AccountId = a.Id;
    newOrder.Status = status;
    newOrder.EffectiveDate = startDate;
    newOrder.Type = orderType;
    newOrder.Pricebook2Id = test.getStandardPricebookId();
    newOrder.SBQQ__ContractingMethod__c = 'Single Contract';
    newOrder.OriginalContractedOrder__c = NULL;

    return newOrder;
}

public static OrderItem orderItemCreator4FFAmendment(Order ord, Product2 p, Date startDate, Date endDate, String billingFrequency){
    OrderItem b = new OrderItem();
    b.OrderId = ord.Id;
    b.Product2Id = p.Id;
    b.Quantity = 1;
    b.SBQQ__BillingFrequency__c = billingFrequency;
    b.ListPrice = 1000;
    b.UnitPrice = 1000;
    PricebookEntry a = [SELECT Id
                            FROM PricebookEntry
                            WHERE Product2Id =: p.Id];
    b.PricebookEntryId = a.Id;
    b.ServiceDate = startDate;
    b.EndDate = endDate;
    b.SBQQ__ChargeType__c = 'Recurring Fixed';
    b.SBQQ__SubscriptionPricing__c = 'Fixed Price';
    b.SBQQ__ProductSubscriptionType__c = 'Renewable';
    b.Original_Segment_Start_Date__c = NULL;

    return b;
}

1 Answer 1

0

Wanted to put in an answer here that now seems very simple.

Essentially my subquery, wasn't picking up the OrderItem because there was a process builder I wasn't aware of that was updating the value of OrderItem.SBQQ__ChargeType__c.

SELECT Id, Order.EffectiveDate, ServiceDate, EndDate, Original_Segment_Start_Date__c FROM OrderItems WHERE SBQQ__ChargeType__c = 'Recurring Fixed'

The product lookup was feeding the OrderItem SBQQ__ChargeType__c field value via this process builder and I believe due to the process of operations, after my insert of the order item in my test class, the process builder was firing and overriding it with a null value which resulted in my test class not picking up the OrderItems as SBQQ__ChartType__c = NULL.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .