// Change status of the ticket in DB to booked or bought, create a new order.
        private void ProcessTickets(SessionTickets viewModel, string newTicketStatus, User user)
        {
            int    SessionId = viewModel.Session.Id;
            Ticket ChangedTicket;
            var    newOrder = new Order();

            if (_context.Users.Find(user.Id) != null)
            {
                newOrder.UserId = user.Id;
            }
            else
            {
                newOrder.BuyerEmail = user.Email;
                newOrder.Name       = user.RealName;
            }
            newOrder.BuyingDateTime = DateTime.Now;
            foreach (var ticket in viewModel.SelectedTickets)
            {
                ChangedTicket = _context.Tickets
                                .Where(_ticket => _ticket.Id == ticket.Id)
                                .FirstOrDefault();
                _context.Tickets.Attach(ChangedTicket);
                ChangedTicket.Status = newTicketStatus;
                newOrder.TicketId    = ticket.Id;
                _context.Add(newOrder);
                _context.SaveChanges();
            }
        }
        // Create SessionTickets view model using id of session and list of tickets ids.
        private SessionTickets CreateViewModel(int sessionId, List <int> selectedTicketsIds)
        {
            var    viewModel = new SessionTickets(sessionId, _context);
            Ticket changedTicket;

            foreach (int id in selectedTicketsIds)
            {
                changedTicket = viewModel.Session.Tickets
                                .Where(ticket => ticket.Id == id)
                                .FirstOrDefault();
                viewModel.SelectedTickets.Add(changedTicket);
            }
            return(viewModel);
        }
        public async Task <IActionResult> ChooseFormAction(
            int sessionId,
            List <int> selectedTicketsIds,
            string totalPrice,
            string userName,
            string userEmail,
            string formAction)
        {
            if (ModelState.IsValid)
            {
                SessionTickets viewModel = CreateViewModel(sessionId, selectedTicketsIds);
                User           user      = new User();
                user.Email    = userEmail;
                user.RealName = userName;
                string newTicketStatus;
                if (formAction == "Buy tickets")
                {
                    newTicketStatus = "BOUGHT";
                }
                else
                {
                    newTicketStatus = "BOOKED";
                }
                if (User.Identity.IsAuthenticated)
                {
                    user = await _userManager.GetUserAsync(User);

                    if (formAction == "Buy tickets")
                    {
                        double newTotalPrice = Convert.ToDouble(totalPrice.Replace('.', ','));
                        user.Bonuses += Convert.ToDouble((newTotalPrice * 0.1).ToString("N2"));
                        await _userManager.UpdateAsync(user);
                    }
                }
                ProcessTickets(viewModel, newTicketStatus, user);
                try
                {
                    await _mailService.SendEmailMessageAsync(user.RealName, user.Email, newTicketStatus, viewModel);
                }
                catch (Exception ex)
                {
                    return(BadRequest(ex));
                }
                return(View("Succeeded"));
            }
            return(View("Error"));
        }
Beispiel #4
0
        // Create mail request, fill text with tickets data and send it to user email.
        public async Task SendEmailMessageAsync(
            string userName,
            string userEmail,
            string newTicketStatus,
            SessionTickets viewModel)
        {
            var mailRequest = new MailRequest()
            {
                ToEmail = userEmail,
                Subject = "Online cinema booking",
                Body    = $"Thanks for your interest to our cinema, {userName}. Here are your tickets: "
            };

            foreach (var ticket in viewModel.SelectedTickets)
            {
                mailRequest.Body += $@"
                    <div style='background: antiquewhite;
                        font-size: 15px;
                        border: 1px solid black;
                        text-align: justify;
                        margin: 10px;
                        padding: 10px;'>
                            <p><b> Title:</b> {viewModel.Session.Film.Title} </p>
                            <p><b>Date:</b> {viewModel.Session.Date.ToShortDateString()} </p>
                            <p><b> Time:</b> {viewModel.Session.Time:hh\:mm} </p>
                            <p><b> Hall:</b> {viewModel.Session.Hall.Title} </p>
                            <p><b> Seat:</b> {ticket.IdSeat} </p>
                            <p><b> Price:</b> {viewModel.Session.Price} </p>
                            <p><b> Status:</b> {newTicketStatus} </p></br></div>";
            }
            mailRequest.Body += $@"<b>If you've booked tickets you have to pay for them at least an hour and a
                half before the session!</b>";
            try
            {
                await SendEmailAsync(mailRequest);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        public IActionResult SelectSeats(int sessionId, List <int> selectedTicketsIds)
        {
            SessionTickets viewModel = CreateViewModel(sessionId, selectedTicketsIds);

            return(View("TicketCart", viewModel));
        }
        // GET: SessionTickets
        public IActionResult Index(int sessionId)
        {
            var viewModel = new SessionTickets(sessionId, _context);

            return(View("SessionTickets", viewModel));
        }