private string ValidateAvailableSeats(PurchaseTicketViewModel ticket, AvailableTrainViewModel train) { if ("business".Equals(ticket.TravellerClass)) { int difference = (train.BusinessClassPassengersCount + ticket.PassengersCount) - AppConstants.TRAIN_CAPACITY_BUSINESS; if (difference > 0) { int availableSeats = AppConstants.TRAIN_CAPACITY_BUSINESS - train.BusinessClassPassengersCount; return availableSeats > 0 ? $"There are only { availableSeats } seats available." : "There are no seats available"; } } if ("economic".Equals(ticket.TravellerClass)) { int difference = (train.EconomicClassPassengersCount + ticket.PassengersCount) - AppConstants.TRAIN_CAPACITY_ECONOMIC; if (difference > 0) { int availableSeats = AppConstants.TRAIN_CAPACITY_ECONOMIC - train.EconomicClassPassengersCount; return availableSeats > 0 ? $"There are only { availableSeats } seats available." : "There are no seats available"; } } return string.Empty; }
public ActionResult Purchase(PurchaseTicketViewModel ticket) { var currentUserId = User.Identity.GetUserId(); var train = db.Trains.Find(ticket.Id); if (train == null) { return new HttpStatusCodeResult(404); } var viewModel = new AvailableTrainViewModel() { Id = train.Id, Route = train.Route, BusinessClassPassengersCount = (db.TrainTickets .Where(t => t.TrainId == train.Id) .Where(t => t.IsConfirmed) .Where(t => t.IsBusinessClass) .Select(t => t.PassengersCount) .DefaultIfEmpty() .Sum()), EconomicClassPassengersCount = (db.TrainTickets .Where(t => t.TrainId == train.Id) .Where(t => t.IsConfirmed) .Where(t => !t.IsBusinessClass) .Select(t => t.PassengersCount) .DefaultIfEmpty() .Sum()), DepartureTime = train.DepartureTime }; if (train.DepartureTime < DateTime.Now) { ViewBag.Error = "This train has already departed."; return View(viewModel); } else if (train.DepartureTime > DateTime.Now.AddDays(AppConstants.MAX_DAYS_BEFORE_RESERVATION)) { ViewBag.Error = "You can only purchase tickets as late as two weeks before departure."; return View(viewModel); } string errorMessage = ValidateAvailableSeats(ticket, viewModel); if (!string.IsNullOrEmpty(errorMessage)) { ViewBag.Error = errorMessage; return View(viewModel); } var generatedTicket = new TrainTicket() { UserId = new Guid(currentUserId), TrainId = train.Id, Departure = train.Route.Departure, Arrival = train.Route.Arrival, DepartureTime = train.DepartureTime, PurchasedOn = DateTime.Now, IsBusinessClass = ticket.TravellerClass == "business" ? true : false, PassengersCount = ticket.PassengersCount, Price = train.Route.Price * ticket.PassengersCount, IsConfirmed = false }; generatedTicket.Price *= generatedTicket.IsBusinessClass ? AppConstants.BUSINESS_CLASS_MULTIPLIER : 1.0m; db.TrainTickets.Add(generatedTicket); db.SaveChanges(); return SendPurchaseConfirmationEmail(generatedTicket.Id); }