Fun coding challenge from:
https://www.sfdc99.com/2014/11/10/show-me-the-code-extravagant-record-creation/
Max cases Trigger
trigger MaxCaseTrigger on Case (before insert) { CaseHelper ch = new CaseHelper(); ch.checkMaxCase(Trigger.new); }
Max cases helper class
public with sharing class CaseHelper { private static Case_Settings__c caseSettings; private static Integer maxCases = 99; static { Map<String, Case_Settings__c> setting = Case_Settings__c.getall(); caseSettings = setting.get('Sandbox_Settings'); if (caseSettings!=null && caseSettings.Max_Cases__c!=null){ maxCases = Integer.valueOf(caseSettings.Max_Cases__c); } } public void checkMaxCase(List<Case> newCases){ Map<Id, Case> accountIdToCaseMap = new Map<Id, Case>(); for (Case newCase :newCases){ if (newCase.AccountId!=null) accountIdToCaseMap.put(newCase.OwnerId, newCase); } List<AggregateResult> agList = [Select count(id) caseCount, OwnerId, Owner.Name from Case where OwnerId IN :accountIdToCaseMap.keySet() Group By OwnerId, Owner.Name Having count(id)>=:maxCases]; List<Case> casesToThrowError = new List<Case>(); Map<Id, String> caseToContactNameMap = new Map<Id, String>(); for (AggregateResult ag : agList){ String ownerId = (String)ag.get('OwnerId'); if (accountIdToCaseMap.containsKey(ownerId)){ Case errorCase = accountIdToCaseMap.get(ownerId); casesToThrowError.add(errorCase); caseToContactNameMap.put(ownerId, (String)ag.get('Name')); } } if (!casesToThrowError.isEmpty()){ for (Case caseToThrowError : casesToThrowError){ caseToThrowError.addError('Too many cases created this month for user ' + caseToContactNameMap.get(caseToThrowError.OwnerId) + ' (' + caseToThrowError.OwnerId + ') : ' + maxCases); } } } }
Max cases helper test
@isTest public class CaseHelperTest { static Integer maxCasesToCreate = 99; @TestSetup static void setup(){ Case_Settings__c caseSettings = new Case_Settings__c(Name='Sandbox_Settings', Max_Cases__c=maxCasesToCreate); insert caseSettings; Account newAccount = new Account(Name='Test'); insert newAccount; Contact newContact = new Contact(FirstName='First', LastName='Last', AccountId=newAccount.Id, Email='test@google.com'); insert newContact; List<Case> caseLst = new List<Case>(); for (Integer k = 0; k < maxCasesToCreate-1; k++){ Case newCase = new Case(); newCase.OwnerId = UserInfo.getUserId(); newCase.AccountId = newAccount.Id; newCase.ContactId = newContact.Id; newCase.Status = 'Open'; caseLst.add(newCase); } insert caseLst; } @isTest static void belowThreshold(){ Case_Settings__c cs = Case_Settings__c.getInstance('Sandbox_Settings'); cs.Max_Cases__c = 101; update cs; Test.startTest(); System.assertEquals([Select Id from Case where ContactId!=null].size(), 98); Case newCase = new Case(); newCase.OwnerId = UserInfo.getUserId(); newCase.AccountId = [Select Id from Account][0].Id; newCase.ContactId = [Select Id from Contact][0].Id; newCase.Status = 'Open'; insert newCase; Test.stopTest(); } @isTest static void errorAboveThreshold(){ Test.startTest(); System.assertEquals([Select Id from Case where ContactId!=null].size(), 98); Case newCase = new Case(); newCase.AccountId = [Select Id from Account][0].Id; newCase.ContactId = [Select Id from Contact][0].Id; newCase.Status = 'Open'; try{ insert newCase; } catch(Exception ex){ System.assert(ex.getMessage().contains('Too many cases created this month for user')); } Test.stopTest(); } }