Untitled

 avatar
unknown
plain_text
2 months ago
43 kB
2
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();
    }
}
Leave a Comment