public async Task <IActionResult> Checkout(OrderAddressViewModel orderAddressViewModel)
        {
            try
            {
                await this.shoppingCartGatewayService.Checkout(orderAddressViewModel);

                return(this.RedirectToAction(nameof(Success)));
            }
            catch (Refit.ApiException apiEx)
            {
                if (apiEx.HasContent)
                {
                    JsonConvert
                    .DeserializeObject <List <string> >(apiEx.Content)
                    .ForEach(error => this.ModelState.AddModelError(string.Empty, error));
                }
                else
                {
                    this.ModelState.AddModelError(string.Empty, ErrorConstants.InternalServerErrorMessage);
                }

                this.HandleException(apiEx);
            }

            return(this.View());
        }
コード例 #2
0
        public async Task <ActionResult> Checkout(OrderAddressViewModel orderAddressViewModel)
        {
            try
            {
                var shoppingCartViewModel = await this.shoppingCartService.GetShoppingCart(this.currentUserService.UserId);

                if (orderAddressViewModel.IsAddressAvailable)
                {
                    await this.orderingService.PlaceOrder(this.currentUserService.UserId, orderAddressViewModel.Id, shoppingCartViewModel.CartItemViewModels);
                }
                else
                {
                    var addressId = await this.catalogService.CreateAddress(this.currentUserService.UserId, orderAddressViewModel);

                    await this.orderingService.PlaceOrder(this.currentUserService.UserId, addressId, shoppingCartViewModel.CartItemViewModels);
                }

                await this.shoppingCartService.Clear(this.currentUserService.UserId);

                return(this.Ok());
            }
            catch (Exception ex)
            {
                return(this.BadRequest(ex.Message));
            }
        }
コード例 #3
0
        public async Task <ActionResult <int> > CreateAddress([FromQuery] string userId, OrderAddressViewModel orderAddressViewModel)
        {
            if (!this.ModelState.IsValid)
            {
                return(this.BadRequest(AddressConstants.InvalidAddressMessage));
            }

            var address = this.mapper.Map <OrderAddressViewModel, Address>(orderAddressViewModel);

            var anyAddresses = await this.catalogDbContext
                               .Addresses
                               .Include(x => x.Customer)
                               .AnyAsync(x => x.Customer.UserId == userId);

            if (!anyAddresses)
            {
                address.IsDeliveryAddress = true;
            }

            var customer = await this.catalogDbContext
                           .Customers
                           .Include(x => x.Addresses)
                           .FirstOrDefaultAsync(x => x.UserId == userId);

            if (customer == null)
            {
                return(this.BadRequest(AddressConstants.CustomerDoesNotExistMessage));
            }

            customer
            .Addresses
            .Add(address);

            this.catalogDbContext
            .Customers
            .Update(customer);

            return(this.Ok(await this.catalogDbContext
                           .SaveChangesAsync()));
        }
コード例 #4
0
        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"));
                    }
                }
            }
        }
コード例 #5
0
        public IActionResult Checkout(OrderCheckoutViewModel vm)
        {
            var cart = GetCart();

            if (cart.Lines.Count() == 0)
            {
                ModelState.AddModelError("", "Your cart is empty");
            }

            if (!vm.AddressId.HasValue)
            {
                OrderAddressViewModel address = new OrderAddressViewModel
                {
                    Line1    = vm.Line1,
                    Line2    = vm.Line2,
                    Line3    = vm.Line3,
                    City     = vm.City,
                    State    = vm.State,
                    Country  = vm.Country,
                    Postcode = vm.Postcode
                };

                TryValidateModel(address);
            }

            if (ModelState.IsValid)
            {
                Order order = new Order
                {
                    OrderId  = vm.OrderId,
                    Name     = vm.Name,
                    Line1    = vm.Line1,
                    Line2    = vm.Line2,
                    Line3    = vm.Line3,
                    City     = vm.City,
                    State    = vm.State,
                    Country  = vm.Country,
                    Postcode = vm.Postcode,
                    Lines    = cart.Lines.ToList()
                };
                if (vm.AddressId.HasValue)
                {
                    var    address  = _addressDataService.GetSingle(a => a.AddressId == vm.AddressId);
                    string userId   = _userManager.GetUserId(User);
                    var    customer = _customerDataService.GetQuery().Where(c => c.UserID == userId).Select(c => c.FirstName).FirstOrDefault();
                    order.Line1    = address.StreetNumber;
                    order.Line2    = address.StreetName;
                    order.City     = address.City;
                    order.State    = address.State;
                    order.Country  = address.Country;
                    order.Postcode = address.Postcode;
                    order.Name     = customer;
                }
                vm.CartLine = cart.Lines.ToArray();
                _orderDataService.SaveOrder(order);
                return(RedirectToAction(nameof(Completed)));
            }
            else
            {
                string userId = _userManager.GetUserId(User);
                //int customerId = _customerDataService.GetQuery().Where(c => c.UserID == userId).Select(c => c.CustomerId).FirstOrDefault();
                var addresses = _addressDataService.GetQuery().Where(a => a.customer.UserID == userId).Select(a => new
                {
                    AddressId   = a.AddressId,
                    FullAddress = a.StreetNumber + " " + a.StreetName + " " + a.City + " " + a.State + " " + a.Country + " " + a.Postcode
                }).ToList();
                vm.Addresses = new SelectList(addresses, "AddressId", "FullAddress");
                return(View(vm));
            }
        }