private async Task <Result <ShippingPrice> > ValidateShippingMethod(string shippingMethodName, Address shippingAddress, Cart cart) { var applicableShippingPrices = await _shippingPriceService.GetApplicableShippingPrices(new GetShippingPriceRequest { OrderAmount = cart.Items.Sum(x => x.Product.Price *x.Quantity), ShippingAddress = shippingAddress }); var shippingMethod = applicableShippingPrices.FirstOrDefault(x => x.Name == shippingMethodName); if (shippingMethod == null) { return(Result.Fail <ShippingPrice>($"Invalid shipping method {shippingMethod}")); } return(Result.Ok(shippingMethod)); }
public async Task <OrderTaxAndShippingPriceVm> UpdateTaxAndShippingPrices(long cartId, TaxAndShippingPriceRequestVm model) { var cart = await _cartRepository.Query().FirstOrDefaultAsync(x => x.Id == cartId); if (cart == null) { throw new ApplicationException($"Cart id {cartId} not found"); } Address address; if (model.ExistingShippingAddressId != 0) { address = await _userAddressRepository.Query().Where(x => x.Id == model.ExistingShippingAddressId).Select(x => x.Address).FirstOrDefaultAsync(); if (address == null) { throw new ApplicationException($"Address id {model.ExistingShippingAddressId} not found"); } } else { address = new Address { CountryId = model.NewShippingAddress.CountryId, StateOrProvinceId = model.NewShippingAddress.StateOrProvinceId, DistrictId = model.NewShippingAddress.DistrictId, ZipCode = model.NewShippingAddress.ZipCode, AddressLine1 = model.NewShippingAddress.AddressLine1, }; } var orderTaxAndShippingPrice = new OrderTaxAndShippingPriceVm { Cart = await _cartService.GetActiveCartDetails(cart.CustomerId, cart.CreatedById) }; cart.TaxAmount = orderTaxAndShippingPrice.Cart.TaxAmount = await GetTax(cartId, address.CountryId, address.StateOrProvinceId, address.ZipCode); var request = new GetShippingPriceRequest { OrderAmount = orderTaxAndShippingPrice.Cart.OrderTotal, ShippingAddress = address }; orderTaxAndShippingPrice.ShippingPrices = await _shippingPriceService.GetApplicableShippingPrices(request); var selectedShippingMethod = string.IsNullOrWhiteSpace(model.SelectedShippingMethodName) ? orderTaxAndShippingPrice.ShippingPrices.FirstOrDefault() : orderTaxAndShippingPrice.ShippingPrices.FirstOrDefault(x => x.Name == model.SelectedShippingMethodName); if (selectedShippingMethod != null) { cart.ShippingAmount = orderTaxAndShippingPrice.Cart.ShippingAmount = selectedShippingMethod.Price; cart.ShippingMethod = orderTaxAndShippingPrice.SelectedShippingMethodName = selectedShippingMethod.Name; } await _cartRepository.SaveChangesAsync(); return(orderTaxAndShippingPrice); }