public IActionResult Add(RouteFormModel model)
        {
            var companyId = this.userManager.GetUserId(User);

            if (!this.companies.IsApproved(companyId))
            {
                this.GenerateAlertMessage(WebConstants.Message.CompanyNotApproved, Alert.Warning);

                return(this.RedirectToAction(nameof(All)));
            }

            if (this.companies.IsBlocked(companyId))
            {
                this.GenerateAlertMessage(WebConstants.Message.AddRouteCompanyBlocked, Alert.Warning);

                return(this.RedirectToAction(nameof(All)));
            }

            if (!this.stations.StationExist(model.StartStation) || !this.stations.StationExist(model.EndStation))
            {
                this.GenerateAlertMessage(WebConstants.Message.InvalidStation, Alert.Warning);

                return(this.RedirectToAction(nameof(All)));
            }

            if (model.StartStation == model.EndStation || this.stations.AreStationsInSameTown(model.StartStation, model.EndStation))
            {
                ModelState.AddModelError(string.Empty, WebConstants.Message.StartStationEqualToEndStation);
                model.TownsStations = this.GenerateTownStationsSelectListItems();
                return(View(model));
            }

            if (!ModelState.IsValid)
            {
                model.TownsStations = this.GenerateTownStationsSelectListItems();

                return(View(model));
            }

            var isAdded = this.routes.Add(model.StartStation, model.EndStation, model.DepartureTime.TimeOfDay, model.Duration, model.BusType, model.Price, companyId);

            if (!isAdded)
            {
                model.TownsStations = this.GenerateTownStationsSelectListItems();
                ModelState.AddModelError(string.Empty, WebConstants.Message.CompanyRouteDuplication);
                return(View(model));
            }

            var startTownName = this.towns.GetTownNameByStationId(model.StartStation);
            var endTownName   = this.towns.GetTownNameByStationId(model.EndStation);

            this.GenerateAlertMessage(string.Format(WebConstants.Message.RouteAdded, startTownName, endTownName), Alert.Success);

            return(RedirectToAction(nameof(All)));
        }
 private void AssertRouteFormModelProperties(int startStationId, int endStationId, RouteFormModel form, object viewResult)
 {
     viewResult.Should().BeOfType <RouteFormModel>();
     form.BusType.Should().Be(BusType.Mini);
     form.DepartureTime.Should().Be(DepartureDateTime);
     form.Duration.Should().Be(Duration);
     form.StartStation.Should().Be(startStationId);
     form.EndStation.Should().Be(endStationId);
     form.Price.Should().Be(Price);
 }
        public IActionResult Edit(RouteFormModel model, int id)
        {
            var companyId = this.userManager.GetUserId(User);

            if (!this.routes.IsRouteOwner(id, companyId))
            {
                this.GenerateAlertMessage(WebConstants.Message.InvalidRoute, Alert.Danger);

                return(RedirectToAction(nameof(All)));
            }

            if (!this.companies.IsApproved(companyId))
            {
                this.GenerateAlertMessage(WebConstants.Message.ChangeRouteCompanyNotApproved, Alert.Warning);
                return(this.RedirectToAction(nameof(All)));
            }

            if (this.companies.IsBlocked(companyId))
            {
                this.GenerateAlertMessage(WebConstants.Message.ChangeRouteCompanyBlocked, Alert.Warning);
                return(this.RedirectToAction(nameof(All)));
            }

            if (!ModelState.IsValid)
            {
                model.TownsStations = this.GenerateTownStationsSelectListItems();
                model.IsEdit        = true;
                return(View(model));
            }

            var alreadyExists = this.routes.RouteAlreadyExist(id, model.StartStation, model.EndStation, model.DepartureTime.TimeOfDay, companyId);

            if (alreadyExists)
            {
                model.TownsStations = this.GenerateTownStationsSelectListItems();
                model.IsEdit        = true;
                ModelState.AddModelError(string.Empty, WebConstants.Message.CompanyRouteDuplication);
                return(View(model));
            }

            var startTownName = this.towns.GetTownNameByStationId(model.StartStation);
            var endTownName   = this.towns.GetTownNameByStationId(model.EndStation);

            if (this.routes.HasReservedTickets(id, companyId))
            {
                this.GenerateAlertMessage(string.Format(WebConstants.Message.EditRouteWithTickets, startTownName, endTownName), Alert.Danger);

                return(RedirectToAction(nameof(All)));
            }

            var success = this.routes.Edit(id, model.StartStation, model.EndStation, model.DepartureTime.TimeOfDay, model.Duration, model.BusType, model.Price, companyId);

            if (!success)
            {
                this.GenerateAlertMessage(WebConstants.Message.InvalidRoute, Alert.Danger);

                return(RedirectToAction(nameof(All)));
            }

            this.GenerateAlertMessage(string.Format(WebConstants.Message.RouteEdited, startTownName, endTownName), Alert.Success);

            return(RedirectToAction(nameof(All)));
        }