Untitled
unknown
plain_text
10 months ago
43 kB
4
Indexable
PROJECT EAG CODE
public without sharing class OpportunityOfferingTriggerHandler {
public static Set<String> fieldsList = new Set<String>();
public static Map<String,String> fieldApINameVsLabel = new Map<String,String>();
public static Map<Id,decimal> idVsOldPerc = new Map<Id,decimal>();
public static Boolean runOnce = false;
public static void updateOfferingDedupe(List<Opportunity_Offering__c> opOfferingList,Map<Id, Opportunity_Offering__c > mapOldRecord){
Set<Id> offerIds = new Set<Id>();
Set<Id> ids = new Set<Id>();
for(Opportunity_Offering__c opOffering : opOfferingList){
ids.add(opOffering.Virtusa_Offering__c);
if(opOffering.Virtusa_Offering__c != null &&
(mapOldRecord == null || mapOldRecord.get(opOffering.Id) == null || mapOldRecord.get(opOffering.Id).Virtusa_Offering__c != opOffering.Virtusa_Offering__c )){
offerIds.add(opOffering.Id);
}
}
Set<String> dedupeName = new Set<String>();
Map<Id,String> offeringIdVsDedupe = new Map<Id,String>();
Map<Id,Virtusa_Offering__c> idVsRecord = new Map<Id,Virtusa_Offering__c>([select id,name from Virtusa_Offering__c where id IN :ids]);
for(Opportunity_Offering__c opOffering : opOfferingList){
if(offerIds.contains(opOffering.Id)){
dedupeName.add(opOffering.Opportunity_Id__c + idVsRecord.get(opOffering.Virtusa_Offering__c).Name);
}
}
List<Opportunity_Offering__c> offers =
[select id,Opportunity_Offering_Dupe_Check__c from Opportunity_Offering__c where Opportunity_Offering_Dupe_Check__c IN :dedupeName];
Set<String> deduExisSet = new Set<String>();
for(Opportunity_Offering__c exis : offers){
String dupe = exis.Opportunity_Offering_Dupe_Check__c;
deduExisSet.add(dupe);
}
for(Opportunity_Offering__c opOffering : opOfferingList){
String dedupeVal = opOffering.Opportunity_Id__c + idVsRecord.get(opOffering.Virtusa_Offering__c).Name;
if(!deduExisSet.contains(dedupeVal)){
opOffering.Opportunity_Offering_Dupe_Check__c = dedupeVal;
deduExisSet.add(dedupeVal);
}
else
opOffering.addError('Please Check Offerings, Duplicate Not Allowed.');
}
}
public static void deleteNoOfferingReq(List<Opportunity_Offering__c> opOfferingList,Boolean isUpdate){
if(!runonce){
OpportunityOfferingTriggerHelper.deleteNoOffering(opOfferingList,isUpdate);
runonce = true;
}
}
public static void stampOldPec(Map<Id, Opportunity_Offering__c > mapOldRecord,Map<Id, Opportunity_Offering__c > mapNewRecord){
OpportunityOfferingTriggerHelper.stampOldPec(mapOldRecord,mapNewRecord);
}
public static void submitEmailNotification(List<Opportunity_Offering__c> opOfferingList) {
for(Opportunity_Offering__c opOffering : opOfferingList){
//Pattern MyPattern = Pattern.compile('^(([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5}){1,25})+([,.](([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5}){1,25})+)*$');
List<Virtusa_Offering__c> vOfferingList = [Select id,
Virtu_Squad_Email_Address__c
from Virtusa_Offering__c
where id = :opOffering.Virtusa_Offering__c];
List<Opportunity_Offering__c> oppOfferingList = [select id,
Virtusa_Offering__r.Offering_Squad__c,
Virtusa_Offering__r.Name,
Virtusa_Offering__r.Virtu_Squad_Email_Address__c,
Virtusa_Offering__r.Offering_Portfolio__c,
Virtu_Offering_Split_p__c
From Opportunity_Offering__c
where Opportunity_Name__c = :opOffering.Opportunity_Name__c ];//new List<Opportunity_GTM__c>();
Opportunity offeringOpp = [Select id,
name,
Account.Customer_Name__r.Client__r.Name,
Account.Customer_Name__r.name,
Account.name,
Opportunity_ID__c,
Deal_Type__c,
StageName,
Amount,
CurrencyIsoCode,
Opportunity_Amount_Converted_New__c,
Opportunity_CS_Owner__r.Name,
Owner.name,
Account.owner.name,
Account.CSM__r.Name
from Opportunity where id = :opOffering.Opportunity_Name__c ];
List<String> to = new List<String>();
for (Virtusa_Offering__c vgtm: vOfferingList){
if(vgtm.Virtu_Squad_Email_Address__c != null){
to.addall(vgtm.Virtu_Squad_Email_Address__c.split(','));
}
}
List<String> cc = new List<String>();
//cc.add('chkodithuwakku@virtusa.com');
String repmail = 'salesoperations@virtusa.com';
String subject = 'FYI: Offering Allocation for Opportunity - '+ offeringOpp.Name;
String body = 'Hi Team,<br/><br/> Following offerings have tagged to the opportunity.<br/><br/>'+
'<b><u>Opportunity Details</b></u><br/><br/>'+
'<ul><li>Client –'+offeringOpp.Account.Customer_Name__r.Client__r.Name+'</li>'+
'<li>Customer –'+offeringOpp.Account.Customer_Name__r.name +' </li>'+
'<li>Account – '+offeringOpp.Account.name+'</li>'+
'<li>Opportunity ID - '+offeringOpp.Opportunity_ID__c+'</li>'+
'<li>Deal Type - '+offeringOpp.Deal_Type__c+'</li>'+
'<li>Stage - '+offeringOpp.StageName+'</li>'+
'<li>Amount - '+offeringOpp.CurrencyIsoCode+' '+offeringOpp.Amount+'</li>'+
'<li>Opportunity CS Owner - '+offeringOpp.Opportunity_CS_Owner__r.Name+'</li>'+
'<li>Account Owner - '+offeringOpp.Account.owner.name+'</li>'+
'<li>Account CS Owner - '+offeringOpp.Account.CSM__r.Name+'</li>'+
'</ul><br/><br/>'+
'Offering Details tag to Opportunity<br/><br/>'+
'<style>table, tr, td {border: 1px solid black;} td{width:200px}</style>'+
'<table><tr><b><td>Offering Squad</td><td>Offering</td><td>Offering Portfolio</td><td>Offering Split %</td></b></tr>';
for(Opportunity_Offering__c item : oppOfferingList){
if(item.Virtusa_Offering__r.Virtu_Squad_Email_Address__c != null &&
item.Virtusa_Offering__r.id != opOffering.Virtusa_Offering__c){
System.debug('email list -' +item.Virtusa_Offering__r.Virtu_Squad_Email_Address__c);
cc.addall(item.Virtusa_Offering__r.Virtu_Squad_Email_Address__c.split(','));
}
body = body + '<tr><td>'+item.Virtusa_Offering__r.Offering_Squad__c+
'</td><td>'+item.Virtusa_Offering__r.Name+
'</td><td>'+item.Virtusa_Offering__r.Offering_Portfolio__c+
'</td><td>'+item.Virtu_Offering_Split_p__c+'</td></tr>';
}
body = body + '</table><br/>';
body = body + 'Thanks,<br/> System Administrator';
System.debug('to list -' +to);
System.debug('cc list -' +cc);
if(to.size() > 0){
SingleEmailUtility seu = new SingleEmailUtility();
seu.sendMail(to, cc, repmail, subject, body);
}
}
}
public static void validateNoOffering(List<Opportunity_Offering__c> opOfferingList){
OpportunityOfferingTriggerHelper.validateNoOffering(opOfferingList);
}
//Author - Srikanth Reddy
//Arguments - opOfferingList -> list of opportunity offering record
//Purpose - called from after insert trigger, before insert.
//Date - 02/02/2023
public static void validateNewOffering(List<Opportunity_Offering__c> opOfferingList,Boolean isUpdate){
Id currentUserId = UserInfo.getUserId();
String currUserEmail = UserInfo.getUserEmail();
if(Label.ByPassApexValForOppOff != null && Label.ByPassApexValForOppOff.contains(currentUserId)){
return ;
}
Map<Id,Id> oppOfferIdVsOppId = new Map<Id,Id>();
Map<Id,Set<Id>> offIdVsRelatedSquad = new Map<Id,Set<Id>>();
Map<Id,Id> oppOfferIdVsVirtusaIds = new Map<Id,Id>();
for(Opportunity_Offering__c oppOffering : opOfferingList){
oppOfferIdVsOppId.put(oppOffering.id,oppOffering.Opportunity_Name__c);
oppOfferIdVsVirtusaIds.put(oppOffering.id,oppOffering.Virtusa_Offering__c);
}
Map<Id,Opportunity> offeringOpp = new Map<Id,Opportunity>([Select id,
name,stagename,ownerid
from Opportunity where id In :oppOfferIdVsOppId.values() ]);
Map<Id,Opportunity_Offering__c> idVsRelOfferingRecord;
if(isUpdate){
idVsRelOfferingRecord = new Map<Id,Opportunity_Offering__c>([select id,Opportunity_Name__c,Virtusa_Offering__c,
Virtusa_Offering__r.Offering_Deal_Type__c,
Opportunity_Name__r.Deal_Type__c
from Opportunity_Offering__c
where Opportunity_Name__c IN :offeringOpp.keySet()
and Virtu_Offering_Split_p__c != 0]);
}
if(!isUpdate){
idVsRelOfferingRecord = new Map<Id,Opportunity_Offering__c>([select id,Opportunity_Name__c,Virtusa_Offering__c
from Opportunity_Offering__c
where Opportunity_Name__c IN :offeringOpp.keySet()
and Virtu_Offering_Split_p__c != 0
and ID Not In :oppOfferIdVsOppId.keySet()]);
}
Map<Id,Set<Id>> oppIdVsOfferingIdSet = new Map<Id,Set<Id>>();
for(Opportunity_Offering__c opOffering : idVsRelOfferingRecord.values()){
oppOfferIdVsOppId.put(opOffering.Id,opOffering.Opportunity_Name__c);
oppOfferIdVsVirtusaIds.put(opOffering.Id,opOffering.Virtusa_Offering__c);
if(!oppIdVsOfferingIdSet.containsKey(opOffering.Opportunity_Name__c)){
oppIdVsOfferingIdSet.put(opOffering.Opportunity_Name__c,new Set<Id>{opOffering.Id});
}else{
oppIdVsOfferingIdSet.get(opOffering.Opportunity_Name__c).add(opOffering.Id);
}
}
Map<Id,Virtusa_Offering__c> vOfferingList = new Map<Id,Virtusa_Offering__c>([Select id,
Offering_Squad__c,
Virtu_Squad_Email_Address__c
from Virtusa_Offering__c
where id In :oppOfferIdVsVirtusaIds.values() ]);
List<String> squadTeam = new List<String>();
for(Virtusa_Offering__c vr : vOfferingList.values()){
if(vr.Offering_Squad__c != null) squadTeam.add(vr.Offering_Squad__c);
}
Map<Id,List<String>> virOffIdVsEmail = new Map<Id,List<String>>();
String value = '(\'' + String.join(squadTeam, '\',\'') + '\')';
String queryString = 'select id,email,name,Offering_squad_Leader__c,Off_Squad_Team_del__c'+
' from contact' +
' where email != null and ' +
' Offering_squad_Leader__c = true and ' +
' Off_Squad_Team_del__c includes' + value;
List<Contact> contactList = DataBase.query(queryString);
Map<String,String> userEmailVsId = new Map<String,String>();
for(Virtusa_Offering__c vr : vOfferingList.values()){
if(vr.Offering_Squad__c != null){
for(Contact con : contactList){
userEmailVsId.put(con.email,'');
if(con.Off_Squad_Team_del__c.contains(vr.Offering_Squad__c)){
if(!virOffIdVsEmail.containskey(vr.Id)){
virOffIdVsEmail.put(vr.Id,new List<String>{con.email});
}
else{
virOffIdVsEmail.get(vr.Id).add(con.email);
}
}
}
}
}
Map<Id,User> userRecords = new Map<Id,User>([select id,email from User where email IN :userEmailVsId.keySet()]);
for(Opportunity_Offering__c oppOffering : opOfferingList){
Opportunity oppRec = offeringOpp.get(oppOffering.Opportunity_Name__c);
Boolean isOppOwner = oppRec != null && oppRec.OwnerId == currentUserId ? true : false;
if(!isOppOwner && (oppRec.stagename == '6 - Verbal' || oppRec.stagename == '7 - Contract Award')){
oppOffering.addError('Opportunity offering at this stage can only be added or edited by Opportunity Owner');
}
Set<Id> offeringIds = oppIdVsOfferingIdSet.get(oppOffering.Opportunity_Name__c);
if(offeringIds == null && !isOppOwner){
oppOffering.addError('You cannot add or edit the offerings of this opportunity');
} else if(offeringIds != null && !isOppOwner){
Set<String> virEmails = new Set<String>();
if(oppOfferIdVsVirtusaIds != null && virOffIdVsEmail != null){
for(Id offId : offeringIds){
if(oppOfferIdVsVirtusaIds.get(offId) != null && virOffIdVsEmail.get(oppOfferIdVsVirtusaIds.get(offId)) != null)
virEmails.addall(virOffIdVsEmail.get(oppOfferIdVsVirtusaIds.get(offId)));
}
}
if(!isOppOwner && (virEmails.size() == 0 || (virEmails != null && !virEmails.contains(currUserEmail)))){
oppOffering.addError('You cannot add or edit the offerings of this opportunity');
}
}
//Changed by Viji - OppOwner Unable to Update Offerings which they haven't created
Boolean isOffOwner = oppOffering.OwnerId != null && oppOffering.OwnerId != oppRec.OwnerId ? true: false;
if(isOffOwner && isOppOwner){
List<User> ownerUserRecords = [select id from User where Id =: oppRec.OwnerId];
Map<String,Opportunity_Offering__share> oppOffList = new Map<String,Opportunity_Offering__share>();
List<Opportunity_Offering__c> oppOwnerOffList= [select id,Opportunity_Name__c,ownerId from
Opportunity_Offering__c where ownerId NOT IN :ownerUserRecords
AND Opportunity_Name__c =:oppRec.Id];
for(User userRec : ownerUserRecords){
if(userRec!=null){
for(Opportunity_Offering__c offering : oppOwnerOffList){
Opportunity_Offering__share oppOfferShare = new Opportunity_Offering__share();
oppOfferShare.ParentId = offering.Id;
oppOfferShare.UserOrGroupId = userRec.Id;
oppOfferShare.AccessLevel = 'edit';
oppOfferShare.RowCause = 'Manual';
if(offering!=null && userRec != null){
oppOffList.put(offering.Id+'-'+userRec.Id,oppOfferShare);
}
}
if(oppOffList.size() > 0) upsert oppOffList.values();
}
}
}
}
}
//Author - Srikanth Reddy
//Arguments - opOfferingList -> list of opportunity offering record
//Purpose - called from after insert trigger, after update.
//Date - 02/02/2023
public static void createOpportunitySolutionTeam(List<Opportunity_Offering__c> opOfferingList){
try{
Map<Id,Id> offeringIdvsVirtuasaId = new Map<Id,Id>();
Map<Id,Id> contactIdVsOpportunityId = new Map<Id,Id>();
Set<Id> oppIds = new Set<Id>();
List<Opportunity_Solution_Team__c> exisOppSolTeamList = new List<Opportunity_Solution_Team__c>();
List<Opportunity_Solution_Team__c> oppSolTeamList = new List<Opportunity_Solution_Team__c>();
Map<Id,Virtusa_Offering__c> virtuasaOfferingMap;
Map<String,List<Contact>> squadVsContactList = new Map<String,List<Contact>>();
Set<String> opportunityName = new Set<String>();
for(Opportunity_Offering__c oppOffering : opOfferingList){
offeringIdvsVirtuasaId.put(oppOffering.Id,oppOffering.Virtusa_Offering__c);
opportunityName.add(oppOffering.Opportunity_Name__c);
oppIds.add(oppOffering.Opportunity_Name__c);
}
exisOppSolTeamList = [SELECT Id, Role__c, SolTeam_Opportunity_Name__c, SolTeam_Team_Member__c FROM Opportunity_Solution_Team__c where SolTeam_Opportunity_Name__c IN :oppIds];
for(Opportunity_Solution_Team__c ost : exisOppSolTeamList){
contactIdVsOpportunityId.put(ost.SolTeam_Team_Member__c,ost.SolTeam_Opportunity_Name__c);
}
virtuasaOfferingMap = new Map<Id,Virtusa_Offering__c>([select id,Offering_Squad__c from Virtusa_Offering__c where Id IN :offeringIdvsVirtuasaId.values()]);
Set<String> squadSet = new Set<String>();
for(Virtusa_Offering__c virtuasaOff : virtuasaOfferingMap.values()){
squadSet.addall(virtuasaOff.Offering_Squad__c.split(';'));
}
System.debug('!!! ---->squadSet' + squadSet);
String squadSetValue = '(\'' + String.join(new List<String>(squadSet), '\',\'') + '\')';
String queryStr = 'select id,Off_Squad_Team_del__c from Contact where Off_Squad_Team_del__c includes ' + squadSetValue;
//List<Contact> contactList = [select id,Off_Squad_Team_del__c from Contact where Off_Squad_Team_del__c includes (:squadSetValue)];
List<Contact> contactList = Database.query(queryStr);
System.debug('!!! ---->contactList' + contactList);
for(Contact contactRecord : contactList){
for(String str : contactRecord.Off_Squad_Team_del__c.split(';')){
if(squadVsContactList.containsKey(str)) squadVsContactList.get(str).add(contactRecord);
else{ squadVsContactList.put(str,new List<Contact>{contactRecord}); }
}
}
for(Opportunity_Offering__c oppOffering : opOfferingList){
System.debug('!!! ---->262' + offeringIdvsVirtuasaId.get(oppOffering.Id));
System.debug('!!! ---->263' + virtuasaOfferingMap.get(offeringIdvsVirtuasaId.get(oppOffering.Id)).Offering_Squad__c);
System.debug('!!! ---->264contactIdVsOpportunityId' + contactIdVsOpportunityId);
System.debug('!!! ---->265' + squadVsContactList);
System.debug('!!! ---->266' + squadVsContactList.get(virtuasaOfferingMap.get(offeringIdvsVirtuasaId.get(oppOffering.Id)).Offering_Squad__c));
if(offeringIdvsVirtuasaId != null && offeringIdvsVirtuasaId.get(oppOffering.Id) != null
&& virtuasaOfferingMap != null && virtuasaOfferingMap.get(offeringIdvsVirtuasaId.get(oppOffering.Id)).Offering_Squad__c != null
&& squadVsContactList != null ){
for(Contact conRecord : squadVsContactList.get(virtuasaOfferingMap.get(offeringIdvsVirtuasaId.get(oppOffering.Id)).Offering_Squad__c)){
if(contactIdVsOpportunityId.size() == 0 ||
!(contactIdVsOpportunityId.containsKey(conRecord.Id)
&& contactIdVsOpportunityId.get(conRecord.Id) == oppOffering.Opportunity_Name__c) ){
System.debug('!!! ---->274' + conRecord.Id);
System.debug('!!! ---->275' + contactIdVsOpportunityId.get(oppOffering.Opportunity_Name__c));
oppSolTeamList.add(createOppSolTeam(oppOffering.Opportunity_Name__c,conRecord.Id));
}
}
}
}
if (oppSolTeamList.size() > 0 ) {
Database.insert(oppSolTeamList,false);
}
}catch(Exception e){
System.debug('An exception occurred: ' + e.getMessage());
}
}
//Author - Srikanth Reddy
//Arguments - oppId,contactId -> opportunityId, ContactId
//Purpose - private method called within class.
//Date - 02/02/2023
private static Opportunity_Solution_Team__c createOppSolTeam(Id oppId, Id contactId){
Opportunity_Solution_Team__c oppSolTeam = new Opportunity_Solution_Team__c();
oppSolTeam.SolTeam_Opportunity_Name__c = oppId;
oppSolTeam.SolTeam_Team_Member__c = contactId;
oppSolTeam.Role__c = 'OFFERING SQUAD MEMBER';
oppSolTeam.SolTeam_Order_Book_Percent__c = 0;
return oppSolTeam;
}
public static void updateRollUpFields(Map<Id, Opportunity_Offering__c > mapOldRecord,Map<Id, Opportunity_Offering__c > mapNewRecord,List<Opportunity_Offering__c> oldRecords){
Set<Id> oppIds = new Set<Id>();
Set<Id> oppIdErr = new Set<Id>();
Map<Id,Id> OffIdVsOppId = new Map<Id,Id>();
List<Opportunity> oppToUpdate = new List<Opportunity>();
if(oldRecords == null){
for(Opportunity_Offering__c oppOffer : mapNewRecord.values()){
OffIdVsOppId.put(oppOffer.Id,oppOffer.Opportunity_Name__c);
if(mapOldRecord == null || (oppOffer.Virtu_Offering_Split_p__c != mapOldRecord.get(oppOffer.Id).Virtu_Offering_Split_p__c
|| oppOffer.Opportunity_Name__c != mapOldRecord.get(oppOffer.Id).Opportunity_Name__c))
oppIds.add(oppOffer.Opportunity_Name__c);
}
}
if(oldRecords != null){
for(Opportunity_Offering__c oppOffer : oldRecords){
oppIds.add(oppOffer.Opportunity_Name__c);
}
}
List<Opportunity_Offering__c> oppOfferingList = [select id,Virtu_Offering_Split_p__c,Opportunity_Name__c from Opportunity_Offering__c
where Opportunity_Name__c IN :oppIds];
Map<Id,Decimal> oppIdVsOfferingList = new Map<Id,Decimal>();
for(Opportunity_Offering__c oppOffer : oppOfferingList){
if(oppIdVsOfferingList.containsKey(oppOffer.Opportunity_Name__c)){
Decimal newPerc = oppIdVsOfferingList.get(oppOffer.Opportunity_Name__c) + oppOffer.Virtu_Offering_Split_p__c;
oppIdVsOfferingList.put(oppOffer.Opportunity_Name__c,newPerc);
}else{
oppIdVsOfferingList.put(oppOffer.Opportunity_Name__c,oppOffer.Virtu_Offering_Split_p__c);
}
}
for(Id oppId : oppIdVsOfferingList.keySet()){
if(oppIdVsOfferingList.get(oppId) > 100 ){
oppIdErr.add(oppId);
}else{
Opportunity oppNew = new Opportunity(Id=oppId);
oppNew.Virtu_Sum_of_Offering_split__c = oppIdVsOfferingList.get(oppId);
oppToUpdate.add(oppNew);
}
}
if(oppIdErr.size() > 0){
for(Id offId : OffIdVsOppId.keySet()){
if(oppIdErr.contains(OffIdVsOppId.get(offId))){
//mapNewRecord.get(offId).addError('Offering Split % cannot exceed 100%. Please re-distribute the split% to proceed.');
}
}
//o.addError('Offering Split % cannot exceed 100%. Please re-distribute the split% to proceed.');
}
if(oppToUpdate.size() > 0) update oppToUpdate;
}
public static void createOpportunityOfferingShare(Map<Id, Opportunity_Offering__c > mapNewRecord){
OpportunityOfferingTriggerHelper.createShareRecordsFutureContext(mapNewRecord.keySet());
}
/*public static void createOpportunityOfferingShareToOwner(Map<Id, Opportunity_Offering__c > mapNewRecord){
OpportunityOfferingTriggerHelper.createShareRecordsForOppOffOwner(mapNewRecord.keySet());
}*/
/*public static void createDeleteShareRecords(List<Opportunity_Offering__c> oldRecords){
Set<Id> oppIds = new Set<Id>();
if(oldRecords != null){
for(Opportunity_Offering__c oppOffer : oldRecords){
oppIds.add(oppOffer.Opportunity_Name__c);
}
}
//OpportunityOfferingTriggerHelper.createDeleteShareRecords(oppIds);
}*/
public static void sendEmailNotificationUponUpdate(Map<Id, Opportunity_Offering__c > mapOldRecord,Map<Id, Opportunity_Offering__c > mapNewRecord,Boolean isUpdate){
List<Opportunity_Offering__c> opOfferingList = new List<Opportunity_Offering__c>();
for(Opportunity_Offering__c opOffering : mapNewRecord.values()){
OpportunityOfferingTriggerHandler.idVsOldPerc.put(opOffering.Id,opOffering.Old_Offering_Split__c);
if(opOffering.Virtu_Offering_Split_p__c != mapOldRecord.get(opOffering.Id).Virtu_Offering_Split_p__c){
opOfferingList.add(opOffering);
}
}
if(opOfferingList.size() > 0) sendEmailNotificationUponCreation(opOfferingList,isUpdate);
}
public static void sendEmailNotificationUponCreation(List<Opportunity_Offering__c> opOfferingList,Boolean isUpdate) {
Map<Id,Id> oppOfferIdVsOppId = new Map<Id,Id>();
Map<Id,Id> virOfferIdVsOppId = new Map<Id,Id>();
Map<Id,Set<Id>> oppIdVsOfferingIdSet = new Map<Id,Set<Id>>();
for(Opportunity_Offering__c opOffering : opOfferingList){
oppOfferIdVsOppId.put(opOffering.Id,opOffering.Opportunity_Name__c);
virOfferIdVsOppId.put(opOffering.Id,opOffering.Virtusa_Offering__c);
if(!oppIdVsOfferingIdSet.containsKey(opOffering.Opportunity_Name__c)){
oppIdVsOfferingIdSet.put(opOffering.Opportunity_Name__c,new Set<Id>{opOffering.Id});
}else{
oppIdVsOfferingIdSet.get(opOffering.Opportunity_Name__c).add(opOffering.Id);
}
}
Map<Id,Opportunity> offeringOpp = new Map<Id,Opportunity>([Select id,
name,
Group_SBU__c,
Account.Customer_Name__r.Client__r.Name,
Account.Customer_Name__r.name,
Account.name,
Opportunity_ID__c,
Deal_Type__c,
StageName,
Amount,
CurrencyIsoCode,
Opportunity_Amount_Converted_New__c,
Opportunity_CS_Owner__r.Name,
Owner.name,
OwnerId,
Owner.Email,
Account.owner.name,
Account.CSM__r.Name
from Opportunity where id In :oppOfferIdVsOppId.values() ]);
Map<Id,Opportunity_Offering__c> idVsRelOfferingRecord = new Map<Id,Opportunity_Offering__c>([select id,
Opportunity_Name__c,Virtusa_Offering__c
from Opportunity_Offering__c
where Opportunity_Name__c IN :offeringOpp.keySet()
and Virtu_Offering_Split_p__c != 0
and ID Not In :oppOfferIdVsOppId.keySet()]);
for(Opportunity_Offering__c opOffering : idVsRelOfferingRecord.values()){
virOfferIdVsOppId.put(opOffering.Id,opOffering.Virtusa_Offering__c);
if(!oppIdVsOfferingIdSet.containsKey(opOffering.Opportunity_Name__c)){
oppIdVsOfferingIdSet.put(opOffering.Opportunity_Name__c,new Set<Id>{opOffering.Id});
}else{
oppIdVsOfferingIdSet.get(opOffering.Opportunity_Name__c).add(opOffering.Id);
}
}
Map<Id,Virtusa_Offering__c> vOfferingList = new Map<Id,Virtusa_Offering__c>([Select id,Name,
Offering_Squad__c,
Virtu_Squad_Email_Address__c
from Virtusa_Offering__c
where id In :virOfferIdVsOppId.values() ]);
List<String> squadTeam = new List<String>();
Map<Id,List<String>> virOffIdVsEmail = new Map<Id,List<String>>();
for(Virtusa_Offering__c vr : vOfferingList.values()){
if(vr.Offering_Squad__c != null) squadTeam.add(vr.Offering_Squad__c);
}
Map<String,String> emailVsName = new Map<String,String>();
String slist = '';
for (String s: squadTeam) {
slist += '\'' + s + '\',';
}
slist = slist.substring (0,slist.length() -1);
String value = '(\'' + String.join(squadTeam, '\',\'') + '\')';
String queryString = 'select id,email,name,Offering_squad_Leader__c,Off_Squad_Team_del__c'+
' from contact' +
' where email != null and ' +
' Offering_squad_Leader__c = true and ' +
' Off_Squad_Team_del__c includes' + value;
List<Contact> contactList = DataBase.query(queryString);
for(Virtusa_Offering__c vr : vOfferingList.values()){
if(vr.Offering_Squad__c != null){
for(Contact con : contactList){
emailVsName.put(con.email,con.name);
if(vr.Offering_Squad__c != null && con.Off_Squad_Team_del__c.contains(vr.Offering_Squad__c)){
if(!virOffIdVsEmail.containskey(vr.Id))virOffIdVsEmail.put(vr.Id,new List<String>{con.email});
else{
virOffIdVsEmail.get(vr.Id).add(con.email);
}
}
}
}
}
for(Opportunity_Offering__c opOffering : opOfferingList){
Set<String> to = new Set<String>();
if(offeringOpp.get(opOffering.Opportunity_Name__c) != null){
Opportunity opp = offeringOpp.get(opOffering.Opportunity_Name__c);
if(opp.owner.email != null){
to.add(opp.owner.email);
emailVsName.put(opp.owner.email,opp.owner.name);
}
Set<Id> relatedOfferingIds = oppIdVsOfferingIdSet.get(opOffering.Opportunity_Name__c);
if(relatedOfferingIds != null && relatedOfferingIds.size() > 0){
for(Id relatedOffId : relatedOfferingIds){
if(virOffIdVsEmail != null && idVsRelOfferingRecord != null && idVsRelOfferingRecord.get(relatedOffId) != null
&& virOffIdVsEmail.get(idVsRelOfferingRecord.get(relatedOffId).Virtusa_Offering__c) != null)
to.addAll(virOffIdVsEmail.get(idVsRelOfferingRecord.get(relatedOffId).Virtusa_Offering__c));
}
}
}
if(virOffIdVsEmail != null && virOffIdVsEmail.get(opOffering.Virtusa_Offering__c) != null){
to.addAll(virOffIdVsEmail.get(opOffering.Virtusa_Offering__c));
}
List<String> cc = new List<String>();
String virtusaName = opOffering.Virtusa_Offering__c != null && vOfferingList != null && vOfferingList.get(opOffering.Virtusa_Offering__c) != null ?
vOfferingList.get(opOffering.Virtusa_Offering__c).Name : '';
String subject = 'Virtusa Offering Notification';
String body = generateMailBody(offeringOpp.get(opOffering.Opportunity_Name__c),opOffering.Name,virtusaName,
opOffering.Virtu_Offering_Split_p__c,opOffering.Old_Offering_Split__c,isUpdate);
String repmail = '';
SingleEmailUtility seu = new SingleEmailUtility();
seu.sendMail(new List<String>(to), cc, repmail, subject, body);
}
}
private static string generateMailBody(Opportunity offeringOpp,String offeringName,String virtusaName,
Decimal splitPerc,Decimal OldsplitPerc, Boolean isUpdate){
return OpportunityOfferingTriggerHelper.generateMailBody(offeringOpp,offeringName,virtusaName,
splitPerc,OldsplitPerc,isUpdate);
}
//Author - Viji
//Arguments - opOfferingList -> list of opportunity offering record
//Purpose - called from after update,after insert
//Date - 21/03/2023
public static void updateOffOwnerAccessToOppOwner(Map<Id, Opportunity_Offering__c > mapNewRecord){
OpportunityOfferingTriggerHelper.updateOffOwnerAccessToOppOwnerHelper(mapNewRecord.keyset());
}
}
------------------------TEST CLASSES---------------------------
@isTest
public class OpportunityOfferingController_Test {
@testSetup
static void createData(){
Test.startTest();
TestRecordsCreator recordCreator = new TestRecordsCreator();
Contact contactRecord = recordCreator.createContact(false);
contactRecord.Offering_squad_Leader__c = true;
contactRecord.Off_Squad_Team_del__c = 'Cloud Migration';
insert contactRecord;
Opportunity opportunity = recordCreator.createOpportunity(false);
opportunity.stagename = '1 - Opportunity';
insert opportunity;
Virtusa_Offering__c virtusaOffering = recordCreator.createVirtusaOffering(false);
virtusaOffering.Name = 'No Offerings';
virtusaOffering.Offering_Deal_Type__c = 'No Offerings Required';
virtusaOffering.Offering_Portfolio__c = 'No Offering required';
insert virtusaOffering;
Opportunity_Offering__c opportunityOfferingOne = new Opportunity_Offering__c(
Opportunity_Name__c = opportunity.id,
Virtusa_Offering__c = virtusaOffering.id
);
opportunityOfferingOne.Virtu_Offering_Split_p__c = 0;
insert opportunityOfferingOne;
Test.stopTest();
}
@isTest
static void test_getOfferings() {
Id oppId = [select Id from opportunity limit 1].Id;
List<OpportunityOfferingWrapper> offeringWrap = OpportunityOfferingSaveEditAllController.getOfferings(oppId);
}
@isTest
static void test_getOppDetails() {
Id oppId = [select Id from opportunity limit 1].Id;
OpportunityOfferingSaveEditAllController.OppOfferWrapper oppWrapper = OpportunityOfferingSaveEditAllController.getOppDetails(oppId);
}
@isTest
static void test_saveDRList() {
Id oppId = [select Id,Opportunity_Name__c from Opportunity_Offering__c limit 1].Opportunity_Name__c;
List<OpportunityOfferingWrapper> offeringWrap = OpportunityOfferingSaveEditAllController.getOfferings(oppId);
Map<String,String> saveResult = OpportunityOfferingSaveEditAllController.saveDRList(oppId,'Non Consulting',offeringWrap);
Map<String,String> saveResultOne = OpportunityOfferingSaveEditAllController.saveDRList(oppId,'Consulting',offeringWrap);
//Map<String,String> saveResult = OpportunityOfferingSaveEditAllController.saveDRList(oppId,'Consulting',offeringWrap);
}
@isTest
static void test_saveDRList1() {
TestRecordsCreator recordCreator = new TestRecordsCreator();
Virtusa_Offering__c virtusaOffering = recordCreator.createVirtusaOffering(false);
insert virtusaOffering;
Opportunity_Offering__c opportunityOfferingOne = new Opportunity_Offering__c();
opportunityOfferingOne.Virtu_Offering_Split_p__c = 10;
opportunityOfferingOne.Virtusa_Offering__c = virtusaOffering.Id;
Id oppId = [select Id,Opportunity_Name__c from Opportunity_Offering__c limit 1].Opportunity_Name__c;
opportunityOfferingOne.Opportunity_Name__c = oppId;
insert opportunityOfferingOne;
List<OpportunityOfferingWrapper> offeringWrap = OpportunityOfferingSaveEditAllController.getOfferings(oppId);
Map<String,String> saveResult = OpportunityOfferingSaveEditAllController.saveDRList(oppId,'No Offerings Required',offeringWrap);
}
}
---------------------------------
@isTest
public class TestOpportunityOfferingTriggerHandler {
@testSetup
static void createData(){
Test.startTest();
TestRecordsCreator recordCreator = new TestRecordsCreator();
Contact contactRecord = recordCreator.createContact(false);
contactRecord.Offering_squad_Leader__c = true;
contactRecord.Off_Squad_Team_del__c = 'Delivery Transformation';
contactRecord.email = Userinfo.getUserEmail();
insert contactRecord;
Opportunity opportunity = recordCreator.createOpportunity(false);
opportunity.stagename = '1 - Opportunity';
insert opportunity;
Virtusa_Offering__c virtusaOffering = recordCreator.createVirtusaOffering(false);
virtusaOffering.Name = 'No Offerings';
insert virtusaOffering;
Id ids = [select id from opportunity limit 1].Id;
Test.stopTest();
}
@isTest static void deleteNoOffering(){
TestRecordsCreator recordCreator = new TestRecordsCreator();
Test.startTest();
Id ids = [select id from opportunity limit 1].Id;
Virtusa_Offering__c virtusaOffering = new Virtusa_Offering__c(
Name = 'test offering1234' ,
offering_Squad__c = 'Cloud Migration',
Offering_Portfolio__c = 'Consulting',
Offering_Deal_Type__c = 'Consulting',
//Offering_Area__c = 'Cloud',
Virtu_Squad_Email_Address__c = '1234@virtusa.com',
Virtu_Project_Id__c = '1234'
);
insert virtusaOffering;
Id virIds = virtusaOffering.Id;
Opportunity_Offering__c opportunityOfferingOne = new Opportunity_Offering__c(
Opportunity_Name__c = ids,
Virtusa_Offering__c = virIds
);
opportunityOfferingOne.Virtu_Offering_Split_p__c = 20;
insert opportunityOfferingOne;
//Id virtusaId = [select id from Virtusa_Offering__c where Name != 'No Offerings' limit 1].Id;
opportunityOfferingOne.Virtusa_Offering__c = virtusaOffering.Id;
opportunityOfferingOne.Virtu_Offering_Split_p__c = 10;
update opportunityOfferingOne;
Virtusa_Offering__c virtusaOfferingTwo = new Virtusa_Offering__c(
Name = 'test offering12' ,
offering_Squad__c = 'Delivery Transformation',
Offering_Portfolio__c = 'Consulting',
Offering_Deal_Type__c = 'Consulting',
Virtu_Squad_Email_Address__c = '12@virtusa.com',
Virtu_Project_Id__c = '12'
);
insert virtusaOfferingTwo;
Id virIdTwo = virtusaOfferingTwo.Id;
Opportunity_Offering__c opportunityOfferingTwo = new Opportunity_Offering__c(
Opportunity_Name__c = ids,
Virtusa_Offering__c = virIdTwo
);
opportunityOfferingTwo.Virtu_Offering_Split_p__c = 20;
insert opportunityOfferingTwo;
Opportunity_Offering__c opportunityOffering = [Select id from Opportunity_Offering__c limit 1];
delete opportunityOffering;
Test.stopTest();
}
}Editor is loading...
Leave a Comment