diff --git a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderController.cs b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderController.cs index dfb3dd9..7a5a6eb 100644 --- a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderController.cs +++ b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomOrderController.cs @@ -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."); diff --git a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomProductController.cs b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomProductController.cs index 1fc5d10..b98e41f 100644 --- a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomProductController.cs +++ b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Controllers/CustomProductController.cs @@ -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 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 ProductList(ProductSearchModel searchModel) { //prepare model - var model = await _productModelFactory.PrepareProductListModelAsync(searchModel); + var model = await _productModelFactory.PrepareProductListModelExtendedAsync(searchModel); return Json(model); } diff --git a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/Order/List.cshtml b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/Order/List.cshtml index 0540362..a518030 100644 --- a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/Order/List.cshtml +++ b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/Order/List.cshtml @@ -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 @@ -11,669 +12,680 @@ @using static Nop.Services.Common.NopLinksDefaults @{ - //page title - ViewBag.PageTitle = T("Admin.Orders").Text; - //active menu item (system name) - NopHtml.SetActiveMenuItemSystemName("Orders"); + //page title + ViewBag.PageTitle = T("Admin.Orders").Text; + //active menu item (system name) + NopHtml.SetActiveMenuItemSystemName("Orders"); } @{ - const string hideSearchBlockAttributeName = "OrdersPage.HideSearchBlock"; - var hideSearchBlock = await genericAttributeService.GetAttributeAsync(await workContext.GetCurrentCustomerAsync(), hideSearchBlockAttributeName); + const string hideSearchBlockAttributeName = "OrdersPage.HideSearchBlock"; + var hideSearchBlock = await genericAttributeService.GetAttributeAsync(await workContext.GetCurrentCustomerAsync(), hideSearchBlockAttributeName); } @if (Model.LicenseCheckModel.BlockPages != true) { -
-
-

- @T("Admin.Orders") -

-
-
- - - -
- -
- - - -
- @await Component.InvokeAsync(typeof(AdminWidgetViewComponent), new { widgetZone = AdminWidgetZones.OrderListButtons, additionalData = Model }) -
-
-
-
-
-
- +
+
-
- -
- +
- @{ - var gridModel = new DataTablesModel - { - Name = "orders-grid", - UrlRead = new DataUrl("OrderList", "CustomOrder", null), - SearchButtonId = "search-orders", - Length = Model.PageSize, - LengthMenu = Model.AvailablePageSizes, - FooterCallback = !Model.IsLoggedInAsVendor ? "ordersfootercallback" : null, - FooterColumns = !Model.IsLoggedInAsVendor ? 10 : 0, - Filters = new List - { - new FilterParameter(nameof(Model.StartDate), typeof(DateTime?)), - new FilterParameter(nameof(Model.EndDate), typeof(DateTime?)), - new FilterParameter(nameof(Model.OrderStatusIds)), - new FilterParameter(nameof(Model.PaymentStatusIds)), - new FilterParameter(nameof(Model.ShippingStatusIds)), - new FilterParameter(nameof(Model.StoreId)), - new FilterParameter(nameof(Model.VendorId)), - new FilterParameter(nameof(Model.WarehouseId)), - new FilterParameter(nameof(Model.BillingEmail)), - new FilterParameter(nameof(Model.BillingPhone)), - new FilterParameter(nameof(Model.BillingLastName)), - new FilterParameter(nameof(Model.BillingCountryId)), - new FilterParameter(nameof(Model.PaymentMethodSystemName)), - new FilterParameter(nameof(Model.ProductId)), - new FilterParameter(nameof(Model.OrderNotes)) - } - }; - gridModel.ColumnCollection = new List - { - new ColumnProperty(nameof(OrderModel.Id)) - { - IsMasterCheckBox = true, - Render = new RenderCheckBox("checkbox_orders"), - ClassName = NopColumnClassDefaults.CenterAll, - Width = "50" - }, - new ColumnProperty(nameof(OrderModel.CustomOrderNumber)) - { - Title = T("Admin.Orders.Fields.CustomOrderNumber").Text, - Width = "80" - } - }; - gridModel.ColumnCollection.Add(new ColumnProperty(nameof(OrderModelExtended.IsMeasurable)) - { - Title = T("Admin.Orders.Fields.ToBeMeasured").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"), - ClassName = NopColumnClassDefaults.CenterAll - }); +
+ - //a vendor does not have access to this functionality - if (!Model.IsLoggedInAsVendor) - { - gridModel.ColumnCollection.Add(new ColumnProperty(nameof(OrderModel.OrderStatus)) - { - Title = T("Admin.Orders.Fields.OrderStatus").Text, - Width = "100", - Render = new RenderCustom("renderColumnOrderStatus") - }); - } - gridModel.ColumnCollection.Add(new ColumnProperty(nameof(OrderModel.PaymentStatus)) - { - Title = T("Admin.Orders.Fields.PaymentStatus").Text, - Width = "150" - }); - //a vendor does not have access to this functionality - if (!Model.IsLoggedInAsVendor) - { - gridModel.ColumnCollection.Add(new ColumnProperty(nameof(OrderModel.ShippingStatus)) - { - Title = T("Admin.Orders.Fields.ShippingStatus").Text, - Width = "150" - }); - } - gridModel.ColumnCollection.Add(new ColumnProperty(nameof(OrderModel.CustomerEmail)) - { - Title = T("Admin.Orders.Fields.Customer").Text, - Render = new RenderCustom("renderColumnCustomer") - }); - gridModel.ColumnCollection.Add(new ColumnProperty(nameof(OrderModel.StoreName)) - { - Title = T("Admin.Orders.Fields.Store").Text, - Width = "100", - Visible = (await storeService.GetAllStoresAsync()).Count > 1 - }); - gridModel.ColumnCollection.Add(new ColumnProperty(nameof(OrderModel.CreatedOn)) - { - Title = T("Admin.Orders.Fields.CreatedOn").Text, - Width = "120", - Render = new RenderDate() - }); - //a vendor does not have access to this functionality - if (!Model.IsLoggedInAsVendor) - { - gridModel.ColumnCollection.Add(new ColumnProperty(nameof(OrderModel.OrderTotal)) - { - Title = T("Admin.Orders.Fields.OrderTotal").Text, - Width = "100", - }); - } - gridModel.ColumnCollection.Add(new ColumnProperty(nameof(OrderModel.Id)) - { - Title = T("Admin.Common.View").Text, - Width = "50", - ClassName = NopColumnClassDefaults.Button, - Render = new RenderButtonView(new DataUrl("~/Admin/Order/Edit")) - }); - var orderSummaryColumnNumber = 8; - } - @await Html.PartialAsync("Table", gridModel) + @{ + var gridModel = new DataTablesModel + { + Name = "orders-grid", + UrlRead = new DataUrl("OrderList", "CustomOrder", null), + SearchButtonId = "search-orders", + Length = Model.PageSize, + LengthMenu = Model.AvailablePageSizes, + FooterCallback = !Model.IsLoggedInAsVendor ? "ordersfootercallback" : null, + FooterColumns = !Model.IsLoggedInAsVendor ? 10 : 0, + Filters = new List + { + new FilterParameter(nameof(Model.StartDate), typeof(DateTime?)), + new FilterParameter(nameof(Model.EndDate), typeof(DateTime?)), + new FilterParameter(nameof(Model.OrderStatusIds)), + new FilterParameter(nameof(Model.PaymentStatusIds)), + new FilterParameter(nameof(Model.ShippingStatusIds)), + new FilterParameter(nameof(Model.StoreId)), + new FilterParameter(nameof(Model.VendorId)), + new FilterParameter(nameof(Model.WarehouseId)), + new FilterParameter(nameof(Model.BillingEmail)), + new FilterParameter(nameof(Model.BillingPhone)), + new FilterParameter(nameof(Model.BillingLastName)), + new FilterParameter(nameof(Model.BillingCountryId)), + new FilterParameter(nameof(Model.PaymentMethodSystemName)), + new FilterParameter(nameof(Model.ProductId)), + new FilterParameter(nameof(Model.OrderNotes)) + } + }; + gridModel.ColumnCollection = new List + { + new ColumnProperty(nameof(OrderModel.Id)) + { + IsMasterCheckBox = true, + Render = new RenderCheckBox("checkbox_orders"), + ClassName = NopColumnClassDefaults.CenterAll, + Width = "50" + }, + new ColumnProperty(nameof(OrderModel.CustomOrderNumber)) + { + Title = T("Admin.Orders.Fields.CustomOrderNumber").Text, + Width = "80" + } + }; + gridModel.ColumnCollection.Add(new ColumnProperty(nameof(OrderModelExtended.IsMeasurable)) + { + Title = T("Admin.Orders.Fields.ToBeMeasured").Text, + Width = "100", + 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 RenderDate(), + ClassName = NopColumnClassDefaults.CenterAll + }); - -
-
-
-
-
-
-
+ return `${formattedDate}`; + } + + $(function() { + $("#@Html.IdFor(model => model.GoDirectlyToCustomOrderNumber)").keydown( + function(event) { + if (event.keyCode === 13) { + $("#go-to-order-by-number").trigger("click"); + return false; + } + }); + }); + function ordersfootercallback(tfoot, data, start, end, display) { + //update order totals summary + var postData = { + StartDate: $('#@Html.IdFor(model => model.StartDate)').val(), + EndDate: $('#@Html.IdFor(model => model.EndDate)').val(), + OrderStatusIds: $('#@Html.IdFor(model => model.OrderStatusIds)').val(), + PaymentStatusIds: $('#@Html.IdFor(model => model.PaymentStatusIds)').val(), + ShippingStatusIds: $('#@Html.IdFor(model => model.ShippingStatusIds)').val(), + StoreId: $('#@Html.IdFor(model => model.StoreId)').val(), + VendorId: $('#@Html.IdFor(model => model.VendorId)').val(), + WarehouseId: $('#@Html.IdFor(model => model.WarehouseId)').val(), + BillingEmail: $('#@Html.IdFor(model => model.BillingEmail)').val(), + BillingPhone: $('#@Html.IdFor(model => model.BillingPhone)').val(), + BillingLastName: $('#@Html.IdFor(model => model.BillingLastName)').val(), + BillingCountryId: $('#@Html.IdFor(model => model.BillingCountryId)').val(), + PaymentMethodSystemName: $('#@Html.IdFor(model => model.PaymentMethodSystemName)').val(), + ProductId: $('#@Html.IdFor(model => model.ProductId)').val(), + OrderNotes: $('#@Html.IdFor(model => model.OrderNotes)').val() + }; + addAntiForgeryToken(postData); + + $.ajax({ + cache: false, + type: "POST", + url: "@(Url.Action("ReportAggregates", "Order"))", + data: postData, + success: function (data, textStatus, jqXHR) { + if (data) { + for (var key in data) { + var reportSummary = '
@T("Admin.Orders.Report.Summary").Text
' + + '
@T("Admin.Orders.Report.Profit").Text ' + data['AggregatorProfit'] +'
' + + '
@T("Admin.Orders.Report.Shipping").Text ' + data['AggregatorShipping'] + '
' + + '
@T("Admin.Orders.Report.Tax").Text ' + data['AggregatorTax'] + '
' + + '
@T("Admin.Orders.Report.Total").Text ' + data['AggregatorTotal'] + '
' + var orderTotalsColumn = $('#orders-grid').DataTable().column(@(orderSummaryColumnNumber)); + $(orderTotalsColumn.footer()).html(reportSummary); + } + } + } + }); + } + + + + + + + + } @*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*@
- +
@*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*@
- +
@*Print packaging slips 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*@
- +
@*import orders form*@ diff --git a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/Product/List.cshtml b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/Product/List.cshtml index cfa08e8..fd5fed1 100644 --- a/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/Product/List.cshtml +++ b/Nop.Plugin.Misc.AIPlugin/Areas/Admin/Views/Product/List.cshtml @@ -1,466 +1,488 @@ @model ProductSearchModel @using Nop.Core.Domain.Catalog; +@using Nop.Plugin.Misc.FruitBankPlugin.Models.Products @{ - //page title - ViewBag.PageTitle = T("Admin.Catalog.Products").Text; - //active menu item (system name) - NopHtml.SetActiveMenuItemSystemName("Products"); + //page title + ViewBag.PageTitle = T("Admin.Catalog.Products").Text; + //active menu item (system name) + NopHtml.SetActiveMenuItemSystemName("Products"); } @{ - const string hideSearchBlockAttributeName = "ProductListPage.HideSearchBlock"; - var hideSearchBlock = await genericAttributeService.GetAttributeAsync(await workContext.GetCurrentCustomerAsync(), hideSearchBlockAttributeName); + const string hideSearchBlockAttributeName = "ProductListPage.HideSearchBlock"; + var hideSearchBlock = await genericAttributeService.GetAttributeAsync(await workContext.GetCurrentCustomerAsync(), hideSearchBlockAttributeName); } @if (Model.LicenseCheckModel.BlockPages != true) { -
-
-

- Fruitbank @T("Admin.Catalog.Products") -

-
- - - @T("Admin.Common.AddNew") - - - - @T("Admin.Catalog.Products.BulkEdit") - - -
- - - -
- @if (!Model.IsLoggedInAsVendor || Model.AllowVendorsToImportProducts) - { - //a vendor cannot import products - - } - - - @await Component.InvokeAsync(typeof(AdminWidgetViewComponent), new { widgetZone = AdminWidgetZones.ProductListButtons, additionalData = Model }) -
-
+ +
+

+ Fruitbank @T("Admin.Catalog.Products") +

+
+ + + @T("Admin.Common.AddNew") + + + + @T("Admin.Catalog.Products.BulkEdit") + + +
+ + +
-
+ + + + + + +
+ @if (!Model.IsLoggedInAsVendor || Model.AllowVendorsToImportProducts) + { + //a vendor cannot import products + + } + + + @await Component.InvokeAsync(typeof(AdminWidgetViewComponent), new { widgetZone = AdminWidgetZones.ProductListButtons, additionalData = Model }) + + -
-
- +
+
+
+
+ - - - -
-
-
-
-
- - + + + + + + + + + + } - @*import products form*@ - +@*import products 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*@ -
- -
+@*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*@ +
+ +
- @*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*@ -
- -
+@*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*@ +
+ +
- + \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Components/OrderAttributesViewComponent.cs b/Nop.Plugin.Misc.AIPlugin/Components/OrderAttributesViewComponent.cs index 6cc2ddc..18733c2 100644 --- a/Nop.Plugin.Misc.AIPlugin/Components/OrderAttributesViewComponent.cs +++ b/Nop.Plugin.Misc.AIPlugin/Components/OrderAttributesViewComponent.cs @@ -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(model.OrderId, nameof(IOrderDto.DateOfReceipt)); - var orderMeasurableAttributeValue = await _fruitBankAttributeService.GetGenericAttributeValueAsync(model.OrderId, nameof(OrderModelExtended.IsMeasurable)); + var orderMeasurableAttributeValue = await _fruitBankAttributeService.GetGenericAttributeValueAsync(model.OrderId, nameof(IMeasurable.IsMeasurable)); model.IsMeasurable = orderMeasurableAttributeValue; if(orderPickupAttributeValue.HasValue && orderPickupAttributeValue.Value != DateTime.MinValue) diff --git a/Nop.Plugin.Misc.AIPlugin/Components/ProductAttributesViewComponent.cs b/Nop.Plugin.Misc.AIPlugin/Components/ProductAttributesViewComponent.cs index 6425006..2373507 100644 --- a/Nop.Plugin.Misc.AIPlugin/Components/ProductAttributesViewComponent.cs +++ b/Nop.Plugin.Misc.AIPlugin/Components/ProductAttributesViewComponent.cs @@ -42,7 +42,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Components } model.Tare = await _fruitBankAttributeService.GetGenericAttributeValueAsync(model.ProductId, nameof(ITare.Tare)); - model.IncomingQuantity = await _fruitBankAttributeService.GetGenericAttributeValueAsync(model.ProductId, "IncomingQuantity"); + model.IncomingQuantity = await _fruitBankAttributeService.GetGenericAttributeValueAsync(model.ProductId, nameof(IIncomingQuantity.IncomingQuantity)); } return View("~/Plugins/Misc.FruitBankPlugin/Views/ProductAttributes.cshtml", model); diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs index 4366d46..ac7e381 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/FruitBankDbContext.cs @@ -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 productRepository, IRepository customerRepository, @@ -84,6 +86,8 @@ public class FruitBankDbContext : MgDbContextBase, Partners = partnerDbTable; Products = productRepository; + ProductDtos = productDtoDbTable; + OrderDtos = orderDtoDbTable; OrderItemDtos = orderItemDtoDbTable; OrderItemPallets = orderItemPalletDbTable; diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/OrderDtoDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/OrderDtoDbTable.cs index adc602b..f890da3 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/OrderDtoDbTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/OrderDtoDbTable.cs @@ -11,27 +11,6 @@ using Nop.Services.Logging; namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; -public class OrderItemDtoDbTable : MgDbTableBase -{ - public OrderItemDtoDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings, ILogger logger) - : base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings, logger) - { - } - - public IQueryable 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 GetByIdAsync(int orderItemId) => GetAll(true).Where(x => x.Id == orderItemId).FirstOrDefaultAsync(null); - - public IQueryable GetAllByOrderId(int orderId)=> GetAll(true).Where(o => o.OrderId == orderId); -} - public class OrderDtoDbTable : MgDbTableBase { public OrderDtoDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings, ILogger logger) diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/OrderItemDtoDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/OrderItemDtoDbTable.cs new file mode 100644 index 0000000..81e4d04 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/OrderItemDtoDbTable.cs @@ -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 +{ + public OrderItemDtoDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings, ILogger logger) + : base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings, logger) + { + } + + public IQueryable 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 GetByIdAsync(int orderItemId) => GetAll(true).Where(x => x.Id == orderItemId).FirstOrDefaultAsync(null); + + public IQueryable GetAllByOrderId(int orderId)=> GetAll(true).Where(o => o.OrderId == orderId); +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ProductDtoDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ProductDtoDbTable.cs new file mode 100644 index 0000000..cb3bc6e --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ProductDtoDbTable.cs @@ -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 +{ + public ProductDtoDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings, ILogger logger) + : base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings, logger) + { + } + + public IQueryable GetAll(bool loadRelations) + { + return GetAll().LoadWith(p => p.GenericAttributes); + } + + public Task GetByIdAsync(int productId) => GetAll(true).Where(x => x.Id == productId).FirstOrDefaultAsync(null); + + public IQueryable GetAllByIds(IEnumerable productIds) => GetAll(true).Where(p => productIds.Contains(p.Id)); +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDbTable.cs index b74ba46..f25eb69 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDbTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDbTable.cs @@ -25,7 +25,7 @@ public class ShippingDbTable : MgDbTableBase ? 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(); diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDocumentDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDocumentDbTable.cs index 1c45bb3..0db565c 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDocumentDbTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingDocumentDbTable.cs @@ -25,7 +25,7 @@ public class ShippingDocumentDbTable : MgDbTableBase ? 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) diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingItemDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingItemDbTable.cs index 2474eee..7c7b384 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingItemDbTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/ShippingItemDbTable.cs @@ -38,9 +38,9 @@ public class ShippingItemDbTable : MgDbTableBase .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 GetAllNotMeasured(bool loadRelations) diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/EventConsumers/FruitBankEventConsumer.cs b/Nop.Plugin.Misc.AIPlugin/Domains/EventConsumers/FruitBankEventConsumer.cs index d234afc..71e3b24 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/EventConsumers/FruitBankEventConsumer.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/EventConsumers/FruitBankEventConsumer.cs @@ -81,12 +81,12 @@ public class FruitBankEventConsumer(IHttpContextAccessor httpContextAcc, FruitBa await fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync(product.Id, nameof(ITare.Tare), tare); } - if (form.ContainsKey("IncomingQuantity")) + if (form.ContainsKey(nameof(IIncomingQuantity.IncomingQuantity))) { - var incomingQuantity = CommonHelper.To(form["IncomingQuantity"].ToString()); + var incomingQuantity = CommonHelper.To(form[nameof(IIncomingQuantity.IncomingQuantity)].ToString()); if (incomingQuantity < 0) throw new Exception($"FruitBankEventConsumer->SaveProductCustomAttributesAsync(); (incomingQuantity < 0); productId: {product.Id}; incomingQuantity: {incomingQuantity}"); - await fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync(product.Id, "IncomingQuantity", incomingQuantity); + await fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync(product.Id, nameof(IIncomingQuantity.IncomingQuantity), incomingQuantity); } } diff --git a/Nop.Plugin.Misc.AIPlugin/Factories/CustomOrderModelFactory.cs b/Nop.Plugin.Misc.AIPlugin/Factories/CustomOrderModelFactory.cs index 1cf7973..9732000 100644 --- a/Nop.Plugin.Misc.AIPlugin/Factories/CustomOrderModelFactory.cs +++ b/Nop.Plugin.Misc.AIPlugin/Factories/CustomOrderModelFactory.cs @@ -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 { 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 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 PrepareOrderListModelExtendedAsync(OrderSearchModel searchModel) { - var orderListModel = await PrepareOrderListModelAsync(searchModel); - var extendedRows = new List(orderListModel.RecordsFiltered); - - var orderDtosById = await _ctx.OrderDtos.GetAllByIds(orderListModel.Data.Select(x => x.Id)).ToDictionaryAsync(k => k.Id, v => v); + Dictionary orderDtosById = null; - 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,14 +175,8 @@ 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.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(fullOrder, nameof(IOrderDto.DateOfReceipt)); + dateTime = await GenericAttributeService.GetAttributeAsync(fullOrder, nameof(IOrderDto.DateOfReceipt)); if(dateTime == DateTime.MinValue || !dateTime.HasValue) { dateTime = null; diff --git a/Nop.Plugin.Misc.AIPlugin/Factories/CustomProductModelFactory.cs b/Nop.Plugin.Misc.AIPlugin/Factories/CustomProductModelFactory.cs new file mode 100644 index 0000000..f7d0a8e --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Factories/CustomProductModelFactory.cs @@ -0,0 +1,73 @@ +using FruitBank.Common.Dtos; +using Nop.Core; +using Nop.Core.Domain.Catalog; +using Nop.Core.Domain.Directory; +using Nop.Core.Domain.Tax; +using Nop.Core.Domain.Vendors; +using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; +using Nop.Plugin.Misc.FruitBankPlugin.Factories.MgBase; +using Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels; +using Nop.Plugin.Misc.FruitBankPlugin.Models.Orders; +using Nop.Plugin.Misc.FruitBankPlugin.Models.Products; +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.Seo; +using Nop.Services.Shipping; +using Nop.Services.Stores; +using Nop.Web.Areas.Admin.Factories; +using Nop.Web.Areas.Admin.Models.Catalog; +using Nop.Web.Framework.Factories; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Factories; + +public class CustomProductModelFactory : MgProductModelFactory +{ + private FruitBankDbContext _ctx; + + public CustomProductModelFactory(FruitBankDbContext ctx,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) + { + _ctx = ctx; + } + + public override async Task PrepareProductSearchModelAsync(ProductSearchModel searchModel) + { + var baseModel = await base.PrepareProductSearchModelAsync(searchModel); + return baseModel; + } + + public override async Task PrepareProductListModelAsync(ProductSearchModel searchModel) + => await base.PrepareProductListModelAsync(searchModel); + + public async Task PrepareProductListModelExtendedAsync(ProductSearchModel searchModel) + { + Dictionary productDtosById = null; + + var productListModelExtended = await base.PrepareProductListModelExtendedAsync(searchModel, async (productListModel, productModelExtended) => + { + //Console.WriteLine(productModelExtended.Id); + //productModelExtended.StockQuantityStr = productModelExtended.StockQuantity.ToString(); + //productModelExtended.NetWeight = 101.2d; + //return; + + productDtosById ??= await _ctx.ProductDtos.GetAllByIds(productListModel.Data.Select(x => x.Id)).ToDictionaryAsync(k => k.Id, v => v); + var productDto = productDtosById[productModelExtended.Id]; + + productModelExtended.Tare = productDto.Tare; + productModelExtended.NetWeight = productDto.NetWeight; + productModelExtended.IsMeasurable = productDto.IsMeasurable; + productModelExtended.IncomingQuantity = productDto.IncomingQuantity; + + productModelExtended.StockQuantityStr = productModelExtended.StockQuantity.ToString(); + }); + + return productListModelExtended; + } +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Factories/MgBase/MgOrderModelFactory.cs b/Nop.Plugin.Misc.AIPlugin/Factories/MgBase/MgOrderModelFactory.cs new file mode 100644 index 0000000..ac63bbf --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Factories/MgBase/MgOrderModelFactory.cs @@ -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 : 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 PrepareOrderSearchModelAsync(OrderSearchModel searchModel) + => base.PrepareOrderSearchModelAsync(searchModel); + + public override Task PrepareOrderListModelAsync(OrderSearchModel searchModel) + => base.PrepareOrderListModelAsync(searchModel); + + public virtual async Task PrepareOrderListModelExtendedAsync(OrderSearchModel searchModel, Func dataItemCopiedCallback) + { + var orderListModel = await PrepareOrderListModelAsync(searchModel); + var extendedRows = new List(orderListModel.RecordsFiltered); + + foreach (var orderModel in orderListModel.Data.ToList()) + { + var orderModelExtended = Activator.CreateInstance(); + + PropertyHelper.CopyPublicValueTypeProperties(orderModel, orderModelExtended); + extendedRows.Add(orderModelExtended); + + if (dataItemCopiedCallback == null) continue; + await dataItemCopiedCallback.Invoke(orderListModel, orderModelExtended); + } + + orderListModel.Data = null; + + var orderListModelExtended = orderListModel.ToJson().JsonTo(); + orderListModelExtended.Data = extendedRows; + + return orderListModelExtended; + } +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Factories/MgBase/MgProductModelFactory.cs b/Nop.Plugin.Misc.AIPlugin/Factories/MgBase/MgProductModelFactory.cs new file mode 100644 index 0000000..0153cf0 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Factories/MgBase/MgProductModelFactory.cs @@ -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 : 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 PrepareProductSearchModelAsync(ProductSearchModel searchModel) + => base.PrepareProductSearchModelAsync(searchModel); + + public override Task PrepareProductListModelAsync(ProductSearchModel searchModel) + => base.PrepareProductListModelAsync(searchModel); + + public virtual async Task PrepareProductListModelExtendedAsync(ProductSearchModel searchModel, Func dataItemCopiedCallback) + { + var productListModel = await PrepareProductListModelAsync(searchModel); + var extendedRows = new List(productListModel.RecordsFiltered); + + foreach (var productModel in productListModel.Data.ToList()) + { + var productModelExtended = Activator.CreateInstance(); + + PropertyHelper.CopyPublicValueTypeProperties(productModel, productModelExtended); + extendedRows.Add(productModelExtended); + + if (dataItemCopiedCallback == null) continue; + await dataItemCopiedCallback.Invoke(productListModel, productModelExtended); + } + + productListModel.Data = null; + + var productListModelExtended = productListModel.ToJson().JsonTo(); + productListModelExtended.Data = extendedRows; + + return productListModelExtended; + } +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs b/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs index e478105..9639bf0 100644 --- a/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs +++ b/Nop.Plugin.Misc.AIPlugin/Infrastructure/PluginNopStartup.cs @@ -58,6 +58,7 @@ public class PluginNopStartup : INopStartup services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); @@ -86,6 +87,7 @@ public class PluginNopStartup : INopStartup //services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/Nop.Plugin.Misc.AIPlugin/Models/IOrderListModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/IOrderListModelExtended.cs deleted file mode 100644 index 5df5da5..0000000 --- a/Nop.Plugin.Misc.AIPlugin/Models/IOrderListModelExtended.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Nop.Web.Framework.Models; - -namespace Nop.Plugin.Misc.FruitBankPlugin.Models; - -public interface IOrderListModelExtended: IPagedModel where T : BaseNopModel -{ - public bool? NeedsMeasurement { get; set; } -} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/MgBase/IMgListModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/IMgListModelExtended.cs new file mode 100644 index 0000000..4eda7d8 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/IMgListModelExtended.cs @@ -0,0 +1,7 @@ +using Nop.Web.Framework.Models; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase; + +public interface IMgListModelExtended: IPagedModel where T : BaseNopModel, IMgModelExtended +{ +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/MgBase/IMgModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/IMgModelExtended.cs new file mode 100644 index 0000000..0a4418c --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/IMgModelExtended.cs @@ -0,0 +1,5 @@ +namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase; + +public interface IMgModelExtended +{ +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/MgBase/OrderModels/IMgOrderListModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/OrderModels/IMgOrderListModelExtended.cs new file mode 100644 index 0000000..68083f5 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/OrderModels/IMgOrderListModelExtended.cs @@ -0,0 +1,5 @@ +namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels; + +public interface IMgOrderListModelExtended: IMgListModelExtended where T : MgOrderModelExtended +{ +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/MgBase/OrderModels/IMgOrderModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/OrderModels/IMgOrderModelExtended.cs new file mode 100644 index 0000000..fb9bb9b --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/OrderModels/IMgOrderModelExtended.cs @@ -0,0 +1,5 @@ +namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels; + +public interface IMgOrderModelExtended : IMgModelExtended +{ +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/MgBase/OrderModels/MgOrderListModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/OrderModels/MgOrderListModelExtended.cs new file mode 100644 index 0000000..e648648 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/OrderModels/MgOrderListModelExtended.cs @@ -0,0 +1,8 @@ +using Nop.Web.Framework.Models; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels; + +public partial record MgOrderListModelExtended : BasePagedListModel, IMgOrderListModelExtended + where TOrderModelExt: MgOrderModelExtended +{ +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/MgBase/OrderModels/MgOrderModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/OrderModels/MgOrderModelExtended.cs new file mode 100644 index 0000000..a3735b9 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/OrderModels/MgOrderModelExtended.cs @@ -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 +{ +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/MgBase/ProductModels/IMgProductListModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/ProductModels/IMgProductListModelExtended.cs new file mode 100644 index 0000000..94a2ec9 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/ProductModels/IMgProductListModelExtended.cs @@ -0,0 +1,5 @@ +namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.ProductModels; + +public interface IMgProductListModelExtended: IMgListModelExtended where T : MgProductModelExtended +{ +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/MgBase/ProductModels/IMgProductModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/ProductModels/IMgProductModelExtended.cs new file mode 100644 index 0000000..85d15f9 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/ProductModels/IMgProductModelExtended.cs @@ -0,0 +1,5 @@ +namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.ProductModels; + +public interface IMgProductModelExtended : IMgModelExtended +{ +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/MgBase/ProductModels/MgProductListModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/ProductModels/MgProductListModelExtended.cs new file mode 100644 index 0000000..c28fbda --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/ProductModels/MgProductListModelExtended.cs @@ -0,0 +1,8 @@ +using Nop.Web.Framework.Models; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.ProductModels; + +public partial record MgProductListModelExtended : BasePagedListModel, IMgProductListModelExtended + where TProductModelExt: MgProductModelExtended +{ +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/MgBase/ProductModels/MgProductModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/ProductModels/MgProductModelExtended.cs new file mode 100644 index 0000000..b0e86ef --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/MgBase/ProductModels/MgProductModelExtended.cs @@ -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 +{ +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/OrderListModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/OrderListModelExtended.cs deleted file mode 100644 index 6e6998a..0000000 --- a/Nop.Plugin.Misc.AIPlugin/Models/OrderListModelExtended.cs +++ /dev/null @@ -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, IOrderListModelExtended - { - public bool? NeedsMeasurement { get; set; } - } -} - diff --git a/Nop.Plugin.Misc.AIPlugin/Models/OrderModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/OrderModelExtended.cs deleted file mode 100644 index 8687e20..0000000 --- a/Nop.Plugin.Misc.AIPlugin/Models/OrderModelExtended.cs +++ /dev/null @@ -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; } - } -} - diff --git a/Nop.Plugin.Misc.AIPlugin/Models/OrderSearchModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/OrderSearchModelExtended.cs deleted file mode 100644 index 7d46408..0000000 --- a/Nop.Plugin.Misc.AIPlugin/Models/OrderSearchModelExtended.cs +++ /dev/null @@ -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; } - } -} - diff --git a/Nop.Plugin.Misc.AIPlugin/Models/Orders/IOrderListModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/Orders/IOrderListModelExtended.cs new file mode 100644 index 0000000..87e4bc6 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/Orders/IOrderListModelExtended.cs @@ -0,0 +1,7 @@ +using Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.OrderModels; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Models.Orders; + +public interface IOrderListModelExtended: IMgOrderListModelExtended +{ +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/Orders/IOrderModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/Orders/IOrderModelExtended.cs new file mode 100644 index 0000000..69e803f --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/Orders/IOrderModelExtended.cs @@ -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; } +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/OrderAttributesModel.cs b/Nop.Plugin.Misc.AIPlugin/Models/Orders/OrderAttributesModel.cs similarity index 90% rename from Nop.Plugin.Misc.AIPlugin/Models/OrderAttributesModel.cs rename to Nop.Plugin.Misc.AIPlugin/Models/Orders/OrderAttributesModel.cs index 080e9f6..0fec549 100644 --- a/Nop.Plugin.Misc.AIPlugin/Models/OrderAttributesModel.cs +++ b/Nop.Plugin.Misc.AIPlugin/Models/Orders/OrderAttributesModel.cs @@ -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 { diff --git a/Nop.Plugin.Misc.AIPlugin/Models/Orders/OrderListModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/Orders/OrderListModelExtended.cs new file mode 100644 index 0000000..55e74f6 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/Orders/OrderListModelExtended.cs @@ -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, IOrderListModelExtended + { + } +} + diff --git a/Nop.Plugin.Misc.AIPlugin/Models/Orders/OrderModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/Orders/OrderModelExtended.cs new file mode 100644 index 0000000..dabbceb --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/Orders/OrderModelExtended.cs @@ -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; } + } +} + diff --git a/Nop.Plugin.Misc.AIPlugin/Models/ProductAttributesModel.cs b/Nop.Plugin.Misc.AIPlugin/Models/ProductAttributesModel.cs index daca835..56726ab 100644 --- a/Nop.Plugin.Misc.AIPlugin/Models/ProductAttributesModel.cs +++ b/Nop.Plugin.Misc.AIPlugin/Models/ProductAttributesModel.cs @@ -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; } diff --git a/Nop.Plugin.Misc.AIPlugin/Models/Products/IProductListModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/Products/IProductListModelExtended.cs new file mode 100644 index 0000000..8d95665 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/Products/IProductListModelExtended.cs @@ -0,0 +1,9 @@ + + +using Nop.Plugin.Misc.FruitBankPlugin.Models.MgBase.ProductModels; + +namespace Nop.Plugin.Misc.FruitBankPlugin.Models.Products; + +public interface IProductListModelExtended: IMgProductListModelExtended +{ +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/Products/IProductModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/Products/IProductModelExtended.cs new file mode 100644 index 0000000..5ab6a82 --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/Products/IProductModelExtended.cs @@ -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 +{ +} \ No newline at end of file diff --git a/Nop.Plugin.Misc.AIPlugin/Models/Products/ProductListModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/Products/ProductListModelExtended.cs new file mode 100644 index 0000000..401a91d --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/Products/ProductListModelExtended.cs @@ -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, IProductListModelExtended + { + } +} + diff --git a/Nop.Plugin.Misc.AIPlugin/Models/Products/ProductModelExtended.cs b/Nop.Plugin.Misc.AIPlugin/Models/Products/ProductModelExtended.cs new file mode 100644 index 0000000..44ddbaa --- /dev/null +++ b/Nop.Plugin.Misc.AIPlugin/Models/Products/ProductModelExtended.cs @@ -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; } + } +} + diff --git a/Nop.Plugin.Misc.AIPlugin/Services/EventConsumer.cs b/Nop.Plugin.Misc.AIPlugin/Services/EventConsumer.cs index e2bf14a..a593d02 100644 --- a/Nop.Plugin.Misc.AIPlugin/Services/EventConsumer.cs +++ b/Nop.Plugin.Misc.AIPlugin/Services/EventConsumer.cs @@ -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 } diff --git a/Nop.Plugin.Misc.AIPlugin/Services/OrderMeasurementService.cs b/Nop.Plugin.Misc.AIPlugin/Services/OrderMeasurementService.cs index c84f94f..d5dbf86 100644 --- a/Nop.Plugin.Misc.AIPlugin/Services/OrderMeasurementService.cs +++ b/Nop.Plugin.Misc.AIPlugin/Services/OrderMeasurementService.cs @@ -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( - order, nameof(OrderModelExtended.IsMeasurable), order.StoreId); + order, nameof(IMeasurable.IsMeasurable), order.StoreId); } } } diff --git a/Nop.Plugin.Misc.AIPlugin/Views/OrderAttributes.cshtml b/Nop.Plugin.Misc.AIPlugin/Views/OrderAttributes.cshtml index 96e8e4e..9090a3d 100644 --- a/Nop.Plugin.Misc.AIPlugin/Views/OrderAttributes.cshtml +++ b/Nop.Plugin.Misc.AIPlugin/Views/OrderAttributes.cshtml @@ -1,4 +1,5 @@ -@model Nop.Plugin.Misc.FruitBankPlugin.Models.OrderAttributesModel +@using Nop.Plugin.Misc.FruitBankPlugin.Models.Orders +@model OrderAttributesModel