improvements, fixes, etc...

This commit is contained in:
Loretta 2025-10-16 11:43:51 +02:00
parent fbf83e5736
commit ba52be2847
46 changed files with 1727 additions and 1166 deletions

View File

@ -8,7 +8,7 @@ using Microsoft.AspNetCore.Mvc;
using Nop.Core.Domain.Orders;
using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer;
using Nop.Plugin.Misc.FruitBankPlugin.Factories;
using Nop.Plugin.Misc.FruitBankPlugin.Models;
using Nop.Plugin.Misc.FruitBankPlugin.Models.Orders;
using Nop.Services.Common;
using Nop.Services.Messages;
using Nop.Services.Orders;
@ -126,7 +126,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Areas.Admin.Controllers
return RedirectToAction("List", "Order");
// store attributes in GenericAttribute table
await _genericAttributeService.SaveAttributeAsync(order, nameof(OrderModelExtended.IsMeasurable), model.IsMeasurable);
await _genericAttributeService.SaveAttributeAsync(order, nameof(IMeasurable.IsMeasurable), model.IsMeasurable);
await _genericAttributeService.SaveAttributeAsync(order, nameof(IOrderDto.DateOfReceipt), model.DateOfReceipt);
_notificationService.SuccessNotification("Custom attributes saved successfully.");

View File

@ -13,6 +13,7 @@ using Nop.Core.Domain.Tax;
using Nop.Core.Domain.Vendors;
using Nop.Core.Http;
using Nop.Core.Infrastructure;
using Nop.Plugin.Misc.FruitBankPlugin.Factories;
using Nop.Services.Catalog;
using Nop.Services.Common;
using Nop.Services.Configuration;
@ -44,6 +45,7 @@ public partial class CustomProductController : BaseAdminController
{
#region Fields
private readonly CustomProductModelFactory _productModelFactory;
protected readonly AdminAreaSettings _adminAreaSettings;
protected readonly IAclService _aclService;
protected readonly IBackInStockSubscriptionService _backInStockSubscriptionService;
@ -70,7 +72,6 @@ public partial class CustomProductController : BaseAdminController
protected readonly IProductAttributeFormatter _productAttributeFormatter;
protected readonly IProductAttributeParser _productAttributeParser;
protected readonly IProductAttributeService _productAttributeService;
protected readonly IProductModelFactory _productModelFactory;
protected readonly IProductService _productService;
protected readonly IProductTagService _productTagService;
protected readonly ISettingService _settingService;
@ -159,7 +160,7 @@ public partial class CustomProductController : BaseAdminController
_productAttributeFormatter = productAttributeFormatter;
_productAttributeParser = productAttributeParser;
_productAttributeService = productAttributeService;
_productModelFactory = productModelFactory;
_productModelFactory = productModelFactory as CustomProductModelFactory;
_productService = productService;
_productTagService = productTagService;
_settingService = settingService;
@ -878,7 +879,6 @@ public partial class CustomProductController : BaseAdminController
[CheckPermission(StandardPermission.Catalog.PRODUCTS_VIEW)]
public virtual async Task<IActionResult> List()
{
//prepare model
var model = await _productModelFactory.PrepareProductSearchModelAsync(new ProductSearchModel());
return View("~/Plugins/Misc.FruitBankPlugin/Areas/Admin/Views/Product/List.cshtml", model);
@ -918,7 +918,7 @@ public partial class CustomProductController : BaseAdminController
public virtual async Task<IActionResult> ProductList(ProductSearchModel searchModel)
{
//prepare model
var model = await _productModelFactory.PrepareProductListModelAsync(searchModel);
var model = await _productModelFactory.PrepareProductListModelExtendedAsync(searchModel);
return Json(model);
}

View File

@ -3,6 +3,7 @@
@inject IStoreService storeService
@using FruitBank.Common.Interfaces
@using Nop.Plugin.Misc.FruitBankPlugin.Models
@using Nop.Plugin.Misc.FruitBankPlugin.Models.Orders
@using Nop.Services.Stores
@using Nop.Web.Areas.Admin.Components
@using Nop.Web.Areas.Admin.Models.Orders
@ -168,7 +169,7 @@
</script>
</div>
</div>
<div class="form-group row" @(Model.IsLoggedInAsVendor ? Html.Raw("style='display: none;'") : null)>
<div class="form-group row" @(Model.IsLoggedInAsVendor? Html.Raw("style='display: none;'") : null)>
<div class="col-md-4">
<nop-label asp-for="OrderStatusIds" />
</div>
@ -184,7 +185,7 @@
<nop-select asp-for="PaymentStatusIds" asp-items="Model.AvailablePaymentStatuses" asp-multiple="true" />
</div>
</div>
<div class="form-group row" @(Model.IsLoggedInAsVendor ? Html.Raw("style='display: none;'") : null)>
<div class="form-group row" @(Model.IsLoggedInAsVendor? Html.Raw("style='display: none;'") : null)>
<div class="col-md-4">
<nop-label asp-for="ShippingStatusIds" />
</div>
@ -194,7 +195,7 @@
</div>
</div>
<div class="col-md-7">
<div class="form-group row" @(Model.HideStoresList ? Html.Raw("style=\"display:none\"") : null)>
<div class="form-group row" @(Model.HideStoresList? Html.Raw("style=\"display:none\"") : null)>
<div class="col-md-4">
<nop-label asp-for="StoreId" />
</div>
@ -346,11 +347,19 @@
Render = new RenderCustom("renderColumnIsMeasurable"),
ClassName = NopColumnClassDefaults.CenterAll
});
gridModel.ColumnCollection.Add(new ColumnProperty(nameof(OrderModelExtended.IsMeasured))
{
Title = T("Admin.Orders.Fields.IsMeasured").Text,
Width = "100",
Render = new RenderCustom("renderColumnIsMeasurable"),
ClassName = NopColumnClassDefaults.CenterAll
});
gridModel.ColumnCollection.Add(new ColumnProperty(nameof(IOrderDto.DateOfReceipt))
{
Title = T("Admin.Orders.Fields.PickupDate").Text,
Width = "100",
Render = new RenderCustom("renderColumnPickupDateAndTime"),
//Render = new RenderCustom("renderColumnPickupDateAndTime"),
Render = new RenderDate(),
ClassName = NopColumnClassDefaults.CenterAll
});
@ -456,7 +465,10 @@
function renderColumnPickupDateAndTime(data, type, row, meta) {
return `<span>${data}</span>`;
var formattedDate = "";
if(data != null) formattedDate = data;//.toString();//('YYYY-MM-DD HH:mm');
return `<span>${formattedDate}</span>`;
}
$(function() {

View File

@ -1,6 +1,7 @@
@model ProductSearchModel
@using Nop.Core.Domain.Catalog;
@using Nop.Plugin.Misc.FruitBankPlugin.Models.Products
@{
//page title
@ -147,7 +148,7 @@
</div>
</div>
<div class="col-md-7">
<div class="form-group row" @(Model.HideStoresList ? Html.Raw("style=\"display:none\"") : null)>
<div class="form-group row" @(Model.HideStoresList? Html.Raw("style=\"display:none\"") : null)>
<div class="col-md-4">
<nop-label asp-for="SearchStoreId" />
</div>
@ -238,13 +239,14 @@
IsMasterCheckBox = true,
Render = new RenderCheckBox("checkbox_products"),
ClassName = NopColumnClassDefaults.CenterAll,
Width = "50"
Width = "40"
},
new ColumnProperty(nameof(ProductModel.PictureThumbnailUrl))
{
Title = T("Admin.Catalog.Products.Fields.PictureThumbnailUrl").Text,
Width = "100",
Render = new RenderPicture(width: 100)
Render = new RenderPicture(width: 100),
Visible = false
},
new ColumnProperty(nameof(ProductModel.Name))
{
@ -252,7 +254,7 @@
},
new ColumnProperty(nameof(ProductModel.Sku))
{
Title = T("Admin.Catalog.Products.Fields.Sku").Text,
Title = "SKU", //T("Admin.Catalog.Products.Fields.Sku").Text,
Width = "100"
},
new ColumnProperty(nameof(ProductModel.FormattedPrice))
@ -263,10 +265,29 @@
{
Title = T("Admin.Catalog.Products.Fields.StockQuantity").Text
},
new ColumnProperty(nameof(ProductModelExtended.NetWeight))
{
Title = "Súly(kg)"//T("Admin.Catalog.Products.Fields.NetWeight").Text
},
new ColumnProperty(nameof(ProductModelExtended.Tare))
{
Title = "Tára(kg)"//T("Admin.Catalog.Products.Fields.Tare").Text
},
new ColumnProperty(nameof(ProductModelExtended.IncomingQuantity))
{
Title = "Bejövő"//T("Admin.Catalog.Products.Fields.Tare").Text
},
new ColumnProperty(nameof(ProductModelExtended.IsMeasurable))
{
Title = "Mérendő?",//T("Admin.Catalog.Products.Fields.Tare").Text
Width = "75",
ClassName = NopColumnClassDefaults.CenterAll,
Render = new RenderBoolean()
},
new ColumnProperty(nameof(ProductModel.Published))
{
Title = T("Admin.Catalog.Products.Fields.Published").Text,
Width = "80",
Width = "75",
ClassName = NopColumnClassDefaults.CenterAll,
Render = new RenderBoolean()
},
@ -282,6 +303,7 @@
<script>
$(function() {
$('#delete-selected-action-confirmation-submit-button').bind('click', function () {
var postData = {
@ -372,8 +394,8 @@
</div>
</div>
@*import products form*@
<div id="importexcel-window" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="importexcel-window-title">
@*import products form*@
<div id="importexcel-window" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="importexcel-window-title">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
@ -413,12 +435,12 @@
</form>
</div>
</div>
</div>
</div>
@*export selected (XML). We don't use GET approach because it's limited to 2K-4K chars and won't work for large number of entities*@
<form asp-controller="Product" asp-action="ExportXmlSelected" method="post" id="export-xml-selected-form">
@*export selected (XML). We don't use GET approach because it's limited to 2K-4K chars and won't work for large number of entities*@
<form asp-controller="Product" asp-action="ExportXmlSelected" method="post" id="export-xml-selected-form">
<input type="hidden" id="selectedIds" name="selectedIds" value="" />
</form>
</form>
<script>
$(function() {
@ -440,12 +462,12 @@
</script>
<nop-alert asp-alert-id="exportXmlSelected" />
@*export selected (Excel). We don't use GET approach because it's limited to 2K-4K chars and won't work for large number of entities*@
<form asp-controller="Product" asp-action="ExportExcelSelected" method="post" id="export-excel-selected-form">
@*export selected (Excel). We don't use GET approach because it's limited to 2K-4K chars and won't work for large number of entities*@
<form asp-controller="Product" asp-action="ExportExcelSelected" method="post" id="export-excel-selected-form">
<input type="hidden" id="selectedIds" name="selectedIds" value="" />
</form>
</form>
<script>
<script>
$(function() {
$('#exportexcel-selected').click(function (e) {
e.preventDefault();
@ -462,5 +484,5 @@
return false;
});
});
</script>
</script>
<nop-alert asp-alert-id="exportExcelSelected" />

View File

@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Mvc;
using Nop.Core;
using Nop.Core.Domain.Catalog;
using Nop.Core.Domain.Orders;
using Nop.Plugin.Misc.FruitBankPlugin.Models;
using Nop.Plugin.Misc.FruitBankPlugin.Models.Orders;
using Nop.Plugin.Misc.FruitBankPlugin.Services;
using Nop.Services.Common;
using Nop.Web.Areas.Admin.Models.Catalog;
@ -37,7 +37,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Components
if (model.OrderId > 0)
{
var orderPickupAttributeValue = await _fruitBankAttributeService.GetGenericAttributeValueAsync<Order, DateTime?>(model.OrderId, nameof(IOrderDto.DateOfReceipt));
var orderMeasurableAttributeValue = await _fruitBankAttributeService.GetGenericAttributeValueAsync<Order, bool>(model.OrderId, nameof(OrderModelExtended.IsMeasurable));
var orderMeasurableAttributeValue = await _fruitBankAttributeService.GetGenericAttributeValueAsync<Order, bool>(model.OrderId, nameof(IMeasurable.IsMeasurable));
model.IsMeasurable = orderMeasurableAttributeValue;
if(orderPickupAttributeValue.HasValue && orderPickupAttributeValue.Value != DateTime.MinValue)

View File

@ -42,7 +42,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Components
}
model.Tare = await _fruitBankAttributeService.GetGenericAttributeValueAsync<Product, double>(model.ProductId, nameof(ITare.Tare));
model.IncomingQuantity = await _fruitBankAttributeService.GetGenericAttributeValueAsync<Product, int>(model.ProductId, "IncomingQuantity");
model.IncomingQuantity = await _fruitBankAttributeService.GetGenericAttributeValueAsync<Product, int>(model.ProductId, nameof(IIncomingQuantity.IncomingQuantity));
}
return View("~/Plugins/Misc.FruitBankPlugin/Views/ProductAttributes.cshtml", model);

View File

@ -45,6 +45,8 @@ public class FruitBankDbContext : MgDbContextBase,
private readonly IProductService _productService;
private readonly IStaticCacheManager _staticCacheManager;
public ProductDtoDbTable ProductDtos { get; set; }
public OrderDtoDbTable OrderDtos { get; set; }
public OrderItemDtoDbTable OrderItemDtos { get; set; }
@ -67,7 +69,7 @@ public class FruitBankDbContext : MgDbContextBase,
public FruitBankDbContext(INopDataProvider dataProvider, ILockService lockService, FruitBankAttributeService fruitBankAttributeService, IStoreContext storeContext,
PartnerDbTable partnerDbTable, ShippingDbTable shippingDbTable, ShippingDocumentDbTable shippingDocumentDbTable, ShippingItemDbTable shippingItemDbTable,
ShippingItemPalletDbTable shippingItemPalletDbTable, FilesDbTable filesDbTable, ShippingDocumentToFilesDbTable shippingDocumentToFilesDbTable,
OrderDtoDbTable orderDtoDbTable, OrderItemDtoDbTable orderItemDtoDbTable, OrderItemPalletDbTable orderItemPalletDbTable,
ProductDtoDbTable productDtoDbTable, OrderDtoDbTable orderDtoDbTable, OrderItemDtoDbTable orderItemDtoDbTable, OrderItemPalletDbTable orderItemPalletDbTable,
IProductService productService, IStaticCacheManager staticCacheManager,
IRepository<Product> productRepository,
IRepository<Customer> customerRepository,
@ -84,6 +86,8 @@ public class FruitBankDbContext : MgDbContextBase,
Partners = partnerDbTable;
Products = productRepository;
ProductDtos = productDtoDbTable;
OrderDtos = orderDtoDbTable;
OrderItemDtos = orderItemDtoDbTable;
OrderItemPallets = orderItemPalletDbTable;

View File

@ -11,27 +11,6 @@ using Nop.Services.Logging;
namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer;
public class OrderItemDtoDbTable : MgDbTableBase<OrderItemDto>
{
public OrderItemDtoDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings, ILogger logger)
: base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings, logger)
{
}
public IQueryable<OrderItemDto> GetAll(bool loadRelations)
{
return GetAll()
.LoadWith(oi => oi.OrderDto)
.LoadWith(oi => oi.OrderItemPallets)
.LoadWith(oi => oi.GenericAttributes)
.LoadWith(oi => oi.ProductDto).ThenLoad(prod => prod.GenericAttributes);
}
public Task<OrderItemDto> GetByIdAsync(int orderItemId) => GetAll(true).Where(x => x.Id == orderItemId).FirstOrDefaultAsync(null);
public IQueryable<OrderItemDto> GetAllByOrderId(int orderId)=> GetAll(true).Where(o => o.OrderId == orderId);
}
public class OrderDtoDbTable : MgDbTableBase<OrderDto>
{
public OrderDtoDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings, ILogger logger)

View File

@ -0,0 +1,31 @@
using FruitBank.Common.Dtos;
using LinqToDB;
using Mango.Nop.Core.Repositories;
using Nop.Core.Caching;
using Nop.Core.Configuration;
using Nop.Core.Events;
using Nop.Data;
using Nop.Services.Logging;
namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer;
public class OrderItemDtoDbTable : MgDbTableBase<OrderItemDto>
{
public OrderItemDtoDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings, ILogger logger)
: base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings, logger)
{
}
public IQueryable<OrderItemDto> GetAll(bool loadRelations)
{
return GetAll()
.LoadWith(oi => oi.OrderDto)
.LoadWith(oi => oi.OrderItemPallets)
.LoadWith(oi => oi.GenericAttributes)
.LoadWith(oi => oi.ProductDto).ThenLoad(prod => prod.GenericAttributes);
}
public Task<OrderItemDto> GetByIdAsync(int orderItemId) => GetAll(true).Where(x => x.Id == orderItemId).FirstOrDefaultAsync(null);
public IQueryable<OrderItemDto> GetAllByOrderId(int orderId)=> GetAll(true).Where(o => o.OrderId == orderId);
}

View File

@ -0,0 +1,27 @@
using FruitBank.Common.Dtos;
using LinqToDB;
using Mango.Nop.Core.Repositories;
using Nop.Core.Caching;
using Nop.Core.Configuration;
using Nop.Core.Events;
using Nop.Data;
using Nop.Services.Logging;
namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer;
public class ProductDtoDbTable : MgDbTableBase<ProductDto>
{
public ProductDtoDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings, ILogger logger)
: base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings, logger)
{
}
public IQueryable<ProductDto> GetAll(bool loadRelations)
{
return GetAll().LoadWith(p => p.GenericAttributes);
}
public Task<ProductDto> GetByIdAsync(int productId) => GetAll(true).Where(x => x.Id == productId).FirstOrDefaultAsync(null);
public IQueryable<ProductDto> GetAllByIds(IEnumerable<int> productIds) => GetAll(true).Where(p => productIds.Contains(p.Id));
}

View File

@ -25,7 +25,7 @@ public class ShippingDbTable : MgDbTableBase<Shipping>
? GetAll()
.LoadWith(s => s.ShippingDocuments).ThenLoad(sd => sd.ShippingItems).ThenLoad(si => si.ShippingItemPallets)
.LoadWith(s => s.ShippingDocuments).ThenLoad(sd => sd.ShippingItems).ThenLoad(si => si.Pallet)
.LoadWith(s => s.ShippingDocuments).ThenLoad(sd => sd.ShippingItems).ThenLoad(si => si.Product)
.LoadWith(s => s.ShippingDocuments).ThenLoad(sd => sd.ShippingItems).ThenLoad(si => si.ProductDto).ThenLoad(prod => prod.GenericAttributes)
.LoadWith(s => s.ShippingDocuments).ThenLoad(sd => sd.ShippingDocumentToFiles).ThenLoad(sdtof => sdtof.ShippingDocumentFile)
.LoadWith(s => s.ShippingDocuments).ThenLoad(sd => sd.Partner)
: GetAll();

View File

@ -25,7 +25,7 @@ public class ShippingDocumentDbTable : MgDbTableBase<ShippingDocument>
? GetAll()
.LoadWith(sd => sd.Shipping)
.LoadWith(sd => sd.ShippingItems).ThenLoad(si => si.Pallet)
.LoadWith(sd => sd.ShippingItems).ThenLoad(si => si.Product)
.LoadWith(sd => sd.ShippingItems).ThenLoad(si => si.ProductDto).ThenLoad(prod => prod.GenericAttributes)
.LoadWith(sd => sd.ShippingItems).ThenLoad(si => si.ShippingItemPallets)
.LoadWith(sd => sd.ShippingDocumentToFiles).ThenLoad(sdtof => sdtof.ShippingDocumentFile)
.LoadWith(sd => sd.Partner)

View File

@ -38,9 +38,9 @@ public class ShippingItemDbTable : MgDbTableBase<ShippingItem>
.LoadWith(si => si.ShippingDocument).ThenLoad(p => p.Partner)
.LoadWith(si => si.ShippingDocument).ThenLoad(sd => sd.ShippingDocumentToFiles).ThenLoad(sdtof => sdtof.ShippingDocumentFile)
.LoadWith(si => si.ShippingItemPallets)
.LoadWith(si => si.Product)
.LoadWith(si => si.ProductDto).ThenLoad(prod => prod.GenericAttributes)
.LoadWith(si => si.Pallet)
: GetAll().LoadWith(si => si.ShippingItemPallets).LoadWith(si => si.Product).LoadWith(si => si.Pallet);
: GetAll().LoadWith(si => si.ShippingItemPallets).LoadWith(si => si.ProductDto).ThenLoad(prod => prod.GenericAttributes).LoadWith(si => si.Pallet);
}
public IQueryable<ShippingItem> GetAllNotMeasured(bool loadRelations)

View File

@ -81,12 +81,12 @@ public class FruitBankEventConsumer(IHttpContextAccessor httpContextAcc, FruitBa
await fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync<Product, double>(product.Id, nameof(ITare.Tare), tare);
}
if (form.ContainsKey("IncomingQuantity"))
if (form.ContainsKey(nameof(IIncomingQuantity.IncomingQuantity)))
{
var incomingQuantity = CommonHelper.To<int>(form["IncomingQuantity"].ToString());
var incomingQuantity = CommonHelper.To<int>(form[nameof(IIncomingQuantity.IncomingQuantity)].ToString());
if (incomingQuantity < 0) throw new Exception($"FruitBankEventConsumer->SaveProductCustomAttributesAsync(); (incomingQuantity < 0); productId: {product.Id}; incomingQuantity: {incomingQuantity}");
await fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync<Product, int>(product.Id, "IncomingQuantity", incomingQuantity);
await fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync<Product, int>(product.Id, nameof(IIncomingQuantity.IncomingQuantity), incomingQuantity);
}
}

View File

@ -11,7 +11,6 @@ using Nop.Core.Domain.Orders;
using Nop.Core.Domain.Shipping;
using Nop.Core.Domain.Tax;
using Nop.Plugin.Misc.FruitBankPlugin.Helpers;
using Nop.Plugin.Misc.FruitBankPlugin.Models;
using Nop.Plugin.Misc.FruitBankPlugin.Services;
using Nop.Services.Affiliates;
using Nop.Services.Catalog;
@ -37,15 +36,18 @@ using System.Collections;
using System.Reflection;
using System.Runtime.Intrinsics.Arm;
using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer;
using Nop.Plugin.Misc.FruitBankPlugin.Factories.MgBase;
using FruitBank.Common.Dtos;
using Nop.Plugin.Misc.FruitBankPlugin.Models.Orders;
namespace Nop.Plugin.Misc.FruitBankPlugin.Factories
{
public class CustomOrderModelFactory : OrderModelFactory
public class CustomOrderModelFactory : MgOrderModelFactory<OrderListModelExtended, OrderModelExtended>
{
private FruitBankDbContext _ctx;
private readonly IOrderMeasurementService _orderMeasurementService;
private readonly IGenericAttributeService _genericAttributeService;
#region Ctor
public CustomOrderModelFactory(
FruitBankDbContext ctx,
IOrderMeasurementService orderMeasurementService,
@ -139,40 +141,17 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Factories
orderSettings,
shippingSettings,
urlRecordService,
taxSettings
taxSettings,
genericAttributeService
)
{
_ctx = ctx;
_orderMeasurementService = orderMeasurementService;
_genericAttributeService = genericAttributeService;
}
#endregion Ctor
public override async Task<OrderSearchModel> PrepareOrderSearchModelAsync(OrderSearchModel searchModel)
{
// let base prepare default model first
var baseModel = await base.PrepareOrderSearchModelAsync(searchModel);
//foreach (var order in baseModel.order)
// create derived/extended instance
//var extended = new OrderSearchModelExtended();
// copy all public instance properties from baseModel to extended
//CopyModelHelper.CopyPublicProperties(baseModel, extended);
// try to obtain NeedsMeasurement from the incoming searchModel (if it's extended)
//bool? needsMeasurement = null;
//var prop = searchModel?.GetType().GetProperty("NeedsMeasurement", BindingFlags.Public | BindingFlags.Instance);
//if (prop != null && prop.PropertyType == typeof(bool?))
//{
// needsMeasurement = (bool?)prop.GetValue(searchModel);
//}
//extended.NeedsMeasurement = needsMeasurement;
// return the extended object (it's assignable to OrderSearchModel)
//return extended;
return baseModel;
}
@ -181,18 +160,14 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Factories
public async Task<OrderListModelExtended> PrepareOrderListModelExtendedAsync(OrderSearchModel searchModel)
{
var orderListModel = await PrepareOrderListModelAsync(searchModel);
var extendedRows = new List<OrderModelExtended>(orderListModel.RecordsFiltered);
Dictionary<int, OrderDto> orderDtosById = null;
var orderDtosById = await _ctx.OrderDtos.GetAllByIds(orderListModel.Data.Select(x => x.Id)).ToDictionaryAsync(k => k.Id, v => v);
foreach (var orderModel in orderListModel.Data)
var orderListModelExtended = await base.PrepareOrderListModelExtendedAsync(searchModel, async (orderListModel, orderModelExtended) =>
{
var orderDto = orderDtosById[orderModel.Id];
var orderModelExtended = new OrderModelExtended();
PropertyHelper.CopyPublicValueTypeProperties(orderModel, orderModelExtended);
orderDtosById ??= await _ctx.OrderDtos.GetAllByIds(orderListModel.Data.Select(x => x.Id)).ToDictionaryAsync(k => k.Id, v => v);
var orderDto = orderDtosById[orderModelExtended.Id];
orderModelExtended.IsMeasured = orderDto.IsMeasured;
orderModelExtended.IsMeasurable = orderDto.IsMeasurable;
orderModelExtended.DateOfReceipt = orderDto.DateOfReceipt;
@ -200,13 +175,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Factories
//orderModelExtended.DateOfReceipt = await GetPickupDateTimeAsync(orderModel);
Console.WriteLine(orderModelExtended.Id);
extendedRows.Add(orderModelExtended);
}
orderListModel.Data = null;
var orderListModelExtended = orderListModel.ToJson().JsonTo<OrderListModelExtended>();
orderListModelExtended.Data = extendedRows;
});
return orderListModelExtended;
}
@ -232,7 +201,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Factories
var fullOrder = await _orderService.GetOrderByIdAsync(order.Id);
if (fullOrder != null)
{
dateTime = await _genericAttributeService.GetAttributeAsync<DateTime>(fullOrder, nameof(IOrderDto.DateOfReceipt));
dateTime = await GenericAttributeService.GetAttributeAsync<DateTime>(fullOrder, nameof(IOrderDto.DateOfReceipt));
if(dateTime == DateTime.MinValue || !dateTime.HasValue)
{
dateTime = null;

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,170 @@
using AyCode.Core.Extensions;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.Routing;
using Nop.Core;
using Nop.Core.Domain.Catalog;
using Nop.Core.Domain.Common;
using Nop.Core.Domain.Directory;
using Nop.Core.Domain.Orders;
using Nop.Core.Domain.Shipping;
using Nop.Core.Domain.Tax;
using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer;
using Nop.Plugin.Misc.FruitBankPlugin.Models.Orders;
using Nop.Plugin.Misc.FruitBankPlugin.Services;
using Nop.Services.Affiliates;
using Nop.Services.Catalog;
using Nop.Services.Common;
using Nop.Services.Configuration;
using Nop.Services.Customers;
using Nop.Services.Directory;
using Nop.Services.Discounts;
using Nop.Services.Helpers;
using Nop.Services.Localization;
using Nop.Services.Media;
using Nop.Services.Orders;
using Nop.Services.Payments;
using Nop.Services.Security;
using Nop.Services.Seo;
using Nop.Services.Shipping;
using Nop.Services.Stores;
using Nop.Services.Tax;
using Nop.Services.Vendors;
using Nop.Web.Areas.Admin.Factories;
using Nop.Web.Areas.Admin.Models.Orders;
namespace Nop.Plugin.Misc.FruitBankPlugin.Factories.MgBase;
public class MgOrderModelFactory<TOrderListModelExt, TOrderModelExt> : OrderModelFactory
where TOrderListModelExt:OrderListModelExtended where TOrderModelExt: OrderModelExtended
{
protected IGenericAttributeService GenericAttributeService;
#region Ctor
public MgOrderModelFactory(
AddressSettings addressSettings,
CatalogSettings catalogSettings,
CurrencySettings currencySettings,
IActionContextAccessor actionContextAccessor,
IAddressModelFactory addressModelFactory,
IAddressService addressService,
IAffiliateService affiliateService,
IBaseAdminModelFactory baseAdminModelFactory,
ICountryService countryService,
ICurrencyService currencyService,
ICustomerService customerService,
IDateTimeHelper dateTimeHelper,
IDiscountService discountService,
IDownloadService downloadService,
IEncryptionService encryptionService,
IGiftCardService giftCardService,
ILocalizationService localizationService,
IMeasureService measureService,
IOrderProcessingService orderProcessingService,
IOrderReportService orderReportService,
IOrderService orderService,
IPaymentPluginManager paymentPluginManager,
IPaymentService paymentService,
IPictureService pictureService,
IPriceCalculationService priceCalculationService,
IPriceFormatter priceFormatter,
IProductAttributeService productAttributeService,
IProductService productService,
IReturnRequestService returnRequestService,
IRewardPointService rewardPointService,
ISettingService settingService,
IShipmentService shipmentService,
IShippingService shippingService,
IStateProvinceService stateProvinceService,
IStoreService storeService,
ITaxService taxService,
IUrlHelperFactory urlHelperFactory,
IVendorService vendorService,
IWorkContext workContext,
MeasureSettings measureSettings,
NopHttpClient nopHttpClient,
OrderSettings orderSettings,
ShippingSettings shippingSettings,
IUrlRecordService urlRecordService,
TaxSettings taxSettings,
IGenericAttributeService genericAttributeService)
: base(addressSettings,
catalogSettings,
currencySettings,
actionContextAccessor,
addressModelFactory,
addressService,
affiliateService,
baseAdminModelFactory,
countryService,
currencyService,
customerService,
dateTimeHelper,
discountService,
downloadService,
encryptionService,
giftCardService,
localizationService,
measureService,
orderProcessingService,
orderReportService,
orderService,
paymentPluginManager,
paymentService,
pictureService,
priceCalculationService,
priceFormatter,
productAttributeService,
productService,
returnRequestService,
rewardPointService,
settingService,
shipmentService,
shippingService,
stateProvinceService,
storeService,
taxService,
urlHelperFactory,
vendorService,
workContext,
measureSettings,
nopHttpClient,
orderSettings,
shippingSettings,
urlRecordService,
taxSettings
)
{
GenericAttributeService = genericAttributeService;
}
#endregion Cotr
public override Task<OrderSearchModel> PrepareOrderSearchModelAsync(OrderSearchModel searchModel)
=> base.PrepareOrderSearchModelAsync(searchModel);
public override Task<OrderListModel> PrepareOrderListModelAsync(OrderSearchModel searchModel)
=> base.PrepareOrderListModelAsync(searchModel);
public virtual async Task<TOrderListModelExt> PrepareOrderListModelExtendedAsync(OrderSearchModel searchModel, Func<OrderListModel, TOrderModelExt, Task> dataItemCopiedCallback)
{
var orderListModel = await PrepareOrderListModelAsync(searchModel);
var extendedRows = new List<TOrderModelExt>(orderListModel.RecordsFiltered);
foreach (var orderModel in orderListModel.Data.ToList())
{
var orderModelExtended = Activator.CreateInstance<TOrderModelExt>();
PropertyHelper.CopyPublicValueTypeProperties(orderModel, orderModelExtended);
extendedRows.Add(orderModelExtended);
if (dataItemCopiedCallback == null) continue;
await dataItemCopiedCallback.Invoke(orderListModel, orderModelExtended);
}
orderListModel.Data = null;
var orderListModelExtended = orderListModel.ToJson().JsonTo<TOrderListModelExt>();
orderListModelExtended.Data = extendedRows;
return orderListModelExtended;
}
}

View File

@ -0,0 +1,164 @@
using AyCode.Core.Extensions;
using Microsoft.AspNetCore.Mvc.Infrastructure;
using Microsoft.AspNetCore.Mvc.Routing;
using Nop.Core;
using Nop.Core.Domain.Catalog;
using Nop.Core.Domain.Common;
using Nop.Core.Domain.Directory;
using Nop.Core.Domain.Orders;
using Nop.Core.Domain.Shipping;
using Nop.Core.Domain.Tax;
using Nop.Core.Domain.Vendors;
using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer;
using Nop.Plugin.Misc.FruitBankPlugin.Models.Orders;
using Nop.Plugin.Misc.FruitBankPlugin.Models.Products;
using Nop.Plugin.Misc.FruitBankPlugin.Services;
using Nop.Services.Affiliates;
using Nop.Services.Catalog;
using Nop.Services.Common;
using Nop.Services.Configuration;
using Nop.Services.Customers;
using Nop.Services.Directory;
using Nop.Services.Discounts;
using Nop.Services.Helpers;
using Nop.Services.Localization;
using Nop.Services.Media;
using Nop.Services.Orders;
using Nop.Services.Payments;
using Nop.Services.Security;
using Nop.Services.Seo;
using Nop.Services.Shipping;
using Nop.Services.Stores;
using Nop.Services.Tax;
using Nop.Services.Vendors;
using Nop.Web.Areas.Admin.Factories;
using Nop.Web.Areas.Admin.Models.Catalog;
using Nop.Web.Areas.Admin.Models.Orders;
using Nop.Web.Framework.Factories;
namespace Nop.Plugin.Misc.FruitBankPlugin.Factories.MgBase;
public class MgProductModelFactory<TProductListModelExt, TProductModelExt> : ProductModelFactory
where TProductListModelExt : ProductListModelExtended where TProductModelExt : ProductModelExtended
{
protected IGenericAttributeService GenericAttributeService;
#region Ctor
public MgProductModelFactory(
CatalogSettings catalogSettings,
CurrencySettings currencySettings,
IAddressService addressService,
IBaseAdminModelFactory baseAdminModelFactory,
ICategoryService categoryService,
ICurrencyService currencyService,
ICustomerService customerService,
IDateTimeHelper dateTimeHelper,
IDiscountService discountService,
IDiscountSupportedModelFactory discountSupportedModelFactory,
ILocalizationService localizationService,
ILocalizedModelFactory localizedModelFactory,
IManufacturerService manufacturerService,
IMeasureService measureService,
IOrderService orderService,
IPictureService pictureService,
IPriceFormatter priceFormatter,
IProductAttributeFormatter productAttributeFormatter,
IProductAttributeParser productAttributeParser,
IProductAttributeService productAttributeService,
IProductService productService,
IProductTagService productTagService,
IProductTemplateService productTemplateService,
ISettingModelFactory settingModelFactory,
ISettingService settingService,
IShipmentService shipmentService,
IShippingService shippingService,
IShoppingCartService shoppingCartService,
ISpecificationAttributeService specificationAttributeService,
IStoreMappingSupportedModelFactory storeMappingSupportedModelFactory,
IStoreContext storeContext,
IStoreService storeService,
IUrlRecordService urlRecordService,
IVideoService videoService,
IWorkContext workContext,
MeasureSettings measureSettings,
NopHttpClient nopHttpClient,
TaxSettings taxSettings,
VendorSettings vendorSettings,
IGenericAttributeService genericAttributeService)
: base(
catalogSettings,
currencySettings,
addressService,
baseAdminModelFactory,
categoryService,
currencyService,
customerService,
dateTimeHelper,
discountService,
discountSupportedModelFactory,
localizationService,
localizedModelFactory,
manufacturerService,
measureService,
orderService,
pictureService,
priceFormatter,
productAttributeFormatter,
productAttributeParser,
productAttributeService,
productService,
productTagService,
productTemplateService,
settingModelFactory,
settingService,
shipmentService,
shippingService,
shoppingCartService,
specificationAttributeService,
storeMappingSupportedModelFactory,
storeContext,
storeService,
urlRecordService,
videoService,
workContext,
measureSettings,
nopHttpClient,
taxSettings,
vendorSettings)
{
GenericAttributeService = genericAttributeService;
}
#endregion Cotr
public override Task<ProductSearchModel> PrepareProductSearchModelAsync(ProductSearchModel searchModel)
=> base.PrepareProductSearchModelAsync(searchModel);
public override Task<ProductListModel> PrepareProductListModelAsync(ProductSearchModel searchModel)
=> base.PrepareProductListModelAsync(searchModel);
public virtual async Task<TProductListModelExt> PrepareProductListModelExtendedAsync(ProductSearchModel searchModel, Func<ProductListModel, TProductModelExt, Task> dataItemCopiedCallback)
{
var productListModel = await PrepareProductListModelAsync(searchModel);
var extendedRows = new List<TProductModelExt>(productListModel.RecordsFiltered);
foreach (var productModel in productListModel.Data.ToList())
{
var productModelExtended = Activator.CreateInstance<TProductModelExt>();
PropertyHelper.CopyPublicValueTypeProperties(productModel, productModelExtended);
extendedRows.Add(productModelExtended);
if (dataItemCopiedCallback == null) continue;
await dataItemCopiedCallback.Invoke(productListModel, productModelExtended);
}
productListModel.Data = null;
var productListModelExtended = productListModel.ToJson().JsonTo<TProductListModelExt>();
productListModelExtended.Data = extendedRows;
return productListModelExtended;
}
}

View File

@ -58,6 +58,7 @@ public class PluginNopStartup : INopStartup
services.AddScoped<FruitBankAttributeService>();
services.AddScoped<ProductDtoDbTable>();
services.AddScoped<OrderDtoDbTable>();
services.AddScoped<OrderItemDtoDbTable>();
services.AddScoped<OrderItemPalletDbTable>();
@ -86,6 +87,7 @@ public class PluginNopStartup : INopStartup
//services.AddScoped<OrderSearchModel, OrderSearchModelExtended>();
services.AddScoped<IOrderModelFactory, CustomOrderModelFactory>();
services.AddScoped<IProductModelFactory, CustomProductModelFactory>();
services.AddScoped<IGenericAttributeService, GenericAttributeService>();
services.AddScoped<CerebrasAPIService>();
services.AddScoped<OpenAIApiService>();

View File

@ -1,8 +0,0 @@
using Nop.Web.Framework.Models;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models;
public interface IOrderListModelExtended<T>: IPagedModel<T> where T : BaseNopModel
{
public bool? NeedsMeasurement { get; set; }
}

View File

@ -0,0 +1,7 @@
using Nop.Web.Framework.Models;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase;
public interface IMgListModelExtended<T>: IPagedModel<T> where T : BaseNopModel, IMgModelExtended
{
}

View File

@ -0,0 +1,5 @@
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase;
public interface IMgModelExtended
{
}

View File

@ -0,0 +1,5 @@
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels;
public interface IMgOrderListModelExtended<T>: IMgListModelExtended<T> where T : MgOrderModelExtended
{
}

View File

@ -0,0 +1,5 @@
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels;
public interface IMgOrderModelExtended : IMgModelExtended
{
}

View File

@ -0,0 +1,8 @@
using Nop.Web.Framework.Models;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels;
public partial record MgOrderListModelExtended<TOrderModelExt> : BasePagedListModel<TOrderModelExt>, IMgOrderListModelExtended<TOrderModelExt>
where TOrderModelExt: MgOrderModelExtended
{
}

View File

@ -0,0 +1,8 @@
using Nop.Web.Areas.Admin.Models.Orders;
using Nop.Web.Framework.Models;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels;
public partial record MgOrderModelExtended : OrderModel, IMgOrderModelExtended
{
}

View File

@ -0,0 +1,5 @@
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.ProductModels;
public interface IMgProductListModelExtended<T>: IMgListModelExtended<T> where T : MgProductModelExtended
{
}

View File

@ -0,0 +1,5 @@
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.ProductModels;
public interface IMgProductModelExtended : IMgModelExtended
{
}

View File

@ -0,0 +1,8 @@
using Nop.Web.Framework.Models;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.ProductModels;
public partial record MgProductListModelExtended<TProductModelExt> : BasePagedListModel<TProductModelExt>, IMgProductListModelExtended<TProductModelExt>
where TProductModelExt: MgProductModelExtended
{
}

View File

@ -0,0 +1,8 @@
using Nop.Web.Areas.Admin.Models.Catalog;
using Nop.Web.Framework.Models;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.ProductModels;
public partial record MgProductModelExtended : ProductModel, IMgProductModelExtended
{
}

View File

@ -1,11 +0,0 @@
using Nop.Web.Areas.Admin.Models.Orders;
using Nop.Web.Framework.Models;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models
{
public partial record OrderListModelExtended : BasePagedListModel<OrderModelExtended>, IOrderListModelExtended<OrderModelExtended>
{
public bool? NeedsMeasurement { get; set; }
}
}

View File

@ -1,11 +0,0 @@
using Nop.Web.Areas.Admin.Models.Orders;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models
{
public partial record OrderModelExtended : OrderModel
{
public bool IsMeasurable { get; set; }
public DateTime? DateOfReceipt { get; set; }
}
}

View File

@ -1,10 +0,0 @@
using Nop.Web.Areas.Admin.Models.Orders;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models
{
public partial record OrderSearchModelExtended : OrderSearchModel
{
public bool? NeedsMeasurement { get; set; }
}
}

View File

@ -0,0 +1,7 @@
using Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.Orders;
public interface IOrderListModelExtended: IMgOrderListModelExtended<OrderModelExtended>
{
}

View File

@ -0,0 +1,9 @@
using FruitBank.Common.Interfaces;
using Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.Orders;
public interface IOrderModelExtended : IMgOrderModelExtended, IMeasurable, IMeasured
{
public DateTime? DateOfReceipt { get; set; }
}

View File

@ -2,7 +2,7 @@
using Nop.Web.Framework.Models;
using Nop.Web.Framework.Mvc.ModelBinding;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.Orders
{
public record OrderAttributesModel : BaseNopModel, IMeasurable
{

View File

@ -0,0 +1,10 @@
using Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels;
using Nop.Web.Areas.Admin.Models.Orders;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.Orders
{
public partial record OrderListModelExtended : MgOrderListModelExtended<OrderModelExtended>, IOrderListModelExtended
{
}
}

View File

@ -0,0 +1,12 @@
using Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.Orders
{
public partial record OrderModelExtended : MgOrderModelExtended, IOrderModelExtended
{
public bool IsMeasured { get; set; }
public bool IsMeasurable { get; set; }
public DateTime? DateOfReceipt { get; set; }
}
}

View File

@ -4,7 +4,7 @@ using Nop.Web.Framework.Mvc.ModelBinding;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models
{
public record ProductAttributesModel : BaseNopModel, IMeasurable, IMeasuringWeights, ITare
public record ProductAttributesModel : BaseNopModel, IMeasurable, IMeasuringWeights, ITare, IIncomingQuantity
{
public int ProductId { get; set; }
@ -18,7 +18,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Models
public double GrossWeight { get; set; }
[NopResourceDisplayName("Plugins.YourCompany.ProductAttributes.Fields.IncomingQuantity")]
public int? IncomingQuantity { get; set; }
public int IncomingQuantity { get; set; }
[NopResourceDisplayName("Plugins.YourCompany.ProductAttributes.Fields.Tare")]
public double Tare { get; set; }

View File

@ -0,0 +1,9 @@

using Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.ProductModels;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.Products;
public interface IProductListModelExtended: IMgProductListModelExtended<ProductModelExtended>
{
}

View File

@ -0,0 +1,9 @@
using FruitBank.Common.Interfaces;
using Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels;
using Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.ProductModels;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.Products;
public interface IProductModelExtended : IMgProductModelExtended, IMeasurable, ITare, IMeasuringNetWeight, IIncomingQuantity
{
}

View File

@ -0,0 +1,11 @@
using Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels;
using Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.ProductModels;
using Nop.Web.Areas.Admin.Models.Orders;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.Products
{
public partial record ProductListModelExtended : MgProductListModelExtended<ProductModelExtended>, IProductListModelExtended
{
}
}

View File

@ -0,0 +1,15 @@
using Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels;
using Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.ProductModels;
namespace Nop.Plugin.Misc.FruitBankPlugin.Models.Products
{
public partial record ProductModelExtended : MgProductModelExtended, IProductModelExtended
{
public bool IsMeasurable { get; set; }
public double Tare { get; set; }
public double NetWeight { get; set; }
public int IncomingQuantity { get; set; }
}
}

View File

@ -3,7 +3,7 @@ using FruitBank.Common.Interfaces;
using Nop.Core;
using Nop.Core.Domain.Catalog;
using Nop.Core.Domain.Orders;
using Nop.Plugin.Misc.FruitBankPlugin.Models;
using Nop.Plugin.Misc.FruitBankPlugin.Models.Orders;
using Nop.Services.Catalog;
using Nop.Services.Common;
using Nop.Services.Events;
@ -114,7 +114,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Services
var store = await _storeContext.GetCurrentStoreAsync();
// itt adjuk hozzá a GenericAttribute flag-et az orderhez
await _genericAttributeService.SaveAttributeAsync(order,
nameof(OrderModelExtended.IsMeasurable), true, store.Id);
nameof(IMeasurable.IsMeasurable), true, store.Id);
// status pending
// paymentstatus pending
}

View File

@ -1,5 +1,6 @@
using Nop.Core.Domain.Orders;
using Nop.Plugin.Misc.FruitBankPlugin.Models;
using FruitBank.Common.Interfaces;
using Nop.Core.Domain.Orders;
using Nop.Plugin.Misc.FruitBankPlugin.Models.Orders;
using Nop.Services.Common;
namespace Nop.Plugin.Misc.FruitBankPlugin.Services
@ -24,7 +25,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Services
return false;
return await _genericAttributeService.GetAttributeAsync<bool>(
order, nameof(OrderModelExtended.IsMeasurable), order.StoreId);
order, nameof(IMeasurable.IsMeasurable), order.StoreId);
}
}
}

View File

@ -1,4 +1,5 @@
@model Nop.Plugin.Misc.FruitBankPlugin.Models.OrderAttributesModel
@using Nop.Plugin.Misc.FruitBankPlugin.Models.Orders
@model OrderAttributesModel
<div class="card card-default">
<div class="card-header">