public async Task <IActionResult> ClientGetOrderList() { // Get customer var customer = GetCustomer(); if (customer == null) { return(Ok(ResponseDTO.BadRequest("Invalid customer's username."))); } // Get orders var orders = customer.Orders; var listResults = new List <ClientOrderResponseDTO>(); foreach (var order in orders) { // Get address var sendAddress = await _context.Addresses.FirstOrDefaultAsync(c => c.Id == (order.AddressId ?? 0)); if (sendAddress == null) { // return Ok(ResponseDTO.BadRequest("Invalid addrss for current order.")); continue; } // Response var orderItems = order.OrderItems; List <ClientOrder_CartItemDTO> cartItemDTOList = new List <ClientOrder_CartItemDTO>() { }; foreach (var item in orderItems) { var stock = await _context.Stocks.FirstOrDefaultAsync(s => s.Id == item.StockId); var shoes = await _context.Shoes.FirstOrDefaultAsync(s => s.Id == stock.ShoesId); var image = await _context.ShoesImages.FirstOrDefaultAsync(i => i.ShoesId == item.Stock.ShoesId); var size = await _context.Sizes.FirstOrDefaultAsync(s => s.Id == stock.SizeId); var cart = new ClientOrder_CartItemDTO { stockId = item.Id, shoesId = shoes.Id, name = shoes.Name, sizeName = size.Name, quantity = item.Amount, price = item.Total, image = image != null ? image.ImagePath : "" }; cartItemDTOList.Add(cart); } var responseDTO = new ClientOrderResponseDTO() { id = order.Id, customerID = customer.Id, saleID = 0, city = sendAddress.City, orderDate = order.OrderDate, confirmDate = order.ConfirmDate, deliveryDate = order.DeliveryDate, total = order.Total, status = order.Status, paymentStatus = order.DeliveryDate.HasValue ? (int)PaymentStatus.Paid : (int)PaymentStatus.NotYet, deliveryAddress = order.DeliverAddress, recipientName = sendAddress.RecipientName, recipientPhoneNumber = sendAddress.RecipientPhoneNumber, cartItemDTOList = cartItemDTOList // cartItemDTOList = orderItems.Select(c => new ClientOrder_CartItemDTO // { // stockId = c.StockId, // shoesId = c.Stock.ShoesId, // name = c.Stock.Shoes.Name, // sizeName = c.Stock.Size.Name, // quantity = c.Amount, // price = c.Total, // image = c.Stock.Shoes.ShoesImages.FirstOrDefault().ImagePath // }).ToArray().ToList() }; listResults.Add(responseDTO); } return(Ok(ResponseDTO.Ok(listResults))); }
public async Task <IActionResult> ClientProcessOrder([FromQuery(Name = "addressId")] int addressId) { // Get customer var customer = GetCustomer(); if (customer == null) { return(BadRequest(ResponseDTO.BadRequest("Invalid customer's username."))); } // Check addressId var sendAddress = customer.Addresses.FirstOrDefault(o => o.Id == addressId); if (sendAddress == null || string.IsNullOrEmpty(sendAddress.RecipientName) || string.IsNullOrEmpty(sendAddress.RecipientPhoneNumber) ) { return(BadRequest(ResponseDTO.BadRequest($"Invalid address for current customer: {customer.Username}."))); } // Check cart var cartItems = customer.Cart.CartItems; if (customer.Cart.CartItems.Count == 0) { return(BadRequest(ResponseDTO.BadRequest($"No items in cart for current customer: {customer.Username}"))); } // Convert cart items to order items // 1: Create order var newOrder = new Order() { OrderDate = DateTime.Now, Total = 0, Status = (int)OrderStatus.Waiting, DeliverAddress = sendAddress.ToString(), ConfirmDate = null, CancelDate = null, BeginDelivery = null, DeliveryDate = null, Note = "", RecipientName = sendAddress.RecipientName, RecipientPhoneNumber = sendAddress.RecipientPhoneNumber, CustomerId = customer.Id, OrderItems = new List <OrderItem>(), AddressId = addressId }; newOrder = await _repository.Add(newOrder); // 2: Create order items var orderItems = new List <OrderItem>(); float orderTotal = 0; foreach (var ci in cartItems) { var item = new OrderItem() { Amount = ci.Amount, PricePerUnit = ci.Stock.Shoes.Price, OrderId = newOrder.Id, StockId = ci.StockId, Total = 0 }; var priceWithSale = item.PricePerUnit; var productSale = await _context.SaleProducts .Include(c => c.Sale) .FirstOrDefaultAsync(c => c.Shoes.Id == ci.Stock.Shoes.Id); if (productSale != null && productSale.Sale.Status != 0) { var sale = productSale.Sale; priceWithSale -= sale.SaleType == 1 ? priceWithSale * (float)((float)sale.Amount / 100.0) : sale.Amount; } item.Total = item.Amount * priceWithSale; orderTotal += item.Total; // Update stock var stock = _context.Stocks.FirstOrDefault(c => c.Id == item.StockId); if (stock != null) { // TODO: Check stock.Instock -= item.Amount; } // Update cartItems in database _context.CartItems.Remove(ci); orderItems.Add(item); } newOrder.OrderItems = orderItems; newOrder.Total = orderTotal; await _context.SaveChangesAsync(); // Response var responseDTO = new ClientOrderResponseDTO() { id = newOrder.Id, customerID = customer.Id, saleID = 0, city = sendAddress.City, orderDate = newOrder.OrderDate, confirmDate = newOrder.ConfirmDate, deliveryDate = newOrder.DeliveryDate, total = newOrder.Total, status = newOrder.Status, paymentStatus = newOrder.DeliveryDate.HasValue ? (int)PaymentStatus.Paid : (int)PaymentStatus.NotYet, deliveryAddress = newOrder.DeliverAddress, recipientName = sendAddress.RecipientName, recipientPhoneNumber = sendAddress.RecipientPhoneNumber, cartItemDTOList = orderItems.Select(c => new ClientOrder_CartItemDTO { stockId = c.StockId, shoesId = c.Stock.ShoesId, name = c.Stock.Shoes.Name, sizeName = c.Stock.Size.Name, quantity = c.Amount, price = c.Total, image = c.Stock.Shoes.ShoesImages.FirstOrDefault().ImagePath }).ToList() }; return(Ok(ResponseDTO.Ok(responseDTO))); }