public async Task <IActionResult> CreateOrder([FromBody] OrderModel model) { try { var userID = HttpContext.User.Identity.Name; if (userID == null) { return(StatusCode(StatusCodes.Status401Unauthorized)); } ApplicationUser user = await _context.Set <ApplicationUser>().SingleOrDefaultAsync(item => item.UserName == userID); if (user == null) { return(BadRequest("Token is not related to any Account")); } Account account = _context.Set <Account>().Include(x => x.Cart) .ThenInclude(x => x.CartItems).FirstOrDefault(x => x.ID == user.AccountID); if (user == null || account == null) { return(null); } //if (!user.IsVerified) return StatusCode(StatusCodes.Status426UpgradeRequired); Order order = new Order() { AccountID = account.ID, CreationDate = DateTime.Now, FromTime = DateTime.Parse(model.FromTime), ToTime = DateTime.Parse(model.ToTime), Location = model.Location, PromoCode = model.PromoCode, LocationRemark = model.LocationRemark, LocationText = model.LocationText, Mobile = model.Mobile, Remark = model.Remark, Name = model.Name, Status = OrderStatus.InProgress.ToString(), UseWallet = model.UseWallet, }; if (!string.IsNullOrEmpty(model.PromoCode)) { var Cash = _context.Set <CashOffer>().FirstOrDefault(s => s.PromoCode == model.PromoCode); if (Cash != null) { order.Discount = Cash.Percentge; } } foreach (var record in model.OrderItems) { if (record == null) { continue; } OrderItem orderItem = new OrderItem() { ItemID = record.OrderItemID, Quantity = record.Quantity, OfferID = record.OfferID }; order.OrderItems.Add(orderItem); if (account.Cart != null) { var item = account.Cart.CartItems.FirstOrDefault(x => x.ItemID == record.OrderItemID); if (item != null) { account.Cart.CartItems.Remove(item); } } } if (order.GenerateCode(_context as NavaraDbContext) == false) { return(BadRequest("Error while generating Order Code")); } if (order.UseWallet == true) { int amount = ((int)(account.Wallet / 100)) * 100; amount = Math.Min(amount, (account.Wallet as int?) ?? 0); account.Wallet -= amount; order.WalletAmount = amount; } this._context.Set <Order>().Add(order); await this._context.SaveChangesAsync(); Thread UpdateAllInfo = new Thread(async() => { using (var context = new NavaraDbContext()) { var orginalOrder = await context.Orders.Include("OrderItems").Include("Account").Include("Account.User") .Include("OrderItems.Item").Include("OrderItems.Offer").FirstOrDefaultAsync(x => x.ID == order.ID); await orginalOrder.FixMissingOfferItems(context); await orginalOrder.UpdateOrder(context); string pdfPath = await orginalOrder.CreatePDF(_converter, context as NavaraDbContext); #region Send Email to Support await EmailService.SendEmailToSupport($"New Order", $"Order # {orginalOrder.Code}\r\n" + $"Account: {orginalOrder.Account.Name}\r\n" + $"Amount: {orginalOrder.OrderItems.Sum(x => x.Total)}\r\n" + $"Date: {orginalOrder.CreationDate}\r\n" + $"Days To Deliver: {orginalOrder.DaysToDeliver}\r\n" + $"Items:\r\n{string.Join("\t | \t", orginalOrder.OrderItems.Select(x => x.Item?.Name + " : " + x.Quantity))}", Path.Combine("wwwroot", pdfPath)); string Mobile = "+" + order.Account.User.CountryCode + order.Account.User.PhoneNumber; if (!string.IsNullOrWhiteSpace(Mobile)) { string message = $"Thank you for choosing Navara Store\r\nYour Order had been recieved\r\nOrder Code: {order.Code}\r\nOrder invoice: {Path.Combine("http://api.navarastore.com/", pdfPath.Replace("\\", "/"))}"; SMSService.SendWhatsApp(message, Mobile); } #endregion } }); UpdateAllInfo.Start(); return(Json(new { OrderCode = order.Code, DaysToDeliver = order.DaysToDeliver })); } catch (Exception ex) { return(BadRequest(ex.Message)); } }