/// <summary> /// Rollup target recursively /// </summary> /// <param name="rollupInfo">Rollup information</param> /// <param name="updateStatus">if set to <c>true</c> [update status].</param> private void RollupTargetRecursively(RollupInfo rollupInfo, bool updateStatus) { while (rollupInfo.ParentTargetId != null) { // If parent targets are calculated, just roll them up int?parentDailyTargetId = null; int?parentMonthlyTargetId = null; int startMonth; decimal?rolledupValue; var rollupTargets = new List <RollupTargetItem>(); var currentRollupTarget = targetRepository.Get(rollupInfo.ParentTargetId.Value); DateTime currentDate = TimeZoneUtility.GetCurrentTimestamp().Date; DateTime previousMonthDate = currentDate.AddMonths(-1); DateTime targetStartDate = currentRollupTarget.EffectiveStartDate; DateTime targetEndDate = currentRollupTarget.EffectiveEndDate; startMonth = previousMonthDate.Month; if (previousMonthDate < targetStartDate) { startMonth = targetStartDate.Month; } int endMonth = currentRollupTarget.EffectiveEndDate.Month; int targetYear = targetStartDate.Year; while (startMonth <= endMonth) { var parentMonthlyTarget = currentRollupTarget?.MonthlyTargets.FirstOrDefault(x => x.Month == startMonth); DateTime monthStartDate = new DateTime(targetYear, startMonth, 1); if (monthStartDate < targetStartDate) { monthStartDate = targetStartDate; } // Depending upon the tracking method, retrieve the targets // of the parent for which we need to roll up if (rollupInfo.TrackingMethodId == Constants.TrackingMethodDaily) { DateTime monthEndDate = new DateTime(targetYear, startMonth, DateTime.DaysInMonth(targetYear, startMonth)); IList <DailyTargetItem> dailyTargets = new List <DailyTargetItem>(); if (monthEndDate > targetEndDate) { monthEndDate = targetEndDate; } if (parentMonthlyTarget != null) { dailyTargets = DistributeDailyTarget(currentRollupTarget, parentMonthlyTarget, targetYear); } while (monthStartDate <= monthEndDate) { rollupInfo.TargetEntryDate = monthStartDate; rolledupValue = CalculateRollupTargetValue(rollupInfo); parentDailyTargetId = parentMonthlyTarget?.DailyTargets.FirstOrDefault(x => x.Day == monthStartDate.Day)?.Id; var dailyTarget = dailyTargets?.FirstOrDefault(x => x.Day == monthStartDate.Day && !x.IsOutofRange); var rollupTargetItem = new RollupTargetItem { TargetId = parentDailyTargetId, TargetEntryDate = monthStartDate, RollUpValue = rolledupValue, GoalValue = dailyTarget?.GoalValue, IsHoliday = dailyTarget?.IsHoliday ?? false }; rollupTargets.Add(rollupTargetItem); monthStartDate = monthStartDate.AddDays(1); } } else if (rollupInfo.TrackingMethodId == Constants.TrackingMethodMonthly) { rollupInfo.TargetEntryDate = monthStartDate; rolledupValue = CalculateRollupTargetValue(rollupInfo); parentMonthlyTargetId = parentMonthlyTarget?.Id; var rollupTargetItem = new RollupTargetItem { TargetId = parentMonthlyTargetId, TargetEntryDate = monthStartDate, RollUpValue = rolledupValue }; rollupTargets.Add(rollupTargetItem); } startMonth++; } AddOrUpdateTargetRollup(rollupInfo, rollupTargets); if (currentRollupTarget.CascadedMetricsTrackingMethodId == (int)CascadedMetricsTrackingMethod.RolledUpTargets || updateStatus) { // update previous month status UpdateActualStatus(rollupInfo, previousMonthDate, rollupTargets, ref updateStatus); // update current month status UpdateActualStatus(rollupInfo, currentDate, rollupTargets, ref updateStatus); } rollupInfo.ParentTargetId = currentRollupTarget.ParentTarget?.Id; rollupInfo.ParentScorecardId = currentRollupTarget.ParentTarget?.ScorecardId; rollupInfo.RollupMethodId = currentRollupTarget.ParentTarget?.RollUpMethodId; RollupTargetRecursively(rollupInfo, updateStatus); } }
/// <summary> /// Rollup target recursively /// </summary> /// <param name="rollupInfo">Rollup information</param> private void RollupTargetRecursively(RollupInfo rollupInfo, DateTime selectedDate, bool updateStatus) { while (rollupInfo.ParentTargetId != null) { // If parent targets are calculated, just roll them up int?parentDailyTargetId = null; int?parentMonthlyTargetId = null; DateTime rollupStartDate = new DateTime(selectedDate.Year, selectedDate.Month, 1); DateTime rollupEndDate = new DateTime(selectedDate.Year, selectedDate.Month, DateTime.DaysInMonth(selectedDate.Year, selectedDate.Month)); decimal?rolledupValue; var rollupTargets = new List <RollupTargetItem>(); var currentRollupTarget = targetRepository.Get(rollupInfo.ParentTargetId.Value); if (currentRollupTarget.EffectiveStartDate > rollupStartDate) { rollupStartDate = currentRollupTarget.EffectiveStartDate; } if (currentRollupTarget.EffectiveEndDate < rollupEndDate) { rollupEndDate = currentRollupTarget.EffectiveEndDate; } var parentMonthlyTarget = currentRollupTarget?.MonthlyTargets.FirstOrDefault(x => x.Month == selectedDate.Month); // Depending upon the tracking method, retrieve the targets // of the parent for which we need to roll up if (rollupInfo.TrackingMethodId == Constants.TrackingMethodDaily) { IList <DailyTargetItem> dailyTargets = new List <DailyTargetItem>(); if (parentMonthlyTarget != null) { dailyTargets = DistributeDailyTarget(currentRollupTarget, parentMonthlyTarget, selectedDate.Year); } while (rollupStartDate <= rollupEndDate) { rollupInfo.TargetEntryDate = rollupStartDate; rolledupValue = CalculateRollupTargetValue(rollupInfo); parentDailyTargetId = parentMonthlyTarget?.DailyTargets.FirstOrDefault(x => x.Day == rollupStartDate.Day)?.Id; var dailyTarget = dailyTargets?.FirstOrDefault(x => x.Day == rollupStartDate.Day && !x.IsOutofRange); var rollupTargetItem = new RollupTargetItem { TargetId = parentDailyTargetId, TargetEntryDate = rollupStartDate, RollUpValue = rolledupValue, GoalValue = dailyTarget?.GoalValue, IsHoliday = dailyTarget?.IsHoliday ?? false }; rollupTargets.Add(rollupTargetItem); rollupStartDate = rollupStartDate.AddDays(1); } } else if (rollupInfo.TrackingMethodId == Constants.TrackingMethodMonthly) { rollupInfo.TargetEntryDate = rollupStartDate; rolledupValue = CalculateRollupTargetValue(rollupInfo); parentMonthlyTargetId = parentMonthlyTarget?.Id; var rollupTargetItem = new RollupTargetItem { TargetId = parentMonthlyTargetId, TargetEntryDate = rollupStartDate, RollUpValue = rolledupValue }; rollupTargets.Add(rollupTargetItem); } AddOrUpdateTargetRollup(rollupInfo, rollupTargets); if (currentRollupTarget.CascadedMetricsTrackingMethodId == (int)CascadedMetricsTrackingMethod.RolledUpTargets || updateStatus) { UpdateActualStatus(rollupInfo, rollupStartDate, rollupTargets, ref updateStatus); } rollupInfo.ParentTargetId = currentRollupTarget.ParentTarget?.Id; rollupInfo.ParentScorecardId = currentRollupTarget.ParentTarget?.ScorecardId; rollupInfo.RollupMethodId = currentRollupTarget.ParentTarget?.RollUpMethodId; RollupTargetRecursively(rollupInfo, selectedDate, updateStatus); } }