Esempio n. 1
0
        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);
        }