public async System.Threading.Tasks.Task <IActionResult> OnPostSaveOrderAsync([FromBody] OrderAddressViewModel model)
        {
            if (!ModelState.IsValid)
            {
                IEnumerable <ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);
                return(new BadRequestObjectResult("Đặt hàng không thành công"));
            }

            using (var context = new OnlineStoreDbContext())
            {
                using (var transaction = context.Database.BeginTransaction())
                {
                    try
                    {
                        var user = _userManager.GetUserAsync(HttpContext.User).Result;
                        if (user == null)
                        {
                            return(new BadRequestObjectResult("Tất cả sản phẩm trong giỏ không thể đặt. Vui lòng kiểm tra lại giỏ hàng."));
                        }

                        var cart = _cartRepository.GetCartByCustomerId(user.Id);
                        if (cart == null)
                        {
                            return(new BadRequestObjectResult("Tất cả sản phẩm trong giỏ không thể đặt. Vui lòng kiểm tra lại giỏ hàng."));
                        }
                        var newAddress = new Address();
                        if (model.Order.ReceivingTypeId == 3)
                        {
                            newAddress = new Address
                            {
                                CustomerId        = user.Id,
                                PhoneNumber       = model.Address.PhoneNumber,
                                RecipientName     = model.Address.RecipientName,
                                ShowRoomAddressId = model.Address.ShowRoomAddressId,
                                DateCreated       = DateTime.Now,
                                DateModified      = DateTime.Now
                            };
                            context.Address.Add(newAddress);
                            context.SaveChanges();
                        }
                        var receivingType = _receivingTypeRepository.Find(model.Order.ReceivingTypeId);

                        var newOrder = new DAL.Data.Entities.Order
                        {
                            DateCreated     = DateTime.Now,
                            DateModified    = DateTime.Now,
                            DeliveryDate    = DateTime.Now.AddDays(receivingType.NumberShipDay),
                            ShippingFee     = model.Order.ShippingFee,
                            SubTotal        = cart.CartDetails.Sum(x => x.Item.Price * x.Quantity),
                            OrderDate       = DateTime.Now,
                            PaymentType     = model.Order.PaymentType,
                            ReceivingTypeId = model.Order.ReceivingTypeId,
                            SaleOff         = model.Order.SaleOff,
                            Status          = model.Order.Status == OrderStatus.ReadyToDeliver ? OrderStatus.ReadyToDeliver : OrderStatus.Pending,
                        };

                        if (model.Order.PaymentType == PaymentType.CreditDebitCard)
                        {
                            Address addressForOnlinePayment = new Address
                            {
                                CustomerId    = user.Id,
                                Detail        = "",
                                DateCreated   = DateTime.Now,
                                RecipientName = user.Name ?? "",
                                PhoneNumber   = user.PhoneNumber ?? ""
                            };
                            context.Address.Add(addressForOnlinePayment);
                            context.SaveChanges();
                            newOrder.AddressId = addressForOnlinePayment.Id;
                        }
                        else
                        {
                            newOrder.AddressId = model.Order.ReceivingTypeId == 3 ? newAddress.Id : model.Order.AddressId;
                        }

                        newOrder.Total = newOrder.SubTotal + newOrder.ShippingFee - newOrder.SaleOff;
                        context.Order.Add(newOrder);
                        context.SaveChanges();


                        var items = cart.CartDetails.Where(cd => cd.IsDeleted == false && cd.Item.Quantity > 0).ToList();

                        if (items == null || items.Count() == 0)
                        {
                            transaction.Rollback();
                            return(new BadRequestObjectResult("Tất cả sản phẩm trong giỏ không thể đặt. Vui lòng kiểm tra lại giỏ hàng."));
                        }

                        var itemsCheckout = TempData.Get <List <ItemCartViewModel> >(CommonConstants.ItemsCheckout);

                        //if (itemsCheckout.Sum(x => x.Quantity) != items.Sum(x => x.Item.Quantity))
                        //{
                        //    transaction.Rollback();
                        //    return new BadRequestObjectResult("Các sản phẩm trong giỏ đã có sự thay đổi về số lượng từ hệ thống. Vui lòng kiểm tra lại giỏ hàng.");
                        //}

                        if (itemsCheckout.Sum(x => x.Price) != items.Sum(x => x.Item.Price))
                        {
                            transaction.Rollback();
                            return(new BadRequestObjectResult("Các sản phẩm trong giỏ đã có sự thay đổi về giá từ hệ thống. Vui lòng kiểm tra lại giỏ hàng."));
                        }
                        foreach (var itemInCart in items)
                        {
                            if (itemsCheckout.Any(x => x.Quantity > itemInCart.Item.Quantity))
                            {
                                transaction.Rollback();
                                return(new BadRequestObjectResult("Các sản phẩm trong giỏ đã có sự thay đổi về số lượng từ hệ thống. Vui lòng kiểm tra lại giỏ hàng."));
                            }

                            var item = _itemRepository.Find(itemInCart.ItemId);
                            if (item.IsDeleted == false)
                            {
                                if (itemInCart.Quantity > item.Quantity)
                                {
                                    transaction.Rollback();
                                    return(new BadRequestObjectResult("Sản phẩm không còn đủ số lượng cho đơn hàng. Quá trình đặt hàng thất bại. Vui lòng kiểm tra lại giỏ hàng"));
                                }

                                var newOrderItem = new OrderItem
                                {
                                    OrderId      = newOrder.Id,
                                    Price        = item.Price,
                                    ItemId       = itemInCart.ItemId,
                                    Quantity     = itemInCart.Quantity,
                                    DateCreated  = DateTime.Now,
                                    DateModified = DateTime.Now,
                                    SaleOff      = 0,
                                    IsDeleted    = false,
                                    Amount       = item.Price * itemInCart.Quantity
                                };
                                context.OrderItem.Add(newOrderItem);
                                context.SaveChanges();

                                item.Quantity -= itemInCart.Quantity;
                                context.Item.Update(item);
                                context.SaveChanges();
                            }
                        }
                        cart.IsDeleted = true;
                        context.Cart.Update(cart);
                        context.SaveChanges();

                        var cartDetails = cart.CartDetails;
                        foreach (var cartDetail in cartDetails)
                        {
                            cartDetail.IsDeleted = true;
                            cartDetail.Quantity  = 0;
                            context.CartDetail.Update(cartDetail);
                            context.SaveChanges();
                        }
                        transaction.Commit();
                        var url = Url.Page("/Order/MyOrder", pageHandler: null, values: new { orderId = newOrder.Id }, protocol: Request.Scheme);
                        var confirmAccountModel = new OrderEmailViewModel
                        {
                            Url = url,
                            LetterDescription = $@"Yêu cầu đặt hàng cho đơn hàng #{newOrder.Id} của bạn đã được tiếp nhận và đang chờ nhà bán hàng xử lý. 
                                                  Thời gian đặt hàng vào lúc {string.Format("{0:HH:mm}", newOrder.OrderDate)} ngày {string.Format("{0:d/M/yyyy}", newOrder.OrderDate)}. 
                                                  Chúng tôi sẽ tiếp tục cập nhật với bạn về trạng thái tiếp theo của đơn hàng."
                        };
                        string body = await _razorViewToStringRenderer.RenderViewToStringAsync("~/Pages/Emails/ConfirmOrderEmail.cshtml", confirmAccountModel);

                        await _emailSender.SendEmailAsync(user.Email, "Xác nhận đơn hàng từ TimiShop", body);

                        return(new OkObjectResult(new { orderId = newOrder.Id, email = user.Email }));
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        return(new BadRequestObjectResult("Đặt hàng không thành công"));
                    }
                }
            }
        }
Exemple #2
0
        public IActionResult OnGetById(int id)
        {
            var model = _receivingTypeRepository.Find(id);

            return(new OkObjectResult(model));
        }