public ActionResult NewShippingAddress(CheckoutShippingAddressModel model) { //validation var cart = _workContext.CurrentCustomer.ShoppingCartItems .Where(sci => sci.ShoppingCartType == ShoppingCartType.ShoppingCart) .Where(sci => sci.StoreId == _storeContext.CurrentStore.Id) .ToList(); if (cart.Count == 0) return RedirectToRoute("ShoppingCart"); if (UseOnePageCheckout()) return RedirectToRoute("CheckoutOnePage"); if ((_workContext.CurrentCustomer.IsGuest() && !_orderSettings.AnonymousCheckoutAllowed)) return new HttpUnauthorizedResult(); if (!cart.RequiresShipping()) { _workContext.CurrentCustomer.ShippingAddress = null; _customerService.UpdateCustomer(_workContext.CurrentCustomer); return RedirectToRoute("CheckoutShippingMethod"); } if (ModelState.IsValid) { var address = model.NewAddress.ToEntity(); address.CreatedOnUtc = DateTime.UtcNow; //some validation if (address.CountryId == 0) address.CountryId = null; if (address.StateProvinceId == 0) address.StateProvinceId = null; _workContext.CurrentCustomer.Addresses.Add(address); _workContext.CurrentCustomer.ShippingAddress = address; _customerService.UpdateCustomer(_workContext.CurrentCustomer); return RedirectToRoute("CheckoutShippingMethod"); } //If we got this far, something failed, redisplay form model = PrepareShippingAddressModel(model.NewAddress.CountryId); return View(model); }
public ActionResult OpcSaveShipping(FormCollection form) { try { //validation var cart = _workContext.CurrentCustomer.ShoppingCartItems .Where(sci => sci.ShoppingCartType == ShoppingCartType.ShoppingCart) .Where(sci => sci.StoreId == _storeContext.CurrentStore.Id) .ToList(); if (cart.Count == 0) throw new Exception("Your cart is empty"); if (!UseOnePageCheckout()) throw new Exception("One page checkout is disabled"); if ((_workContext.CurrentCustomer.IsGuest() && !_orderSettings.AnonymousCheckoutAllowed)) throw new Exception("Anonymous checkout is not allowed"); if (!cart.RequiresShipping()) throw new Exception("Shipping is not required"); int shippingAddressId = 0; int.TryParse(form["shipping_address_id"], out shippingAddressId); if (shippingAddressId > 0) { //existing address var address = _workContext.CurrentCustomer.Addresses.FirstOrDefault(a => a.Id == shippingAddressId); if (address == null) throw new Exception("Address can't be loaded"); _workContext.CurrentCustomer.ShippingAddress = address; _customerService.UpdateCustomer(_workContext.CurrentCustomer); } else { //new address var model = new CheckoutShippingAddressModel(); TryUpdateModel(model.NewAddress, "ShippingNewAddress"); //validate model TryValidateModel(model.NewAddress); if (!ModelState.IsValid) { //model is not valid. redisplay the form with errors var shippingAddressModel = PrepareShippingAddressModel(model.NewAddress.CountryId); shippingAddressModel.NewAddressPreselected = true; return Json(new { update_section = new UpdateSectionJsonModel() { name = "shipping", html = this.RenderPartialViewToString("OpcShippingAddress", shippingAddressModel) } }); } //try to find an address with the same values (don't duplicate records) var address = _workContext.CurrentCustomer.Addresses.ToList().FindAddress( model.NewAddress.FirstName, model.NewAddress.LastName, model.NewAddress.PhoneNumber, model.NewAddress.Email, model.NewAddress.FaxNumber, model.NewAddress.Company, model.NewAddress.Address1, model.NewAddress.Address2, model.NewAddress.City, model.NewAddress.StateProvinceId, model.NewAddress.ZipPostalCode, model.NewAddress.CountryId); if (address == null) { address = model.NewAddress.ToEntity(); address.CreatedOnUtc = DateTime.UtcNow; //little hack here (TODO: find a better solution) //EF does not load navigation properties for newly created entities (such as this "Address"). //we have to load them manually //otherwise, "Country" property of "Address" entity will be null in shipping rate computation methods if (address.CountryId.HasValue) address.Country = _countryService.GetCountryById(address.CountryId.Value); if (address.StateProvinceId.HasValue) address.StateProvince = _stateProvinceService.GetStateProvinceById(address.StateProvinceId.Value); //other null validations if (address.CountryId == 0) address.CountryId = null; if (address.StateProvinceId == 0) address.StateProvinceId = null; _workContext.CurrentCustomer.Addresses.Add(address); } _workContext.CurrentCustomer.ShippingAddress = address; _customerService.UpdateCustomer(_workContext.CurrentCustomer); } var shippingMethodModel = PrepareShippingMethodModel(cart); return Json(new { update_section = new UpdateSectionJsonModel() { name = "shipping-method", html = this.RenderPartialViewToString("OpcShippingMethods", shippingMethodModel) }, goto_section = "shipping_method" }); } catch (Exception exc) { _logger.Warning(exc.Message, exc, _workContext.CurrentCustomer); return Json(new { error = 1, message = exc.Message }); } }
protected CheckoutShippingAddressModel PrepareShippingAddressModel(int? selectedCountryId = null) { var model = new CheckoutShippingAddressModel(); //existing addresses var addresses = _workContext.CurrentCustomer.Addresses.Where(a => a.Country == null || a.Country.AllowsShipping).ToList(); foreach (var address in addresses) { var addressModel = new AddressModel(); addressModel.PrepareModel(address, false, _addressSettings); model.ExistingAddresses.Add(addressModel); } //new address model.NewAddress.CountryId = selectedCountryId; model.NewAddress.PrepareModel(null, false, _addressSettings, _localizationService, _stateProvinceService, () => _countryService.GetAllCountriesForShipping()); return model; }