Beispiel #1
0
        public IActionResult Continue()
        {
            var clientId = User.GetId();
            var user     = _context.Users.Single(u => u.Id == clientId);

            if (!user.EmailConfirmed)
            {
                new ExecutionResult().AddError(_localizer["Your email is not confirmed. Please confirm it before proceeding."]).PushTo(TempData);
                return(RedirectToAction(nameof(Index), "Manage"));
            }

            var requestCulture = HttpContext.Features.Get <IRequestCultureFeature>();
            var cultCode       = requestCulture.RequestCulture.UICulture.Name;
            var vm             = new ConfirmCheckoutViewModel
            {
                CheckoutList   = GetCheckoutOrders(clientId, cultCode),
                ConfirmAddress = user.Address,
                PhoneNumber    = user.PhoneNumber
            };

            vm.Price = vm.CheckoutList.Sum(o => o.Price * o.Quantity);

            return(View(vm));
        }
Beispiel #2
0
        public async Task <IActionResult> Continue(ConfirmCheckoutViewModel model)
        {
            var execRes = new ExecutionResult();

            var clientId = User.GetId();
            var user     = _context.Users.Single(u => u.Id == clientId);

            if (!ModelState.IsValid)
            {
                var requestCulture = HttpContext.Features.Get <IRequestCultureFeature>();
                var cultCode       = requestCulture.RequestCulture.UICulture.Name;
                model.CheckoutList = GetCheckoutOrders(clientId, cultCode);
                model.Price        = model.CheckoutList.Sum(o => o.Price * o.Quantity);

                return(View(model));
            }

            var orders = await _context.Orders.Include(o => o.Pizza)
                         .Where(o => o.Client.Id == clientId)
                         .Where(o => o.Status == OrderStatus.Unpaid)
                         .Where(o => o.PlacementDate > DateTime.Now.AddDays(-7)) // Each item is only valid for 7 days
                         .ToArrayAsync();

            var price = orders.Sum(o => o.Price * o.Quantity);

            if (price > user.Coins)
            {
                // insufficient PizzaCoins
                execRes.AddError(_localizer["Insufficient amount of coins in the balance."]).PushTo(TempData);
                return(RedirectToAction("Index"));
            }

            // looks good, go ahead

            foreach (var checkoutEntry in orders)
            {
                var order = _context.Orders.Single(o => o.Id == checkoutEntry.Id);
                order.Status          = OrderStatus.Queued;
                order.IsPaid          = true;
                order.DeliveryAddress = model.ConfirmAddress;
                order.DeliveryComment = model.Comment;
                order.PaymentDate     = DateTime.Now;
                order.PhoneNumber     = model.PhoneNumber;
            }

            user.Coins -= price;

            if (await _context.SaveChangesAsync() > 0)
            {
                execRes.AddSuccess(_localizer["Pizza was ordered successfully."]);
            }
            else
            {
                execRes.AddError(_localizer["Order could not be processed. Please try again."]).PushTo(TempData);
                return(RedirectToAction("Index"));
            }

            if (user.EmailSendUpdates)
            {
                await SendEmail(user, orders.ToArray());

                execRes.AddInfo(_localizer["Email was sent to {0}", user.Email]);
            }

            _cache.Remove(user.UserName);

            execRes.PushTo(TempData);
            return(RedirectToAction("Index", "Order"));
        }