/// <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); }