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()); }
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)); } }
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())); }
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")); } } } }
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)); } }