コード例 #1
0
        /// <summary>
        /// Get Month To date performance to determine month Color
        /// </summary>
        /// <param name="target"></param>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <returns></returns>
        public MonthToDatePerformanceItem GetMonthToDatePerformance(Target target, int year, int month)
        {
            if (target.MTDPerformanceTrackingMethodId == null)
            {
            }
            var mTDPerformance = new MonthToDatePerformanceItem
            {
                Year   = year,
                Month  = month,
                Status = ActualStatus.NotEntered
            };

            var currentDate = TimeZoneUtility.GetCurrentTimestamp();
            var day         = currentDate.Day;

            if ((month > currentDate.Month && currentDate.Year == year) || year > currentDate.Year)
            {
                return(mTDPerformance);
            }
            else if ((currentDate.Month > month && currentDate.Year == year) || (currentDate.Year > year))
            {
                day = holidayCalculator.GetLastWorkingDayOfMonthForTarget(target, month, year).Day;
            }

            var selectedDate = new DateTime(year, month, day).Date;

            var dailyActualsList = dailyActualRepository.GetAll()
                                   .Where(x =>
                                          x.TargetId == target.Id &&
                                          x.Date.Month == month && x.ActualValue != null &&
                                          x.Status != ActualStatus.Holiday)
                                   ?.ToList();

            if (dailyActualsList.Any())
            {
                var latestActualDate = dailyActualsList.OrderBy(x => x.Date).LastOrDefault().Date;

                switch ((MTDPerformanceTrackingMethod)target.MTDPerformanceTrackingMethodId)
                {
                case MTDPerformanceTrackingMethod.Cumulative:
                {
                    mTDPerformance.GoalValue   = goalCalculator.CalculateCumulativeGoal(target, latestActualDate);
                    mTDPerformance.ActualValue = dailyActualsList.Sum(x => x.ActualValue);
                }
                break;

                case MTDPerformanceTrackingMethod.Average:
                {
                    mTDPerformance.GoalValue   = goalCalculator.CalculateAverageMTDGoal(target, selectedDate.Month);
                    mTDPerformance.ActualValue = Math.Round(dailyActualsList.Average(x => x.ActualValue).Value, 2, MidpointRounding.AwayFromZero);

                    if (target.Metric.DataTypeId == Constants.DataTypeWholeNumber)
                    {
                        mTDPerformance.ActualValue = Math.Round(mTDPerformance.ActualValue.Value, MidpointRounding.AwayFromZero);
                    }
                }
                break;

                case MTDPerformanceTrackingMethod.Latest:
                {
                    mTDPerformance.GoalValue = dailyActualsList?.OrderBy(x => x.Date).LastOrDefault(x => x.GoalValue != null)?.GoalValue;
                    if (!mTDPerformance.GoalValue.HasValue)
                    {
                        mTDPerformance.GoalValue = target.IsCascaded && target.CascadedMetricsTrackingMethodId.Value == (int)CascadedMetricsTrackingMethod.RolledUpTargets ?
                                                   target.MonthlyTargets?.FirstOrDefault(x => x.Month == month)?.DailyTargets?.OrderBy(d => d.Day).LastOrDefault(y => y.Day <= latestActualDate.Day)?.RolledUpGoalValue :
                                                   target.MonthlyTargets?.FirstOrDefault(x => x.Month == month)?.DailyTargets?.OrderBy(d => d.Day).LastOrDefault(y => y.Day <= latestActualDate.Day)?.MaxGoalValue;
                    }

                    mTDPerformance.ActualValue = dailyActualsList?.FirstOrDefault(x => x.Date == latestActualDate.Date)?.ActualValue;
                }
                break;

                default: break;
                }
                //set status if actual and goal has values
                if (mTDPerformance.ActualValue.HasValue && mTDPerformance.GoalValue.HasValue)
                {
                    mTDPerformance.Status = TargetActualComparer.GetActualStatus(mTDPerformance.GoalValue, mTDPerformance.ActualValue, target.Metric.GoalTypeId);
                }
            }
            return(mTDPerformance);
        }