*EDIT-I have updated my code with more explanation and debugs showing what is printed and where execution unexpectedly exits without error. I am also only working with 1 test method for now. I am receiving debugs in the Trigger's first few lines, but the AggregateResultsList is always empty so the For-each loop never executes.
This Trigger will send an email message if an Account has 8 or more cases created within 7 days. Depending on the status of the four fields in the If/Else block will dictate the destination of the email. If the status is "Active" 1 email is sent to a set email address. If the status is "Implementation" then 2 emails are sent, addresses are grabbed from SOQL.
Any help is appreciated.
trigger CaseCountAlertTrigger on Case (before insert) {
List<String> emailAdds = new List<String>(); // Holds '2' ToAddresses from Milestone1_project__c object
Set <Id> AcctIds = new Set <Id>(); //Holds Account Ids from this Case Trigger
String messageToSend; //Email body sent in email (will be in HTML format)
Map < Id, String > accountIdEmailmessageMap = new Map < Id, String > (); // map of AccountId and Email body per Account/AccountId to be sent
List < AggregateResult > AggregateResultList = [SELECT AccountId, Account.Name name, COUNT(Id) co
FROM Case
WHERE CreatedDate = LAST_N_DAYS:7 AND Id in :Trigger.New
GROUP BY Account.Name, AccountId
HAVING COUNT(Id) >= 8
];
System.debug('AggregateResult: ' + AggregateResultList); // debugs: 'AggregateResult: ()' --emtpy aggregate list
System.debug('Trigger Results' + Trigger.new); // This line will print the Case that comes in as Trigger.New, debugs as expected.
// ******** It seems to exit here***************
for (AggregateResult aggr: AggregateResultList){
messageToSend = 'You are receiving this email alert due to an account ';
messageToSend += 'activity rule has exceeded 8 cases created within 5 business days.<br><br>';
messageToSend += 'Please, follow up with the account and provide guidance and assistance.<br><br>';
messageToSend += '<b>Account Name: </b>' + aggr.get('name') + '<br> <br>';
messageToSend += 'Thank you, <br>';
messageToSend += 'Salesforce Team';
//Crete Map of <AccountId, Message to serve as body in Email
// for each accountId>
Id accId = (Id) aggr.get('AccountId');
accountIdEmailmessageMap.put(accId, messageToSend);
//Create List of AccountId's to grab email addresses
// from child Object for 'Implementation Status
AcctIds.add(accId);
}
System.debug(accountIdEmailmessageMap);
/*
List < Case > caseList = [SELECT Id, AccountId, Account.Name, Account.Eyefinity_EHR_Status__c,
Account.Eyefinity_PM_Status__c, Account.OfficeMate_Status__c,
Account.Project_Imp_Status__c
FROM Case
WHERE AccountId IN: AcctIds];
*/
// SOQL to grab the four status fields on Account to check status either 'Active' or 'Implementation'
// also grab two email addresses for use in ifElse block
List<Account> accList = [SELECT Id, Name, Eyefinity_EHR_Status__c, Eyefinity_PM_Status__c,
Project_Imp_Status__c, OfficeMate_Status__c,(select Client_Advisor_Email__c,
Resource_Coordinator_Email__c
from Projects__r)
FROM Account
WHERE Id IN :AcctIds];
List<Messaging.SingleEmailMessage> lstASingleEmailMessage = new List<Messaging.SingleEmailMessage>();
List<Messaging.SingleEmailMessage> lstBSingleEmailMessage = new List<Messaging.SingleEmailMessage>();
for (Account al: accList) {
if (al.Eyefinity_EHR_Status__c == 'Active' ||
al.Eyefinity_PM_Status__c == 'Active' ||
al.Project_Imp_Status__c == 'Active' ||
al.OfficeMate_Status__c == 'Active') {
// String messageBody = accountIdEmailmessageMap.get(al.accId);
//Send Email to CustomerService if Active
List<String> emailaddr = new List<String>();
emailaddr.add('[email protected]');
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
mail.setSenderDisplayName(' Support');
mail.setToAddresses(emailaddr);
mail.Subject = 'Notification: Account Case activity rule exceeded';
mail.setHtmlBody(messageToSend);
lstASingleEmailMessage.add(mail);
}
else if (al.Eyefinity_EHR_Status__c == 'Implementation' ||
al.Eyefinity_PM_Status__c == 'Implementation' ||
al.Project_Imp_Status__c == 'Implementation' ||
al.OfficeMate_Status__c == 'Implementation'){
String messageBody1 = accountIdEmailmessageMap.get(cl.AccountId);
System.debug('Accounts: ' + al);
//Send email to Coordinator and Advisor if in Implementation
for(Account a : accList)
{
for(Milestone1_Project__c p : a.Projects__r)
{
emailAdds.add(p.Client_Advisor_Email__c);
emailAdds.add(p.Resource_Coordinator_Email__c);
}
}
System.debug(emailAdds);
Messaging.SingleEmailMessage amail = new Messaging.SingleEmailMessage();
amail.SetSenderDisplayName('Support');
amail.setToAddresses(emailAdds);
amail.Subject = 'Notification: Account Case activity rule exceeded';
amail.setHtmlBody(messageBody1);
lstASingleEmailMessage.add(amail);
}
else{
System.debug(AggregateResultList);
}
}
Messaging.SendEmailResult[] r = Messaging.sendEmail(lstASingleEmailMessage);
}
Test Case:
@isTest
private class TestCaseHandlerAlert {
@testSetup static void setup(){
List<Account> testAccounts = new List<Account>();
Account a = new Account();
a.name = 'AccountEHRImplement';
a.RecordTypeId = '01230000000v58OAAQ';
a.Eyefinity_EHR_Status__c = 'Implementation';
a.Tax_Id__c = '123456789';
testAccounts.add(a);
//Insert Account
insert testAccounts;
//Create User: THis user will fill required fields on the Milestone1_Project1 allowing for a an email address to populate
User tuser = new User( firstname = 'tuserFname',
lastName = 'tuserLastname',
email = '[email protected]',
Username = '[email protected]',
EmailEncodingKey = 'ISO-8859-1',
Alias ='Blah',
TimeZoneSidKey = 'America/Los_Angeles',
LocaleSidKey = 'en_US',
LanguageLocaleKey = 'en_US',
ProfileId =[Select Id From Profile Where Name='Eyefinity Managers'].id
);
insert tuser;
//Create Project
Milestone1_Project__c project1 = new Milestone1_Project__c();
project1.Customer_Account__c = [Select Id FROM Account Where Name ='AccountEHRImplement'].id;
project1.Name = 'triggerProject';
project1.Client_Advisor__c = [Select Id FROM User Where Username ='[email protected]'].id;
project1.Resource_Coordinator__c = [Select Id FROM User Where Username ='[email protected]'].id;
project1.RecordTypeId = '01214000001RYp7AAG';
insert project1;
}
@isTest static void AccountEHRImplement (){
//Create and insert more than more than 8 cases
List<Case> casestoInsert = new List<Case>();
for (Integer i=1; i<10; i++){
Case cas1 = new Case();
cas1.RecordTypeId = '01214000001NcOYAA0';
cas1.AccountId = [Select Id FROM Account Where name ='AccountEHRImplement'].id;
cas1.Origin = 'Phone';
cas1.Impact__c = 'Low';
cas1.Severity__c = 'Minor';
cas1.Type = 'Bridge';
casesToInsert.add(cas1);
}
Test.startTest();
insert casesToInsert;
Test.stopTest();
System.debug('Expected: 2, actual: ' + Limits.getEmailInvocations());
}
}
I can see the empty AggregateResult debug and the Trigger Results showing that Account that was created, but then nothing.
Messaging.sendEmail
.