Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -89,5 +89,30 @@ public string[] OrganizationIds
/// Search orders with a certain product
/// </summary>
public string ProductId { get; set; }

/// <summary>
/// Search orders with a certain promotion
/// </summary>
public string PromotionId { get; set; }

private string[] _promotionIds;
/// <summary>
/// Search orders with given promotions
/// </summary>
public string[] PromotionIds
{
get
{
if (_promotionIds == null && !string.IsNullOrEmpty(PromotionId))
{
_promotionIds = new[] { PromotionId };
}
return _promotionIds;
}
set
{
_promotionIds = value;
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public Task BuildSchemaAsync(IndexDocument schema)
schema.AddFilterableString("OuterId");
schema.AddFilterableString("Status");
schema.AddFilterableString("Currency");
schema.AddFilterableString("PromotionId");

schema.AddFilterableDecimal("Total");
schema.AddFilterableDecimal("SubTotal");
Expand Down Expand Up @@ -125,26 +126,31 @@ protected virtual async Task<IndexDocument> CreateDocument(CustomerOrder order)
document.AddFilterableBoolean("IsCancelled", order.IsCancelled);
document.AddFilterableBoolean("IsPrototype", order.IsPrototype);

IndexDiscounts(order.Discounts, document);

foreach (var address in order.Addresses ?? Enumerable.Empty<Address>())
{
IndexAddress(address, document);
}

foreach (var lineItem in order.Items ?? Enumerable.Empty<LineItem>())
{
IndexDiscounts(lineItem.Discounts, document);
document.AddContentString(lineItem.Comment);
}

foreach (var payment in order.InPayments ?? Enumerable.Empty<PaymentIn>())
{
IndexAddress(payment.BillingAddress, document);
IndexDiscounts(payment.Discounts, document);
document.AddContentString(payment.Number);
document.AddContentString(payment.Comment);
}

foreach (var shipment in order.Shipments ?? Enumerable.Empty<Shipment>())
{
IndexAddress(shipment.DeliveryAddress, document);
IndexDiscounts(shipment.Discounts, document);
document.AddContentString(shipment.Number);
document.AddContentString(shipment.Comment);

Expand All @@ -171,5 +177,16 @@ protected virtual void IndexAddress(Address address, IndexDocument document)
document.AddContentString($"{address.AddressType} {address}");
}
}

protected virtual void IndexDiscounts(ICollection<VirtoCommerce.CoreModule.Core.Common.Discount> discounts, IndexDocument document)
{
if(discounts!=null)
{
foreach (var discount in discounts.Where(d => d != null && !string.IsNullOrEmpty(d.PromotionId)))
{
document.AddFilterableString("PromotionId", discount.PromotionId);
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,11 @@ protected virtual IList<IFilter> GetPermanentFilters(CustomerOrderSearchCriteria
result.Add(FilterHelper.CreateTermFilter("isprototype", "false"));
}

if (!criteria.PromotionIds.IsNullOrEmpty())
{
result.Add(FilterHelper.CreateTermFilter("promotionid", criteria.PromotionIds));
}

return result;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ protected override IQueryable<CustomerOrderEntity> BuildQuery(IRepository reposi
query = query.Where(o => o.Items.Any(i => i.ProductId == criteria.ProductId));
}

query = WithPromotionConditions(query, criteria);

return query;
}

Expand Down Expand Up @@ -175,5 +177,21 @@ private static IQueryable<CustomerOrderEntity> WithSubscriptionConditions(IQuery

return query;
}

private static IQueryable<CustomerOrderEntity> WithPromotionConditions(IQueryable<CustomerOrderEntity> query, CustomerOrderSearchCriteria criteria)
{
if (!criteria.PromotionIds.IsNullOrEmpty())
{
// Check if any discount in the order, shipments, payments, or line items has the promotion ID
query = query.Where(o =>
(o.Discounts != null && o.Discounts.Any(d => criteria.PromotionIds.Contains(d.PromotionId))) ||
(o.Shipments != null && o.Shipments.Any(s => s.Discounts != null && s.Discounts.Any(d => criteria.PromotionIds.Contains(d.PromotionId)))) ||
(o.InPayments != null && o.InPayments.Any(p => p.Discounts != null && p.Discounts.Any(d => criteria.PromotionIds.Contains(d.PromotionId)))) ||
(o.Items != null && o.Items.Any(i => i.Discounts != null && i.Discounts.Any(d => criteria.PromotionIds.Contains(d.PromotionId))))
);
}

return query;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
angular.module('virtoCommerce.orderModule')
.controller('virtoCommerce.orderModule.operationDiscountsController', [
'$scope',
'platformWebApp.uiGridHelper',
function ($scope, uiGridHelper) {
var blade = $scope.blade;

blade.title = 'orders.blades.customerOrder-item-discounts.title';
blade.headIcon = 'fa fa-area-chart';

$scope.setGridOptions = function (gridOptions) {
uiGridHelper.initialize($scope, gridOptions, function (gridApi) {
$scope.gridApi = gridApi;
});
};

blade.isLoading = false;
}
]);


Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<div class="blade-content __medium-wide">
<div class="blade-inner">
<div class="inner-block" ng-init="setGridOptions({
rowTemplate: 'discounts-list.row.html',
data: 'blade.currentEntity.discounts',
enableSorting: false,
columnDefs: [
{ name: 'name', displayName: 'orders.blades.customerOrder-item-discounts.labels.name'},
{ name: 'coupon', displayName: 'orders.blades.customerOrder-item-discounts.labels.coupon' },
{ name: 'discountAmount', displayName: 'orders.blades.customerOrder-item-discounts.labels.discountAmount' },
{ name: 'currency', displayName: 'orders.blades.customerOrder-item-discounts.labels.currency' }
]})">
<div class="table-wrapper" ng-if="(blade.currentEntity.discounts || []).length" style="margin: 0 -21px 0;">
<div ui-grid="gridOptions" ui-grid-auto-resize ui-grid-save-state ui-grid-resize-columns ui-grid-move-columns ui-grid-pinning ui-grid-height></div>
</div>
<div class="note" ng-if="!(blade.currentEntity.discounts || []).length">{{ 'orders.blades.customerOrder-item-discounts.descr.no-discounts' | translate }}</div>
</div>
</div>
</div>

<script type="text/ng-template" id="discounts-list.row.html">
<div ng-repeat="(colRenderIndex, col) in colContainer.renderedColumns track by col.uid" ui-grid-one-bind-id-grid="rowRenderIndex + '-' + col.uid + '-cell'" class="ui-grid-cell" ng-class="{'ui-grid-row-header-cell': col.isRowHeader, '__hovered': grid.appScope.contextMenuEntity === row.entity}" role="{{col.isRowHeader ? 'rowheader' : 'gridcell' }}" ui-grid-cell></div>
</script>


11 changes: 7 additions & 4 deletions src/VirtoCommerce.OrdersModule.Web/Scripts/order.js
Original file line number Diff line number Diff line change
Expand Up @@ -851,11 +851,14 @@ angular.module(moduleName, [
}
});

var customerOrderItemDiscountWidget = {
controller: 'virtoCommerce.orderModule.customerOrderItemDiscountWidgetController',
template: 'Modules/$(VirtoCommerce.Orders)/Scripts/widgets/customerOrder-item-discounts-widget.tpl.html'
var operationDiscountsWidget = {
controller: 'virtoCommerce.orderModule.operationDiscountWidgetController',
template: 'Modules/$(VirtoCommerce.Orders)/Scripts/widgets/operation-discounts-widget.tpl.html'
};
widgetService.registerWidget(customerOrderItemDiscountWidget, 'customerOrderItemDetailWidgets');
widgetService.registerWidget(operationDiscountsWidget, 'customerOrderDetailWidgets');
widgetService.registerWidget(operationDiscountsWidget, 'paymentDetailWidgets');
widgetService.registerWidget(operationDiscountsWidget, 'shipmentDetailWidgets');
widgetService.registerWidget(operationDiscountsWidget, 'customerOrderItemDetailWidgets');

var customerOrderItemConfigurationWidget = {
controller: 'virtoCommerce.orderModule.customerOrderItemConfigurationWidgetController',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
angular.module('virtoCommerce.orderModule')
.controller('virtoCommerce.orderModule.operationDiscountWidgetController', [
'$scope',
'platformWebApp.bladeNavigationService',
function ($scope, bladeNavigationService) {
var blade = $scope.blade;

$scope.openBlade = function () {
var newBlade = {
id: "operationDiscounts",
controller: 'virtoCommerce.orderModule.operationDiscountsController',
template: 'Modules/$(VirtoCommerce.Orders)/Scripts/blades/operation-discounts.tpl.html',
currentEntity: blade.currentEntity,
};

bladeNavigationService.showBlade(newBlade, blade);
};
}
]);


Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<div class="gridster-cnt" ng-click="openBlade()">
<div class="cnt-inner">
<div class="list-count">{{(blade.currentEntity.discounts || []).length | number:0}}</div>
<div class="list-t">{{ 'orders.widgets.customerOrder-item-discounts.title' | translate }}</div>
</div>
</div>