Questo trigger crea nuovi Case alla chiusura di altri Case. E’ un esercizio di un superbadge dove i Case sono ordini di manutenzione di veicoli. Come la manuntenzione è chiusa di aprono altri ordini per il futuro (Manutenzione programmata)
trigger MaintenanceRequest on Case (after update) {
// Trigger che scatta dopo l'aggiornamento di un case
// Il case deve avere lo status closed e il type repair o routine maintenance
if(Trigger.isUpdate){
List<Case> ListOfCaseTriggered = Trigger.new; // Lista dei case che sono stati aggiornati
List<Case> ListOfCaseValid = new List<Case>(); // Lista dei case che serviranno poi per la creazione dei nuovi case
for(Case c:ListOfCaseTriggered){
if(c.Status == 'Closed' && (c.Type == 'Repair' || c.Type == 'Routine Maintenance')){
ListOfCaseValid.add(c); // Viene popolata la lista dei case che serviranno per la creazione dei nuovi case
}
}
MaintenanceRequestHelper.updateWorkOrders(ListOfCaseValid); // Viene invocata la classe che elabora i dati per la creazione dei nuovi case
}
}
Classe MaintenanceRequestHelper
Il trigger in alto scatta per ogni aggiornamento di un case. Crea una lista di dati (Case) da elaborare e la invia ad una classe che poi partendo da questa base crea nuovi Case che sono la duplicazione di quelli appena chiusi
public with sharing class MaintenanceRequestHelper {
public static void updateWorkOrders(List<Case> c) {
List<Case> newMaintenanceRequestList = new List<Case>(); // Lista nuovi case
List<Case> baseCaseData = [select Status,Vehicle__c,Equipment__c,Type,Subject,Date_Reported__c,Product__c,ContactId,AccountId,AssetId from case where id in: c];
for(Case caseItem:baseCaseData){
Case nc = new Case();
nc.Status = 'New';
nc.Vehicle__c = caseItem.Vehicle__c;
nc.Equipment__c = caseItem.Equipment__c;
nc.Type = ' Routine Maintenance'; // Routine Maintenance or Repair
nc.Subject = caseItem.Subject;
nc.Date_Reported__c = Date.today();
nc.Product__c = caseItem.Product__c;
nc.ContactId = caseItem.ContactId;
nc.AccountId = caseItem.AccountId;
//nc.AssetId = caseItem.AssetId;
nc.Type = 'Routine Maintenance';
newMaintenanceRequestList.add(nc);
}
insert newMaintenanceRequestList;
}
}
Classe di test per Trigger after update
@isTest
public class MaintenanceRequestTest {
@isTest
static void TestTrigger_1(){
List<Case> lc = new List<Case>();
Vehicle__c v = new Vehicle__c(Name = 'dfd');
insert v;
Product2 p = new Product2(Name = 'dfd');
insert p;
Account a = new Account (name = 'Acme',
BillingCity ='TestCity',
BillingCountry ='TestCountry',
BillingStreet ='TestStreet',
BillingPostalCode ='t3stcd3'
);
insert a;
Contact c = new Contact (
FirstName = 'xyzFirst',
LastName = 'XyZLast',
AccountId = a.Id,
Email = 'xyzmail@mail.com'
);
//line added - waveoc
insert c;
Integer i = 0;
for(i = 0; i < 300; i++){
Case testCase = new Case();
testCase.Status = 'New';
testCase.Type = 'Routine Maintenance';
testCase.Subject = 'Manutenzione ' + i;
testCase.Date_Reported__c = Date.today();
testCase.Vehicle__c = v.id; //
testCase.Equipment__c = p.id; //
testCase.Product__c = 'GC1040';
testCase.ContactId = c.id;
testCase.AccountId = a.id;
lc.add(testCase);
}
insert lc;
Test.startTest();
List<Case> testCase = [select Status,Type from case limit 50];
List<Case> testCaseUp = new List<Case>();
for(Case cas:testCase){
cas.Status = 'Closed';
cas.Type = 'Repair';
testCaseUp.add(cas);
}
update testCaseUp;
Test.stopTest();
System.assertEquals(50, [Select Id from Case where type='Repair' and Status='Closed'].size());
}
@isTest
static void TestTrigger_2(){
List<Case> lc = new List<Case>();
Vehicle__c v = new Vehicle__c(Name = 'dfd');
insert v;
Product2 p = new Product2(Name = 'dfd');
insert p;
Account a = new Account (name = 'Acme',
BillingCity ='TestCity',
BillingCountry ='TestCountry',
BillingStreet ='TestStreet',
BillingPostalCode ='t3stcd3'
);
insert a;
Contact c = new Contact (
FirstName = 'xyzFirst',
LastName = 'XyZLast',
AccountId = a.Id,
Email = 'xyzmail@mail.com'
);
//line added - waveoc
insert c;
Integer i = 0;
for(i = 0; i < 300; i++){
Case testCase = new Case();
testCase.Status = 'Working';
testCase.Type = 'Mechanical';
testCase.Subject = 'Mechanical ' + i;
testCase.Date_Reported__c = Date.today();
testCase.Vehicle__c = v.id; //
testCase.Equipment__c = p.id; //
testCase.Product__c = 'GC1040';
testCase.ContactId = c.id;
testCase.AccountId = a.id;
lc.add(testCase);
}
insert lc;
Test.startTest();
List<Case> testCase = [select Status,Type from case limit 50];
List<Case> testCaseUp = new List<Case>();
for(Case cas:testCase){
cas.Status = 'Escalated';
cas.Type = 'Working';
testCaseUp.add(cas);
}
update testCaseUp;
System.assertEquals(0, [Select Id from Case where type='Repair' and Status='Closed'].size());
Test.stopTest();
}
@isTest
static void TestTrigger_3(){
List<Case> lc = new List<Case>();
Vehicle__c v = new Vehicle__c(Name = 'dfd');
insert v;
Product2 p = new Product2(Name = 'dfd');
insert p;
Account a = new Account (name = 'Acme',
BillingCity ='TestCity',
BillingCountry ='TestCountry',
BillingStreet ='TestStreet',
BillingPostalCode ='t3stcd3'
);
insert a;
Contact c = new Contact (
FirstName = 'xyzFirst',
LastName = 'XyZLast',
AccountId = a.Id,
Email = 'xyzmail@mail.com'
);
//line added - waveoc
insert c;
Integer i = 0;
for(i = 0; i < 300; i++){
Case testCase = new Case();
testCase.Status = 'New';
testCase.Type = 'Routine Maintenance';
testCase.Subject = 'Manutenzione ' + i;
testCase.Date_Reported__c = Date.today();
testCase.Vehicle__c = v.id; //
testCase.Equipment__c = p.id; //
testCase.Product__c = 'GC1040';
testCase.ContactId = c.id;
testCase.AccountId = a.id;
lc.add(testCase);
}
insert lc;
Test.startTest();
List<Case> testCase = [select Status,Type from case limit 300];
List<Case> testCaseUp = new List<Case>();
for(Case cas:testCase){
cas.Status = 'Closed';
cas.Type = 'Repair';
testCaseUp.add(cas);
}
update testCaseUp;
Test.stopTest();
System.assertEquals(300, [Select Id from Case where type='Repair' and Status='Closed'].size());
}
}