Skip to content

Commit

Permalink
Resolves #1616 Add new field for tracking URL to shipment entity to b…
Browse files Browse the repository at this point in the history
…etter track shipments
  • Loading branch information
mgesing committed Feb 27, 2020
1 parent 0a0550c commit f652c68
Show file tree
Hide file tree
Showing 20 changed files with 491 additions and 152 deletions.
1 change: 1 addition & 0 deletions changelog.md
Expand Up @@ -35,6 +35,7 @@
* #1793 Add field for manufacturer bottom description like for categories.
* #1116 Add new field for product condition.
* #1790 ACL support for manufacturers.
* #1616 Add new field for tracking URL to shipment entity to better track shipments.

### Improvements
* #1663 Make MeasureDimension and MeasureWeight localizable.
Expand Down
8 changes: 8 additions & 0 deletions src/Libraries/SmartStore.Core/Domain/Shipping/Shipment.cs
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using SmartStore.Core.Domain.Orders;
using System.Runtime.Serialization;
using System.ComponentModel.DataAnnotations;

namespace SmartStore.Core.Domain.Shipping
{
Expand All @@ -25,6 +26,13 @@ public partial class Shipment : BaseEntity
[DataMember]
public string TrackingNumber { get; set; }

/// <summary>
/// Gets or sets the tracking URL.
/// </summary>
[DataMember]
[StringLength(2000)]
public string TrackingUrl { get; set; }

/// <summary>
/// Gets or sets the total weight of this shipment
/// It's nullable for compatibility with the previous version of SmartStore.NET where was no such property
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

@@ -0,0 +1,18 @@
namespace SmartStore.Data.Migrations
{
using System;
using System.Data.Entity.Migrations;

public partial class ShipmentTrackingUrl : DbMigration
{
public override void Up()
{
AddColumn("dbo.Shipment", "TrackingUrl", c => c.String(maxLength: 2000));
}

public override void Down()
{
DropColumn("dbo.Shipment", "TrackingUrl");
}
}
}

Large diffs are not rendered by default.

Expand Up @@ -193,7 +193,8 @@ public void MigrateLocaleResources(LocaleResourcesBuilder builder)
builder.Delete(
"Admin.Catalog.Products.Fields.VisibleIndividually",
"Admin.Catalog.Products.Fields.VisibleIndividually.Hint",
"Admin.Promotions.Discounts.NoDiscountsAvailable");
"Admin.Promotions.Discounts.NoDiscountsAvailable",
"Admin.Orders.Shipments.TrackingNumber.Button");

// Rule
builder.AddOrUpdate("Admin.Rules.SystemName", "System name", "Systemname");
Expand Down Expand Up @@ -480,6 +481,19 @@ public void MigrateLocaleResources(LocaleResourcesBuilder builder)
builder.AddOrUpdate("Enums.SmartStore.Core.Domain.Catalog.ProductCondition.Damaged", "Damaged", "Defekt");

builder.AddOrUpdate("Products.Condition", "Product condition", "Artikelzustand");
builder.AddOrUpdate("Common.OpenUrl", "Open URL", "URL öffnen");

builder.AddOrUpdate("Admin.Orders.Shipments.TrackingNumber",
"Tracking number",
"Tracking-Nummer",
"Specifies the tracking number for tracking the shipment.",
"Legt die Tracking-Nummer zur Sendungsverfolgung fest.");

builder.AddOrUpdate("Admin.Orders.Shipments.TrackingUrl",
"Tracking URL",
"Tracking-URL",
"Specifies the URL for tracking the shipment.",
"Legt die URL zur Sendungsverfolgung fest.");
}
}
}
7 changes: 7 additions & 0 deletions src/Libraries/SmartStore.Data/SmartStore.Data.csproj
Expand Up @@ -770,6 +770,10 @@
<Compile Include="Migrations\202002251510114_ManufacturerSubjectToAcl.Designer.cs">
<DependentUpon>202002251510114_ManufacturerSubjectToAcl.cs</DependentUpon>
</Compile>
<Compile Include="Migrations\202002271206204_ShipmentTrackingUrl.cs" />
<Compile Include="Migrations\202002271206204_ShipmentTrackingUrl.Designer.cs">
<DependentUpon>202002271206204_ShipmentTrackingUrl.cs</DependentUpon>
</Compile>
<Compile Include="ObjectContextBase.SaveChanges.cs" />
<Compile Include="Setup\Builder\ActivityLogTypeMigrator.cs" />
<Compile Include="Setup\Builder\SettingsBuilder.cs" />
Expand Down Expand Up @@ -1373,6 +1377,9 @@
<EmbeddedResource Include="Migrations\202002251510114_ManufacturerSubjectToAcl.resx">
<DependentUpon>202002251510114_ManufacturerSubjectToAcl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Migrations\202002271206204_ShipmentTrackingUrl.resx">
<DependentUpon>202002271206204_ShipmentTrackingUrl.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Sql\Indexes.sql" />
<EmbeddedResource Include="Sql\StoredProcedures.sql" />
</ItemGroup>
Expand Down
@@ -1,5 +1,4 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using SmartStore.ComponentModel;
Expand All @@ -18,10 +17,11 @@
using SmartStore.Services.Media;
using SmartStore.Services.Orders;
using SmartStore.Services.Payments;
using SmartStore.Services.Shipping;

namespace SmartStore.Services.Messages
{
public partial class MessageModelProvider
public partial class MessageModelProvider
{
protected virtual object CreateModelPart(Order part, MessageContext messageContext)
{
Expand Down Expand Up @@ -228,10 +228,6 @@ protected virtual object CreateOrderTotalsPart(Order order, MessageContext messa

private (Money SubTotal, Money SubTotalDiscount, Money ShippingTotal, Money PaymentFee, bool DisplaySubTotalDiscount) GetSubTotals(Order order, MessageContext messageContext)
{
var language = messageContext.Language;
var currencyService = _services.Resolve<ICurrencyService>();
var priceFormatter = _services.Resolve<IPriceFormatter>();

var isNet = order.CustomerTaxDisplayType == TaxDisplayType.ExcludingTax;

var subTotal = isNet ? order.OrderSubtotalExclTax : order.OrderSubtotalInclTax;
Expand Down Expand Up @@ -389,30 +385,47 @@ protected virtual object CreateModelPart(Shipment part, MessageContext messageCo
Guard.NotNull(messageContext, nameof(messageContext));
Guard.NotNull(part, nameof(part));

var orderItems = new List<OrderItem>();
var orderItemIds = part.ShipmentItems.Select(x => x.OrderItemId).ToArray();
foreach (var orderItemId in orderItemIds)
{
var orderItem = _services.Resolve<IOrderService>().GetOrderItemById(orderItemId);
if (orderItem != null)
{
orderItems.Add(orderItem);
}
}
var orderService = _services.Resolve<IOrderService>();
var orderItems = orderService.GetOrderItemsByOrderIds(new int[] { part.OrderId })[part.OrderId];
var itemParts = orderItems
.Where(x => x.Product != null)
.Select(x => CreateModelPart(x, messageContext))
.ToList();

var trackingUrl = part.TrackingUrl;

if (trackingUrl.IsEmpty() && part.TrackingNumber.HasValue() && part.Order.ShippingRateComputationMethodSystemName.HasValue())
{
// Try to get URL from tracker.
var srcm = _services.Resolve<IShippingService>().LoadShippingRateComputationMethodBySystemName(part.Order.ShippingRateComputationMethodSystemName);
if (srcm != null && srcm.Value.IsActive)
{
var tracker = srcm.Value.ShipmentTracker;
if (tracker != null)
{
var shippingSettings = _services.Settings.LoadSetting<ShippingSettings>(part.Order.StoreId);
if (srcm.IsShippingRateComputationMethodActive(shippingSettings))
{
trackingUrl = tracker.GetUrl(part.TrackingNumber);
}
}
}
}

var m = new Dictionary<string, object>
{
{ "Id", part.Id },
{ "TrackingNumber", part.TrackingNumber.NullEmpty() },
{ "TotalWeight", part.TotalWeight },
{ "TrackingUrl", trackingUrl.NullEmpty() },
{ "TotalWeight", part.TotalWeight },
{ "CreatedOn", ToUserDate(part.CreatedOnUtc, messageContext) },
{ "DeliveredOn", ToUserDate(part.DeliveryDateUtc, messageContext) },
{ "ShippedOn", ToUserDate(part.ShippedDateUtc, messageContext) },
{ "Url", BuildActionUrl("ShipmentDetails", "Order", new { id = part.Id, area = "" }, messageContext)},
{ "Items", orderItems.Where(x => x.Product != null).Select(x => CreateModelPart(x, messageContext)).ToList() },
{ "Items", itemParts },
};

PublishModelPartCreatedEvent<Shipment>(part, m);
PublishModelPartCreatedEvent(part, m);

return m;
}
Expand Down
Expand Up @@ -297,12 +297,17 @@ public partial interface IOrderProcessingService
bool ValidateMinOrderTotalAmount(IList<OrganizedShoppingCartItem> cart);

/// <summary>
/// Adds a shipment to an order
/// Adds a shipment to an order.
/// </summary>
/// <param name="order">Order</param>
/// <param name="trackingNumber">Tracking number</param>
/// <param name="order">Order.</param>
/// <param name="trackingNumber">Tracking number.</param>
/// <param name="trackingUrl">Tracking URL.</param>
/// <param name="quantities">Quantities by order item identifiers. <c>null</c> to use the remaining total number of products for each order item.</param>
/// <returns>New shipment, <c>null</c> if no shipment was added</returns>
Shipment AddShipment(Order order, string trackingNumber, Dictionary<int, int> quantities);
/// <returns>New shipment, <c>null</c> if no shipment was added.</returns>
Shipment AddShipment(
Order order,
string trackingNumber,
string trackingUrl,
Dictionary<int, int> quantities);
}
}
Expand Up @@ -6,7 +6,6 @@
using SmartStore.Core.Domain.Catalog;
using SmartStore.Core.Domain.Common;
using SmartStore.Core.Domain.Customers;
using SmartStore.Core.Domain.Directory;
using SmartStore.Core.Domain.Discounts;
using SmartStore.Core.Domain.Localization;
using SmartStore.Core.Domain.Orders;
Expand Down Expand Up @@ -72,7 +71,6 @@ public partial class OrderProcessingService : IOrderProcessingService
private readonly OrderSettings _orderSettings;
private readonly TaxSettings _taxSettings;
private readonly LocalizationSettings _localizationSettings;
private readonly CurrencySettings _currencySettings;
private readonly ShoppingCartSettings _shoppingCartSettings;
private readonly CatalogSettings _catalogSettings;

Expand Down Expand Up @@ -115,7 +113,6 @@ public partial class OrderProcessingService : IOrderProcessingService
OrderSettings orderSettings,
TaxSettings taxSettings,
LocalizationSettings localizationSettings,
CurrencySettings currencySettings,
ShoppingCartSettings shoppingCartSettings,
CatalogSettings catalogSettings)
{
Expand Down Expand Up @@ -153,7 +150,6 @@ public partial class OrderProcessingService : IOrderProcessingService
_orderSettings = orderSettings;
_taxSettings = taxSettings;
_localizationSettings = localizationSettings;
_currencySettings = currencySettings;
_shoppingCartSettings = shoppingCartSettings;
_catalogSettings = catalogSettings;

Expand Down Expand Up @@ -2693,7 +2689,11 @@ public virtual bool ValidateMinOrderTotalAmount(IList<OrganizedShoppingCartItem>
return true;
}

public virtual Shipment AddShipment(Order order, string trackingNumber, Dictionary<int, int> quantities)
public virtual Shipment AddShipment(
Order order,
string trackingNumber,
string trackingUrl,
Dictionary<int, int> quantities)
{
Guard.NotNull(order, nameof(order));

Expand All @@ -2705,7 +2705,7 @@ public virtual Shipment AddShipment(Order order, string trackingNumber, Dictiona
if (!orderItem.Product.IsShipEnabled)
continue;

//ensure that this product can be shipped (have at least one item to ship)
// Ensure that this product can be shipped (have at least one item to ship).
var maxQtyToAdd = orderItem.GetItemsCanBeAddedToShipmentCount();
if (maxQtyToAdd <= 0)
continue;
Expand Down Expand Up @@ -2737,8 +2737,9 @@ public virtual Shipment AddShipment(Order order, string trackingNumber, Dictiona
shipment = new Shipment
{
OrderId = order.Id,
Order = order, // otherwise order updated event would not be fired during InsertShipment
Order = order, // Otherwise order updated event would not be fired during InsertShipment.
TrackingNumber = trackingNumber,
TrackingUrl = trackingUrl,
TotalWeight = null,
ShippedDateUtc = null,
DeliveryDateUtc = null,
Expand Down
Expand Up @@ -242,7 +242,8 @@ public SingleResult<Order> AddShipment(int key, ODataActionParameters parameters
if (order.CanAddItemsToShipment())
{
var trackingNumber = parameters.GetValueSafe<string>("TrackingNumber");
var shipment = _orderProcessingService.Value.AddShipment(order, trackingNumber, null);
var trackingUrl = parameters.GetValueSafe<string>("TrackingUrl");
var shipment = _orderProcessingService.Value.AddShipment(order, trackingNumber, trackingUrl, null);
if (shipment != null)
{
Expand Down

0 comments on commit f652c68

Please sign in to comment.