diff --git a/src/VirtoCommerce.XOrder.Core/ModuleConstants.cs b/src/VirtoCommerce.XOrder.Core/ModuleConstants.cs new file mode 100644 index 0000000..b9d6451 --- /dev/null +++ b/src/VirtoCommerce.XOrder.Core/ModuleConstants.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using VirtoCommerce.Platform.Core.Settings; + +namespace VirtoCommerce.XOrder.Core +{ + public static class ModuleConstants + { + public static class Settings + { + public static class General + { + public const string ShippingAddressPolicyDisabled = "Disabled"; + public const string ShippingAddressPolicyPreviousOrder = "Previous Order Address"; + + public static SettingDescriptor ShippingAddressPolicy { get; } = new SettingDescriptor + { + Name = "XOrder.ShippingAddressPolicy", + ValueType = SettingValueType.ShortText, + GroupName = "Orders|General", + DefaultValue = ShippingAddressPolicyDisabled, + AllowedValues = new[] { ShippingAddressPolicyDisabled, ShippingAddressPolicyPreviousOrder } + }; + + public static IEnumerable AllSettings + { + get + { + yield return ShippingAddressPolicy; + } + } + } + + public static IEnumerable StoreLevelSettings + { + get + { + yield return General.ShippingAddressPolicy; + } + } + } + } +} diff --git a/src/VirtoCommerce.XOrder.Core/VirtoCommerce.XOrder.Core.csproj b/src/VirtoCommerce.XOrder.Core/VirtoCommerce.XOrder.Core.csproj index e9f7fe8..4c3c6ea 100644 --- a/src/VirtoCommerce.XOrder.Core/VirtoCommerce.XOrder.Core.csproj +++ b/src/VirtoCommerce.XOrder.Core/VirtoCommerce.XOrder.Core.csproj @@ -13,7 +13,7 @@ - + \ No newline at end of file diff --git a/src/VirtoCommerce.XOrder.Data/Extensions/ServiceCollectionExtensions.cs b/src/VirtoCommerce.XOrder.Data/Extensions/ServiceCollectionExtensions.cs index 468fec5..4647d67 100644 --- a/src/VirtoCommerce.XOrder.Data/Extensions/ServiceCollectionExtensions.cs +++ b/src/VirtoCommerce.XOrder.Data/Extensions/ServiceCollectionExtensions.cs @@ -30,6 +30,11 @@ public static IServiceCollection AddXOrder(this IServiceCollection services, IGr builder.AddMiddleware(typeof(EvalPromoContextOrderMiddleware)); }); + services.AddPipeline(builder => + { + builder.AddMiddleware(typeof(ShipmentContextMiddleware)); + }); + return services; } } diff --git a/src/VirtoCommerce.XOrder.Data/Middlewares/ShipmentContextMiddleware.cs b/src/VirtoCommerce.XOrder.Data/Middlewares/ShipmentContextMiddleware.cs new file mode 100644 index 0000000..f3f25b6 --- /dev/null +++ b/src/VirtoCommerce.XOrder.Data/Middlewares/ShipmentContextMiddleware.cs @@ -0,0 +1,97 @@ +using System; +using System.Linq; +using System.Threading.Tasks; +using PipelineNet.Middleware; +using VirtoCommerce.CartModule.Core.Model; +using VirtoCommerce.OrdersModule.Core.Model.Search; +using VirtoCommerce.OrdersModule.Core.Services; +using VirtoCommerce.Platform.Core.Common; +using VirtoCommerce.Platform.Core.Settings; +using VirtoCommerce.XCart.Core.Models; +using static VirtoCommerce.CoreModule.Core.Common.AddressType; +using XOrderSetting = VirtoCommerce.XOrder.Core.ModuleConstants.Settings.General; + +namespace VirtoCommerce.XOrder.Data.Middlewares +{ + public class ShipmentContextMiddleware : IAsyncMiddleware + { + private readonly ICustomerOrderSearchService _customerOrderSearchService; + + public ShipmentContextMiddleware(ICustomerOrderSearchService customerOrderSearchService) + { + _customerOrderSearchService = customerOrderSearchService; + } + + public async Task Run(ShipmentContextCartMap parameter, Func next) + { + ArgumentNullException.ThrowIfNull(parameter); + + await RunInternal(parameter); + await next(parameter); + } + + protected virtual async Task RunInternal(ShipmentContextCartMap parameter) + { + var shipment = parameter.Shipment; + var shippingAddressPolicy = GetShippingPolicy(parameter); + + if (shipment?.DeliveryAddress != null || !shippingAddressPolicy.EqualsInvariant(XOrderSetting.ShippingAddressPolicyPreviousOrder)) + { + return; + } + + var lastOrderCriteria = new CustomerOrderSearchCriteria + { + CustomerId = parameter.CartAggregate.Cart.CustomerId, + Take = 1 + }; + + var lastOrderResult = await _customerOrderSearchService.SearchNoCloneAsync(lastOrderCriteria); + if (lastOrderResult.Results.Count == 0) + { + return; + } + + var order = lastOrderResult.Results[0]; + var address = order.Addresses?.FirstOrDefault(x => x.AddressType == BillingAndShipping || x.AddressType == Shipping); + + if (address != null) + { + var cartShipmentAddress = CreateCartShipmentAddress(address); + parameter.Shipment.DeliveryAddress = cartShipmentAddress; + } + } + + private static string GetShippingPolicy(ShipmentContextCartMap parameter) + { + return parameter.CartAggregate?.Store?.Settings?.GetValue(XOrderSetting.ShippingAddressPolicy); + } + + protected virtual Address CreateCartShipmentAddress(OrdersModule.Core.Model.Address address) + { + var cartShipmentAddress = AbstractTypeFactory
.TryCreateInstance(); + + cartShipmentAddress.Key = null; + cartShipmentAddress.Name = address.Name; + cartShipmentAddress.City = address.City; + cartShipmentAddress.CountryCode = address.CountryCode; + cartShipmentAddress.CountryName = address.CountryName; + cartShipmentAddress.Phone = address.Phone; + cartShipmentAddress.PostalCode = address.PostalCode; + cartShipmentAddress.RegionId = address.RegionId; + cartShipmentAddress.RegionName = address.RegionName; + cartShipmentAddress.City = address.City; + cartShipmentAddress.Email = address.Email; + cartShipmentAddress.FirstName = address.FirstName; + cartShipmentAddress.LastName = address.LastName; + cartShipmentAddress.Line1 = address.Line1; + cartShipmentAddress.Line2 = address.Line2; + cartShipmentAddress.AddressType = address.AddressType; + cartShipmentAddress.Organization = address.Organization; + cartShipmentAddress.OuterId = address.OuterId; + cartShipmentAddress.Description = address.Description; + + return cartShipmentAddress; + } + } +} diff --git a/src/VirtoCommerce.XOrder.Web/Localizations/en.XOrder.json b/src/VirtoCommerce.XOrder.Web/Localizations/en.XOrder.json index b1543bf..445451e 100644 --- a/src/VirtoCommerce.XOrder.Web/Localizations/en.XOrder.json +++ b/src/VirtoCommerce.XOrder.Web/Localizations/en.XOrder.json @@ -1,8 +1,8 @@ { - "permissions": { - "XOrder:create": "Create XOrder related data", - "XOrder:read": "View XOrder related data", - "XOrder:update": "Update XOrder related data", - "XOrder:delete": "Delete XOrder related data" + "settings": { + "XOrder.ShippingAddressPolicy": { + "title": "Shipping Address Policy (XAPI)", + "description": "This setting is store level." + } } } diff --git a/src/VirtoCommerce.XOrder.Web/Module.cs b/src/VirtoCommerce.XOrder.Web/Module.cs index aa55a54..718f10d 100644 --- a/src/VirtoCommerce.XOrder.Web/Module.cs +++ b/src/VirtoCommerce.XOrder.Web/Module.cs @@ -2,7 +2,10 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using VirtoCommerce.Platform.Core.Modularity; +using VirtoCommerce.Platform.Core.Settings; +using VirtoCommerce.StoreModule.Core.Model; using VirtoCommerce.Xapi.Core.Infrastructure; +using VirtoCommerce.XOrder.Core; using VirtoCommerce.XOrder.Data.Extensions; namespace VirtoCommerce.XOrder.Web; @@ -20,7 +23,12 @@ public void Initialize(IServiceCollection serviceCollection) public void PostInitialize(IApplicationBuilder appBuilder) { - // Nothing to do here + var serviceProvider = appBuilder.ApplicationServices; + + // settings + var settingsRegistrar = serviceProvider.GetRequiredService(); + settingsRegistrar.RegisterSettings(ModuleConstants.Settings.General.AllSettings, ModuleInfo.Id); + settingsRegistrar.RegisterSettingsForType(ModuleConstants.Settings.StoreLevelSettings, nameof(Store)); } public void Uninstall() diff --git a/src/VirtoCommerce.XOrder.Web/module.manifest b/src/VirtoCommerce.XOrder.Web/module.manifest index c29d0e2..e5b9a31 100644 --- a/src/VirtoCommerce.XOrder.Web/module.manifest +++ b/src/VirtoCommerce.XOrder.Web/module.manifest @@ -7,7 +7,7 @@ 3.848.0 - +