public System.Web.Mvc.ActionResult BookingConfirm(int bookingID)
        {
            var userID         = User.Identity.GetUserId();
            var fiveMinuteAgo  = DateTime.Now.AddMinutes(-Constants.BOOKING_CONFIRM_TIMEOUT_IN_MINUTES);
            var bookingReceipt = this.Service <IBookingReceiptService>()
                                 .Get(br => br.IsPending == true &&
                                      br.CustomerID == userID &&
                                      br.ID == bookingID &&
                                      br.BookingTime > fiveMinuteAgo
                                      ).FirstOrDefault();

            if (bookingReceipt == null)
            {
                return(new HttpStatusCodeResult(403, "Access denied."));
            }

            var bookingConfirmViewModel = new BookingConfirmViewModel
            {
                Receipt   = bookingReceipt,
                NganLuong = new NganLuongPaymentModel()
            };

            bookingConfirmViewModel.NganLuong.OrderCode = bookingReceipt.ID.ToString();

            return(View("~/Areas/Customer/Views/Booking/BookingConfirm.cshtml", bookingConfirmViewModel));
        }
        public System.Web.Mvc.ActionResult BookVehicle(BookingConfirmViewModel bookingModel, NganLuongPaymentModel nganLuongPayment)
        {
            var user = HttpContext.GetOwinContext()
                       .GetUserManager <ApplicationUserManager>()
                       .FindById(HttpContext.User.Identity.GetUserId());

            // Check if the request contains all valid params
            if (bookingModel?.Action == null || bookingModel.Receipt?.ID == null || nganLuongPayment == null)
            {
                return(new HttpStatusCodeResult(400, "Invalid request"));
            }

            var bookingService = this.Service <IBookingReceiptService>();
            var bookingReceipt = bookingService.Get(br => br.ID == bookingModel.Receipt.ID &&
                                                    br.CustomerID == user.Id &&
                                                    br.IsPending).FirstOrDefault();

            if (bookingReceipt == null)
            {
                return(new HttpStatusCodeResult(400, "Invalid request"));
            }

            // Act based on the received action's name
            switch (bookingModel.Action)
            {
            case "delete":
                bookingService.Delete(bookingReceipt);
                return(RedirectToAction("Index", "Home"));

            case "change":
                var vehicleID = bookingReceipt.VehicleID;
                bookingService.Delete(bookingReceipt);
                return(RedirectToAction("VehicleInfo", "Home", new { id = vehicleID }));

            case "pay":
                break;

            default:
                return(new HttpStatusCodeResult(400, "Bad request"));
            }

            // Only "pay" action left to handle
            // Now validate nganluong params before redirect to nganluong

            var info = new RequestInfoTestTemplate
            {
                bank_code         = nganLuongPayment.BankCode,
                Order_code        = nganLuongPayment.OrderCode,
                order_description = "Test booking",
                return_url        = "http://localhost:65358/bookingReceipt",
                cancel_url        = "http://localhost:65358/bookingReceipt?canceledBookingID=" + bookingModel.Receipt.ID,
                Buyer_fullname    = user.FullName,
                Buyer_email       = user.Email,
                Buyer_mobile      = user.PhoneNumber,
                time_limit        = Constants.BOOKING_CONFIRM_TIMEOUT_IN_MINUTES.ToString()
            };

            var objNLCheckout = new APICheckoutV3();
            var result        = objNLCheckout.GetUrlCheckout(info, nganLuongPayment.PaymentMethod);

            if (result.Error_code == "00")
            {
                return(Redirect(result.Checkout_url));
            }

            return(new HttpStatusCodeResult(400, "Invalid request"));
        }