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)); }
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")); }