function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
kiran2000kiran2000 

Batch apex

Hi All,

 

  The below batch updates account statistics records with the values of  # accounts,# calls ,# days worked on Teritorry type = Territory,Territory Type = District, Territory Type= Region and Territory Type = Nation from Call object(Call2_vod__c)

 

Nation

  |

  Region

    |

    District

        |

       Territory A

       Territory B

       Territory C

......

 

 

Values(#Accounts,#Calls,#days Worked) on Territory rollups to District level and values on District level rollups to Region and similarly to Nation level.

 

The issue i have is # Accounts on Disctrict level,Region level and Nation Level.

 

Lets say Territory A has Account A,Account B

                Territory B has Account B,Account C,Account D

                Territory C has Account A,Account B,Account C

 

So # Accounts on Territory A is 2

                                 Territory B is 3

                                 Territory C is 3

 

which displays correctly on Account Satistics records for Territory level

 

But the issue on District level ..the value of # Accounts is  2+3+3 = 8  (rollups up value )

 

 I neeed to get unique set accounts which  should be # Accounts = Account A+Account B+Account C +Account D = 4

 

So i should get # accounts on Distrcit level should be 4 but right now it displays 8 .

 

Can some one help me in fixing the below batch apex.

 

 

I have to post in different sections as it exceeded 20,000 char.Sorry about this

 

 

 

kiran2000kiran2000

global class UpdateAccountStatisticsRecsMonthly implements Database.Batchable<sObject>,Database.Stateful{

    

    global Map<String,Map<String,Map<String,Map<String,Map<String,Decimal>>>>> FinalMap = new Map<String,Map<String,Map<String,Map<String,Map<String,Decimal>>>>>();

    global Date MonthStartDate;

    global Date MonthEndDate;

    global Date currentDate = Date.today();

    global UpdateAccountStatisticsRecsMonthly() {

        

        

        //Date currentDate = date.parse('04/01/2013');

        System.debug(':::::::::::::::'+currentDate);

        

        Integer yearValue = currentDate.Year();

        System.debug('::yearValue::'+yearValue);

                

        if(currentDate >= date.newInstance(yearValue, 1, 1) && currentDate <= date.newInstance(yearValue, 1, 31)){

            System.debug(':::::Jan ::::::::::');

            MonthStartDate = date.newInstance(yearValue, 1, 1);

            MonthEndDate =   date.newInstance(yearValue, 1, 31);  

        }else if(currentDate >= date.newInstance(yearValue, 2, 1) && currentDate <= date.newInstance(yearValue, 2, 29)){

            System.debug(':::::Feb::::::::::');

            MonthStartDate = date.newInstance(yearValue, 2, 1);

            MonthEndDate =   date.newInstance(yearValue, 2, 29);

        }else if(currentDate >= date.newInstance(yearValue, 3, 1) && currentDate <= date.newInstance(yearValue, 3, 31)){

            System.debug(':::::Mar::::::::::');

            MonthStartDate = date.newInstance(yearValue, 3, 1);

            MonthEndDate =   date.newInstance(yearValue, 3, 31);

        } else if(currentDate >= date.newInstance(yearValue, 4, 1) && currentDate <= date.newInstance(yearValue, 4, 30)){

            System.debug(':::::Apr::::::::::');

            MonthStartDate = date.newInstance(yearValue, 4, 1);

            MonthEndDate =   date.newInstance(yearValue, 4, 30);

        } else if(currentDate >= date.newInstance(yearValue, 5, 1) && currentDate <= date.newInstance(yearValue, 5, 31)){

            System.debug(':::::May::::::::::');

            MonthStartDate = date.newInstance(yearValue, 5, 1);

            MonthEndDate =   date.newInstance(yearValue, 5, 31);

        }else if(currentDate >= date.newInstance(yearValue, 6, 1) && currentDate <= date.newInstance(yearValue, 6, 30)){

            System.debug(':::::Jun::::::::::');

            MonthStartDate = date.newInstance(yearValue, 6, 1);

            MonthEndDate =   date.newInstance(yearValue, 6, 30);

        }else if(currentDate >= date.newInstance(yearValue, 7, 1) && currentDate <= date.newInstance(yearValue, 7, 31)){

            System.debug(':::::July::::::::::');

            MonthStartDate = date.newInstance(yearValue, 7, 1);

            MonthEndDate =   date.newInstance(yearValue, 7, 31);

        }else if(currentDate >= date.newInstance(yearValue, 8, 1) && currentDate <= date.newInstance(yearValue, 8, 31)){

            System.debug(':::::Aug::::::::::');

            MonthStartDate = date.newInstance(yearValue, 8, 1);

            MonthEndDate =   date.newInstance(yearValue, 8, 31);

        }else if(currentDate >= date.newInstance(yearValue, 9, 1) && currentDate <= date.newInstance(yearValue, 9, 30)){

            System.debug(':::::Sep::::::::::');

            MonthStartDate = date.newInstance(yearValue, 9, 1);

            MonthEndDate =   date.newInstance(yearValue, 9, 30);

        }else if(currentDate >= date.newInstance(yearValue, 10, 1) && currentDate <= date.newInstance(yearValue, 10, 31)){

            System.debug(':::::Oct::::::::::');

            MonthStartDate = date.newInstance(yearValue, 10, 1);

            MonthEndDate =   date.newInstance(yearValue, 10, 31);

        }else if(currentDate >= date.newInstance(yearValue, 11, 1) && currentDate <= date.newInstance(yearValue, 11, 30)){

            System.debug(':::::Nov::::::::::');

            MonthStartDate = date.newInstance(yearValue, 11, 1);

            MonthEndDate =   date.newInstance(yearValue, 11, 30);

        }else if(currentDate >= date.newInstance(yearValue, 12, 1) && currentDate <= date.newInstance(yearValue, 12, 31)){

            System.debug(':::::Dec::::::::::');

            MonthStartDate = date.newInstance(yearValue, 12, 1);

            MonthEndDate =   date.newInstance(yearValue, 12, 31);

        } 

        System.debug('::::::MonthStartDate::::::::'+MonthStartDate);

    }

kiran2000kiran2000

global Database.QueryLocator start(Database.BatchableContext BC){

       // Set<Id> accIdSet = new Set<Id>{'a1vZ0000000Fox9IAC'};

        return Database.getQueryLocator('SELECT Id,Accounts__c,Calls__c,Days_Worked__c,Reaches__c,Account_Type__c,Avg_Calls__c,Quarter__c,Reach_Status__c,Territory__c,Territory_Name__c,Territory_Type__c,OwnerId,Territory_Id__c,Parent_Territory_Id__c,Grand_Parent_Territory_Id__c,Great_Grand_Parent_Id__c,Business_Days_in_Quarter__c,Date__c,Date_Type_Dashboard__c FROM Account_Statistic__c WHERE Date__c = :MonthStartDate AND Date_Type_Dashboard__c=\'Monthly\' AND Territory_Type__c = \'Territory\'');

       // return Database.getQueryLocator('SELECT Id,Accounts__c,Calls__c,Days_Worked__c,Reaches__c,Account_Type__c,Avg_Calls__c,Quarter__c,Reach_Status__c,Territory__c,Territory_Name__c,Territory_Type__c,OwnerId,Territory_Id__c,Parent_Territory_Id__c,Grand_Parent_Territory_Id__c,Great_Grand_Parent_Id__c,Business_Days_in_Quarter__c FROM Account_Statistic__c WHERE Id IN :accIdSet AND Quarter__c = :quarterStartDate AND Territory_Type__c = \'Territory\'');

    }

    

    global void execute(Database.BatchableContext BC, List<sObject> scope){

        List<Account_Statistic__c> accStatisticList = (List<Account_Statistic__c>)scope;

       Account_Statistic__c accStaticRec = accStatisticList[0];

       System.debug('::::::accStaticRec ::::::::'+accStaticRec );

        

        Map<Id,List<Account_Statistic__c>> terrIdAndListOfAccStatMap = new Map<Id,List<Account_Statistic__c>>();

        Map<Id,Set<Id>> terrIdAndSetOfPractionerAccIdMap = new Map<Id,Set<Id>>();

        

        Map<Id,Set<Id>> terrIdAndSetOfNonTargetPractionerAccIdMap  = new Map<Id,Set<Id>>();//added on May 21

        Map<Id,Set<Id>> terrIdAndSetOfTargetPractionerAccIdMap  = new Map<Id,Set<Id>>();//added on May 21

        

        Map<Id,Set<Id>> terrIdAndSetOfPharmacyAccIdMap = new Map<Id,Set<Id>>();

        

        Set<String> relatedIdSet = new Set<String>();

        Map<Id,Id> groupIdAndTerrIdMap = new Map<Id,Id>();

        

        relatedIdSet.add(accStaticRec.Territory_Id__c);

       

        if(relatedIdSet != NULL && relatedIdSet.size() > 0){

            for(Group groupRec : [SELECT Id,RelatedId FROM Group WHERE RelatedId IN :relatedIdSet] ){

                groupIdAndTerrIdMap.put(groupRec.Id,groupRec.RelatedId );         

            }

        }

        if(groupIdAndTerrIdMap != NULL && groupIdAndTerrIdMap.size() > 0){

        

            for(AccountShare accShare : [SELECT Id,AccountId,Account.RecordTypeId,Account.RecordType.Name,Account.Target__c, UserOrGroupId FROM AccountShare WHERE (RowCause = 'Territory' OR RowCause = 'TerritoryManual') AND UserOrGroupId IN :groupIdAndTerrIdMap.keySet() AND (Account.RecordType.Name = 'Practitioner' OR Account.RecordType.Name = 'Pharmacy')] ){

                 

                 if(accShare.Account.RecordType.Name == 'Practitioner'){

                     if(accShare.Account.Target__c){

                        Id RelatedId = groupIdAndTerrIdMap.get(accShare.UserOrGroupId );

                        

                        if(!terrIdAndSetOfTargetPractionerAccIdMap.containsKey(RelatedId) )

                        terrIdAndSetOfTargetPractionerAccIdMap.put(RelatedId,new Set<Id>());

                        

                        terrIdAndSetOfTargetPractionerAccIdMap.get(RelatedId).add(accShare.AccountId);

                    }else{

                        Id RelatedId = groupIdAndTerrIdMap.get(accShare.UserOrGroupId );

                        

                        if(!terrIdAndSetOfNonTargetPractionerAccIdMap.containsKey(RelatedId) )

                        terrIdAndSetOfNonTargetPractionerAccIdMap.put(RelatedId,new Set<Id>());

                        

                        terrIdAndSetOfNonTargetPractionerAccIdMap.get(RelatedId).add(accShare.AccountId);    

                    }

                }else if(accShare.Account.RecordType.Name == 'Pharmacy'){

                    Id RelatedId = groupIdAndTerrIdMap.get(accShare.UserOrGroupId );

                    

                    if(!terrIdAndSetOfPharmacyAccIdMap.containsKey(RelatedId) )

                    terrIdAndSetOfPharmacyAccIdMap.put(RelatedId,new Set<Id>());

                    

                    terrIdAndSetOfPharmacyAccIdMap.get(RelatedId).add(accShare.AccountId);    

                }

                       

            }

        }

        Set<Id> accIdSet = new Set<Id>();

        

        if(accStaticRec.Account_Type__c == 'Target'){

            accIdSet = terrIdAndSetOfTargetPractionerAccIdMap.get(accStaticRec.Territory_Id__c);

        }else if(accStaticRec.Account_Type__c == 'Non-Target'){

            accIdSet = terrIdAndSetOfNonTargetPractionerAccIdMap.get(accStaticRec.Territory_Id__c);

        }else if(accStaticRec.Account_Type__c == 'Pharmacy'){

            accIdSet = terrIdAndSetOfPharmacyAccIdMap.get(accStaticRec.Territory_Id__c);

        }

        

       // Set<Id> accIdSet = terrIdAndSetOfAccIdMap.get(accStaticRec.Territory_Id__c);

        if(accIdSet != NULL && accIdSet.size() > 0){

            //AggregateResult[] groupedResultCall = [SELECT Account_vod__c,count(Id) FROM Call2_vod__c WHERE Date_First_Day_of_Quarter__c = :accStaticRec.Quarter__c AND Account_Type__c =:accStaticRec.Account_Type__c AND Territory_vod__c = :accStaticRec.Territory__c AND Account_vod__c IN :accIdSet  GROUP BY Account_vod__c ];

            // AggregateResult[] groupedResultCall = [SELECT Account_vod__c,count(Id) FROM Call2_vod__c WHERE Call_Date_vod__c >= :QuarterStartDate  AND Call_Date_vod__c <= :QuarterEndDate  AND Account_Type__c =:accStaticRec.Account_Type__c AND Territory_vod__c = :accStaticRec.Territory__c AND Account_vod__c IN :accIdSet  GROUP BY Account_vod__c ];

            AggregateResult[] groupedResultCall = [SELECT Account_vod__c,count(Id) FROM Call2_vod__c WHERE Call_Date_vod__c >= :MonthStartDate  AND Call_Date_vod__c <= :MonthEndDate  AND Account_Type__c =:accStaticRec.Account_Type__c 

                                                        AND Territory_vod__c = :accStaticRec.Territory__c AND Status_vod__c = 'Submitted_vod' AND (Call_Type_vod__c != 'Call Only' OR Call_Type_vod__c != 'Event Only' OR Call_Type_vod__c != 'Event Detail')

                                                        AND Account_vod__c IN :accIdSet  

                                                        //PS added 7.11.2013

                                                        AND Activity_Type__c <> 'Staff'

                                                        GROUP BY Account_vod__c ];

            

            System.debug('::::groupedResultCall:::::'+groupedResultCall);

            Map<Id,Integer> AccIdAndCountOfCallMap = new Map<Id,Integer>();

            Integer totalCallsCount = 0;

            

            for (AggregateResult ar : groupedResultCall)  {

                String accId  = String.ValueOf(ar.get('Account_vod__c'));

                Integer countOfCall = Integer.valueof(ar.get('expr0'));

                totalCallsCount += countOfCall; 

                AccIdAndCountOfCallMap.put(accId,countOfCall );

            }

            

            if(accStaticRec.Reach_Status__c == 'Reached'){

                accStaticRec.Accounts__c = AccIdAndCountOfCallMap.size();

                accStaticRec.Calls__c = totalCallsCount;

                //accStaticRec.Days_Worked__c = ;

                accStaticRec.Avg_Calls__c = totalCallsCount;

                String terrName = '%'+accStaticRec.Territory__c+'%';

                

                Decimal timeOffHrs = 0;

                for(Time_Off_Territory_vod__c timeOff : [SELECT Id ,Territory_vod__c,Hours_vod__c FROM Time_Off_Territory_vod__c 

                                                            WHERE Territory_vod__c 

                                                            LIKE :terrName

                                                            AND Date_vod__c >= :MonthStartDate 

                                                            AND Date_vod__c <= :MonthEndDate

                                                            AND Status_vod__c = 'Approved'

                                                            AND Date_vod__c>= :currentDate]){

                    if(timeOff.Hours_vod__c > 0){

                         timeOffHrs += timeOff.Hours_vod__c;

                    }

                }

                System.debug('::::::Days_Worked__c   ::::::::'+accStaticRec.Days_Worked__c  );

                System.debug('::::::Business_Days_in_Quarter__c ::::::::'+accStaticRec.Business_Days_in_Quarter__c  );

                System.debug('::::::timeOffHrs::::::::'+timeOffHrs);

                

                accStaticRec.Days_Worked__c = accStaticRec.Business_Days_in_Quarter__c - (timeOffHrs/8);

                

                

            }else if(accStaticRec.Reach_Status__c == 'Not Reached'){

                if(AccIdAndCountOfCallMap.size() == accIdSet.size()){

                    accStaticRec.Accounts__c = 0;

                }else{

                    accStaticRec.Accounts__c = accIdSet.size() - AccIdAndCountOfCallMap.size();

                }

                

                accStaticRec.Calls__c = 0;

                accStaticRec.Days_Worked__c = 0;

                accStaticRec.Avg_Calls__c = 0;

                accStaticRec.Days_Worked__c = 0;

            }

            

        }else {

            accStaticRec.Calls__c = 0;

            accStaticRec.Days_Worked__c = 0;

            accStaticRec.Avg_Calls__c = 0;

            accStaticRec.Accounts__c = 0;

        }

        

      

kiran2000kiran2000

  if(accStaticRec != NULL)    {

            //commented by Maha

            update accStaticRec;

            

            System.debug(':::::accStaticRec::::::::::'+accStaticRec);

            

            //----------------------Processing Map Formation---------------------------------------------

           

 

            if(!FinalMap.containsKey(accStaticRec.Great_Grand_Parent_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c)){

            

                Map<String,Map<String,Decimal>> territoryMap = new Map<String,Map<String,Decimal>>();

                String mapKey = accStaticRec.Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c;

                territoryMap.put(mapKey,new Map<String,Decimal>());

                territoryMap.get(mapKey).put('#Accounts',accStaticRec.Accounts__c);

                territoryMap.get(mapKey).put('#Calls',accStaticRec.Calls__c);

                territoryMap.get(mapKey).put('#DaysWorked',accStaticRec.Days_Worked__c);

                

                Map<String,Map<String,Map<String,Decimal>>> DistrictMap = new Map<String,Map<String,Map<String,Decimal>>>();

                DistrictMap.put(accStaticRec.Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c,territoryMap);

                

                Map<String,Map<String,Map<String,Map<String,Decimal>>>> RegionMap = new Map<String,Map<String,Map<String,Map<String,Decimal>>>>();

                RegionMap.put(accStaticRec.Grand_Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c,DistrictMap);

                

                FinalMap.put(accStaticRec.Great_Grand_Parent_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c,RegionMap);

                

            }else {

                Map<String,Map<String,Map<String,Map<String,Decimal>>>> RegionFinalMap = new Map<String,Map<String,Map<String,Map<String,Decimal>>>>();

                RegionFinalMap = FinalMap.get(accStaticRec.Great_Grand_Parent_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c);

                if(!RegionFinalMap.containsKey(accStaticRec.Grand_Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c)){

                    

                    Map<String,Map<String,Decimal>> territoryMap = new Map<String,Map<String,Decimal>>();

                

                    String mapKey3 = accStaticRec.Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c;

                    territoryMap.put(mapKey3,new Map<String,Decimal>());

                    territoryMap.get(mapKey3).put('#Accounts',accStaticRec.Accounts__c);

                    territoryMap.get(mapKey3).put('#Calls',accStaticRec.Calls__c);

                    territoryMap.get(mapKey3).put('#DaysWorked',accStaticRec.Days_Worked__c);

                    

                    Map<String,Map<String,Map<String,Decimal>>> DistrictMap = new Map<String,Map<String,Map<String,Decimal>>>();

                    DistrictMap.put(accStaticRec.Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c,territoryMap);

                    

                   // Map<String,Map<String,Map<String,Map<String,Integer>>>> RegionMap = new Map<String,Map<String,Map<String,Map<String,Integer>>>>();

                   // RegionMap.put(accStaticRec.Grand_Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c,DistrictMap);

                   // FinalMap.get(accStaticRec.Great_Grand_Parent_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c).put(RegionMap);

                  

                   RegionFinalMap.put(accStaticRec.Grand_Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c,DistrictMap);

                   FinalMap.put(accStaticRec.Great_Grand_Parent_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c,RegionFinalMap);

                    

                }else{

                    Map<String,Map<String,Map<String,Decimal>>> DistrictFinalMap = RegionFinalMap.get(accStaticRec.Grand_Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c);

                    if(!DistrictFinalMap.containsKey(accStaticRec.Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c)){

                        Map<String,Map<String,Decimal>> territoryMap = new Map<String,Map<String,Decimal>>();

                        

                        String mapKey2 = accStaticRec.Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c;

                        territoryMap.put(mapKey2,new Map<String,Decimal>());

                        territoryMap.get(mapKey2).put('#Accounts',accStaticRec.Accounts__c);

                        territoryMap.get(mapKey2).put('#Calls',accStaticRec.Calls__c);

                        territoryMap.get(mapKey2).put('#DaysWorked',accStaticRec.Days_Worked__c);

                        

                        Map<String,Map<String,Map<String,Decimal>>> DistrictMap = new Map<String,Map<String,Map<String,Decimal>>>();

                       // DistrictMap.put(accStaticRec.Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c,territoryMap);

                       // FinalMap.get(accStaticRec.Great_Grand_Parent_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c).get(accStaticRec.Grand_Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c).put(DistrictMap);

                        

                        DistrictFinalMap.put(accStaticRec.Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c,territoryMap);

                        RegionFinalMap.put(accStaticRec.Grand_Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c,DistrictFinalMap);

                        FinalMap.put(accStaticRec.Great_Grand_Parent_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c,RegionFinalMap);

                    }else{

                        Map<String,Map<String,Decimal>> TerritoryFinalMap = DistrictFinalMap.get(accStaticRec.Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c);

                        

                      //  Map<String,Map<String,Decimal>> territoryMap = new Map<String,Map<String,Decimal>>();

                        String mapKey1 = accStaticRec.Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c;

                        TerritoryFinalMap.put(mapKey1,new Map<String,Decimal>());

                        TerritoryFinalMap.get(mapKey1).put('#Accounts',accStaticRec.Accounts__c);

                        TerritoryFinalMap.get(mapKey1).put('#Calls',accStaticRec.Calls__c);

                        TerritoryFinalMap.get(mapKey1).put('#DaysWorked',accStaticRec.Days_Worked__c);

                        

                        

                        DistrictFinalMap.put(accStaticRec.Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c,TerritoryFinalMap);

                        RegionFinalMap.put(accStaticRec.Grand_Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c,DistrictFinalMap);

                        FinalMap.put(accStaticRec.Great_Grand_Parent_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c,RegionFinalMap);

                        

                       // FinalMap.get(accStaticRec.Great_Grand_Parent_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c).get(accStaticRec.Grand_Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c).get(accStaticRec.Parent_Territory_Id__c+accStaticRec.Account_Type__c+accStaticRec.Reach_Status__c).put(TerritoryFinalMap);

                    }

                    

                }

            }

                

       } 

       System.debug(':::::FinalMap:::::::'+FinalMap);    

    }

kiran2000kiran2000

global void finish(Database.BatchableContext BC){

        

        System.debug('::::::FinalMap-Finish::::::::::'+FinalMap);

 

        List<Account_Statistic__c> accStaticListUpdate = new List<Account_Statistic__c>(); //Collection of UpdateList

        List<Account_Statistic__c> districtAccList = new List<Account_Statistic__c>(); //Collection of AccStatistic List of type District.

        List<Account_Statistic__c> regionAccList = new List<Account_Statistic__c>(); //Collection of accStatistic List of type Region

        List<Account_Statistic__c> NationAccList = new List<Account_Statistic__c>(); //Collection of accStatistic of type Region

        

        Map<String,Map<String,Decimal>> ProcessedDistrictMap = new Map<String,Map<String,Decimal>>(); 

        Map<String,Map<String,Decimal>> ProcessedRegionMap = new Map<String,Map<String,Decimal>>();

        

        for(Account_Statistic__c accStatic : [SELECT Id,Accounts__c,Calls__c,Days_Worked__c,Reaches__c,Account_Type__c,Avg_Calls__c,

                                                Quarter__c,Reach_Status__c,Territory__c,Territory_Name__c,Territory_Type__c,

                                                Business_Days_in_Quarter__c,OwnerId,Territory_Id__c,Parent_Territory_Id__c,

                                                Grand_Parent_Territory_Id__c,Great_Grand_Parent_Id__c,Date__c,Date_Type_Dashboard__c

                                              FROM Account_Statistic__c 

                                              WHERE Date__c = :MonthStartDate AND Date_Type_Dashboard__c='Monthly' AND Territory_Type__c != 'Territory']){

            if(accStatic.Territory_Type__c == 'District'){

                districtAccList.add(accStatic);

            }else if(accStatic.Territory_Type__c == 'Region'){

                regionAccList.add(accStatic);

            }else if(accStatic.Territory_Type__c == 'Nation'){

                NationAccList.add(accStatic);

            }

        }

        System.debug(':::::::districtAccList:::::::::'+districtAccList);

        System.debug(':::::::districtAccList-Size:::::::::'+districtAccList.size());

        System.debug(':::::::regionAccList:::::::::'+regionAccList);

        System.debug(':::::::regionAccList-Size:::::::::'+regionAccList.size());

        System.debug(':::::::NationAccList:::::::::'+NationAccList);

        System.debug(':::::::NationAccList:::::::::'+NationAccList.size());

        //---------------------------------District Records Processing-----------------------------------------------------

        for(Account_Statistic__c accStatic : districtAccList){

            Decimal totalAccounts = 0;

            Decimal totalCalls = 0;

            Decimal HoursWorked = 0 ;

            Decimal NoOfTerritory = 0;

            

            String finalMapKey = accStatic.Grand_Parent_Territory_Id__c+accStatic.Account_Type__c+accStatic.Reach_Status__c;

            if(FinalMap.containsKey(finalMapKey)){

                System.debug(':::::::finalMapKey-Finish:::::::::'+finalMapKey);

                Map<String,Map<String,Map<String,Map<String,Decimal>>>> regionMap = FinalMap.get(finalMapKey);

                System.debug(':::::::regionMap-Finish :::::::::'+regionMap );

                String regionMapKey = accStatic.Parent_Territory_Id__c+accStatic.Account_Type__c+accStatic.Reach_Status__c;

                System.debug(':::::::regionMapKey-Finish :::::::::'+regionMapKey );

                

                if(regionMap.containsKey(regionMapKey)){

                    Map<String,Map<String,Map<String,Decimal>>> districtMap = regionMap.get(regionMapKey);

                    System.debug(':::::::districtMap -Finish :::::::::'+districtMap );

                    String districtMapKey = accStatic.Territory_Id__c+accStatic.Account_Type__c+accStatic.Reach_Status__c;

                    System.debug(':::::::districtMapKey -Finish :::::::::'+districtMapKey );

                    if(districtMap.containsKey(districtMapKey)){

                        Map<String,Map<String,Decimal>> territoryMap = districtMap.get(districtMapKey);

                         System.debug(':::::::territoryMap-Finish :::::::::'+territoryMap );

                        for(String terrKey : territoryMap.keySet()){

                            Map<String,Decimal> valueMap = territoryMap.get(terrKey);

                            System.debug(':::::::valueMap -Finish :::::::::'+valueMap );

                            for(String valueMapKey : valueMap.keySet() ){

                                if(valueMapKey == '#Accounts'){

                                    totalAccounts += valueMap.get(valueMapKey);

                                }

                                if(valueMapKey == '#Calls'){

                                    totalCalls += valueMap.get(valueMapKey);

                                }

                                if(valueMapKey == '#DaysWorked'){

                                    HoursWorked += valueMap.get(valueMapKey);

                                }

                            }

                            NoOfTerritory += 1;

                        }

                    }

                }

            }

            accStatic.Accounts__c = totalAccounts;

            if(accStatic.Reach_Status__c == 'Reached'){

                accStatic.Calls__c = totalCalls;

                accStatic.Days_Worked__c = HoursWorked;

                if(NoOfTerritory > 0){

                    Decimal avgCalls = (Decimal)totalCalls/(Decimal)NoOfTerritory;

                    accStatic.Avg_Calls__c = avgCalls.SetSCale(2); 

                }else{

                    accStatic.Avg_Calls__c = 0;

                }

                

            }else if(accStatic.Reach_Status__c == 'Not Reached'){

                accStatic.Calls__c = 0;

                accStatic.Avg_Calls__c = 0;

                accStatic.Days_Worked__c = 0;

            }

            System.debug(':::::::accStatic:::::::::'+accStatic);

            accStaticListUpdate.add(accStatic);

            String mapKey = accStatic.Territory_Id__c+accStatic.Account_Type__c+accStatic.Reach_Status__c;

            ProcessedDistrictMap.put(mapKey,new Map<String,Decimal>());

            ProcessedDistrictMap.get(mapKey).put('#Accounts',accStatic.Accounts__c);

            ProcessedDistrictMap.get(mapKey).put('#Calls',accStatic.Calls__c);

            ProcessedDistrictMap.get(mapKey).put('#DaysWorked',accStatic.Days_Worked__c);

            ProcessedDistrictMap.get(mapKey).put('NoOfTerritory',NoOfTerritory);

        }

        

        System.debug(':::::::ProcessedDistrictMap:::::::::'+ProcessedDistrictMap);

        System.debug(':::::::ProcessedDistrictMap-Size:::::::::'+ProcessedDistrictMap.size());

        

      

kiran2000kiran2000

  //-----------------------------Region Processing-------------------------------

        for(Account_Statistic__c regionAccStatic : regionAccList){

            Decimal totalAccounts = 0;

            Decimal totalCalls = 0;

            Decimal HoursWorked = 0 ;

            Decimal NoOfTerritory = 0;

            

            String finalMapKey = regionAccStatic.Parent_Territory_Id__c+regionAccStatic.Account_Type__c+regionAccStatic.Reach_Status__c;

            

            if(FinalMap.containsKey(finalMapKey)){

                

                Map<String,Map<String,Map<String,Map<String,Decimal>>>> regionMap = FinalMap.get(finalMapKey);

                String regionMapKey = regionAccStatic.Territory_Id__c+regionAccStatic.Account_Type__c+regionAccStatic.Reach_Status__c;

                if(regionMap.containsKey(regionMapKey)){

                    Map<String,Map<String,Map<String,Decimal>>> districtMap = regionMap.get(regionMapKey);

                    for(String districtKey : districtMap.keySet()){

                        if(ProcessedDistrictMap.containsKey(districtKey)){

                            Map<String,Decimal> districtValueMap = ProcessedDistrictMap.get(districtKey);

                            for(String disValueKey : districtValueMap.keySet()){

                                if(disValueKey == '#Accounts'){

                                    totalAccounts += districtValueMap.get(disValueKey);

                                }

                                if(disValueKey == '#Calls'){

                                    totalCalls += districtValueMap.get(disValueKey);

                                }

                                if(disValueKey == '#DaysWorked'){

                                    HoursWorked += districtValueMap.get(disValueKey);

                                }

                                if(disValueKey == 'NoOfTerritory'){

                                    NoOfTerritory += districtValueMap.get(disValueKey);

                                }

                            }

                            

                        }

                    }

                }

                

            }

            regionAccStatic.Accounts__c = totalAccounts;

            if(regionAccStatic.Reach_Status__c == 'Reached'){

                regionAccStatic.Calls__c = totalCalls;

                regionAccStatic.Days_Worked__c = HoursWorked;

                if(NoOfTerritory > 0){

                     Decimal avgCalls = (Decimal)totalCalls/(Decimal)NoOfTerritory;

                     regionAccStatic.Avg_Calls__c = avgCalls.SetSCale(2);

                   // regionAccStatic.Avg_Calls__c = totalCalls/NoOfTerritory;

                }else{

                    regionAccStatic.Avg_Calls__c = 0;

                }

                

            }else if(regionAccStatic.Reach_Status__c == 'Not Reached'){

                regionAccStatic.Calls__c = 0;

                regionAccStatic.Avg_Calls__c = 0;

                regionAccStatic.Days_Worked__c = 0;

            }

            System.debug(':::::::regionAccStatic:::::::::'+regionAccStatic);

            

            accStaticListUpdate.add(regionAccStatic);

            String mapKey = regionAccStatic.Territory_Id__c+regionAccStatic.Account_Type__c+regionAccStatic.Reach_Status__c;

            

            ProcessedRegionMap.put(mapKey,new Map<String,Decimal>());

            ProcessedRegionMap.get(mapKey).put('#Accounts',regionAccStatic.Accounts__c);

            ProcessedRegionMap.get(mapKey).put('#Calls',regionAccStatic.Calls__c);

            ProcessedRegionMap.get(mapKey).put('#DaysWorked',regionAccStatic.Days_Worked__c);

            ProcessedRegionMap.get(mapKey).put('NoOfTerritory',NoOfTerritory);

    

        }

        System.debug(':::::::ProcessedRegionMap:::::::::'+ProcessedRegionMap);

        System.debug(':::::::ProcessedRegionMap-Size:::::::::'+ProcessedRegionMap.size());

        

        //-----------------------------Nation Processing-------------------------------

        for(Account_Statistic__c NationAccStatic : NationAccList){

            Decimal totalAccounts = 0;

            Decimal totalCalls = 0;

            Decimal HoursWorked = 0 ;

            Decimal NoOfTerritory = 0;

            

            String finalMapKey = NationAccStatic.Territory_Id__c+NationAccStatic.Account_Type__c+NationAccStatic.Reach_Status__c;

            if(FinalMap.containsKey(finalMapKey)){

                Map<String,Map<String,Map<String,Map<String,Decimal>>>> regionMap = FinalMap.get(finalMapKey);

                

                for(String regionKey : regionMap.keySet()){

                    if(ProcessedRegionMap.containsKey(regionKey)){

                        Map<String,Decimal> regionValueMap = ProcessedRegionMap.get(regionKey);

                        for(String regValueKey : regionValueMap.keySet()){

                            if(regValueKey == '#Accounts'){

                                totalAccounts += regionValueMap.get(regValueKey);

                            }

                            if(regValueKey == '#Calls'){

                                totalCalls += regionValueMap.get(regValueKey);

                            }

                            if(regValueKey == '#DaysWorked'){

                                HoursWorked += regionValueMap.get(regValueKey);

                            }

                            if(regValueKey == 'NoOfTerritory'){

                                NoOfTerritory += regionValueMap.get(regValueKey);

                            }

                        }

                    }

                }

            }

            NationAccStatic.Accounts__c = totalAccounts;

            if(NationAccStatic.Reach_Status__c == 'Reached'){

                NationAccStatic.Calls__c = totalCalls;

                NationAccStatic.Days_Worked__c = HoursWorked;

                if(NoOfTerritory > 0){

                    Decimal avgCalls = (Decimal)totalCalls/(Decimal)NoOfTerritory;

                    NationAccStatic.Avg_Calls__c = avgCalls.SetSCale(2); 

                   // NationAccStatic.Avg_Calls__c = totalCalls/NoOfTerritory;

                }else{

                    NationAccStatic.Avg_Calls__c = 0;

                }

                

            }else if(NationAccStatic.Reach_Status__c == 'Not Reached'){

                NationAccStatic.Calls__c = 0;

                NationAccStatic.Avg_Calls__c = 0;

                NationAccStatic.Days_Worked__c = 0;

            }

            accStaticListUpdate.add(NationAccStatic);

        }

        System.debug(':::::::accStaticListUpdate:::::::::'+accStaticListUpdate);

        System.debug(':::::::accStaticListUpdate-Size:::::::::'+accStaticListUpdate.size());

        //---------------------------Update Account Statistic Records-------------

        if(accStaticListUpdate != NULL && accStaticListUpdate.size() > 0){

            // Commented by Maha

            update accStaticListUpdate;

            

        }

    

    }

    

 

    

}