Ejemplo n.º 1
0
        /// <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);
            }
        }
Ejemplo n.º 2
0
        /// <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);
            }
        }