public ActionResult ValidateOrder(OrderTicketsFormViewModel OrderTicketsFormViewModel, List <TicketFormViewModel> ticketFormViewModels)
        {
            if (!ModelState.IsValid)
            {
                //The refresh interval is used for preventing the user refresh the order page. Here is initialized ia a valid state.
                TempData["RefreshInterval"] = -1;
                Flight flight          = Session["flight"] as Flight;
                var    ticketContainer = InitializeTicketContainer(ticketFormViewModels);
                var    viewModel       = new OrderTicketFormContainerViewModel(OrderTicketsFormViewModel, ticketContainer, flight);
                return(View("Create", viewModel));
            }

            string userId = null;

            if (User.Identity.IsAuthenticated)
            {
                userId = User.Identity.GetUserId();
            }

            var tickets = new List <Ticket>();

            ticketFormViewModels.ForEach(tv => tickets.Add(new Ticket(tv)));

            var ticketOrders = new List <TicketOrder>();

            tickets.ForEach(t => ticketOrders.Add(new TicketOrder(t, OrderTicketsFormViewModel.OrderId)));

            var order = new Models.Order(OrderTicketsFormViewModel.BuyerEmail, userId, ticketOrders);

            Session["order"]   = order;
            Session["tickets"] = tickets;

            return(RedirectToAction("PaymentWithPaypal"));
        }
        public ActionResult Create()
        {
            int refreshInterval = Convert.ToInt32(TempData["RefreshInterval"]);

            ViewBag.RefreshInterval = refreshInterval + 1;

            if (Session["flight"] == null || Session["flightSeats"] == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.NotFound));
            }

            Flight            flight      = Session["flight"] as Flight;
            List <FlightSeat> flightSeats = Session["flightSeats"] as List <FlightSeat>;

            //For holding the seats when user refreshes the view of the form
            foreach (var flightSeat in flightSeats)
            {
                if (flightSeat.IsAvailable)
                {
                    flightSeat.HoldSeat();
                    flightSeatRepository.ModifySeats(flightSeat);
                }
            }
            unitOfWork.Complete();

            var flightSeatIds = flightSeats.Select(fs => fs.FlightSeatId).ToArray();
            var flightService = new FlightHubService();

            flightService.FlightSeatsClosed(flightSeatIds);

            var ticketViewModels = new List <TicketFormViewModel>();

            flightSeats.ForEach(fs => ticketViewModels.Add(new TicketFormViewModel(flight.FlightId, fs)));

            var ticketContainer = InitializeTicketContainer(ticketViewModels);
            var orderViewModel  = new OrderTicketsFormViewModel(null, null, ticketContainer.GetTotalPrice());
            var viewModel       = new OrderTicketFormContainerViewModel(orderViewModel, ticketContainer, flight);

            return(View(viewModel));
        }