Untitled
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(); } }
Leave a Comment