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
BHASKAR GANGULYBHASKAR GANGULY 

too many DML apex superbadge

HI,
i am doing the Apex Specialist superbadge.I have completed the 1st 3 challenges successfully.
while doing the 4 th challenge i am getting govornence limits exception for bulk testing.
can some body please verify my code and tell me what is the problem here.i am stuck in this for lat 2 days.Please help.
below is my code :

This is the Trigger :

trigger MaintenanceRequest on Case (before update, after update) {
    // call MaintenanceRequestHelper.updateWorkOrders
    //list<case> scase1=[select id from case where id in := trigger.new.id limit 200];
  //  set<Id> ccase=new set<Id>();
    if(trigger.isafter)
    {
    for(Case c:trigger.new)
    {
        if((c.Type=='Routine Maintenance' || c.Type=='Repair'))
        {
            if(c.status=='Closed')
            {
              // c.adderror('Hi this is bhaskar'); 
              //ccase.add(c.id);
               MaintenanceRequestHelper.updateWorkOrders(trigger.new); 
            }
        }
    }
    }
}

Helper Class :

public class MaintenanceRequestHelper {
    
    public static void updateWorkOrders(list<case> scase){
        list<case> acc= new list<Case>();
       // list<product2> pp =[select Maintenance_Cycle__c,(select id from case) from product2];
      // scase=[select id from case where id in :limit 200];
       list<id> sid= new list<id>();
       for(case aa:scase)
       {
      
         sid.add(aa.Equipment__c);  
       }
        system.debug('sid :'+sid.size());
        list<product2> sp=[select id,Maintenance_Cycle__c from product2 where Id  =:sid];
        system.debug(sp.size());
        
         Map<id, product2> emailToUserMap = new Map<id, product2>();
  for (product2 u : sp) {
     
    emailToUserMap.put(u.id, u);
     
  }
           for(case a:scase)
           {
             
            
          //  product2 p=[select Maintenance_Cycle__c from product2 where Id =:a.Equipment__c];
           // double p1= double.valueOf(emailToUserMap.get(Maintenance_Cycle__c));
           product2 pp= new product2();
               pp= emailToUserMap.get(a.Equipment__c);
           decimal p= pp.Maintenance_Cycle__c;
            integer p2=p.intValue();
            acc.add(new case(type='Routine Maintenance',status='New',Vehicle__c=a.Vehicle__c,Equipment__c=a.Equipment__c,subject='New Routin Maintenance',Date_Reported__c=system.today(),Date_Due__c=(system.today()+p2)));
        // a.Date_Due__c
         
           }
       
        insert acc;
      
        
    }        
    
}

Test class :

/* 
 * This class can be safely deleted from your org. 
 * It was only used to ensure 100% test coverage
 * for the managed package installation.
 */

@IsTest
private class InstallationTests {
    
  static testmethod void testMaintenancebulkRequest() 
 { 
     list<case> a= new list<case>(); 
       list<case> aa= new list<case>(); 
      Vehicle__c v=new Vehicle__c(name='Test BMV');
       insert v;
      product2 p=new product2(name='Test Product',Maintenance_Cycle__c=10);
      insert p;
  
     for(integer i =0;i<200;i++)
     {
     a.add(new case(type='Repair',status='New'));   
     }
     test.startTest();
     insert a;

     for(case cc:a)
     {
       cc.Status='Closed';
       cc.Vehicle__c=v.id;
       cc.Equipment__c=p.id;  
       aa.add(cc);  
     }
    // system.debug(aa.size());
     update aa;
    
     
      test.stopTest();  
    
 }   
   
}

Thanks,
Bhaskar
Best Answer chosen by BHASKAR GANGULY
Raj VakatiRaj Vakati
try this code
 
trigger MaintenanceRequest on Case (before update, after update) {
    // call MaintenanceRequestHelper.updateWorkOrders  
    if (Trigger.isAfter && Trigger.isUpdate) {
        List<Case> caseList = new List<Case>();
        for(Case c : Trigger.New){
            Case oldCase = (Case)Trigger.OldMap.get(c.id);
            if(c.Status == 'Closed' && c.Status != oldCase.Status && (c.Type == 'Routine Maintenance' || c.Type == 'Repair')){
        		caseList.add(c);
            }
        }
        MaintenanceRequestHelper.updateWorkOrders(caseList);
    }
}
 
public class MaintenanceRequestHelper {
    public static List<Id> caseIds = new List<Id>();
    public static Map<Id, Integer> dayDueMap = new Map<Id, Integer>();
    
    public static void updateWorkOrders(List<Case> requestList){
        for(case c : requestList){
            caseIds.add(c.id);
        }
        
        calculateDayDue();
        System.debug('dayDueMap:'+dayDueMap);
        System.debug('dayDueMap size:'+dayDueMap.size());
        System.debug('requestList size:'+requestList.size());

        List<Case> caseList = new List<Case>();
        for(Case c : requestList){
            // New a Maintenance Request
            Case newMTReq = new Case();
            newMTReq.Vehicle__c = c.Vehicle__c;
            newMTReq.Equipment__c = c.Equipment__c;
            newMTReq.Type = 'Routine Maintenance';
            newMTReq.Status = 'New';
            newMTReq.Origin = c.Origin;
            newMTReq.Subject = 'Routine Mainten';
            newMTReq.Date_Reported__c = Date.today();
            newMTReq.Date_Due__c = Date.today().addDays(dayDueMap.get(c.id));
            newMTReq.old_case__c = String.valueOf(c.Id);
            System.debug('newMTReq:'+newMTReq);
            caseList.add(newMTReq);
        }
        if(caseList.size() > 0){
            insert caseList;
            updateWorkParts(caseList);
        }
    }
    
    private static void updateWorkParts(List<Case> caseList){
        List<Work_Part__c> wpList = new List<Work_Part__c>();
        Map<id, id> oldToNewCase = new Map<id, id>();
        for(Case c : caseList){
            oldToNewCase.put(Id.valueOf(c.old_case__c), c.id);
        }
        
        for(Work_Part__c wp : [select Maintenance_Request__r.id 
                               from Work_Part__c where Maintenance_Request__r.id IN :caseIds])
        {
            // Pls enable the [Allow reparenting] checkbox on "Maintenance Request" Field, 
            // so that it can be updated.
            wp.Maintenance_Request__c = oldToNewCase.get(wp.Maintenance_Request__r.id);
            wpList.add(wp);
            
        }
        
        update wpList;
    }
    
    private static void calculateDayDue(){
        List<Work_Part__c> wpList = [select Maintenance_Request__r.id, Equipment__r.Maintenance_Cycle__c 
                                     from Work_Part__c where Maintenance_Request__r.id IN :caseIds];
        System.debug('wpList:'+wpList);
        System.debug('wpList size:'+wpList.size());
        if(wpList.size() == 0){
            for(id caseid : caseIds){
                dayDueMap.put(caseid, 0);
            }
        }
        for(Work_Part__c wp : wpList){
            if(wp.Equipment__r.Maintenance_Cycle__c == null)
                wp.Equipment__r.Maintenance_Cycle__c = 0;
            if(dayDueMap.containsKey(wp.Maintenance_Request__r.id)){
                Integer dayDue = dayDueMap.get(wp.Maintenance_Request__r.id);
                if(dayDue > wp.Equipment__r.Maintenance_Cycle__c){
                    dayDueMap.put(wp.Maintenance_Request__r.id, (Integer)wp.Equipment__r.Maintenance_Cycle__c);
                }
            }else{
                dayDueMap.put(wp.Maintenance_Request__r.id, (Integer)wp.Equipment__r.Maintenance_Cycle__c);    
            }
        }
    }
    
}