public List <SystemMessage> Validate(Run run) { var messages = new List <SystemMessage>(); using (var scope = _repositoryFactory.BeginRepositoryScope()) { var repositories = scope.CreateRepositories( typeof(ISalesAreaRepository), typeof(ICampaignRepository), typeof(IAutoBookInstanceConfigurationRepository), typeof(IDemographicRepository), typeof(IScheduleRepository), typeof(ISmoothConfigurationRepository) ); var salesAreaRepository = repositories.Get <ISalesAreaRepository>(); var campaignRepository = repositories.Get <ICampaignRepository>(); var autoBookInstanceConfigurationRepository = repositories.Get <IAutoBookInstanceConfigurationRepository>(); var demographicRepository = repositories.Get <IDemographicRepository>(); var scheduleRepository = repositories.Get <IScheduleRepository>(); var smoothConfigurationRepository = repositories.Get <ISmoothConfigurationRepository>(); // Validate run details, first check that run is well formed and // carry on if it pass this first method check messages.AddRange(ValidateRunDetailsForStartRun(run)); if (messages.Count != 0) { return(messages); } // Get Sales areas for run and list of sales area names from // run.SalesAreaPriorities NOT set to 'Exclude' var runSalesAreas = new List <SalesArea>(); var runSalesAreaNames = new List <string>(); if (run.SalesAreaPriorities.Any()) { runSalesAreas = salesAreaRepository.FindByNames(run.SalesAreaPriorities.Where(s => s.Priority != SalesAreaPriorityType.Exclude).Select(s => s.SalesArea).ToList()); runSalesAreaNames = salesAreaRepository.GetListOfNames(runSalesAreas); } else { // If there are NO entries in run.SalesAreaPriorities then // get all sales are names from the repository of sales areas runSalesAreaNames = salesAreaRepository.GetListOfNames(salesAreaRepository.GetAll().ToList()); } // check that there are some sales areas from one of the two // sources above if (!runSalesAreaNames.Any()) { messages.Add(FormatSystemMessage(SystemMessage.SalesAreaDataMissing)); // only carry on with the run validation if there are some // sales areas return(messages); } bool isOptimiserNeeded = run.Optimisation || run.RightSizer || run.ISR; var allAutoBookInstanceConfigurations = autoBookInstanceConfigurationRepository.GetAll().ToList(); if (!allAutoBookInstanceConfigurations.Any()) { allAutoBookInstanceConfigurations = _autoBooks.CreateDefaultInstanceConfigurations(); } var allCampaigns = campaignRepository.GetAllFlat().ToList(); var runCampaigns = RunManager.GetRunCampaigns(run, allCampaigns); var demographics = demographicRepository.GetAll().ToList(); // Validate RatingsData if (_featureManager.IsEnabled(nameof(ProductFeature.NineValidationRatingPredictions))) { var demographicsGameplan = demographics.Where(g => g.Gameplan).Select(x => x.ExternalRef).ToList(); var noOfRatingPredictionsPerScheduleDayAreaDemo = _tenantSettingsRepository.Get()?.NoOfRatingsPerSalesDayDemo ?? 96; messages.AddRange(ValidateMissingRatingsForStartRun(run.StartDate, run.EndDate, runSalesAreaNames, demographicsGameplan, noOfRatingPredictionsPerScheduleDayAreaDemo)); } if (isOptimiserNeeded && allAutoBookInstanceConfigurations.Count > 1) //single instance? { // Get number of breaks int breaks = RunManager.GetBreakCountEstimate(run, runSalesAreas, _repositoryFactory); messages.AddRange(ValidateAutoBookResourcesForStartRun(run, allAutoBookInstanceConfigurations, runSalesAreas.Count, runCampaigns.Count, demographics.Count, breaks)); } // Validate ISR settings messages.AddRange(ValidateISRSettingsForStartRun(run, runSalesAreas)); // Validate RS settings messages.AddRange(ValidateRSSettingsForStartRun(run, runSalesAreas)); // Validate Optimisation settings messages.AddRange(ValidateOptimisationSettingsForStartRun(run)); // Validate Smooth configuration messages.AddRange(ValidateSmoothConfiguration(run, smoothConfigurationRepository)); // Validate against existing runs messages.AddRange(ValidateExistingRunsForStartRun()); // Validate schedule data (Breaks, spots, campaigns etc) messages.AddRange(ValidateScheduleDataForStartRun(run, runCampaigns, runSalesAreas, demographics.Count)); // Validate demographics messages.AddRange(ValidateDemographicsForStartRun(demographics)); // Validate output files, can't process output files if data is missing messages.AddRange(ValidateOutputFilesForStartRun(run)); // Validate universes messages.AddRange(ValidateUniversesForStartRun(run, runSalesAreas)); } return(messages); }