Example #1
0
        public ActionResult LiqPayCallback()
        {
            LiqPayHelper liqPayHelper = new LiqPayHelper(ConfigurationManager.AppSettings["LiqPayPrivateKey"], ConfigurationManager.AppSettings["LiqPayPublicKey"]);

            // --- Перетворюю відповідь LiqPay в Dictionary<string, string> для зручності:
            var request_dictionary = Request.Form.AllKeys.ToDictionary(key => key, key => Request.Form[key]);

            // --- Розшифровую параметр data відповіді LiqPay та перетворюю в Dictionary<string, string> для зручності:
            byte[] request_data            = Convert.FromBase64String(request_dictionary["data"]);
            string decodedString           = Encoding.UTF8.GetString(request_data);
            var    request_data_dictionary = JsonConvert.DeserializeObject <Dictionary <string, string> >(decodedString);

            // --- Отримую сигнатуру для перевірки
            var mySignature = liqPayHelper.GetLiqPaySignature(request_dictionary["data"]);

            // --- Якщо сигнатура серевера не співпадає з сигнатурою відповіді LiqPay - щось пішло не так
            if (mySignature != request_dictionary["signature"])
            {
                return(View("PurchaseError"));
            }
            //return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

            string order_id = request_data_dictionary["order_id"];
            Order  order    = orderRepository.FindBy(x => x.TestIdForLiqpay == order_id).FirstOrDefault();

            if (order == null)
            {
                return(View("PurchaseError"));
            }
            //new HttpStatusCodeResult(HttpStatusCode.BadRequest);
            // --- Якщо статус відповіді "Тест" або "Успіх" - все добре
            if (request_data_dictionary["status"] == "sandbox" || request_data_dictionary["status"] == "success")
            {
                // Тут можна оновити статус замовлення та зробити всі необхідні речі. Id замовлення можна взяти тут: request_data_dictionary[order_id]
                foreach (var item in order.OrderItems)
                {
                    item.Ticket.StatusId = 1;
                }
                order.OrderStatusId = 1;
                order.PurchaseDate  = DateTime.Now;
                orderRepository.AddOrUpdate(order);
                orderRepository.Save();

                return(View("PurchaseSuccess", order));
            }

            // delete tickets
            foreach (var item in order.OrderItems)
            {
                if (item.Ticket != null)
                {
                    ticketRepository.Delete(item.Ticket);
                }
            }
            ticketRepository.Save();
            TicketHub.NotifyToAllClients();

            return(View("PurchaseError"));
        }
Example #2
0
        public ActionResult ReserveTickets(List <SelectedSeatsViewModel> selected_seats, int?session_id)
        {
            if (!IsValidSelectedSeats(selected_seats, session_id) || !ModelState.IsValid)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            ApplicationUserManager userMgr = new ApplicationUserManager(new UserStore <ApplicationUser>(context));
            var user = userMgr.FindByName(User.Identity.Name);

            // якщо в юзера вже заброньовано більше 10 квитків - не дозволю йому бронювати більше, поки він не сплатить заброньовані замовлення
            if (user.Orders.Where(x => x.OrderStatusId == 2).Sum(x => x.OrderItems.Count) + selected_seats.Count > 10)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            Session session = sessionRepository.FindBy(x => x.Id == session_id).FirstOrDefault();

            if (session.DateTime < DateTime.Now.AddMinutes(35))
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            // створюю список позицій замовлення (квитків)
            List <OrderItem> orderItems = new List <OrderItem>();

            foreach (var item in selected_seats)
            {
                TicketPrice ticketPrice = session.TicketPrices.FirstOrDefault(x => x.Seat.Row == item.Row && x.Seat.Number == item.Number);
                orderItems.Add(new OrderItem
                {
                    Movie  = session.Movie,
                    Price  = ticketPrice.Price,
                    Ticket = new Ticket
                    {
                        SessionDateTime  = session.DateTime,
                        CreationDateTime = DateTime.Now,
                        TicketPrice      = ticketPrice,
                        Seat             = ticketPrice.Seat,
                        StatusId         = 2, // заброньовано (видалиться за 30хв до початку сеансу)
                    }
                });
            }

            // створюю замовлення та зберігаю його в бд
            Order order = new Order
            {
                OrderItems    = orderItems,
                OrderStatusId = 2, // не сплачено (заброньовано)
                User          = userMgr.FindByName(User.Identity.Name),
                PurchaseDate  = DateTime.Now
            };

            orderRepository.AddOrUpdate(order);
            orderRepository.Save();
            TicketHub.NotifyToAllClients();

            return(View());
        }
Example #3
0
        public ActionResult BuyTickets(List <SelectedSeatsViewModel> selected_seats, int?session_id)
        {
            if (!IsValidSelectedSeats(selected_seats, session_id) || !ModelState.IsValid)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            // створюю список позицій замовлення (квитків)
            Session          session    = sessionRepository.FindBy(x => x.Id == session_id).FirstOrDefault();
            List <OrderItem> orderItems = new List <OrderItem>();

            foreach (var item in selected_seats)
            {
                TicketPrice ticketPrice = session.TicketPrices.FirstOrDefault(x => x.Seat.Row == item.Row && x.Seat.Number == item.Number);
                orderItems.Add(new OrderItem
                {
                    Movie  = session.Movie,
                    Price  = ticketPrice.Price,
                    Ticket = new Ticket
                    {
                        SessionDateTime  = session.DateTime,
                        CreationDateTime = DateTime.Now,
                        TicketPrice      = ticketPrice,
                        Seat             = ticketPrice.Seat,
                        StatusId         = 3, // зарезервовано на 15хв
                    }
                });
            }

            // створюю замовлення та зберігаю його в бд
            ApplicationUserManager userMgr = new ApplicationUserManager(new UserStore <ApplicationUser>(context));
            Order order = new Order
            {
                TestIdForLiqpay = Guid.NewGuid().ToString(), // ця властивість необхідна для тестування "лікпею"
                OrderItems      = orderItems,
                OrderStatusId   = 3,                         // статус "відхилено" поки користувач не заплатить
                User            = userMgr.FindByName(User.Identity.Name),
                PurchaseDate    = DateTime.Now
            };

            orderRepository.AddOrUpdate(order);
            orderRepository.Save();
            TicketHub.NotifyToAllClients();

            // на основі створенго замовлення збираю необхідні для liqpay api дані та відправляю їх на в'ю
            LiqPayHelper liqPayHelper = new LiqPayHelper(ConfigurationManager.AppSettings["LiqPayPrivateKey"], ConfigurationManager.AppSettings["LiqPayPublicKey"]);
            string       redirect_url = Request.Url.Scheme + System.Uri.SchemeDelimiter + Request.Url.Host +
                                        (Request.Url.IsDefaultPort ? "" : ":" + Request.Url.Port) + "/Order/LiqPayCallback";
            var model = liqPayHelper.GetLiqPayModel(order, redirect_url);

            return(View(model));
        }
Example #4
0
        //CinemaContext db = new CinemaContext();

        public void Execute(IJobExecutionContext context)
        {
            using (CinemaContext db = new CinemaContext())
            {
                // видаляю зарезервовані на 15 хв квитики, які по якимось причинам не були викуплені
                DateTime dtNow         = DateTime.Now.AddMinutes(-15);
                var      deleteTickest = db.Tickets.Where(x => dtNow > x.CreationDateTime && x.StatusId == 3).ToList();
                db.Tickets.RemoveRange(deleteTickest);
                db.SaveChanges();
                if (deleteTickest != null && deleteTickest.Count > 0)
                {
                    TicketHub.NotifyToAllClients();
                }

                // видаляю квитки, які були заброньовані, але не викуплені за 30хв до початку сеансу (+ змінюю статус замовлення на "відхилено")
                DateTime dtNow2             = DateTime.Now.AddMinutes(30);
                var      reservedDidntPayed = db.Sessions.Where(x => dtNow2 > x.DateTime).SelectMany(x => x.TicketPrices.Where(y => y.Ticket.StatusId == 2).Select(xx => xx.Ticket).ToList()).ToList();
                foreach (var item in reservedDidntPayed)
                {
                    if (item.OrderItem != null)
                    {
                        var order = item.OrderItem.Order;
                        order.OrderStatusId = 3;
                        db.Orders.AddOrUpdate(order);
                    }
                }
                db.Tickets.RemoveRange(reservedDidntPayed);
                db.SaveChanges();
                if (reservedDidntPayed != null && reservedDidntPayed.Count > 0)
                {
                    TicketHub.NotifyToAllClients();
                }

                // видаляю застарілі сеанси (які почались 12 годин тому)
                DateTime dtNow3 = DateTime.Now.AddHours(-12);
                //dtNow = DateTime.Now.AddMinutes(-10);
                var oldSessions = db.Sessions.Where(x => dtNow3 > x.DateTime).ToList();
                db.Sessions.RemoveRange(oldSessions);
                db.SaveChanges();


                // якщо сеансів меньше 50 - додаю 1
                if (db.Sessions.Count() < 50)
                {
                    Random random         = new Random();
                    int    movieId        = random.Next(1, db.Movies.Count() + 1);
                    int    cinemaHallId   = random.Next(1, db.CinemaHalls.Count() + 1);
                    var    itemCinemaHall = db.CinemaHalls.Find(cinemaHallId);

                    double randMin  = random.Next(-10, 30);
                    int    randHour = random.Next(1, 120);

                    var currentSession = new Session
                    {
                        MovieId    = movieId,
                        DateTime   = DateTime.Now.AddHours(randHour).AddMinutes(randMin),
                        CinemaHall = itemCinemaHall
                    };
                    db.Sessions.Add(currentSession);
                    // додаю ціни за місця на сеанс
                    foreach (var itemSeat in itemCinemaHall.Seats)
                    {
                        db.TicketPrices.Add(new TicketPrice {
                            Seat = itemSeat, Price = Convert.ToInt32(itemSeat.SeatType.DefaultPrice), Session = currentSession
                        });
                    }

                    db.SaveChanges();
                }
            }
        }