public async Task<IActionResult> Checkout(OrderViewModel order) { if (!ModelState.IsValid||order.OrderQuantities==null) { _logger.LogInformation("OrderViewModel is invalid", order); return RedirectToAction(nameof(EmptyOrder)); } int totalItems = 0; int index = 0; List<int> emptyIndices = new List<int>(); foreach(var item in order.OrderQuantities) { totalItems += item; if (item == 0) { emptyIndices.Add(index); } index++; } if (totalItems == 0) { return RedirectToAction(nameof(EmptyOrder)); } if (!(emptyIndices == null)) { for (int i = emptyIndices.Count-1; i >= 0; i--) { order.Products.RemoveAt(emptyIndices[i]); order.OrderQuantities.RemoveAt(emptyIndices[i]); } /*foreach (var item in emptyIndices) { order.Products.RemoveAt(item); order.OrderQuantities.RemoveAt(item); }*/ } // calculate cost double orderCost = 0; index = 0; foreach (var item in order.Products) { Product product = await _productRepository.GetProductById(item); // calculate order total orderCost += (product.UnitPrice * order.OrderQuantities[index]); index++; } int locId = order.LocationIds[0]; int userId = int.Parse(HttpContext.User.FindFirst(claim => claim.Type == "UserId").Value); // Create new order and get order id _logger.LogInformation("Attempting to create new order for user: {0}, at time: {1}",userId, DateTime.Now); var newOrder = await _orderRepository.AddOrder(userId, locId, orderCost); index = 0; // Create line items List<OrderLineItem> lineItems = new List<OrderLineItem>(); foreach(var item in order.Products) { Product product = await _productRepository.GetProductById(item); await _orderRepository.AddLineItem(userId, newOrder, product, order.OrderQuantities[index]); index++; } // var items = await _orderRepository.GetLineItems(newOrder); lineItems.AddRange(await _orderRepository.GetLineItems(newOrder)); /*var productVM = new ProductsViewModel { Locations = new SelectList(locnames.Distinct().ToList()), Products = listProducts };*/ // get location name string locName = await _locationRepository.GetLocationName(locId); var checkoutVM = new CompletedOrder { Date = newOrder.Timestamp, Location = locName, Total = orderCost, OrderLineItems = lineItems }; return View(checkoutVM); }