Пример #1
0
 // when user paid with saved card
 public IActionResult Checkout(TicketAndReceipt ticketAndReceipt)
 {
     return(View(ticketAndReceipt));
 }
Пример #2
0
        // 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());
        }
Пример #3
0
        // 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)));
            }
        }