When an existing maintenance request of type Repair or Routine Maintenance is closed, create a new maintenance request for a future routine check up. This new maintenance request is tied to the same Vehicle and Equipment Records as the original closed request. This new request's Type should be set as Routine Maintenance. The Subject should not be null and the Report Date field reflects the day the request was created. Remember, all equipment has maintenance cycles.

Calculate the maintenance request due dates by using the maintenance cycle defined on the related equipment records. If multiple pieces of equipment are used in the maintenance request, define the due date by applying the shortest maintenance cycle to today’s date.

Design the code to work for both single and bulk maintenance requests. Bulkify the system to successfully process approximately 300 records of offline maintenance requests that are scheduled to import together. For now, don’t worry about changes that occur on the equipment record itself.

*******************MaintenanceRequest.apxt*************************************

trigger MaintenanceRequest on Case (before update, after update) {

    // ToDo: Call MaintenanceRequestHelper.updateWorkOrders

    if(Trigger.isUpdate && Trigger.isAfter){

       MaintenanceRequestHelper.updateWorkOrders(Trigger.New, Trigger.OldMap);

    }

}

*********************************MaintenanceRequestHelper.apxc********************************

public with sharing class MaintenanceRequestHelper {

    public static void updateworkOrders(List<Case> updWorkOrders, Map<Id,Case> nonUpdCaseMap) {

        //Hold the valid Case Ids to be updated

        Set<Id> validIds = new Set<Id>();

       //Logic to fill validIds Set.

        for (Case c : updWorkOrders){

            if (nonUpdCaseMap.get(c.Id).Status != 'Closed' && c.Status == 'Closed'){

                if (c.Type == 'Repair' || c.Type == 'Routine Maintenance'){

                    validIds.add(c.Id);

                }

            }

        }

        

        if (!validIds.isEmpty()){

            //Cases list to be inserted.

            List<Case> newCases = New List<Case>();

            /**Logic to fetch child records(Equipment Maintenance Items), Vehicles,

               Equipments etc of closed/valid cases using validIds and store results

               in closedCasesM Map  **/

            Map<Id, Case> closedCasesM = New Map<Id, Case>([SELECT Id, Vehicle__c, Equipment__c, 

                                                          Equipment__r.Maintenance_Cycle__c,

                                                          (SELECT Id, Equipment__c, Quantity__c 

                                                           FROM Equipment_Maintenance_Items__r) 

                                                          FROM Case WHERE Id IN :validIds]);

            

            /**Logic to fetch minimum maintenance request cycle from Equipment_Maintenance_Item__c

               using validIds and store result in maintenanceCycles Map.**/

            Map<Id, Decimal> maintenanceCycles = new Map<ID, Decimal>();

            AggregateResult[] results = [SELECT Maintenance_Request__c, MIN(Equipment__r.Maintenance_Cycle__c)cycle 

                                         FROM Equipment_Maintenance_Item__c WHERE 

                                         Maintenance_Request__c IN :ValidIds 

                                         GROUP BY Maintenance_Request__c];

        

        for (AggregateResult ar : results){ 

            maintenanceCycles.put((Id) ar.get('Maintenance_Request__c'), (Decimal) ar.get('cycle'));

        }

          /**Logic to create new case to insert**/  

            for(Case cc : closedCasesM.values()){

                Case nc = new Case (

                    ParentId = cc.Id, //This holds the reference to the old record and is very important.

                    Status = 'New',

                    Subject = 'Routine Maintenance',

                    Type = 'Routine Maintenance',

                    Vehicle__c = cc.Vehicle__c,

                    Equipment__c = cc.Equipment__c,

                    Origin = 'Web',

                    Date_Reported__c = Date.Today()

                );

                

                If (maintenanceCycles.containskey(cc.Id)){

                    nc.Date_Due__c = Date.today().addDays((Integer) maintenanceCycles.get(cc.Id));

                } else {

                    nc.Date_Due__c = Date.today().addDays((Integer) cc.Equipment__r.maintenance_Cycle__c);

                }

                

                newCases.add(nc);

            }

            

           insert newCases;

            

           /**Logic to clone Equipment_Maintenance_Item__c records using closedCasesM Map and link

              each with the newly inserted newCases list above**/

           List<Equipment_Maintenance_Item__c> clonedWPs = new List<Equipment_Maintenance_Item__c>();

           for (Case nc : newCases){

                for (Equipment_Maintenance_Item__c wp : closedCasesM.get(nc.ParentId).Equipment_Maintenance_Items__r){

                    Equipment_Maintenance_Item__c wpClone = wp.clone();

                    wpClone.Maintenance_Request__c = nc.Id;

                    ClonedWPs.add(wpClone);

                    

                }

            }

            //Inserting cloned Equipment_Maintenance_Item__c below.

            insert ClonedWPs;

        }

    }

}

Comments