//[ResponseType(typeof(PassModel))] public IHttpActionResult PostCreateTestData([FromUri] int numberOfPasses, int cloneFromPassId = 0) { var passes = _passRepository.GetAll().OrderBy(p => p.Id).ToList(); if (!passes.Any()) { return(this.Error().UnknownError("No passes to clone from")); } var templatePass = cloneFromPassId == 0 ? passes.First() : passes.FirstOrDefault(p => p.Id == cloneFromPassId); if (templatePass == null) { return(this.Error().InvalidParameters("Pass to clone from does not exist")); } if (numberOfPasses < 1) { return(this.Error().InvalidParameters("Number of passes to create is invalid")); } else if (numberOfPasses > 100) { return(this.Error().InvalidParameters("Number of passes to create is too large")); } // Create new passes from var newPasses = new List <Pass>(); for (int passIndex = 0; passIndex < numberOfPasses; passIndex++) { var pass = (Pass)templatePass.Clone(); pass.Id = 0; IdUpdater.SetIds(pass, _identityGeneratorResolver); pass.Name = $"Pass {pass.Id}"; newPasses.Add(pass); } _passRepository.Add(newPasses); _passRepository.SaveChanges(); return(Ok()); }
public IHttpActionResult PostScenario([FromBody] CreateScenarioModel command) { // Check empty name if (string.IsNullOrWhiteSpace(command.Name)) { return(this.Error().InvalidParameters("No name was entered")); } if (!ModelState.IsValid) { return(this.Error().InvalidParameters("Invalid scenario parameters")); } // Check that scenario doesn't exist Scenario scenario = _scenarioRepository.Get(command.Id); if (scenario != null) { return(this.Error().InvalidParameters("Scenario already exists")); } // Check that scenario with such name doesn't exist scenario = _scenarioRepository.FindByName(command.Name, command.IsLibraried); if (scenario != null) { return(this.Error().InvalidParameters("Scenario with such name already exists")); } foreach (var pass in command.Passes) { if (_passInspectorService.InspectPassSalesAreaPriorities( pass.PassSalesAreaPriorities, out string errorMessage)) { return(this.Error().InvalidParameters(errorMessage)); } List <string> errorMessages = new List <string>(); if (!BreakExclusionsValidations.DateTimeRangeIsValid(pass.BreakExclusions, _salesAreaRepository.GetAll(), out errorMessages)) { return(this.Error().InvalidParameters(errorMessages)); } } ValidateCampaignPriorityRounds(command.CampaignPriorityRounds); // Add scenario scenario = _mapper.Map <Scenario>(command); IdUpdater.SetIds(scenario, _identityGeneratorResolver); // Update Pass repository UpdatePassRepository(scenario, command, null); _passRepository.SaveChanges(); // Add Campaign Pass Priorities to Scenario var campaignsResult = _campaignRepository.GetWithProduct(null); var usingAllCampaigns = campaignsResult.Items?.Any() == true?campaignsResult.Items.ToList() : null; var forScenarioPasses = _passRepository.FindByIds(scenario.Passes.Select(p => p.Id)).ToList(); var allCampaigns = usingAllCampaigns?.ToDictionary(x => x.ExternalId, x => x); CampaignPassPrioritiesServiceMapper.AmendCampaignPassPrioritiesForNewCampaigns( scenario, forScenarioPasses, allCampaigns, _passRepository, _mapper); // Validate ValidateForSave(scenario); scenario.DateUserModified = DateTime.UtcNow; // Add scenario _scenarioRepository.Add(scenario); _scenarioRepository.SaveChanges(); // Do not remove this, need to persist changes now so that we can return ScenarioModel return(Ok(Mappings.MapToScenarioModel(scenario, _scenarioRepository, _passRepository, _tenantSettingsRepository, _mapper))); }
public IHttpActionResult PutScenario([FromUri] Guid id, [FromBody] ScenarioModel command) { // Check empty name if (string.IsNullOrWhiteSpace(command.Name)) { return(this.Error().InvalidParameters("No name was entered")); } if (!ModelState.IsValid) { return(this.Error().InvalidParameters("Invalid scenario parameters")); } var scenario = _scenarioRepository.Get(id); if (scenario == null) { return(NotFound()); } var scenario2 = _scenarioRepository.FindByName(command.Name, command.IsLibraried); if (scenario2 != null && scenario.Id != scenario2.Id) { return(this.Error().InvalidParameters("Scenario with such name already exists")); } var salesAreas = _salesAreaRepository.GetAll(); foreach (var pass in command.Passes) { if (_passInspectorService.InspectPassSalesAreaPriorities( pass.PassSalesAreaPriorities, out string errorMessage)) { return(this.Error().InvalidParameters(errorMessage)); } List <string> errorMessages = new List <string>(); if (!BreakExclusionsValidations.DateTimeRangeIsValid(pass.BreakExclusions, salesAreas, out errorMessages)) { return(this.Error().InvalidParameters(errorMessages)); } } var oldPassIds = scenario.Passes.Select(p => p.Id).ToList(); // Get PassIds to delete var deletedPassIds = oldPassIds.Except(command.Passes.Select(p => p.Id)).Distinct().ToList(); ValidateCampaignPriorityRounds(command.CampaignPriorityRounds); Mappings.ApplyToScenario(scenario, command, _mapper); IdUpdater.SetIds(scenario, _identityGeneratorResolver); // Update Pass repository UpdatePassRepository(scenario, command, deletedPassIds); _passRepository.SaveChanges(); // update scenario with any changes to passes in that scenario.campaignpasspriorities UpdateScenarioWithEditedPassList(scenario, oldPassIds, deletedPassIds); // Validate, update and save scenario ValidateForSave(scenario); scenario.DateUserModified = DateTime.UtcNow; _scenarioRepository.Update(new List <Scenario> { scenario }); // Used bulk update method as a temporary solution as it is optimized to update nested collections // Will be changed in scope of performance optimizations phase 2 _scenarioRepository.SaveChanges(); // Do not remove this, need to persist changes now so that we can return ScenarioModel return(Ok(Mappings.MapToScenarioModel(scenario, _scenarioRepository, _passRepository, _tenantSettingsRepository, _mapper))); }
/// <summary> /// Creates template run, all run options selected, single sales area, default scenario. The template run can be manually modified /// later. /// </summary> /// <param name="runId"></param> private void CreateRunForTemplate(Guid runId) { using (var scope = _repositoryFactory.BeginRepositoryScope()) { var repositories = scope.CreateRepositories( typeof(IRunRepository), typeof(ISalesAreaRepository), typeof(ITenantSettingsRepository) ); var runRepository = repositories.Get <IRunRepository>(); var tenantSettingsRepository = repositories.Get <ITenantSettingsRepository>(); var salesAreaRepository = repositories.Get <ISalesAreaRepository>(); // Get sales areas var salesAreas = salesAreaRepository.GetAll(); // Get tenant settings with default scenario var tenantSettings = tenantSettingsRepository.Get(); // Create run, single sales area Run run = new Run() { Id = runId, Description = "Template", CreatedDateTime = DateTime.UtcNow, //StartDateTime = DateTime.UtcNow.Date, //EndDateTime = DateTime.UtcNow.Date.AddDays(48), IsLocked = false, Optimisation = true, Smooth = true, ISR = true, RightSizer = true, Real = false, Author = new AuthorModel() { Id = 1, Name = "User" } }; run.SalesAreaPriorities.Add(new SalesAreaPriority() { SalesArea = salesAreas.OrderBy(sa => sa.Name).First().Name, Priority = SalesAreaPriorityType.Priority3 }); // Add scenario var runScenario = new RunScenario() { Id = tenantSettings.DefaultScenarioId }; run.Scenarios.Add(runScenario); //Scenario scenario = (Scenario)tenantSettings.DefaultScenario.Clone(); run.Scenarios.ForEach(s => s.ResetToPendingStatus()); //run.Scenarios.Add(scenario); // Set new IDs IdUpdater.SetIds(run, _identityGeneratorResolver); // Save run runRepository.Add(run); runRepository.SaveChanges(); } }