// when user paid with saved card public IActionResult Checkout(TicketAndReceipt ticketAndReceipt) { return(View(ticketAndReceipt)); }
// basket checkout public async Task <IActionResult> Checkout(string stripeToken, bool RememberMe, string customerName, decimal Total, string selectedDelivery) { var user = await _userManager.GetUserAsync(User); var role = await _userManager.GetRolesAsync(user); var tickets = await _context.BasketTickets.Include(x => x.Performance).ThenInclude(y => y.Play) .Include(x => x.BookedSeat).ThenInclude(y => y.Seat).Where(x => x.BasketId == user.Id).ToListAsync(); // check if any seats if (tickets.Count > 0 && Total > 0) { long amount = long.Parse(Total.ToString("#.00").Replace(".", "")); if (amount < 100) { amount *= 100; } // verify payment succeeds if (Charge(user.Email, stripeToken, amount, RememberMe)) { // charge succeeded, create an order Models.Order newOrder = new Models.Order() { OrderTime = DateTime.Now, UserId = user.Id, DeliveryMethod = selectedDelivery, IsPrinted = false }; // check the type of client if (role[0] == "Customer") { newOrder.ClientName = user.FirstName + " " + user.LastName; } else if (role[0] == "AgencyOrClub") { newOrder.ClientName = user.AgencyOrClubName; } else { newOrder.DeliveryMethod = "Pick from collection booth"; newOrder.ClientName = customerName; } // see if there was a discount DateTime time = DateTime.Now; bool discount = false; if (((int)time.DayOfWeek < 5) && ((int)time.DayOfWeek > 0)) { discount = true; } List <TicketsInBasket> ticketsBought = new List <TicketsInBasket>(); // create a sold ticket for each seat reserved foreach (BasketTicket basketTicket in tickets) { TicketsInBasket ticket = new TicketsInBasket { Price = basketTicket.Price, RowNumber = basketTicket.BookedSeat.Seat.RowNumber, SeatLetter = basketTicket.BookedSeat.Seat.ColumnLetter, PerformanceName = basketTicket.Performance.Play.Name, Id = basketTicket.Id, PerformanceTime = basketTicket.Performance.Date }; ticketsBought.Add(ticket); SoldTicket soldTicket = new SoldTicket { PlayName = basketTicket.Performance.Play.Name, UserId = user.Id, CustomerName = newOrder.ClientName, PerformanceTimeAndDate = basketTicket.Performance.Date, ColumnLetter = ticket.SeatLetter, Band = basketTicket.BookedSeat.Seat.Band, RowNumber = ticket.RowNumber }; if (discount) { soldTicket.PaidPrice = basketTicket.Price * 8 / 10; } else { soldTicket.PaidPrice = basketTicket.Price; } newOrder.SoldTickets.Add(soldTicket); } decimal finalPrice = 0; // add order to database await _context.Orders.AddAsync(newOrder); foreach (BasketTicket basketTicket in tickets) { var bookedSeat = await _context.BookedSeats .FirstOrDefaultAsync(x => x.Id == basketTicket.BookedSeatId); if (discount) { finalPrice += basketTicket.Price; } bookedSeat.Booked = 2; _context.Update(bookedSeat); } var basket = await _context.Basket.Include(x => x.Tickets).FirstOrDefaultAsync(x => x.UserId == user.Id); basket.Tickets.Clear(); await _context.SaveChangesAsync(); if (role[0] == "AgencyOrClub" && ticketsBought.Count > 19) { if (user.ApprovedMultipleDiscounts == true) { finalPrice = finalPrice * 9 / 10; } else { finalPrice = finalPrice * (decimal)9.5 / 10; } } // cereate tickets and receipt view TicketAndReceipt ticketAndReceipt = new TicketAndReceipt() { TotalCost = Total, OrderId = newOrder.Id, PersonName = newOrder.ClientName, Tickets = ticketsBought, DiscountApplied = discount, Saved = 0 }; if (discount) { ticketAndReceipt.Saved = Total - finalPrice; } return(View(ticketAndReceipt)); } else { return(RedirectToAction(nameof(Basket))); } } TempData["UserNotifier"] = new UserNotifier() { CssFormat = "alert-danger", Content = "Payment was declined", MessageType = "Error!" }; return(View()); }
// use when customer saved card details public async Task <IActionResult> UseSavedCard(decimal Total, string selectedDelivery) { var user = await _userManager.GetUserAsync(User); var role = await _userManager.GetRolesAsync(user); var tickets = await _context.BasketTickets.Include(x => x.Performance).ThenInclude(y => y.Play) .Include(x => x.BookedSeat).ThenInclude(y => y.Seat).Where(x => x.BasketId == user.Id).ToListAsync(); long amount = 0; // check if any seats if (tickets.Count > 0 && Total > 0) { // calculate the amount amount = long.Parse(Total.ToString("#.00").Replace(".", "")); if (amount < 100) { amount *= 100; } } else { // if basket empty return Basket View return(RedirectToAction(nameof(Basket))); } var chargeOptions = new ChargeCreateOptions { Amount = amount, Currency = "gbp", Description = "Theatre charge", CustomerId = user.SavedCustomerCard }; var chargeService = new ChargeService(); Charge charge = chargeService.Create(chargeOptions); // if charge succeeded create order if (charge.Status.ToLower() == "succeeded") { // charge succeeded, create an order Models.Order newOrder = new Models.Order() { OrderTime = DateTime.Now, UserId = user.Id, DeliveryMethod = selectedDelivery, IsPrinted = false }; // check who is the customer if (role[0] == "Customer") { newOrder.ClientName = user.FirstName + " " + user.LastName; } else if (role[0] == "AgencyOrClub") { newOrder.ClientName = user.AgencyOrClubName; } // see if there was a discount DateTime time = DateTime.Now; bool discount = false; if (((int)time.DayOfWeek < 5) && ((int)time.DayOfWeek > 0)) { discount = true; } List <TicketsInBasket> ticketsBought = new List <TicketsInBasket>(); // create a sold ticket for each seat reserved foreach (BasketTicket basketTicket in tickets) { TicketsInBasket ticket = new TicketsInBasket { Price = basketTicket.Price, RowNumber = basketTicket.BookedSeat.Seat.RowNumber, SeatLetter = basketTicket.BookedSeat.Seat.ColumnLetter, PerformanceName = basketTicket.Performance.Play.Name, Id = basketTicket.Id, PerformanceTime = basketTicket.Performance.Date }; ticketsBought.Add(ticket); SoldTicket soldTicket = new SoldTicket { PlayName = basketTicket.Performance.Play.Name, UserId = user.Id, CustomerName = newOrder.ClientName, PerformanceTimeAndDate = basketTicket.Performance.Date, ColumnLetter = ticket.SeatLetter, Band = basketTicket.BookedSeat.Seat.Band, RowNumber = ticket.RowNumber }; // check if there is a discount for week days if (discount) { soldTicket.PaidPrice = basketTicket.Price * 8 / 10; } else { soldTicket.PaidPrice = basketTicket.Price; } newOrder.SoldTickets.Add(soldTicket); } decimal finalPrice = 0; // add order to database await _context.Orders.AddAsync(newOrder); //reserve seats foreach (BasketTicket basketTicket in tickets) { var bookedSeat = await _context.BookedSeats .FirstOrDefaultAsync(x => x.Id == basketTicket.BookedSeatId); if (discount) { finalPrice += basketTicket.Price; } bookedSeat.Booked = 2; _context.Update(bookedSeat); } var basket = await _context.Basket.Include(x => x.Tickets).FirstOrDefaultAsync(x => x.UserId == user.Id); // remove all the tickets in the basket basket.Tickets.Clear(); await _context.SaveChangesAsync(); // if agency/club and approved, receive discounts for more than 20 tickets if (role[0] == "AgencyOrClub" && ticketsBought.Count > 19) { if (user.ApprovedMultipleDiscounts == true) { finalPrice = finalPrice * 9 / 10; } else { finalPrice = finalPrice * (decimal)9.5 / 10; } } // create tickets and receipt view TicketAndReceipt ticketAndReceipt = new TicketAndReceipt() { TotalCost = Total, OrderId = newOrder.Id, PersonName = newOrder.ClientName, Tickets = ticketsBought, DiscountApplied = discount, Saved = 0 }; if (discount) { ticketAndReceipt.Saved = Total - finalPrice; } return(View(nameof(Checkout), ticketAndReceipt)); } else { // if payment failed resend to basket return(RedirectToAction(nameof(Basket))); } }