improvements, fixes, etc...

This commit is contained in:
Loretta 2025-10-18 08:43:36 +02:00
parent ba52be2847
commit 0035725399
10 changed files with 125 additions and 107 deletions

View File

@ -4,26 +4,17 @@ using AyCode.Utils.Extensions;
using FruitBank.Common.Entities; using FruitBank.Common.Entities;
using FruitBank.Common.Interfaces; using FruitBank.Common.Interfaces;
using FruitBank.Common.Models; using FruitBank.Common.Models;
using FruitBank.Common.Server;
using LinqToDB;
using LinqToDB.Common;
using Mango.Nop.Core.Loggers;
using Mango.Nop.Core.Repositories; using Mango.Nop.Core.Repositories;
using Nop.Core; using Nop.Core;
using Nop.Core.Caching; using Nop.Core.Caching;
using Nop.Core.ComponentModel;
using Nop.Core.Domain.Catalog; using Nop.Core.Domain.Catalog;
using Nop.Core.Domain.Customers; using Nop.Core.Domain.Customers;
using Nop.Data; using Nop.Data;
using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer.Interfaces; using Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer.Interfaces;
using Nop.Plugin.Misc.FruitBankPlugin.Services; using Nop.Plugin.Misc.FruitBankPlugin.Services;
using Nop.Services.Catalog; using Nop.Services.Catalog;
using Nop.Services.Common;
using System.Transactions;
using DevExpress.XtraExport.Helpers;
using FruitBank.Common.Dtos; using FruitBank.Common.Dtos;
using Mango.Nop.Core.Dtos; using Mango.Nop.Core.Extensions;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Nop.Core.Domain.Orders; using Nop.Core.Domain.Orders;
namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer;
@ -185,17 +176,17 @@ public class FruitBankDbContext : MgDbContextBase,
{ {
try try
{ {
Product? product = null; ProductDto? productDto = null;
var productIsMeasurable = false; var productIsMeasurable = false;
if (shippingItem.ProductId > 0) if (shippingItem.ProductId > 0)
{ {
product = await Products.GetByIdAsync(shippingItem.ProductId); productDto = await ProductDtos.GetByIdAsync(shippingItem.ProductId!.Value, true);
if (product == null) if (productDto == null)
throw new Exception($"shippingItem.ProductId > 0 && product == null; shippingItem.ProductId: {shippingItem.ProductId}"); throw new Exception($"shippingItem.ProductId > 0 && product == null; shippingItem.ProductId: {shippingItem.ProductId}");
productIsMeasurable = await _fruitBankAttributeService.IsMeasurableEntityAsync<Product>(product.Id); productIsMeasurable = productDto.IsMeasurable;
} }
shippingItem.IsMeasurable = productIsMeasurable; shippingItem.IsMeasurable = productIsMeasurable;
@ -211,7 +202,7 @@ public class FruitBankDbContext : MgDbContextBase,
var dbShippingItem = await ShippingItems.GetByIdAsync(shippingItem.Id, false); var dbShippingItem = await ShippingItems.GetByIdAsync(shippingItem.Id, false);
if (dbShippingItem == null) throw new Exception($"dbShippingItem == null; shippingItem.Id: {shippingItem.Id}"); if (dbShippingItem == null) throw new Exception($"dbShippingItem == null; shippingItem.Id: {shippingItem.Id}");
var isMeasuredPrerequisite = product != null && shippingItem.PalletsOnDocument == shippingItem.ShippingItemPallets.Count var isMeasuredPrerequisite = productDto != null && shippingItem.PalletsOnDocument == shippingItem.ShippingItemPallets.Count
&& shippingItem.ShippingItemPallets.All(x => x.IsMeasuredAndValid(shippingItem.IsMeasurable)); && shippingItem.ShippingItemPallets.All(x => x.IsMeasuredAndValid(shippingItem.IsMeasurable));
SetupShippingItemMeasuringValues(shippingItem, isMeasuredPrerequisite); SetupShippingItemMeasuringValues(shippingItem, isMeasuredPrerequisite);
@ -234,36 +225,51 @@ public class FruitBankDbContext : MgDbContextBase,
if (shippingItem.IsMeasured) if (shippingItem.IsMeasured)
{ {
product!.StockQuantity += productIdChanged ? shippingItem.MeasuredQuantity : shippingItem.MeasuredQuantity - dbShippingItem.MeasuredQuantity; var quantityInc = productIdChanged ? shippingItem.MeasuredQuantity : shippingItem.MeasuredQuantity - dbShippingItem.MeasuredQuantity;
productDto!.StockQuantity += quantityInc;
if (!await UpdateProductStockQuantityAsync(product, true)) if (!await UpdateProductDtoStockQuantityAsync(productDto, true))
throw new Exception($"UpdateProductStockQuantity() == false; shippingItem! product.Id: {product.Id}"); throw new Exception($"UpdateProductStockQuantity() == false; shippingItem! product.Id: {productDto.Id}");
var incomingQuantity = productDto.GenericAttributes.GetValueOrNull<int>(nameof(IIncomingQuantity.IncomingQuantity));
if (incomingQuantity != null)
{
await _fruitBankAttributeService.UpdateGenericAttributeAsync<Product, int>
(productDto.Id, nameof(IIncomingQuantity.IncomingQuantity), incomingQuantity.Value - quantityInc);
}
if (productIsMeasurable) if (productIsMeasurable)
await _fruitBankAttributeService.InsertOrUpdateMeasuringAttributeValuesAsync<Product>(product.Id, {
await _fruitBankAttributeService.InsertOrUpdateMeasuringAttributeValuesAsync<Product>(productDto.Id,
productIdChanged ? shippingItem.MeasuredNetWeight : shippingItem.MeasuredNetWeight - dbShippingItem.MeasuredNetWeight, productIdChanged ? shippingItem.MeasuredNetWeight : shippingItem.MeasuredNetWeight - dbShippingItem.MeasuredNetWeight,
productIdChanged ? shippingItem.MeasuredGrossWeight : shippingItem.MeasuredGrossWeight - dbShippingItem.MeasuredGrossWeight,
shippingItem.IsMeasurable, true); shippingItem.IsMeasurable, true);
} }
}
//if (productIdUnchanged || !dbShippingItem.IsMeasured) return true; //if (productIdUnchanged || !dbShippingItem.IsMeasured) return true;
if (!productIdChanged && (shippingItem.IsMeasured || !dbShippingItem.IsMeasured)) return true; if (!productIdChanged && (shippingItem.IsMeasured || !dbShippingItem.IsMeasured)) return true;
product = await Products.GetByIdAsync(dbShippingItem.ProductId); productDto = await ProductDtos.GetByIdAsync(dbShippingItem.ProductId);
if (product != null) if (productDto != null)
{ {
productIsMeasurable = await _fruitBankAttributeService.IsMeasurableEntityAsync<Product>(product.Id); productIsMeasurable = productDto.IsMeasurable;
product.StockQuantity -= dbShippingItem.MeasuredQuantity; productDto.StockQuantity -= dbShippingItem.MeasuredQuantity;
if (!await UpdateProductStockQuantityAsync(product, true)) if (!await UpdateProductDtoStockQuantityAsync(productDto, true))
throw new Exception($"UpdateProductStockQuantity() == false; dbShippingItem! product.Id: {product.Id}"); throw new Exception($"UpdateProductStockQuantity() == false; dbShippingItem! product.Id: {productDto.Id}");
var incomingQuantity = productDto.GenericAttributes.GetValueOrNull<int>(nameof(IIncomingQuantity.IncomingQuantity));
if (incomingQuantity != null)
{
await _fruitBankAttributeService.UpdateGenericAttributeAsync<Product, int>
(productDto.Id, nameof(IIncomingQuantity.IncomingQuantity), incomingQuantity.Value + dbShippingItem.MeasuredQuantity);
}
if (!productIsMeasurable) return true; if (!productIsMeasurable) return true;
var measuringValues = new MeasuringAttributeValues(product.Id, -dbShippingItem.MeasuredNetWeight, -dbShippingItem.MeasuredGrossWeight, dbShippingItem.IsMeasurable); var measuringValues = new MeasuringAttributeValues(productDto.Id, -dbShippingItem.MeasuredNetWeight, dbShippingItem.IsMeasurable);
await _fruitBankAttributeService.InsertOrUpdateMeasuringAttributeValuesAsync<Product>(measuringValues, true); await _fruitBankAttributeService.InsertOrUpdateMeasuringAttributeValuesAsync<Product>(measuringValues, true);
} }
else Logger.Warning($"product == null; dbShippingItem.ProductId: {dbShippingItem.ProductId}"); else Logger.Warning($"product == null; dbShippingItem.ProductId: {dbShippingItem.ProductId}");
//else //TODO: productIdUnchanged-et lekezelni! - J. //else //TODO: productIdUnchanged-et lekezelni! - J.
@ -389,7 +395,7 @@ public class FruitBankDbContext : MgDbContextBase,
(orderItemDto.Id, nameof(IMeasuringNetWeight.NetWeight), orderItemDto.NetWeight); (orderItemDto.Id, nameof(IMeasuringNetWeight.NetWeight), orderItemDto.NetWeight);
await _fruitBankAttributeService.InsertOrUpdateMeasuringAttributeValuesAsync<Product> await _fruitBankAttributeService.InsertOrUpdateMeasuringAttributeValuesAsync<Product>
(orderItemDto.ProductId, -(orderItemDto.NetWeight-gaNetWeight), 0, orderItemDto.IsMeasurable, true); (orderItemDto.ProductId, -(orderItemDto.NetWeight-gaNetWeight), orderItemDto.IsMeasurable, true);
} }
return orderDto; return orderDto;
@ -439,22 +445,22 @@ public class FruitBankDbContext : MgDbContextBase,
return true; return true;
} }
private async Task<bool> UpdateProductStockQuantityAsync(int productId, bool publishEvent) private async Task<bool> UpdateProductDtoStockQuantityAsync(int productDtoId, bool publishEvent)
{ {
var product = await Products.GetByIdAsync(productId); var productDto = await ProductDtos.GetByIdAsync(productDtoId);
if (product != null) return await UpdateProductStockQuantityAsync(product, publishEvent); if (productDto != null) return await UpdateProductDtoStockQuantityAsync(productDto, publishEvent);
Logger.Error($"product == null; id: {productId}"); Logger.Error($"product == null; id: {productDtoId}");
return await Task.FromResult(false); return await Task.FromResult(false);
} }
private async Task<bool> UpdateProductStockQuantityAsync(Product product, bool publishEvent) private async Task<bool> UpdateProductDtoStockQuantityAsync(ProductDto productDto, bool publishEvent)
{ {
//Itt mi legyen? RollBack? - J. //Itt mi legyen? RollBack? - J.
if (product.StockQuantity < 0) if (productDto.StockQuantity < 0)
Logger.Error($"product.StockQuantity < 0; Id: {product.Id}; StockQuantity: {product.StockQuantity}"); Logger.Error($"productDto.StockQuantity < 0; Id: {productDto.Id}; StockQuantity: {productDto.StockQuantity}");
await Products.UpdateAsync(product, publishEvent); await ProductDtos.UpdateAsync(productDto, publishEvent);
return await Task.FromResult(true); return await Task.FromResult(true);
//var updatedRowsCount = await DataProvider.ExecuteNonQueryAsync($"update product set {nameof(Product.StockQuantity)} = {product.StockQuantity} where {nameof(Product.Id)} = {product.Id}"); //var updatedRowsCount = await DataProvider.ExecuteNonQueryAsync($"update product set {nameof(Product.StockQuantity)} = {product.StockQuantity} where {nameof(Product.Id)} = {product.Id}");

View File

@ -11,7 +11,7 @@ using Nop.Services.Logging;
namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer;
public class OrderDtoDbTable : MgDbTableBase<OrderDto> public class OrderDtoDbTable : MgDtoDbTableBase<OrderDto, Order>
{ {
public OrderDtoDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings, ILogger logger) public OrderDtoDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings, ILogger logger)
: base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings, logger) : base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings, logger)
@ -28,9 +28,9 @@ public class OrderDtoDbTable : MgDbTableBase<OrderDto>
.LoadWith(o => o.OrderItemDtos).ThenLoad(oi => oi.OrderItemPallets); .LoadWith(o => o.OrderItemDtos).ThenLoad(oi => oi.OrderItemPallets);
} }
public Task<OrderDto> GetByIdAsync(int orderId) => GetAll(true).Where(x => x.Id == orderId).FirstOrDefaultAsync(null); public Task<OrderDto> GetByIdAsync(int orderId, bool loadRelations) => GetAll(loadRelations).Where(x => x.Id == orderId).FirstOrDefaultAsync(null);
public IQueryable<OrderDto> GetAllByOrderStatus(OrderStatus orderStatus) => GetAll(true).Where(o => o.OrderStatusId == (int)orderStatus); public IQueryable<OrderDto> GetAllByOrderStatus(OrderStatus orderStatus, bool loadRelations = true) => GetAll(loadRelations).Where(o => o.OrderStatusId == (int)orderStatus);
public IQueryable<OrderDto> GetAllByIds(IEnumerable<int> orderIds) => GetAll(true).Where(o => orderIds.Contains(o.Id)); public IQueryable<OrderDto> GetAllByIds(IEnumerable<int> orderIds, bool loadRelations = true) => GetAll(loadRelations).Where(o => orderIds.Contains(o.Id));
} }

View File

@ -3,13 +3,14 @@ using LinqToDB;
using Mango.Nop.Core.Repositories; using Mango.Nop.Core.Repositories;
using Nop.Core.Caching; using Nop.Core.Caching;
using Nop.Core.Configuration; using Nop.Core.Configuration;
using Nop.Core.Domain.Orders;
using Nop.Core.Events; using Nop.Core.Events;
using Nop.Data; using Nop.Data;
using Nop.Services.Logging; using Nop.Services.Logging;
namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer; namespace Nop.Plugin.Misc.FruitBankPlugin.Domains.DataLayer;
public class OrderItemDtoDbTable : MgDbTableBase<OrderItemDto> public class OrderItemDtoDbTable : MgDtoDbTableBase<OrderItemDto, OrderItem>
{ {
public OrderItemDtoDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings, ILogger logger) public OrderItemDtoDbTable(IEventPublisher eventPublisher, INopDataProvider dataProvider, IShortTermCacheManager shortTermCacheManager, IStaticCacheManager staticCacheManager, AppSettings appSettings, ILogger logger)
: base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings, logger) : base(eventPublisher, dataProvider, shortTermCacheManager, staticCacheManager, appSettings, logger)
@ -25,7 +26,7 @@ public class OrderItemDtoDbTable : MgDbTableBase<OrderItemDto>
.LoadWith(oi => oi.ProductDto).ThenLoad(prod => prod.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 Task<OrderItemDto> GetByIdAsync(int orderItemId, bool loadRelations) => GetAll(loadRelations).Where(x => x.Id == orderItemId).FirstOrDefaultAsync(null);
public IQueryable<OrderItemDto> GetAllByOrderId(int orderId)=> GetAll(true).Where(o => o.OrderId == orderId); public IQueryable<OrderItemDto> GetAllByOrderId(int orderId, bool loadRelations = true)=> GetAll(loadRelations).Where(o => o.OrderId == orderId);
} }

View File

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

View File

@ -1,9 +1,12 @@
using AyCode.Core.Loggers; using System.Diagnostics.CodeAnalysis;
using AyCode.Core.Loggers;
using AyCode.Interfaces.Entities; using AyCode.Interfaces.Entities;
using FruitBank.Common.Dtos;
using FruitBank.Common.Entities; using FruitBank.Common.Entities;
using FruitBank.Common.Interfaces; using FruitBank.Common.Interfaces;
using FruitBank.Common.Loggers; using FruitBank.Common.Loggers;
using FruitBank.Common.Server; using FruitBank.Common.Server;
using Humanizer;
using Mango.Nop.Core.Loggers; using Mango.Nop.Core.Loggers;
using Mango.Nop.Services; using Mango.Nop.Services;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
@ -36,58 +39,83 @@ public class FruitBankEventConsumer(IHttpContextAccessor httpContextAcc, FruitBa
{ {
var product = eventMessage.Entity; var product = eventMessage.Entity;
await SaveProductCustomAttributesAsync(eventMessage.Entity); var saveProductCustomAttributesResult = await SaveProductCustomAttributesAsync(eventMessage.Entity);
var isMeasurableProduct = await fruitBankAttributeService.IsMeasurableEntityAsync<Product>(product.Id); //var isMeasurableProduct = await fruitBankAttributeService.IsMeasurableEntityAsync<Product>(product.Id);
if (saveProductCustomAttributesResult is { IsMeasurableChanged: true, IsMeasurable: not null })
{
var shippingItems = await ctx.ShippingItems.Table var shippingItems = await ctx.ShippingItems.Table
.Where(si => si.ProductId == product.Id && !si.IsMeasured && si.IsMeasurable != isMeasurableProduct) .Where(si => si.ProductId == product.Id && !si.IsMeasured && si.IsMeasurable != saveProductCustomAttributesResult.IsMeasurable.Value)
.ToListAsync(); .ToListAsync();
foreach (var shippingItem in shippingItems) if (shippingItems.Count > 0)
shippingItem.IsMeasurable = isMeasurableProduct; {
foreach (var shippingItem in shippingItems) shippingItem.IsMeasurable = saveProductCustomAttributesResult.IsMeasurable.Value;
await ctx.ShippingItems.UpdateAsync(shippingItems, false); await ctx.ShippingItems.UpdateAsync(shippingItems, false);
}
}
await base.HandleEventAsync(eventMessage); await base.HandleEventAsync(eventMessage);
} }
public override async Task HandleEventAsync(EntityInsertedEvent<Product> eventMessage) public override async Task HandleEventAsync(EntityInsertedEvent<Product> eventMessage)
{ {
await SaveProductCustomAttributesAsync(eventMessage.Entity); await SaveProductCustomAttributesAsync(eventMessage.Entity); //TODO: ez ide miért kell? - J.
await base.HandleEventAsync(eventMessage); await base.HandleEventAsync(eventMessage);
} }
private async Task SaveProductCustomAttributesAsync(Product product) /// <summary>
///
/// </summary>
/// <param name="product"></param>
/// <returns>IsMeasureable</returns>
/// <exception cref="Exception"></exception>
private async Task<(bool IsMeasurableChanged, bool? IsMeasurable)> SaveProductCustomAttributesAsync(Product product)
{ {
if (product == null) return; if (product == null) return (false, null);
var form = HttpContextAccessor.HttpContext?.Request?.Form; var hasForm = HttpContextAccessor.HttpContext?.Request?.HasFormContentType ?? false;
if (form == null || form.Count == 0) return; var form = hasForm ? HttpContextAccessor.HttpContext.Request.Form : null;
if (form.ContainsKey(nameof(IMeasurable.IsMeasurable)) && form.ContainsKey(nameof(IMeasuringNetWeight.NetWeight))) if (form == null || form.Count == 0 ||
!form.ContainsKey(nameof(IMeasurable.IsMeasurable)) || !form.ContainsKey(nameof(IMeasuringNetWeight.NetWeight)) ||
!form.ContainsKey(nameof(IIncomingQuantity.IncomingQuantity)) || !form.ContainsKey(nameof(ITare.Tare))) return (false, null);
bool? isMeasurable = null;
var isMeasurableChanged = false;
var productDto = product.Id > 0 ? await ctx.ProductDtos.GetByIdAsync(product.Id, false) : null;
//IsMeasurable
isMeasurable = form[nameof(IMeasurable.IsMeasurable)].ToString().Contains("true");
if (productDto == null || productDto.IsMeasurable != isMeasurable.Value)
{ {
var isMeasurable = form[nameof(IMeasurable.IsMeasurable)].ToString().Contains("true"); await fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync<Product, bool>(product.Id, nameof(IMeasurable.IsMeasurable), isMeasurable.Value);
//var isMeasurable = CommonHelper.To<bool>(form[nameof(IMeasurable.IsMeasurable)].ToString()); isMeasurableChanged = true;
var netWeight = CommonHelper.To<double>(form[nameof(IMeasuringNetWeight.NetWeight)].ToString());
await fruitBankAttributeService.InsertOrUpdateMeasuringAttributeValuesAsync<Product>(product.Id, netWeight, 0, isMeasurable, false);
} }
if (form.ContainsKey(nameof(ITare.Tare))) //NetWeight
{ var netWeight = double.Round(CommonHelper.To<double>(form[nameof(IMeasuringNetWeight.NetWeight)].ToString()), 1);
var tare = CommonHelper.To<double>(form[nameof(ITare.Tare)].ToString()); if (productDto == null || productDto.NetWeight != netWeight)
await fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync<Product, double>(product.Id, nameof(IMeasuringNetWeight.NetWeight), netWeight);
//Tára
var tare = double.Round(CommonHelper.To<double>(form[nameof(ITare.Tare)].ToString()), 1);
if (tare < 0) throw new Exception($"FruitBankEventConsumer->SaveProductCustomAttributesAsync(); (tare < 0); productId: {product.Id}; tare: {tare}"); if (tare < 0) throw new Exception($"FruitBankEventConsumer->SaveProductCustomAttributesAsync(); (tare < 0); productId: {product.Id}; tare: {tare}");
if (productDto == null || productDto.Tare != tare)
await fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync<Product, double>(product.Id, nameof(ITare.Tare), tare); await fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync<Product, double>(product.Id, nameof(ITare.Tare), tare);
}
if (form.ContainsKey(nameof(IIncomingQuantity.IncomingQuantity))) //IncomingQuantity
{
var incomingQuantity = CommonHelper.To<int>(form[nameof(IIncomingQuantity.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}"); if (incomingQuantity < 0) throw new Exception($"FruitBankEventConsumer->SaveProductCustomAttributesAsync(); (incomingQuantity < 0); productId: {product.Id}; incomingQuantity: {incomingQuantity}");
if (productDto == null || productDto.IncomingQuantity != incomingQuantity)
await fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync<Product, int>(product.Id, nameof(IIncomingQuantity.IncomingQuantity), incomingQuantity); await fruitBankAttributeService.InsertOrUpdateGenericAttributeAsync<Product, int>(product.Id, nameof(IIncomingQuantity.IncomingQuantity), incomingQuantity);
}
return (isMeasurableChanged, isMeasurable);
} }
public async Task HandleEventAsync(EntityInsertedEvent<ShippingItemPallet> eventMessage) public async Task HandleEventAsync(EntityInsertedEvent<ShippingItemPallet> eventMessage)

View File

@ -44,7 +44,7 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Factories
{ {
public class CustomOrderModelFactory : MgOrderModelFactory<OrderListModelExtended, OrderModelExtended> public class CustomOrderModelFactory : MgOrderModelFactory<OrderListModelExtended, OrderModelExtended>
{ {
private FruitBankDbContext _ctx; private readonly FruitBankDbContext _ctx;
private readonly IOrderMeasurementService _orderMeasurementService; private readonly IOrderMeasurementService _orderMeasurementService;
#region Ctor #region Ctor

File diff suppressed because one or more lines are too long

View File

@ -162,7 +162,8 @@ public class MgOrderModelFactory<TOrderListModelExt, TOrderModelExt> : OrderMode
orderListModel.Data = null; orderListModel.Data = null;
var orderListModelExtended = orderListModel.ToJson().JsonTo<TOrderListModelExt>(); //var orderListModelExtended = orderListModel.ToJson().JsonTo<TOrderListModelExt>();
var orderListModelExtended = orderListModel.CloneTo<TOrderListModelExt>();
orderListModelExtended.Data = extendedRows; orderListModelExtended.Data = extendedRows;
return orderListModelExtended; return orderListModelExtended;

View File

@ -156,7 +156,8 @@ public class MgProductModelFactory<TProductListModelExt, TProductModelExt> : Pro
productListModel.Data = null; productListModel.Data = null;
var productListModelExtended = productListModel.ToJson().JsonTo<TProductListModelExt>(); //var productListModelExtended = productListModel.ToJson().JsonTo<TProductListModelExt>();
var productListModelExtended = productListModel.CloneTo<TProductListModelExt>();
productListModelExtended.Data = extendedRows; productListModelExtended.Data = extendedRows;
return productListModelExtended; return productListModelExtended;

View File

@ -10,7 +10,6 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Services;
public class FruitBankAttributeService(IGenericAttributeService genericAttributeService, IStoreContext storeContext) public class FruitBankAttributeService(IGenericAttributeService genericAttributeService, IStoreContext storeContext)
{ {
private const string NET_WEIGHT_KEY = nameof(IMeasuringAttributeValues.NetWeight); private const string NET_WEIGHT_KEY = nameof(IMeasuringAttributeValues.NetWeight);
private const string GROSS_WEIGHT_KEY = nameof(IMeasuringAttributeValues.GrossWeight);
private const string IS_MEASURABLE_KEY = nameof(IMeasuringAttributeValues.IsMeasurable); private const string IS_MEASURABLE_KEY = nameof(IMeasuringAttributeValues.IsMeasurable);
@ -31,11 +30,11 @@ public class FruitBankAttributeService(IGenericAttributeService genericAttribute
public async Task<List<GenericAttribute>?> GetMeasuringAttributesAsync<TEntity>(int entityId, int storeId) public async Task<List<GenericAttribute>?> GetMeasuringAttributesAsync<TEntity>(int entityId, int storeId)
{ {
var measuringAttributes = (await genericAttributeService.GetAttributesForEntityAsync(entityId, typeof(TEntity).Name)) var measuringAttributes = (await genericAttributeService.GetAttributesForEntityAsync(entityId, typeof(TEntity).Name))
.Where(ga => ga.StoreId == storeId && ga.Key is NET_WEIGHT_KEY or GROSS_WEIGHT_KEY or IS_MEASURABLE_KEY) .Where(ga => ga.StoreId == storeId && ga.Key is NET_WEIGHT_KEY or IS_MEASURABLE_KEY)
.ToList(); .ToList();
if (measuringAttributes.Count == 0) return null; if (measuringAttributes.Count == 0) return null;
if (measuringAttributes.Count != 3) throw new Exception($"FruitBankAttributeService->GetMeasuringAttributesAsync(); measuringAttributes.Count != 3; entityId: {entityId}"); if (measuringAttributes.Count != 2) throw new Exception($"FruitBankAttributeService->GetMeasuringAttributesAsync(); measuringAttributes.Count != 2; entityId: {entityId}");
return measuringAttributes; return measuringAttributes;
} }
@ -51,7 +50,6 @@ public class FruitBankAttributeService(IGenericAttributeService genericAttribute
var measuringAttributeValues = new MeasuringAttributeValues( var measuringAttributeValues = new MeasuringAttributeValues(
entityId, entityId,
CommonHelper.To<double>(measuringAttributes.Single(ga => ga.Key == NET_WEIGHT_KEY).Value), CommonHelper.To<double>(measuringAttributes.Single(ga => ga.Key == NET_WEIGHT_KEY).Value),
CommonHelper.To<double>(measuringAttributes.Single(ga => ga.Key == GROSS_WEIGHT_KEY).Value),
CommonHelper.To<bool>(measuringAttributes.Single(ga => ga.Key == IS_MEASURABLE_KEY).Value)); CommonHelper.To<bool>(measuringAttributes.Single(ga => ga.Key == IS_MEASURABLE_KEY).Value));
return measuringAttributeValues; return measuringAttributeValues;
@ -64,13 +62,12 @@ public class FruitBankAttributeService(IGenericAttributeService genericAttribute
return measurableAttribute != null && CommonHelper.To<bool>(measurableAttribute.Value); return measurableAttribute != null && CommonHelper.To<bool>(measurableAttribute.Value);
} }
public async Task<MeasuringAttributeValues> InsertOrUpdateMeasuringAttributeValuesAsync<TEntity>(int entityId, double netWeight, double grossWeight, bool isMeasurable, bool cumulativeWeightUpdate) public async Task<MeasuringAttributeValues> InsertOrUpdateMeasuringAttributeValuesAsync<TEntity>(int entityId, double netWeight, bool isMeasurable, bool cumulativeWeightUpdate)
{ {
var measuringAttributeValues = new MeasuringAttributeValues var measuringAttributeValues = new MeasuringAttributeValues
{ {
Id = entityId, Id = entityId,
NetWeight = netWeight, NetWeight = netWeight,
GrossWeight = grossWeight,
IsMeasurable = isMeasurable IsMeasurable = isMeasurable
}; };
@ -91,27 +88,15 @@ public class FruitBankAttributeService(IGenericAttributeService genericAttribute
if (measuringAttributes == null) if (measuringAttributes == null)
{ {
await InsertGenericAttributeAsync<TEntity, double>(entityId, NET_WEIGHT_KEY, double.Round(measuringAttributeValues.NetWeight, 1), storeId); await InsertGenericAttributeAsync<TEntity, double>(entityId, NET_WEIGHT_KEY, double.Round(measuringAttributeValues.NetWeight, 1), storeId);
await InsertGenericAttributeAsync<TEntity, double>(entityId, GROSS_WEIGHT_KEY, double.Round(measuringAttributeValues.GrossWeight, 1), storeId);
await InsertGenericAttributeAsync<TEntity, bool>(entityId, IS_MEASURABLE_KEY, measuringAttributeValues.IsMeasurable, storeId); await InsertGenericAttributeAsync<TEntity, bool>(entityId, IS_MEASURABLE_KEY, measuringAttributeValues.IsMeasurable, storeId);
return; return;
} }
await UpdateMeasuringWeightAttributeValueAsync(measuringAttributes.Single(ma => ma.Key == NET_WEIGHT_KEY), measuringAttributeValues.NetWeight, cumulativeWeightUpdate); await UpdateMeasuringWeightAttributeValueAsync(measuringAttributes.Single(ma => ma.Key == NET_WEIGHT_KEY), measuringAttributeValues.NetWeight, cumulativeWeightUpdate);
await UpdateMeasuringWeightAttributeValueAsync(measuringAttributes.Single(ma => ma.Key == GROSS_WEIGHT_KEY), measuringAttributeValues.GrossWeight, cumulativeWeightUpdate);
await UpdateGenericAttributeAsync(measuringAttributes.Single(ma => ma.Key == IS_MEASURABLE_KEY), measuringAttributeValues.IsMeasurable);
//var netWeightAttribute = measuringAttributes?.SingleOrDefault(ma => ma.Key == NET_WEIGHT_KEY); //TODO: ezzel mi legyen? - J.
//if (netWeightAttribute != null) await UpdateMeasuringWeightAttributeValueAsync(netWeightAttribute, measuringAttributeValues.NetWeight, cumulativeWeightUpdate); //await UpdateGenericAttributeAsync(measuringAttributes.Single(ma => ma.Key == IS_MEASURABLE_KEY), measuringAttributeValues.IsMeasurable);
//else await InsertGenericAttributeAsync<TEntity, double>(entityId, NET_WEIGHT_KEY, measuringAttributeValues.NetWeight, storeId);
//var grossWeightAttribute = measuringAttributes?.SingleOrDefault(ma => ma.Key == GROSS_WEIGHT_KEY);
//if (grossWeightAttribute != null) await UpdateMeasuringWeightAttributeValueAsync(grossWeightAttribute, measuringAttributeValues.GrossWeight, cumulativeWeightUpdate);
//else await InsertGenericAttributeAsync<TEntity, double>(entityId, GROSS_WEIGHT_KEY, measuringAttributeValues.GrossWeight, storeId);
//var isMeasurableAttribute = measuringAttributes?.SingleOrDefault(ma => ma.Key == IS_MEASURABLE_KEY);
//if (isMeasurableAttribute != null) await UpdateGenericAttributeAsync(isMeasurableAttribute, measuringAttributeValues.IsMeasurable);
//else await InsertGenericAttributeAsync<TEntity, bool>(entityId, IS_MEASURABLE_KEY, measuringAttributeValues.IsMeasurable, storeId);
} }
private async Task UpdateMeasuringWeightAttributeValueAsync(GenericAttribute genericAttribute, double newWeightValue, bool cumulativeWeightUpdate) private async Task UpdateMeasuringWeightAttributeValueAsync(GenericAttribute genericAttribute, double newWeightValue, bool cumulativeWeightUpdate)