Skip to content

Commit 1ddea3f

Browse files
Updated shipping method artifact
1 parent 0eda87f commit 1ddea3f

File tree

4 files changed

+84
-42
lines changed

4 files changed

+84
-42
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using System.Collections.Generic;
2+
3+
namespace Umbraco.Commerce.Deploy.Artifacts
4+
{
5+
public class FixedRateShippingCalculationConfigArtifact
6+
{
7+
public IEnumerable<ServicePriceArtifact> Prices { get; set; }
8+
}
9+
}

src/Umbraco.Commerce.Deploy/Artifacts/ShippingMethodArtifact.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
3+
using Newtonsoft.Json.Linq;
24
using Umbraco.Cms.Core;
35
using Umbraco.Cms.Core.Deploy;
6+
using Umbraco.Commerce.Core.Models;
47

58
namespace Umbraco.Commerce.Deploy.Artifacts
69
{
@@ -12,8 +15,16 @@ public ShippingMethodArtifact(GuidUdi udi, GuidUdi storeUdi, IEnumerable<Artifac
1215

1316
public string Sku { get; set; }
1417
public GuidUdi TaxClassUdi { get; set; }
18+
19+
[Obsolete("Now handled via CalculationConfig")]
1520
public IEnumerable<ServicePriceArtifact> Prices { get; set; }
1621
public string ImageId { get; set; }
22+
23+
public ShippingCalculationMode CalculationMode { get; set; }
24+
public JObject CalculationConfig { get; set; }
25+
public string ShippingProviderAlias { get; set; }
26+
public SortedDictionary<string, string> ShippingProviderSettings { get; set; }
27+
1728
public IEnumerable<AllowedCountryRegionArtifact> AllowedCountryRegions { get; set; }
1829
public int SortOrder { get; set; }
1930
}

src/Umbraco.Commerce.Deploy/Configuration/UmbracoCommerceDeploySettings.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1-
using System;
1+
using System;
22

33
namespace Umbraco.Commerce.Deploy.Configuration
44
{
55
public class UmbracoCommerceDeploySettings
66
{
77
public UmbracoCommerceDeployPaymentMethodSettings PaymentMethods { get; set; }
8+
public UmbracoCommerceDeployShippingMethodSettings ShippingMethods { get; set; }
89

910
public UmbracoCommerceDeploySettings()
1011
{
1112
PaymentMethods = new UmbracoCommerceDeployPaymentMethodSettings();
13+
ShippingMethods = new UmbracoCommerceDeployShippingMethodSettings();
1214
}
1315
}
1416

@@ -21,4 +23,14 @@ public UmbracoCommerceDeployPaymentMethodSettings()
2123
IgnoreSettings = Array.Empty<string>();
2224
}
2325
}
26+
27+
public class UmbracoCommerceDeployShippingMethodSettings
28+
{
29+
public string[] IgnoreSettings { get; set; }
30+
31+
public UmbracoCommerceDeployShippingMethodSettings()
32+
{
33+
IgnoreSettings = Array.Empty<string>();
34+
}
35+
}
2436
}

src/Umbraco.Commerce.Deploy/Connectors/ServiceConnectors/UmbracoCommerceShippingMethodServiceConnector.cs

Lines changed: 50 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1-
using System;
1+
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4+
using Newtonsoft.Json.Linq;
45
using Umbraco.Commerce.Core.Api;
56
using Umbraco.Commerce.Core.Models;
67
using Umbraco.Commerce.Deploy.Artifacts;
78
using Umbraco.Commerce.Deploy.Configuration;
8-
99
using Umbraco.Cms.Core;
1010
using Umbraco.Cms.Core.Deploy;
1111

12+
using StringExtensions = Umbraco.Commerce.Extensions.StringExtensions;
13+
1214
namespace Umbraco.Commerce.Deploy.Connectors.ServiceConnectors
1315
{
1416
[UdiDefinition(UmbracoCommerceConstants.UdiEntityType.ShippingMethod, UdiType.GuidUdi)]
@@ -61,6 +63,11 @@ public override ShippingMethodArtifact GetArtifact(GuidUdi udi, ShippingMethodRe
6163
Alias = entity.Alias,
6264
Sku = entity.Sku,
6365
ImageId = entity.ImageId, // Could be a UDI?
66+
CalculationMode = entity.CalculationMode,
67+
ShippingProviderAlias = entity.ShippingProviderAlias,
68+
ShippingProviderSettings = new SortedDictionary<string, string>(entity.ShippingProviderSettings
69+
.Where(x => !StringExtensions.InvariantContains(_settingsAccessor.Settings.ShippingMethods.IgnoreSettings, x.Key)) // Ignore any settings that shouldn't be transfered
70+
.ToDictionary(x => x.Key, x => x.Value)), // Could contain UDIs?
6471
SortOrder = entity.SortOrder
6572
};
6673

@@ -75,12 +82,16 @@ public override ShippingMethodArtifact GetArtifact(GuidUdi udi, ShippingMethodRe
7582
artifact.TaxClassUdi = taxClassDepUdi;
7683
}
7784

78-
// Service prices
79-
if (entity.Prices.Count > 0)
85+
// Only the fixed rate shipping provider has delcared dependencies
86+
// that we can deserialize. Dynamic can have a dependency, but because
87+
// it's config is all plugin based, we can't be certain of the data structure
88+
// and so we just have to pass the value through. Realtime rates don't currently
89+
// have any dependencies.
90+
if (entity.CalculationMode == ShippingCalculationMode.Fixed && entity.CalculationConfig is FixedRateShippingCalculationConfig calcConfig)
8091
{
8192
var servicesPrices = new List<ServicePriceArtifact>();
8293

83-
foreach (var price in entity.Prices)
94+
foreach (var price in calcConfig.Prices)
8495
{
8596
var spArtifact = new ServicePriceArtifact { Value = price.Value };
8697

@@ -117,7 +128,15 @@ public override ShippingMethodArtifact GetArtifact(GuidUdi udi, ShippingMethodRe
117128
servicesPrices.Add(spArtifact);
118129
}
119130

120-
artifact.Prices = servicesPrices;
131+
artifact.CalculationConfig = JObject.FromObject(new FixedRateShippingCalculationConfigArtifact
132+
{
133+
Prices = servicesPrices
134+
});
135+
}
136+
else
137+
{
138+
// No additional processing required
139+
artifact.CalculationConfig = JObject.FromObject(entity.CalculationConfig);
121140
}
122141

123142
// Allowed country regions
@@ -183,11 +202,16 @@ private void Pass2(ArtifactDeployState<ShippingMethodArtifact, ShippingMethodRea
183202
artifact.Udi.EnsureType(UmbracoCommerceConstants.UdiEntityType.ShippingMethod);
184203
artifact.StoreUdi.EnsureType(UmbracoCommerceConstants.UdiEntityType.Store);
185204

186-
var entity = state.Entity?.AsWritable(uow) ?? ShippingMethod.Create(uow, artifact.Udi.Guid, artifact.StoreUdi.Guid, artifact.Alias, artifact.Name);
205+
var entity = state.Entity?.AsWritable(uow) ?? ShippingMethod.Create(uow, artifact.Udi.Guid, artifact.StoreUdi.Guid, artifact.Alias, artifact.Name, artifact.ShippingProviderAlias, artifact.CalculationMode);
206+
207+
var settings = artifact.ShippingProviderSettings
208+
.Where(x => !StringExtensions.InvariantContains(_settingsAccessor.Settings.ShippingMethods.IgnoreSettings, x.Key)) // Ignore any settings that shouldn't be transfered
209+
.ToDictionary(x => x.Key, x => x.Value);
187210

188211
entity.SetName(artifact.Name, artifact.Alias)
189212
.SetSku(artifact.Sku)
190213
.SetImage(artifact.ImageId)
214+
.SetSettings(settings, SetBehavior.Merge)
191215
.SetSortOrder(artifact.SortOrder);
192216

193217
_umbracoCommerceApi.SaveShippingMethod(entity);
@@ -209,62 +233,48 @@ private void Pass4(ArtifactDeployState<ShippingMethodArtifact, ShippingMethodRea
209233
if (artifact.TaxClassUdi != null)
210234
{
211235
artifact.TaxClassUdi.EnsureType(UmbracoCommerceConstants.UdiEntityType.TaxClass);
212-
// TODO: Check the payment method exists?
236+
213237
entity.SetTaxClass(artifact.TaxClassUdi.Guid);
214238
}
215239
else
216240
{
217241
entity.ClearTaxClass();
218242
}
219243

220-
// Prices
221-
var pricesToRemove = entity.Prices
222-
.Where(x => artifact.Prices == null || !artifact.Prices.Any(y => y.CountryUdi?.Guid == x.CountryId
223-
&& y.RegionUdi?.Guid == x.RegionId
224-
&& y.CurrencyUdi.Guid == x.CurrencyId))
225-
.ToList();
226-
227-
if (artifact.Prices != null)
244+
// Calculation config
245+
if (artifact.CalculationConfig != null)
228246
{
229-
foreach (var price in artifact.Prices)
247+
if (artifact.CalculationMode == ShippingCalculationMode.Fixed)
230248
{
231-
price.CurrencyUdi.EnsureType(UmbracoCommerceConstants.UdiEntityType.Currency);
249+
var cfgArtifact = artifact.CalculationConfig.ToObject<FixedRateShippingCalculationConfigArtifact>();
250+
var prices = new List<ServicePrice>();
232251

233-
if (price.CountryUdi == null && price.RegionUdi == null)
252+
foreach (var price in cfgArtifact.Prices)
234253
{
235-
entity.SetDefaultPriceForCurrency(price.CurrencyUdi.Guid, price.Value);
236-
}
237-
else
238-
{
239-
price.CountryUdi.EnsureType(UmbracoCommerceConstants.UdiEntityType.Country);
254+
price.CurrencyUdi.EnsureType(UmbracoCommerceConstants.UdiEntityType.Currency);
255+
256+
if (price.CountryUdi != null)
257+
price.CountryUdi.EnsureType(UmbracoCommerceConstants.UdiEntityType.Country);
240258

241259
if (price.RegionUdi != null)
242-
{
243260
price.RegionUdi.EnsureType(UmbracoCommerceConstants.UdiEntityType.Region);
244261

245-
entity.SetRegionPriceForCurrency(price.CountryUdi.Guid, price.RegionUdi.Guid, price.CurrencyUdi.Guid, price.Value);
246-
}
247-
else
248-
{
249-
entity.SetCountryPriceForCurrency(price.CountryUdi.Guid, price.CurrencyUdi.Guid, price.Value);
250-
}
262+
prices.Add(new ServicePrice(price.Value, price.CurrencyUdi.Guid, price.CountryUdi?.Guid, price.RegionUdi?.Guid));
251263
}
252-
}
253-
}
254264

255-
foreach (var price in pricesToRemove)
256-
{
257-
if (price.CountryId == null && price.RegionId == null)
265+
entity.SetCalculationConfig(new FixedRateShippingCalculationConfig(prices));
266+
}
267+
else if (artifact.CalculationMode == ShippingCalculationMode.Dynamic)
258268
{
259-
entity.ClearDefaultPriceForCurrency(price.CurrencyId);
269+
entity.SetCalculationConfig(artifact.CalculationConfig.ToObject<DynamicRateShippingCalculationConfig>());
260270
}
261-
else if (price.CountryId != null && price.RegionId == null)
271+
else if (artifact.CalculationMode == ShippingCalculationMode.Realtime)
262272
{
263-
entity.ClearCountryPriceForCurrency(price.CountryId.Value, price.CurrencyId);
273+
entity.SetCalculationConfig(artifact.CalculationConfig.ToObject<RealtimeRateShippingCalculationConfig>());
264274
}
265275
else
266276
{
267-
entity.ClearRegionPriceForCurrency(price.CountryId.Value, price.RegionId.Value, price.CurrencyId);
277+
throw new ApplicationException($"Unknown calculation mode: {artifact.CalculationMode}");
268278
}
269279
}
270280

0 commit comments

Comments
 (0)