I have written the test class for trigger in salesforce
@isTest
private class DeliveryDateUpdationtest{
static testMethod void DeliveryDateUpdation()
{
account[] testaccount1 = new List<Account>();
testAccount1.add(new Account(Name='Test',Type='Test',Status__c = 'Draft',Call_Status__c = 'called On',JDE_Date_Delivery_Offset__c = null));
testAccount1.add(new Account(Name='Test1',Type='Test',Status__c = 'Draft',Call_Status__c = 'called On',JDE_Date_Delivery_Offset__c = 2.00));
insert testAccount1;
Product2 testProduct = new Product2(Name='Test', IsActive=true, CurrencyIsoCode = 'EUR');
insert testProduct;
Pricebook2 testPriceBook = new Pricebook2(Name='Test', IsActive=true,Shipment_Method__c = 'Internal',Market__c = 'FR');
insert testPriceBook;
PricebookEntry[] testPricebookEntries = new list<PricebookEntry>();
testPricebookEntries.add(new PricebookEntry(Pricebook2Id=Test.getStandardPricebookId(), UnitPrice=4.99, Product2Id=testProduct.Id,CurrencyIsoCode = 'EUR'));
testPricebookEntries.add(new PricebookEntry(Pricebook2Id=testPriceBook.Id, UnitPrice=4.99, UseStandardPrice=false, Product2Id=testProduct.Id,CurrencyIsoCode = 'EUR'));
insert testPricebookEntries;
order[] order1 = new list<order>();
order1.add(new Order(AccountId = testAccount1[0].id, EffectiveDate = date.newinstance(2017, 3, 29) ,Status = 'Draft',Shipping_Urgency__c = 'high',Subtype__c = 'offer',Pricebook2Id=testPriceBook.Id,OrderDeliveryDate__c = date.newinstance(2017, 3, 10)));
order1.add(new Order(AccountId = testAccount1[0].id, EffectiveDate = date.newinstance(2017, 3, 29) ,Status = 'Draft',Shipping_Urgency__c = 'high',Subtype__c = 'offer',Pricebook2Id=testPriceBook.Id,OrderDeliveryDate__c = date.newinstance(2017, 3, 11)));
order1.add(new order(AccountId = testAccount1[0].id, EffectiveDate = Date.today(),Status = 'Draft',Shipping_Urgency__c = 'high',Subtype__c = 'ASP',Pricebook2Id=testPriceBook.Id,OrderDeliveryDate__c = date.newinstance(2017, 3, 10)));
order1.add(new order(AccountId = testAccount1[1].id, EffectiveDate = Date.today(),Status = 'Draft',Shipping_Urgency__c = 'high',Subtype__c = 'ASP',Pricebook2Id=testPriceBook.Id,OrderDeliveryDate__c = date.newinstance(2017, 3, 11)));
insert order1;
Holiday__c[] holiday1 = new list<Holiday__c>();
holiday1.add(new Holiday__c(Date__c = Date.today(),Country__c = 'FR'));
holiday1.add(new Holiday__c(Date__c = Date.today(),Country__c = 'IT'));
insert holiday1;
OrderItem orderItemOffer = new OrderItem();
orderItemOffer.PricebookEntryId = testPricebookEntries[1].Id;
orderItemOffer.OrderId = order1[0].Id;
orderItemOffer.Quantity = 2;
orderItemOffer.UnitPrice = 50;
orderItemOffer.Delivery_Date__c = date.newinstance(2017, 3, 10);
insert orderItemOffer;
orderItemOffer = [select id, Delivery_Date__c from orderItem where Id = :orderItemOffer.Id];
System.assertEquals(date.newinstance(2017, 04, 05), orderItemOffer.Delivery_Date__c);
OrderItem orderItemOffer1 = new OrderItem();
orderItemOffer1.PricebookEntryId = testPricebookEntries[1].Id;
orderItemOffer1.OrderId = order1[1].Id;
orderItemOffer1.Quantity = 2;
orderItemOffer1.UnitPrice = 50;
orderItemOffer1.Delivery_Date__c = date.newinstance(2017, 3, 10);
insert orderItemOffer1;
orderItemOffer1 = [select id, Delivery_Date__c from orderItem where Id = :orderItemOffer1.Id];
System.assertEquals(date.newinstance(2017, 04, 05), orderItemOffer.Delivery_Date__c);
OrderItem orderItemASP = new OrderItem();
orderItemASP.PricebookEntryId = testPricebookEntries[1].Id;
orderItemASP.OrderId = order1[2].Id;
orderItemASP.Quantity = 2;
orderItemASP.UnitPrice = 50;
orderItemASP.Delivery_Date__c = date.newinstance(2017, 3, 10);
insert orderItemASP;
orderItemASP = [select id, Delivery_Date__c from orderItem where Id = :orderItemASP.Id];
System.assertEquals(date.newinstance(2017, 04, 03), orderItemASP.Delivery_Date__c);
OrderItem orderItemASP1 = new OrderItem();
orderItemASP1.PricebookEntryId = testPricebookEntries[1].Id;
orderItemASP1.OrderId = order1[3].Id;
orderItemASP1.Quantity = 2;
orderItemASP1.UnitPrice = 50;
orderItemASP1.Delivery_Date__c = date.newinstance(2017, 3, 10);
insert orderItemASP1;
orderItemASP1 = [select id, Delivery_Date__c from orderItem where Id = :orderItemASP1.Id];
System.assertEquals(date.newinstance(2017, 3, 10), orderItemASP1.Delivery_Date__c);
OrderItem orderItemASP2 = new OrderItem();
orderItemASP2.PricebookEntryId = testPricebookEntries[1].Id;
orderItemASP2.OrderId = order1[3].Id;
orderItemASP2.Quantity = 2;
orderItemASP2.UnitPrice = 50;
orderItemASP2.Delivery_Date__c = date.newinstance(2017, 3, 10);
insert orderItemASP2;
orderItemASP2 = [select id, Delivery_Date__c from orderItem where Id = :orderItemASP2.Id];
System.assertEquals(date.newinstance(2017, 04, 03), orderItemASP2.Delivery_Date__c);
}
}
Trigger code:
trigger DeliveryDateUpdation on orderitem(before insert) {
Map<Id, Order> orders = new Map<Id, Order>();
for(OrderItem record: Trigger.new) {
orders.put(record.OrderId, null);
}
orders.putAll([SELECT Id,Account.JDE_Date_Delivery_Offset__c, OrderDeliveryDate__c,Subtype__c FROM Order WHERE Id =:orders.keySet()]);
Set<String> markets = new Set<String>();
for(Order record: orders.values()) {
if(record.Subtype__c == 'Offer') {
markets.add('FR');
}
if(record.Subtype__c == 'ASP') {
markets.add('IT');
}
}
if(markets.size()<=0) {return;}
Map<string, Map<Date,Holiday__c>> holidays = new Map<string, Map<Date,Holiday__c>>();
for(String market: markets) {
holidays.put(market, new Map<Date, Holiday__c>());
}
for(Holiday__c record: [SELECT Date__c, Country__c FROM Holiday__c WHERE Country__c = :markets]) {
holidays.get(record.Country__c).put(record.Date__c, record);
}
Time midnight = Time.newInstance(0, 0, 0, 0);
for(OrderItem record: Trigger.new) {
Order orderRecord = orders.get(record.OrderId);
if(orderRecord.OrderDeliveryDate__c == record.Delivery_Date__c && (orderRecord.SubType__c == 'Offer'|| orderRecord.SubType__c == 'ASP'))
{
String market = orderRecord.SubType__c == 'Offer'? 'FR': 'IT';
Date UpdatedDeliverydate = Date.today();
integer Offsetvalue;
if(orderRecord.Account.JDE_Date_Delivery_Offset__c!= null) {
Offsetvalue = orderRecord.Account.JDE_Date_Delivery_Offset__c.intValue();
}
if(orderRecord.Account.JDE_Date_Delivery_Offset__c == null && orderRecord.SubType__c == 'Offer') {
Offsetvalue = 5;
}
if(orderRecord.Account.JDE_Date_Delivery_Offset__c == null && orderRecord.SubType__c == 'ASP') {
Offsetvalue = 3;
}
while(Offsetvalue > 0) {
UpdatedDeliverydate = UpdatedDeliverydate.addDays(1);
DateTime UpdatedDeliverydatetime = DateTime.newInstance(UpdatedDeliverydate , midnight);
String dayName = UpdatedDeliverydatetime.format('EEEE');
if(dayName != 'Saturday' && dayName != 'Sunday' && !holidays.get(market).containsKey(UpdatedDeliverydate)) {
Offsetvalue --;
}
}
if(orderRecord.OrderDeliveryDate__c < UpdatedDeliverydate)
record.Delivery_Date__c = UpdatedDeliverydate;
}
}
}
While inserting the order and account it is showing error :
System.LimitException: Too many SOQL queries: 101
How to avoid this error?please anyone rectify