public async Task <Order> CreateOrderAsync(Order order) { var customLunch = _cartRepository.GetSessionLunchIfNotEmpty(order.BookingId); if (customLunch != null) { _lunchRep.SaveLunch(order.BookingId); _cartRepository.AddCateringToOrder(customLunch); } order.BookingId = order.BookingId ?? _cartRepository.GetSessionCartId(); order.Cuit = _cartRepository.GetCuit(order.BookingId); order.OrderTotal = _cartRepository.GetTotal(order.BookingId); order.TotalInStore = _cartRepository.GetTotalInStore(order.BookingId); order.Discount = _cartRepository.GetDiscount(order.BookingId); order.DeliveryAddress = _cartRepository.GetDelivery(order.BookingId); order.CustomerComments = _cartRepository.GetComments(order.BookingId)?.Comments; order.PreparationTime = _cartRepository.GetPreparationTime(order.BookingId); order.OrderPlaced = _calendarRepository.LocalTime(); order.PickedUp = false; var pickUpTime = _cartRepository.GetPickUpDate(order.BookingId); order.PickUpTimeFrom = pickUpTime.From; order.TimeLeftUntilStoreCloses = pickUpTime.To; order.PickUpTime = order.PickUpTimeFrom;// _calendarRepository.GetPickupEstimate(order.PreparationTime); _appDbContext.Orders.Add(order); _appDbContext.SaveChanges(); /**********************/ var shoppingItems = _cartRepository.GetItems(order.BookingId); _appDbContext.OrderDetails.AddRange(shoppingItems.Select(x => new OrderDetail() { Amount = x.Amount, PieId = x.Pie.PieId, OrderId = order.OrderId, Price = x.Pie.Price })); _appDbContext.SaveChanges(); /**********************/ var shoppingProductItems = _cartRepository.GetCatalogItems(order.BookingId); _appDbContext.OrderCatalogItems.AddRange(shoppingProductItems.Select(x => new OrderCatalogItem() { Amount = x.Amount, Price = x.Product.Price, OrderId = order.OrderId, ProductId = x.Product.ProductId, Product = x.Product })); _appDbContext.SaveChanges(); /**********************/ var shoppingLunches = _cartRepository.GetShoppingCaterings(order.BookingId).Select(x => _mapper.Map <ShoppingCartComboCatering, OrderCatering>(x)).ToArray(); foreach (var lunch in shoppingLunches) { lunch.Order = order; lunch.OrderId = order.OrderId; } _appDbContext.OrderCaterings.AddRange(shoppingLunches); _appDbContext.SaveChanges(); /**********************/ await _cartRepository.ClearCartAsync(order.BookingId); return(order); }