How to avoid the SQL Query in this case
public static void sendSMS(List<Case> newList){
List<Case> selectedCases =[SELECT Id ,
Department__c,
CaseNumber,
Customer_mobile__c,
Case_Category__c,
Sub_Category__c ,
Unit__c ,
Unit__r.Project__c ,
Account.PersonMobilePhone ,
Project__c,
Project_Name__c,
Description,
CreatedBy.Profile.Name
FROM Case
WHERE Id IN :newList];
List<User> communityManagmentUsers= [SELECT Id, Name, MobilePhone,Email
FROM User
WHERE id IN (SELECT UserOrGroupid FROM Groupmember WHERE Group.Name = 'Community Management - SMS')];
for(Case caseItem : selectedCases){
Map<String, String> smsMessageMap = new Map<String, String>();
if(caseItem.Department__c == 'Community Management'){
//Internal SMS
if (caseItem.Case_Category__c == 'Incident'){
project__c project=[SELECT Id,Name ,CM_Project_Manager__c,FM_Project_Manager__c FROM Project__c WHERE Name=:caseItem.Project_Name__c OR Id =:caseItem.Project__c LIMIT 1];
List<User> managerUsers = [SELECT Id , MobilePhone , Email FROM User WHERE id=:project.CM_Project_Manager__c OR id=:project.FM_Project_Manager__c];
communityManagmentUsers.addAll(managerUsers);
for(User user : communityManagmentUsers){
String smsBody = 'Incident Case has been created' + ' '+ caseItem.CaseNumber + ' ' + 'Sub Category: ' + caseItem.Sub_Category__c + ' '+'Project: ' + project.Name +'. \n' +
URL.getSalesforceBaseUrl().toExternalForm()+'/'+caseItem.Id + ' .' ;
smsMessageMap.put(user.MobilePhone,smsBody);
sendEmail(user.email,caseItem);
}
isMsgSent(smsMessageMap);
}
//External SMS
else{
if(caseItem.CreatedBy.Profile.Name.contains('Call Centre')){
String messageBody = 'Thank you for calling. your case number ' + caseItem.CaseNumber + '.';
if(isValidMobileNumber(caseItem.Customer_mobile__c)){
smsMessageMap.put(caseItem.Customer_mobile__c , messageBody);
isMsgSent(smsMessageMap);
}
else{
if(isValidMobileNumber(caseItem.Account.PersonMobilePhone)){
smsMessageMap.put(caseItem.Account.PersonMobilePhone, messageBody);
isMsgSent(smsMessageMap);
}
}
}
}
}
}