/// <summary>
 /// Parameterized constructor
 /// </summary>
 /// <param name="counterMeasureRepository">Counter measure repository</param>
 /// <param name="counterMeasureStatusRepository">Counter measure status repository</param>
 /// <param name="userRepository">User repository</param>
 /// <param name="targetRepository">Target repository</param>
 /// <param name="dailyActualRepository">The daily actual repository.</param>
 /// <param name="holidayRepository">The holiday repository.</param>
 /// <param name="yearRepository">The year repository.</param>
 /// <param name="counterMeasurePriorityRepository">The counter measure priority repository.</param>
 /// <exception cref="System.ArgumentNullException">Repository - The given parameter cannot be null.</exception>
 public CounterMeasureManager(IBaseRepository <CounterMeasure> counterMeasureRepository,
                              IBaseRepository <CounterMeasureStatus> counterMeasureStatusRepository,
                              INDMSUserRepository userRepository, IBaseRepository <Target> targetRepository,
                              IBaseRepository <DailyActual> dailyActualRepository,
                              IBaseRepository <ScorecardWorkdayPattern> scorecardWorkdayPatternRepository,
                              IBaseRepository <ScorecardHolidayPattern> scorecardHolidayPatternRepository,
                              IBaseRepository <ScorecardWorkdayTracker> scorecardWorkdayTrackerRepository,
                              IBaseRepository <Year> yearRepository,
                              IBaseRepository <CounterMeasurePriority> counterMeasurePriorityRepository)
 {
     if (counterMeasureRepository == null || counterMeasureStatusRepository == null ||
         userRepository == null || targetRepository == null ||
         dailyActualRepository == null || scorecardWorkdayPatternRepository == null || yearRepository == null ||
         counterMeasurePriorityRepository == null || scorecardHolidayPatternRepository == null ||
         scorecardWorkdayTrackerRepository == null)
     {
         throw new ArgumentNullException("Repository",
                                         "The given parameter cannot be null.");
     }
     this.counterMeasureRepository       = counterMeasureRepository;
     this.counterMeasureStatusRepository = counterMeasureStatusRepository;
     this.userRepository   = userRepository;
     this.targetRepository = targetRepository;
     this.yearRepository   = yearRepository;
     this.scorecardHolidayPatternRepository = scorecardHolidayPatternRepository;
     this.counterMeasurePriorityRepository  = counterMeasurePriorityRepository;
     this.scorecardWorkdayPatternRepository = scorecardWorkdayPatternRepository;
     this.scorecardWorkdayTrackerRepository = scorecardWorkdayTrackerRepository;
     this.actualCalculator = CreateScorecardActualCalculator(dailyActualRepository);
     this.goalCalculator   = CreateScorecardGoalCalculator(targetRepository,
                                                           dailyActualRepository, scorecardWorkdayPatternRepository,
                                                           scorecardHolidayPatternRepository, scorecardWorkdayTrackerRepository);
 }
 /// <summary>
 /// Creates an instance of ScorecardActualCalculator and returns
 /// </summary>
 /// <returns></returns>
 protected virtual ScorecardActualCalculator CreateScorecardActualCalculator(
     IBaseRepository <DailyActual> dailyActualRepository)
 {
     if (actualCalculator == null)
     {
         actualCalculator = new ScorecardActualCalculator(dailyActualRepository);
     }
     return(actualCalculator);
 }