You need to sign in to do that
Don't have an account?
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
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);
}
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;
}
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);
}
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());
//-----------------------------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;
}
}
}