From 7ddcab99ff5e1b006682fb71cf2a06894258ba71 Mon Sep 17 00:00:00 2001 From: Viet Anh Nguyen Date: Tue, 5 Nov 2019 10:14:22 +0700 Subject: [PATCH] Quicksilver release version 13.10.0 --- Sources/AssemblyVersionAuto.cs | 6 +- ...PiServer.Reference.Commerce.Manager.csproj | 56 ++--- .../packages.config | 4 +- .../web.config | 38 ++-- ...EPiServer.Reference.Commerce.Shared.csproj | 38 ++-- .../packages.config | 2 +- ...erver.Reference.Commerce.Site.Tests.csproj | 45 ++-- .../Services/CheckoutAddressHandlingTests.cs | 5 +- .../Checkout/Services/CheckoutServiceTests.cs | 11 +- .../ErrorHandlingControllerTests.cs | 85 ------- .../app.config | 4 + .../packages.config | 6 +- .../App_Data/DefaultSiteContent.episerverdata | Bin 18811 -> 18257 bytes .../EPiServer.Reference.Commerce.Site.csproj | 67 +++--- .../Cart/Controllers/CartController.cs | 3 - .../Controllers/CheckoutController.cs | 38 +++- .../Services/CheckoutAddressHandling.cs | 59 ++++- .../Checkout/Services/CheckoutService.cs | 31 ++- .../Controllers/ErrorHandlingController.cs | 69 +++--- .../ErrorHandling/Pages/ErrorFallback.html | 7 - .../Features/ErrorHandling/Pages/ErrorPage.cs | 16 -- .../ViewModels/ErrorViewModel.cs | 9 - .../Controllers/StandardPageController.cs | 15 +- .../Start/Controllers/StartController.cs | 2 +- .../Features/Start/Pages/StartPage.cs | 9 +- .../Global.asax.cs | 52 ++++- .../Views/Bundle/Index.cshtml | 19 +- .../Views/Bundle/_Quickview.cshtml | 32 ++- .../Views/Cart/LargeCart.cshtml | 6 +- .../Views/Checkout/BillingAddress.cshtml | 185 +++++++++++----- .../Checkout/MultiShipmentCheckout.cshtml | 54 ++--- .../Checkout/SingleShipmentCheckout.cshtml | 61 +++--- .../Checkout/SingleShippingAddress.cshtml | 207 ++++++++++++------ .../Views/ErrorHandling/Forbidden.cshtml | 17 ++ .../Views/ErrorHandling/Index.cshtml | 11 - .../Views/ErrorHandling/InternalError.cshtml | 17 ++ .../ErrorHandling/OtherHttpStatusCode.cshtml | 17 ++ .../Views/ErrorHandling/PageNotFound.cshtml | 9 + .../Views/MultiShipment/Index.cshtml | 39 ++-- .../Views/Package/Index.cshtml | 4 +- .../Views/Package/_Quickview.cshtml | 4 +- .../Views/Product/Index.cshtml | 4 +- .../Views/Product/_Quickview.cshtml | 4 +- .../Views/Shared/_MiniCartDetails.cshtml | 6 +- .../Views/Shared/_Product.cshtml | 2 +- .../Web.Release.config | 4 +- .../Web.config | 56 ++--- .../episerver.config | 7 +- .../modules/_protected/Commerce/Commerce.zip | Bin 46027 -> 46040 bytes ...rver.Commerce.Shell.ManagerIntegration.zip | Bin 1328 -> 1328 bytes .../EPiServer.Commerce.Shell.zip | Bin 557643 -> 558526 bytes .../EPiServer.Commerce.UI.CustomerService.zip | Bin 5611033 -> 5663915 bytes .../packages.config | 16 +- 53 files changed, 814 insertions(+), 644 deletions(-) delete mode 100644 Sources/EPiServer.Reference.Commerce.Site.Tests/Features/ErrorHandling/Controllers/ErrorHandlingControllerTests.cs delete mode 100644 Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/Pages/ErrorFallback.html delete mode 100644 Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/Pages/ErrorPage.cs delete mode 100644 Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/ViewModels/ErrorViewModel.cs create mode 100644 Sources/EPiServer.Reference.Commerce.Site/Views/ErrorHandling/Forbidden.cshtml delete mode 100644 Sources/EPiServer.Reference.Commerce.Site/Views/ErrorHandling/Index.cshtml create mode 100644 Sources/EPiServer.Reference.Commerce.Site/Views/ErrorHandling/InternalError.cshtml create mode 100644 Sources/EPiServer.Reference.Commerce.Site/Views/ErrorHandling/OtherHttpStatusCode.cshtml create mode 100644 Sources/EPiServer.Reference.Commerce.Site/Views/ErrorHandling/PageNotFound.cshtml diff --git a/Sources/AssemblyVersionAuto.cs b/Sources/AssemblyVersionAuto.cs index 425ebf97..f8b527b1 100644 --- a/Sources/AssemblyVersionAuto.cs +++ b/Sources/AssemblyVersionAuto.cs @@ -3,6 +3,6 @@ [assembly: AssemblyCopyright("Copyright ? 2019 Episerver")] -[assembly: AssemblyVersion("13.9.0.0")] -[assembly: AssemblyInformationalVersion("13.9.0")] -[assembly: AssemblyFileVersion("13.9.0.3821")] +[assembly: AssemblyVersion("13.10.0.0")] +[assembly: AssemblyInformationalVersion("13.10.0")] +[assembly: AssemblyFileVersion("13.10.0.3843")] diff --git a/Sources/EPiServer.Reference.Commerce.Manager/EPiServer.Reference.Commerce.Manager.csproj b/Sources/EPiServer.Reference.Commerce.Manager/EPiServer.Reference.Commerce.Manager.csproj index 690e8c22..d4e345fd 100644 --- a/Sources/EPiServer.Reference.Commerce.Manager/EPiServer.Reference.Commerce.Manager.csproj +++ b/Sources/EPiServer.Reference.Commerce.Manager/EPiServer.Reference.Commerce.Manager.csproj @@ -376,109 +376,109 @@ --> - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\EPiServer.Business.Commerce.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\EPiServer.Business.Commerce.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\EPiServer.Commerce.Reporting.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\EPiServer.Commerce.Reporting.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\EPiServer.Commerce.Internal.Migration.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\EPiServer.Commerce.Internal.Migration.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.BusinessFoundation.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.BusinessFoundation.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.BusinessFoundation.Data.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.BusinessFoundation.Data.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Marketing.Validators.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Marketing.Validators.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Plugins.Payment.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Plugins.Payment.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Plugins.Shipping.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Plugins.Shipping.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Website.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Website.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Workflow.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Workflow.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.DataProvider.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.DataProvider.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.FileUploader.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.FileUploader.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.MetaDataPlus.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.MetaDataPlus.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Search.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Search.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Search.Extensions.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Search.Extensions.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Search.LuceneSearchProvider.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Search.LuceneSearchProvider.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.SqlDataProvider.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.SqlDataProvider.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.WebConsoleLib.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.WebConsoleLib.dll True - ..\..\packages\EPiServer.CommerceManager.13.9.0\lib\net461\Mediachase.ConsoleManager.dll + ..\..\packages\EPiServer.CommerceManager.13.10.0\lib\net461\Mediachase.ConsoleManager.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\AjaxControlToolkit.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\AjaxControlToolkit.dll True - ..\..\packages\EPiServer.CommerceManager.13.9.0\lib\net461\ComponentArt.Web.UI.dll + ..\..\packages\EPiServer.CommerceManager.13.10.0\lib\net461\ComponentArt.Web.UI.dll True - ..\..\packages\EPiServer.CommerceManager.13.9.0\lib\net461\RssToolkit.dll + ..\..\packages\EPiServer.CommerceManager.13.10.0\lib\net461\RssToolkit.dll True - ..\..\packages\EPiServer.CommerceManager.13.9.0\lib\net461\Validators.dll + ..\..\packages\EPiServer.CommerceManager.13.10.0\lib\net461\Validators.dll True - + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - + diff --git a/Sources/EPiServer.Reference.Commerce.Manager/packages.config b/Sources/EPiServer.Reference.Commerce.Manager/packages.config index e9afaebd..63f821fa 100644 --- a/Sources/EPiServer.Reference.Commerce.Manager/packages.config +++ b/Sources/EPiServer.Reference.Commerce.Manager/packages.config @@ -45,6 +45,6 @@ - - + + diff --git a/Sources/EPiServer.Reference.Commerce.Manager/web.config b/Sources/EPiServer.Reference.Commerce.Manager/web.config index 22974408..f8470e76 100644 --- a/Sources/EPiServer.Reference.Commerce.Manager/web.config +++ b/Sources/EPiServer.Reference.Commerce.Manager/web.config @@ -540,79 +540,79 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/Sources/EPiServer.Reference.Commerce.Shared/EPiServer.Reference.Commerce.Shared.csproj b/Sources/EPiServer.Reference.Commerce.Shared/EPiServer.Reference.Commerce.Shared.csproj index 62d05448..5d4bef73 100644 --- a/Sources/EPiServer.Reference.Commerce.Shared/EPiServer.Reference.Commerce.Shared.csproj +++ b/Sources/EPiServer.Reference.Commerce.Shared/EPiServer.Reference.Commerce.Shared.csproj @@ -267,79 +267,79 @@ --> - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\EPiServer.Business.Commerce.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\EPiServer.Business.Commerce.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\EPiServer.Commerce.Internal.Migration.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\EPiServer.Commerce.Internal.Migration.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.BusinessFoundation.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.BusinessFoundation.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.BusinessFoundation.Data.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.BusinessFoundation.Data.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Marketing.Validators.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Marketing.Validators.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Plugins.Payment.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Plugins.Payment.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Plugins.Shipping.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Plugins.Shipping.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Website.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Website.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Workflow.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Workflow.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.DataProvider.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.DataProvider.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.FileUploader.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.FileUploader.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.MetaDataPlus.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.MetaDataPlus.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Search.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Search.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Search.Extensions.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Search.Extensions.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Search.LuceneSearchProvider.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Search.LuceneSearchProvider.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.SqlDataProvider.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.SqlDataProvider.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.WebConsoleLib.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.WebConsoleLib.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\AjaxControlToolkit.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\AjaxControlToolkit.dll True diff --git a/Sources/EPiServer.Reference.Commerce.Shared/packages.config b/Sources/EPiServer.Reference.Commerce.Shared/packages.config index 09ef1b56..2f0cb381 100644 --- a/Sources/EPiServer.Reference.Commerce.Shared/packages.config +++ b/Sources/EPiServer.Reference.Commerce.Shared/packages.config @@ -39,5 +39,5 @@ - + diff --git a/Sources/EPiServer.Reference.Commerce.Site.Tests/EPiServer.Reference.Commerce.Site.Tests.csproj b/Sources/EPiServer.Reference.Commerce.Site.Tests/EPiServer.Reference.Commerce.Site.Tests.csproj index 22b2651d..100c18e8 100644 --- a/Sources/EPiServer.Reference.Commerce.Site.Tests/EPiServer.Reference.Commerce.Site.Tests.csproj +++ b/Sources/EPiServer.Reference.Commerce.Site.Tests/EPiServer.Reference.Commerce.Site.Tests.csproj @@ -303,7 +303,6 @@ - @@ -398,91 +397,91 @@ --> - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\EPiServer.Business.Commerce.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\EPiServer.Business.Commerce.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\EPiServer.Commerce.Reporting.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\EPiServer.Commerce.Reporting.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\EPiServer.Commerce.Internal.Migration.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\EPiServer.Commerce.Internal.Migration.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.BusinessFoundation.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.BusinessFoundation.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.BusinessFoundation.Data.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.BusinessFoundation.Data.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Marketing.Validators.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Marketing.Validators.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Plugins.Payment.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Plugins.Payment.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Plugins.Shipping.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Plugins.Shipping.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Website.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Website.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Workflow.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Workflow.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.DataProvider.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.DataProvider.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.FileUploader.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.FileUploader.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.MetaDataPlus.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.MetaDataPlus.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Search.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Search.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Search.Extensions.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Search.Extensions.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Search.LuceneSearchProvider.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Search.LuceneSearchProvider.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.SqlDataProvider.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.SqlDataProvider.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.WebConsoleLib.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.WebConsoleLib.dll True - ..\..\packages\EPiServer.Tracking.Commerce.3.2.1\lib\net461\EPiServer.Tracking.Commerce.dll + ..\..\packages\EPiServer.Tracking.Commerce.3.2.2\lib\net461\EPiServer.Tracking.Commerce.dll True - ..\..\packages\EPiServer.Personalization.Commerce.3.2.1\lib\net461\EPiServer.Personalization.Commerce.dll + ..\..\packages\EPiServer.Personalization.Commerce.3.2.2\lib\net461\EPiServer.Personalization.Commerce.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\AjaxControlToolkit.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\AjaxControlToolkit.dll True diff --git a/Sources/EPiServer.Reference.Commerce.Site.Tests/Features/Checkout/Services/CheckoutAddressHandlingTests.cs b/Sources/EPiServer.Reference.Commerce.Site.Tests/Features/Checkout/Services/CheckoutAddressHandlingTests.cs index 63e9bab5..fd76f285 100644 --- a/Sources/EPiServer.Reference.Commerce.Site.Tests/Features/Checkout/Services/CheckoutAddressHandlingTests.cs +++ b/Sources/EPiServer.Reference.Commerce.Site.Tests/Features/Checkout/Services/CheckoutAddressHandlingTests.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using EPiServer.Data; using EPiServer.Reference.Commerce.Site.Features.AddressBook.Services; using EPiServer.Reference.Commerce.Site.Features.Cart.ViewModels; using EPiServer.Reference.Commerce.Site.Features.Checkout.Services; @@ -158,11 +159,13 @@ public void ChangeAddress_WhenShippingAddressIndexHasInValidValue_ShouldUpdateBi private readonly CheckoutAddressHandling _subject; private readonly Mock _addressBookServiceMock; + private readonly Mock _databaseModeMock; public CheckoutAddressHandlingTests() { _addressBookServiceMock = new Mock(); - _subject = new CheckoutAddressHandling(_addressBookServiceMock.Object); + _databaseModeMock = new Mock(); + _subject = new CheckoutAddressHandling(_addressBookServiceMock.Object, _databaseModeMock.Object); } } } diff --git a/Sources/EPiServer.Reference.Commerce.Site.Tests/Features/Checkout/Services/CheckoutServiceTests.cs b/Sources/EPiServer.Reference.Commerce.Site.Tests/Features/Checkout/Services/CheckoutServiceTests.cs index 99f6295f..65218227 100644 --- a/Sources/EPiServer.Reference.Commerce.Site.Tests/Features/Checkout/Services/CheckoutServiceTests.cs +++ b/Sources/EPiServer.Reference.Commerce.Site.Tests/Features/Checkout/Services/CheckoutServiceTests.cs @@ -1,5 +1,6 @@ using EPiServer.Commerce.Order; using EPiServer.Core; +using EPiServer.Data; using EPiServer.Framework.Localization; using EPiServer.Reference.Commerce.Shared.Services; using EPiServer.Reference.Commerce.Site.Features.AddressBook.Services; @@ -259,12 +260,12 @@ public void PlaceOrder_WhenPaymentProcessingFails_ShouldReturnNullAndAddModelErr _orderGroupCalculatorMock.Setup(p => p.GetTotal(It.IsAny())).Throws(new PaymentException("", "", "")); - var PaymentMethodMock = new Mock(String.Empty); + var paymentMethodMock = new Mock(string.Empty); var viewModel = new CheckoutViewModel { BillingAddress = new AddressModel { AddressId = "billingAddress" }, - Payment = PaymentMethodMock.Object + Payment = paymentMethodMock.Object }; var result = _subject.PlaceOrder(cart, modelState, viewModel); @@ -380,6 +381,8 @@ public void SendConfirmation_WhenFails_ShouldReturnFalse() private readonly Mock _customerContextFacadeMock; private readonly Mock _paymentProcessorMock; private readonly Mock _localizedOrderValidationServiceMock; + private readonly Mock _databaseModeMock; + public CheckoutServiceTests() { var addressBookServiceMock = new Mock(); @@ -388,6 +391,7 @@ public CheckoutServiceTests() _orderGroupCalculatorMock = new Mock(); _orderRepositoryMock = new Mock(); + _databaseModeMock = new Mock(); _mailServiceMock = new Mock(); _contentRepositoryMock = new Mock(); @@ -414,7 +418,8 @@ public CheckoutServiceTests() _customerContextFacadeMock.Object, new MemoryLocalizationService(), _mailServiceMock.Object, - _cartServiceMock.Object); + _cartServiceMock.Object, + _databaseModeMock.Object); } } } diff --git a/Sources/EPiServer.Reference.Commerce.Site.Tests/Features/ErrorHandling/Controllers/ErrorHandlingControllerTests.cs b/Sources/EPiServer.Reference.Commerce.Site.Tests/Features/ErrorHandling/Controllers/ErrorHandlingControllerTests.cs deleted file mode 100644 index 89519102..00000000 --- a/Sources/EPiServer.Reference.Commerce.Site.Tests/Features/ErrorHandling/Controllers/ErrorHandlingControllerTests.cs +++ /dev/null @@ -1,85 +0,0 @@ -using EPiServer.Core; -using EPiServer.Reference.Commerce.Site.Features.ErrorHandling.Controllers; -using EPiServer.Reference.Commerce.Site.Features.ErrorHandling.Pages; -using EPiServer.Reference.Commerce.Site.Features.Start.Pages; -using EPiServer.Web.Routing; -using Moq; -using System; -using System.Web.Mvc; -using EPiServer.Reference.Commerce.Site.Features.ErrorHandling.ViewModels; -using Xunit; - -namespace EPiServer.Reference.Commerce.Site.Tests.Features.ErrorHandling.Controllers -{ - - public class ErrorHandlingControllerTests - { - [Fact] - public void Index_WhenPassingPage_ShouldUseItOnModel() - { - // Arrange - var errorPage = new ErrorPage(); - - // Act - var result = (ViewResult)_subject.Index(errorPage); - - // Assert - Assert.Equal(errorPage, ((ErrorViewModel)result.Model).CurrentPage); - } - - [Fact] - public void PageNotFound_WhenUrlCanBeResolved_ShouldRedirectToUrl() - { - // Arrange - var resolvedUrl = "http://example.com/Resolved/"; - _urlResolver.Setup(u => u.GetUrl(It.IsAny())).Returns(resolvedUrl); - - // Act - var result = (RedirectResult)_subject.PageNotFound(); - - // Assert - Assert.Equal(resolvedUrl, result.Url); - } - - [Fact] - public void PageNotFound_WhenUrlResolvingThrows_ShouldRedirectToFallback() - { - // Arrange - _urlResolver.Setup(u => u.GetUrl(It.IsAny())).Throws(new EPiServerException("Oops")); - - // Act - var result = (RedirectResult)_subject.PageNotFound(); - - // Assert - Assert.Equal(_fallbackUrl, result.Url); - } - - [Fact] - public void PageNotFound_WhenUrlResolvingReturnsNull_ShouldRedirectToFallback() - { - // Arrange - _urlResolver.Setup(u => u.GetUrl(It.IsAny())).Returns((String)null); - - // Act - var result = (RedirectResult)_subject.PageNotFound(); - - // Assert - Assert.Equal(_fallbackUrl, result.Url); - } - - ErrorHandlingController _subject; - Mock _contentLoaderMock; - Mock _urlResolver; - string _fallbackUrl = "~/Features/ErrorHandling/Pages/ErrorFallback.html"; - - - public ErrorHandlingControllerTests() - { - _contentLoaderMock = new Mock(); - _contentLoaderMock.Setup(c => c.Get(It.IsAny())).Returns(new StartPage()); - _urlResolver = new Mock(); - - _subject = new ErrorHandlingController(_contentLoaderMock.Object, _urlResolver.Object); - } - } -} diff --git a/Sources/EPiServer.Reference.Commerce.Site.Tests/app.config b/Sources/EPiServer.Reference.Commerce.Site.Tests/app.config index 63830d0c..3f49079c 100644 --- a/Sources/EPiServer.Reference.Commerce.Site.Tests/app.config +++ b/Sources/EPiServer.Reference.Commerce.Site.Tests/app.config @@ -118,6 +118,10 @@ + + + + diff --git a/Sources/EPiServer.Reference.Commerce.Site.Tests/packages.config b/Sources/EPiServer.Reference.Commerce.Site.Tests/packages.config index 5c60032f..c3262e8d 100644 --- a/Sources/EPiServer.Reference.Commerce.Site.Tests/packages.config +++ b/Sources/EPiServer.Reference.Commerce.Site.Tests/packages.config @@ -55,7 +55,7 @@ - - - + + + diff --git a/Sources/EPiServer.Reference.Commerce.Site/App_Data/DefaultSiteContent.episerverdata b/Sources/EPiServer.Reference.Commerce.Site/App_Data/DefaultSiteContent.episerverdata index 8e1f48bf70bbfcde7108030c2e11452a68990a40..5bb1498eb1ff42e00d6e82244ca23ce7f78f2c43 100644 GIT binary patch literal 18257 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 ..\..\packages\EPiServer.CMS.UI.Core.11.21.4\lib\net461\EPiServer.UI.dll + + ..\..\packages\EPiServer.Turnstile.Contracts.Hmac.3.3.1\lib\net461\EPiServer.Turnstile.Contracts.Hmac.dll + ..\..\packages\EPiServer.CMS.AspNet.11.13.0\lib\net461\EPiServer.Web.WebControls.dll @@ -239,7 +242,9 @@ - + + ..\..\packages\System.Net.Http.4.3.3\lib\net46\System.Net.Http.dll + ..\..\packages\Microsoft.AspNet.WebApi.Client.5.2.3\lib\net45\System.Net.Http.Formatting.dll @@ -432,8 +437,6 @@ - - @@ -626,8 +629,7 @@ - - + @@ -808,6 +810,9 @@ + + + web.config @@ -1013,107 +1018,107 @@ - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\EPiServer.Business.Commerce.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\EPiServer.Business.Commerce.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\EPiServer.Commerce.Internal.Migration.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\EPiServer.Commerce.Internal.Migration.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.BusinessFoundation.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.BusinessFoundation.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.BusinessFoundation.Data.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.BusinessFoundation.Data.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Marketing.Validators.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Marketing.Validators.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Plugins.Payment.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Plugins.Payment.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Plugins.Shipping.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Plugins.Shipping.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Website.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Website.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Commerce.Workflow.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Commerce.Workflow.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.DataProvider.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.DataProvider.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.FileUploader.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.FileUploader.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.MetaDataPlus.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.MetaDataPlus.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Search.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Search.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Search.Extensions.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Search.Extensions.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.Search.LuceneSearchProvider.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.Search.LuceneSearchProvider.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.SqlDataProvider.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.SqlDataProvider.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\Mediachase.WebConsoleLib.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\Mediachase.WebConsoleLib.dll True - ..\..\packages\EPiServer.Commerce.UI.13.9.0\lib\net461\EPiServer.Commerce.Shell.dll + ..\..\packages\EPiServer.Commerce.UI.13.10.0\lib\net461\EPiServer.Commerce.Shell.dll True - ..\..\packages\EPiServer.Commerce.UI.ManagerIntegration.13.9.0\lib\net461\EPiServer.Commerce.Shell.ManagerIntegration.dll + ..\..\packages\EPiServer.Commerce.UI.ManagerIntegration.13.10.0\lib\net461\EPiServer.Commerce.Shell.ManagerIntegration.dll True - ..\..\packages\EPiServer.Commerce.UI.13.9.0\lib\net461\EPiServer.Commerce.UI.dll + ..\..\packages\EPiServer.Commerce.UI.13.10.0\lib\net461\EPiServer.Commerce.UI.dll True - ..\..\packages\EPiServer.Commerce.UI.CustomerService.13.9.0\lib\net461\EPiServer.Commerce.UI.CustomerService.dll + ..\..\packages\EPiServer.Commerce.UI.CustomerService.13.10.0\lib\net461\EPiServer.Commerce.UI.CustomerService.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\EPiServer.Commerce.Reporting.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\EPiServer.Commerce.Reporting.dll True - ..\..\packages\EPiServer.Tracking.Commerce.3.2.1\lib\net461\EPiServer.Tracking.Commerce.dll + ..\..\packages\EPiServer.Tracking.Commerce.3.2.2\lib\net461\EPiServer.Tracking.Commerce.dll True - ..\..\packages\EPiServer.Personalization.Commerce.3.2.1\lib\net461\EPiServer.Personalization.Commerce.dll + ..\..\packages\EPiServer.Personalization.Commerce.3.2.2\lib\net461\EPiServer.Personalization.Commerce.dll True - ..\..\packages\EPiServer.Commerce.Core.13.9.0\lib\net461\AjaxControlToolkit.dll + ..\..\packages\EPiServer.Commerce.Core.13.10.0\lib\net461\AjaxControlToolkit.dll True diff --git a/Sources/EPiServer.Reference.Commerce.Site/Features/Cart/Controllers/CartController.cs b/Sources/EPiServer.Reference.Commerce.Site/Features/Cart/Controllers/CartController.cs index 14c5cfef..ae2884c5 100644 --- a/Sources/EPiServer.Reference.Commerce.Site/Features/Cart/Controllers/CartController.cs +++ b/Sources/EPiServer.Reference.Commerce.Site/Features/Cart/Controllers/CartController.cs @@ -48,7 +48,6 @@ public ActionResult LargeCart() } [HttpPost] - [AllowDBWrite] public async Task AddToCart(string code) { ModelState.Clear(); @@ -71,7 +70,6 @@ public async Task AddToCart(string code) } [HttpPost] - [AllowDBWrite] public async Task ChangeCartItem(int shipmentId, string code, decimal quantity, string size, string newSize, string displayName) { ModelState.Clear(); @@ -90,7 +88,6 @@ public async Task ChangeCartItem(int shipmentId, string code, deci } [HttpPost] - [AllowDBWrite] public ActionResult UpdateShippingMethod(UpdateShippingMethodViewModel viewModel) { ModelState.Clear(); diff --git a/Sources/EPiServer.Reference.Commerce.Site/Features/Checkout/Controllers/CheckoutController.cs b/Sources/EPiServer.Reference.Commerce.Site/Features/Checkout/Controllers/CheckoutController.cs index 497c87ea..b7640aa8 100644 --- a/Sources/EPiServer.Reference.Commerce.Site/Features/Checkout/Controllers/CheckoutController.cs +++ b/Sources/EPiServer.Reference.Commerce.Site/Features/Checkout/Controllers/CheckoutController.cs @@ -1,5 +1,6 @@ using EPiServer.Commerce.Order; using EPiServer.Core; +using EPiServer.Data; using EPiServer.Reference.Commerce.Site.Features.Cart.Services; using EPiServer.Reference.Commerce.Site.Features.Checkout.Pages; using EPiServer.Reference.Commerce.Site.Features.Checkout.Services; @@ -7,11 +8,13 @@ using EPiServer.Reference.Commerce.Site.Features.Checkout.ViewModels; using EPiServer.Reference.Commerce.Site.Features.Market.Services; using EPiServer.Reference.Commerce.Site.Features.Recommendations.Services; +using EPiServer.Reference.Commerce.Site.Features.Shared.Models; using EPiServer.Reference.Commerce.Site.Features.Shared.Services; using EPiServer.Reference.Commerce.Site.Infrastructure.Attributes; using EPiServer.Web.Mvc; using EPiServer.Web.Mvc.Html; using EPiServer.Web.Routing; +using System; using System.Linq; using System.Threading.Tasks; using System.Web.Mvc; @@ -30,6 +33,7 @@ public class CheckoutController : PageController private readonly OrderValidationService _orderValidationService; private ICart _cart; private readonly CheckoutService _checkoutService; + private readonly IDatabaseMode _databaseMode; public CheckoutController( ICurrencyService currencyService, @@ -39,8 +43,9 @@ public CheckoutController( ICartService cartService, OrderSummaryViewModelFactory orderSummaryViewModelFactory, IRecommendationService recommendationService, - CheckoutService checkoutService, - OrderValidationService orderValidationService) + CheckoutService checkoutService, + OrderValidationService orderValidationService, + IDatabaseMode databaseMode) { _currencyService = currencyService; _controllerExceptionHandler = controllerExceptionHandler; @@ -51,6 +56,7 @@ public CheckoutController( _recommendationService = recommendationService; _checkoutService = checkoutService; _orderValidationService = orderValidationService; + _databaseMode = databaseMode; } [HttpGet] @@ -92,11 +98,23 @@ public ActionResult SingleShipment(CheckoutPage currentPage) } [HttpPost] - [AllowDBWrite] public ActionResult ChangeAddress(UpdateAddressViewModel addressViewModel) { ModelState.Clear(); + var viewModel = CreateCheckoutViewModel(addressViewModel.CurrentPage); + + // Set random value for Name/Id if null. + if (addressViewModel.BillingAddress.AddressId == null) + { + addressViewModel.BillingAddress.Name = addressViewModel.BillingAddress.AddressId = Guid.NewGuid().ToString(); + } + + foreach (var shipment in addressViewModel.Shipments.Where(x => x.Address.AddressId == null)) + { + shipment.Address.Name = shipment.Address.AddressId = Guid.NewGuid().ToString(); + } + _checkoutService.CheckoutAddressHandling.ChangeAddress(viewModel, addressViewModel); _checkoutService.UpdateShippingAddresses(Cart, viewModel); @@ -136,9 +154,8 @@ public ActionResult RemoveCouponCode(CheckoutPage currentPage, string couponCode var viewModel = CreateCheckoutViewModel(currentPage); return View(viewModel.ViewName, viewModel); } - + [HttpPost] - [AllowDBWrite] public ActionResult Purchase(CheckoutViewModel viewModel, IPaymentMethod paymentMethod) { if (CartIsNullOrEmpty()) @@ -150,20 +167,22 @@ public ActionResult Purchase(CheckoutViewModel viewModel, IPaymentMethod payment viewModel.IsAuthenticated = User.Identity.IsAuthenticated; + + _checkoutService.CheckoutAddressHandling.UpdateUserAddresses(viewModel); if (!_checkoutService.ValidateOrder(ModelState, viewModel, _orderValidationService.ValidateOrder(Cart))) { return View(viewModel); } - + if (!paymentMethod.ValidateData()) { return View(viewModel); } _checkoutService.UpdateShippingAddresses(Cart, viewModel); - + _checkoutService.CreateAndAddPaymentToCart(Cart, viewModel); var purchaseOrder = _checkoutService.PlaceOrder(Cart, ModelState, viewModel); @@ -176,7 +195,7 @@ public ActionResult Purchase(CheckoutViewModel viewModel, IPaymentMethod payment { return View(viewModel); } - + var confirmationSentSuccessfully = _checkoutService.SendConfirmation(viewModel, purchaseOrder); return Redirect(_checkoutService.BuildRedirectionUrl(viewModel, purchaseOrder, confirmationSentSuccessfully)); @@ -208,7 +227,8 @@ private ViewResult View(CheckoutViewModel checkoutViewModel) private CheckoutViewModel CreateCheckoutViewModel(CheckoutPage currentPage, IPaymentMethod paymentMethod = null) { - return _checkoutViewModelFactory.CreateCheckoutViewModel(Cart, currentPage, paymentMethod); + var checkoutViewModel = _checkoutViewModelFactory.CreateCheckoutViewModel(Cart, currentPage, paymentMethod); + return checkoutViewModel; } private ICart Cart => _cart ?? (_cart = _cartService.LoadCart(_cartService.DefaultCartName)); diff --git a/Sources/EPiServer.Reference.Commerce.Site/Features/Checkout/Services/CheckoutAddressHandling.cs b/Sources/EPiServer.Reference.Commerce.Site/Features/Checkout/Services/CheckoutAddressHandling.cs index 01a852a5..1a037764 100644 --- a/Sources/EPiServer.Reference.Commerce.Site/Features/Checkout/Services/CheckoutAddressHandling.cs +++ b/Sources/EPiServer.Reference.Commerce.Site/Features/Checkout/Services/CheckoutAddressHandling.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using EPiServer.Data; using EPiServer.Reference.Commerce.Site.Features.AddressBook.Services; using EPiServer.Reference.Commerce.Site.Features.Checkout.ViewModels; @@ -8,10 +9,12 @@ namespace EPiServer.Reference.Commerce.Site.Features.Checkout.Services public class CheckoutAddressHandling { private readonly IAddressBookService _addressBookService; + private readonly IDatabaseMode _databaseMode; - public CheckoutAddressHandling(IAddressBookService addressBookService) + public CheckoutAddressHandling(IAddressBookService addressBookService, IDatabaseMode databaseMode) { _addressBookService = addressBookService; + _databaseMode = databaseMode; } public virtual void UpdateUserAddresses(CheckoutViewModel viewModel) @@ -30,8 +33,8 @@ public virtual void ChangeAddress(CheckoutViewModel viewModel, UpdateAddressView { var isShippingAddressUpdated = updateViewModel.ShippingAddressIndex > -1; - var updatedAddress = isShippingAddressUpdated ? - updateViewModel.Shipments[updateViewModel.ShippingAddressIndex].Address : + var updatedAddress = isShippingAddressUpdated ? + updateViewModel.Shipments[updateViewModel.ShippingAddressIndex].Address : updateViewModel.BillingAddress; if (updatedAddress.AddressId != null) @@ -60,21 +63,41 @@ public virtual void ChangeAddress(CheckoutViewModel viewModel, UpdateAddressView private void SetDefaultBillingAddressName(CheckoutViewModel viewModel) { - Guid guid; - if (Guid.TryParse(viewModel.BillingAddress.Name, out guid)) + if (IsInReadOnlyMode()) { - viewModel.BillingAddress.Name = "Billing address (" + viewModel.BillingAddress.Line1 + ")"; + if (viewModel.BillingAddress.AddressId == null) + { + viewModel.BillingAddress.Name = viewModel.BillingAddress.AddressId = Guid.NewGuid().ToString(); + } + } + else + { + Guid guid; + if (Guid.TryParse(viewModel.BillingAddress.Name, out guid)) + { + viewModel.BillingAddress.Name = "Billing address (" + viewModel.BillingAddress.Line1 + ")"; + } } } private void SetDefaultShippingAddressesNames(CheckoutViewModel viewModel) { - foreach (var address in viewModel.Shipments.Select(x => x.Address)) + if (IsInReadOnlyMode()) { - Guid guid; - if (Guid.TryParse(address.Name, out guid)) + foreach (var shipment in viewModel.Shipments.Where(x => x.Address.AddressId == null)) + { + shipment.Address.Name = shipment.Address.AddressId = Guid.NewGuid().ToString(); + } + } + else + { + foreach (var address in viewModel.Shipments.Select(x => x.Address)) { - address.Name = "Shipping address (" + address.Line1 + ")"; + Guid guid; + if (Guid.TryParse(address.Name, out guid)) + { + address.Name = "Shipping address (" + address.Line1 + ")"; + } } } } @@ -96,6 +119,20 @@ private void UpdateAuthenticatedUserAddresses(CheckoutViewModel viewModel) { LoadBillingAddressFromAddressBook(viewModel); LoadShippingAddressesFromAddressBook(viewModel); + + if (IsInReadOnlyMode()) + { + if (viewModel.BillingAddress.AddressId == null) + { + viewModel.BillingAddress.AddressId = Guid.NewGuid().ToString(); + } + + foreach (var shipment in viewModel.Shipments.Where(x => x.Address.AddressId == null)) + { + shipment.Address.Name = shipment.Address.AddressId = Guid.NewGuid().ToString(); + } + } + if (viewModel.UseBillingAddressForShipment) { viewModel.Shipments.Single().Address = viewModel.BillingAddress; @@ -112,5 +149,7 @@ private void UpdateAnonymousUserAddresses(CheckoutViewModel viewModel) viewModel.Shipments.Single().Address = viewModel.BillingAddress; } } + + private bool IsInReadOnlyMode() => _databaseMode.DatabaseMode == DatabaseMode.ReadOnly; } } \ No newline at end of file diff --git a/Sources/EPiServer.Reference.Commerce.Site/Features/Checkout/Services/CheckoutService.cs b/Sources/EPiServer.Reference.Commerce.Site/Features/Checkout/Services/CheckoutService.cs index 040df21f..b456ee85 100644 --- a/Sources/EPiServer.Reference.Commerce.Site/Features/Checkout/Services/CheckoutService.cs +++ b/Sources/EPiServer.Reference.Commerce.Site/Features/Checkout/Services/CheckoutService.cs @@ -1,6 +1,6 @@ -using EPiServer.Commerce.Marketing; -using EPiServer.Commerce.Order; +using EPiServer.Commerce.Order; using EPiServer.Core; +using EPiServer.Data; using EPiServer.Framework.Localization; using EPiServer.Logging; using EPiServer.Reference.Commerce.Shared.Services; @@ -35,6 +35,7 @@ public class CheckoutService private readonly IMailService _mailService; private readonly ILogger _log = LogManager.GetLogger(typeof(CheckoutService)); private readonly ICartService _cartService; + private readonly IDatabaseMode _databaseMode; public AuthenticatedPurchaseValidation AuthenticatedPurchaseValidation { get; } public AnonymousPurchaseValidation AnonymousPurchaseValidation { get; } @@ -50,7 +51,8 @@ public CheckoutService( CustomerContextFacade customerContext, LocalizationService localizationService, IMailService mailService, - ICartService cartService) + ICartService cartService, + IDatabaseMode databaseMode) { _addressBookService = addressBookService; _orderGroupFactory = orderGroupFactory; @@ -62,10 +64,11 @@ public CheckoutService( _localizationService = localizationService; _mailService = mailService; _cartService = cartService; + _databaseMode = databaseMode; AuthenticatedPurchaseValidation = new AuthenticatedPurchaseValidation(_localizationService); AnonymousPurchaseValidation = new AnonymousPurchaseValidation(_localizationService); - CheckoutAddressHandling = new CheckoutAddressHandling(_addressBookService); + CheckoutAddressHandling = new CheckoutAddressHandling(_addressBookService, databaseMode); } public virtual void UpdateShippingMethods(ICart cart, IList shipmentViewModels) @@ -139,19 +142,13 @@ public virtual IPurchaseOrder PlaceOrder(ICart cart, ModelStateDictionary modelS throw new InvalidOperationException("Wrong amount"); } - PurchaseValidation validation; - if (checkoutViewModel.IsAuthenticated) + if (!IsInReadOnlyMode()) { - validation = AuthenticatedPurchaseValidation; - } - else - { - validation = AnonymousPurchaseValidation; - } - - if (!validation.ValidateOrderOperation(modelState, _cartService.RequestInventory(cart))) - { - return null; + var validation = checkoutViewModel.IsAuthenticated ? AuthenticatedPurchaseValidation : (PurchaseValidation)AnonymousPurchaseValidation; + if (!validation.ValidateOrderOperation(modelState, _cartService.RequestInventory(cart))) + { + return null; + } } var orderReference = _orderRepository.SaveAsPurchaseOrder(cart); @@ -231,5 +228,7 @@ public void ProcessPaymentCancel(CheckoutViewModel viewModel, TempDataDictionary viewModel.Message = message; } } + + private bool IsInReadOnlyMode() => _databaseMode.DatabaseMode == DatabaseMode.ReadOnly; } } \ No newline at end of file diff --git a/Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/Controllers/ErrorHandlingController.cs b/Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/Controllers/ErrorHandlingController.cs index effa06a3..33992dbc 100644 --- a/Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/Controllers/ErrorHandlingController.cs +++ b/Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/Controllers/ErrorHandlingController.cs @@ -1,48 +1,55 @@ -using EPiServer.Core; -using EPiServer.Reference.Commerce.Site.Features.ErrorHandling.Pages; -using EPiServer.Reference.Commerce.Site.Features.ErrorHandling.ViewModels; -using EPiServer.Reference.Commerce.Site.Features.Start.Pages; -using EPiServer.Web.Mvc; -using EPiServer.Web.Routing; -using System; -using System.Web.Mvc; +using System.Web.Mvc; namespace EPiServer.Reference.Commerce.Site.Features.ErrorHandling.Controllers { - public class ErrorHandlingController : PageController - { - private readonly IContentLoader _contentLoader; - private readonly UrlResolver _urlResolver; + public class ErrorHandlingController : Controller + { + [HttpGet] + public ActionResult PageNotFound() + { + Response.TrySkipIisCustomErrors = true; + Response.StatusCode = 404; + return View(); + } - public ErrorHandlingController(IContentLoader contentLoader, UrlResolver urlResolver) + [HttpGet] + public ActionResult InternalError(string message = null) { - - _contentLoader = contentLoader; - _urlResolver = urlResolver; + Response.TrySkipIisCustomErrors = true; + Response.StatusCode = 500; + ViewBag.Message = message; + return View(); } [HttpGet] - public ActionResult Index(ErrorPage currentPage) + [PreventDirectAccess] + public ActionResult Forbidden(string message = null) { - var model = new ErrorViewModel - { - CurrentPage = currentPage - }; - return View(model); + Response.TrySkipIisCustomErrors = true; + Response.StatusCode = 403; + ViewBag.Message = message; + return View(); } [HttpGet] - public ActionResult PageNotFound() + [PreventDirectAccess] + public ActionResult OtherHttpStatusCode(int httpStatusCode) { - try - { - var startpage = _contentLoader.Get(ContentReference.StartPage); - var url = _urlResolver.GetUrl(startpage.PageNotFound); - return Redirect(url ?? "~/Features/ErrorHandling/Pages/ErrorFallback.html"); - } - catch (Exception) + Response.TrySkipIisCustomErrors = true; + Response.StatusCode = httpStatusCode; + ViewBag.StatusCode = httpStatusCode; + return View(httpStatusCode); + } + + private class PreventDirectAccessAttribute : FilterAttribute, IAuthorizationFilter + { + public void OnAuthorization(AuthorizationContext filterContext) { - return Redirect("~/Features/ErrorHandling/Pages/ErrorFallback.html"); + object value = filterContext.RouteData.Values["fromAppErrorEvent"]; + if (!(value is bool && (bool)value)) + { + filterContext.Result = new ViewResult { ViewName = "PageNotFound" }; + } } } } diff --git a/Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/Pages/ErrorFallback.html b/Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/Pages/ErrorFallback.html deleted file mode 100644 index 8806d4b1..00000000 --- a/Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/Pages/ErrorFallback.html +++ /dev/null @@ -1,7 +0,0 @@ - - -

Internal Error

- -
Something went wrong
- - diff --git a/Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/Pages/ErrorPage.cs b/Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/Pages/ErrorPage.cs deleted file mode 100644 index f4a413a3..00000000 --- a/Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/Pages/ErrorPage.cs +++ /dev/null @@ -1,16 +0,0 @@ -using EPiServer.DataAbstraction; -using EPiServer.DataAnnotations; -using EPiServer.Reference.Commerce.Site.Features.Shared.Pages; - -namespace EPiServer.Reference.Commerce.Site.Features.ErrorHandling.Pages -{ - [ContentType( - DisplayName = "Error page", - GUID = "E7DCAABC-05BC-4230-A2AF-94CD9A9ED535", - Description = "The page which allows you to show errors details.", - AvailableInEditMode = true)] - [ImageUrl("~/styles/images/page_type.png")] - public class ErrorPage : StandardPage - { - } -} \ No newline at end of file diff --git a/Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/ViewModels/ErrorViewModel.cs b/Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/ViewModels/ErrorViewModel.cs deleted file mode 100644 index d22866a4..00000000 --- a/Sources/EPiServer.Reference.Commerce.Site/Features/ErrorHandling/ViewModels/ErrorViewModel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using EPiServer.Reference.Commerce.Site.Features.ErrorHandling.Pages; -using EPiServer.Reference.Commerce.Site.Features.Shared.ViewModels; - -namespace EPiServer.Reference.Commerce.Site.Features.ErrorHandling.ViewModels -{ - public class ErrorViewModel : PageViewModel - { - } -} \ No newline at end of file diff --git a/Sources/EPiServer.Reference.Commerce.Site/Features/Shared/Controllers/StandardPageController.cs b/Sources/EPiServer.Reference.Commerce.Site/Features/Shared/Controllers/StandardPageController.cs index 80bc0840..2efe3465 100644 --- a/Sources/EPiServer.Reference.Commerce.Site/Features/Shared/Controllers/StandardPageController.cs +++ b/Sources/EPiServer.Reference.Commerce.Site/Features/Shared/Controllers/StandardPageController.cs @@ -33,17 +33,14 @@ public ActionResult Index(StandardPage currentPage) [HttpGet] public ActionResult SuccessOptinConfirmation() - { - try - { - var startpage = _contentLoader.Get(ContentReference.StartPage); - var url = _urlResolver.GetUrl(startpage.OptinConfirmSuccessPage); - return Redirect(url ?? "~/Features/ErrorHandling/Pages/ErrorFallback.html"); - } - catch (Exception) + { + var startpage = _contentLoader.Get(ContentReference.StartPage); + var url = _urlResolver.GetUrl(startpage.OptinConfirmSuccessPage); + if (string.IsNullOrEmpty(url)) { - return Redirect("~/Features/ErrorHandling/Pages/ErrorFallback.html"); + throw new Exception(); } + return Redirect(url); } } } \ No newline at end of file diff --git a/Sources/EPiServer.Reference.Commerce.Site/Features/Start/Controllers/StartController.cs b/Sources/EPiServer.Reference.Commerce.Site/Features/Start/Controllers/StartController.cs index fe3fd988..7281232b 100644 --- a/Sources/EPiServer.Reference.Commerce.Site/Features/Start/Controllers/StartController.cs +++ b/Sources/EPiServer.Reference.Commerce.Site/Features/Start/Controllers/StartController.cs @@ -33,7 +33,7 @@ public ViewResult Index(StartPage currentPage) { StartPage = currentPage, Promotions = GetActivePromotions() - }; + }; return View(viewModel); } diff --git a/Sources/EPiServer.Reference.Commerce.Site/Features/Start/Pages/StartPage.cs b/Sources/EPiServer.Reference.Commerce.Site/Features/Start/Pages/StartPage.cs index 4848f296..91c67496 100644 --- a/Sources/EPiServer.Reference.Commerce.Site/Features/Start/Pages/StartPage.cs +++ b/Sources/EPiServer.Reference.Commerce.Site/Features/Start/Pages/StartPage.cs @@ -99,14 +99,7 @@ public class StartPage : PageData GroupName = SiteTabs.SiteStructure, Order = 6)] [AllowedTypes(typeof(ResetPasswordPage))] - public virtual ContentReference ResetPasswordPage { get; set; } - - [Display( - Name = "Resource not found page", - Description = "", - GroupName = SiteTabs.SiteStructure, - Order = 10)] - public virtual ContentReference PageNotFound { get; set; } + public virtual ContentReference ResetPasswordPage { get; set; } [Display( Name = "Login registration page", diff --git a/Sources/EPiServer.Reference.Commerce.Site/Global.asax.cs b/Sources/EPiServer.Reference.Commerce.Site/Global.asax.cs index c1c6ada8..45164783 100644 --- a/Sources/EPiServer.Reference.Commerce.Site/Global.asax.cs +++ b/Sources/EPiServer.Reference.Commerce.Site/Global.asax.cs @@ -1,5 +1,8 @@ -using EPiServer.Reference.Commerce.Site.Infrastructure; +using EPiServer.Reference.Commerce.Site.Features.ErrorHandling.Controllers; +using EPiServer.Reference.Commerce.Site.Infrastructure; using EPiServer.Reference.Commerce.Site.Infrastructure.Attributes; +using System; +using System.Web; using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; @@ -34,6 +37,53 @@ protected void Application_Start() BundleConfig.RegisterBundles(BundleTable.Bundles); } + protected void Application_Error(object sender, EventArgs e) + { + if (Context.IsCustomErrorEnabled) + { + ShowCustomErrorPage(Server.GetLastError()); + } + } + + private void ShowCustomErrorPage(Exception exception) + { + var httpException = exception as HttpException; + if (httpException == null) + { + httpException = new HttpException(500, "Internal Server Error", exception); + } + + Response.Clear(); + var routeData = new RouteData(); + routeData.Values.Add("controller", "ErrorHandling"); + routeData.Values.Add("fromAppErrorEvent", true); + + switch (httpException.GetHttpCode()) + { + case 403: + routeData.Values.Add("action", "Forbidden"); + break; + + case 404: + routeData.Values.Add("action", "PageNotFound"); + break; + + case 500: + routeData.Values.Add("action", "InternalError"); + break; + + default: + routeData.Values.Add("action", "OtherHttpStatusCode"); + routeData.Values.Add("httpStatusCode", httpException.GetHttpCode()); + break; + } + + Server.ClearError(); + + IController controller = new ErrorHandlingController(); + controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); + } + protected void Application_EndRequest() { if (Context.Response.StatusCode == 302 diff --git a/Sources/EPiServer.Reference.Commerce.Site/Views/Bundle/Index.cshtml b/Sources/EPiServer.Reference.Commerce.Site/Views/Bundle/Index.cshtml index 04e3f52a..9c468f47 100644 --- a/Sources/EPiServer.Reference.Commerce.Site/Views/Bundle/Index.cshtml +++ b/Sources/EPiServer.Reference.Commerce.Site/Views/Bundle/Index.cshtml @@ -40,20 +40,17 @@
- @if (!(bool)ViewData["IsReadOnly"]) + @using (Html.BeginForm("AddToCart", "Cart", FormMethod.Post, new { @class = "form-inline", data_container = "MiniCart" })) { - using (Html.BeginForm("AddToCart", "Cart", FormMethod.Post, new { @class = "form-inline", data_container = "MiniCart" })) + @Html.Hidden("code", Model.Bundle.Code) + + } + @if (User.Identity.IsAuthenticated && !(bool)ViewData["IsReadOnly"]) + { + using (Html.BeginForm("AddToCart", "WishList", FormMethod.Post, new { @class = "form-inline jsAddToWishList", data_container = "WishListMiniCart" })) { @Html.Hidden("code", Model.Bundle.Code) - - } - if (User.Identity.IsAuthenticated) - { - using (Html.BeginForm("AddToCart", "WishList", FormMethod.Post, new { @class = "form-inline jsAddToWishList", data_container = "WishListMiniCart" })) - { - @Html.Hidden("code", Model.Bundle.Code) - - } + } }
diff --git a/Sources/EPiServer.Reference.Commerce.Site/Views/Bundle/_Quickview.cshtml b/Sources/EPiServer.Reference.Commerce.Site/Views/Bundle/_Quickview.cshtml index a63314f8..23abacee 100644 --- a/Sources/EPiServer.Reference.Commerce.Site/Views/Bundle/_Quickview.cshtml +++ b/Sources/EPiServer.Reference.Commerce.Site/Views/Bundle/_Quickview.cshtml @@ -31,37 +31,33 @@
- @if (!(bool)ViewData["IsReadOnly"]) + @using (Html.BeginForm("AddToCart", "Cart", FormMethod.Post, new { @class = "form-inline", data_container = "MiniCart" })) { - using (Html.BeginForm("AddToCart", "Cart", FormMethod.Post, new { @class = "form-inline", data_container = "MiniCart" })) + @Html.Hidden("code", Model.Bundle.Code) + + } + @if (User.Identity.IsAuthenticated && !(bool)ViewData["IsReadOnly"]) + { + using (Html.BeginForm("AddToCart", "WishList", FormMethod.Post, new { @class = "form-inline jsAddToWishList", data_container = "WishListMiniCart" })) { @Html.Hidden("code", Model.Bundle.Code) - + } - if (User.Identity.IsAuthenticated) - { - using (Html.BeginForm("AddToCart", "WishList", FormMethod.Post, new { @class = "form-inline jsAddToWishList", data_container = "WishListMiniCart" })) - { - @Html.Hidden("code", Model.Bundle.Code) - - } - } - - if (Functions.ShouldRenderTrackingSection()) - { - - } + }