From 158713a869000a89075533f046b88a3296af09bc Mon Sep 17 00:00:00 2001 From: Loretta Date: Thu, 2 Oct 2025 07:23:13 +0200 Subject: [PATCH] rename: QuantityOnDocument, NetWeightOnDocument, GrossWeightOnDocument; improvements, fixes, etc... --- FruitBank.Common/Dtos/MeasuringProductDto.cs | 25 ++++-- FruitBank.Common/Entities/ShippingItem.cs | 28 +++--- .../Entities/ShippingItemPallet.cs | 45 ++++++++++ FruitBank.Common/FruitBankConstClient.cs | 1 + .../Interfaces/IMeasuringAttributeValues.cs | 9 +- .../Interfaces/IMeasuringValues.cs | 6 ++ .../Interfaces/IMeasuringWeights.cs | 7 ++ FruitBank.Common/Interfaces/IShippingItem.cs | 13 +-- .../Interfaces/IShippingItemPallet.cs | 16 ++++ .../Models/MeasuringAttributeValues.cs | 12 +-- .../FruitBankClientTests.cs | 88 ++++++++++++------- .../Pages/MeasuringIn.razor | 4 +- .../Pages/MeasuringIn.razor.cs | 6 +- 13 files changed, 185 insertions(+), 75 deletions(-) create mode 100644 FruitBank.Common/Entities/ShippingItemPallet.cs create mode 100644 FruitBank.Common/Interfaces/IMeasuringValues.cs create mode 100644 FruitBank.Common/Interfaces/IMeasuringWeights.cs create mode 100644 FruitBank.Common/Interfaces/IShippingItemPallet.cs diff --git a/FruitBank.Common/Dtos/MeasuringProductDto.cs b/FruitBank.Common/Dtos/MeasuringProductDto.cs index bb42a09..3e7d9ef 100644 --- a/FruitBank.Common/Dtos/MeasuringProductDto.cs +++ b/FruitBank.Common/Dtos/MeasuringProductDto.cs @@ -6,9 +6,18 @@ namespace FruitBank.Common.Dtos; public class MeasuringProductDto : ProductDto, IMeasuringProductDto { - public double? NetWeight { get; set; } - public double? GrossWeight { get; set; } - public bool? IsMeasurable { get; set; } + /// + /// Reference to StockQuantity, always equals! + /// + public int Quantity + { + get => StockQuantity; + set => StockQuantity = value; + } + + public double NetWeight { get; set; } + public double GrossWeight { get; set; } + public bool IsMeasurable { get; set; } public MeasuringProductDto() :base() { } @@ -36,10 +45,12 @@ public class MeasuringProductDto : ProductDto, IMeasuringProductDto base.CopyEntityValuesToDto(entity); - NetWeight = measuringAttributeValues?.NetWeight; - GrossWeight = measuringAttributeValues?.GrossWeight; - IsMeasurable = measuringAttributeValues?.IsMeasurable; + if (measuringAttributeValues == null) return; + + NetWeight = measuringAttributeValues.NetWeight; + GrossWeight = measuringAttributeValues.GrossWeight; + IsMeasurable = measuringAttributeValues.IsMeasurable; } - public bool HasValues() => Id > 0 && NetWeight != null && GrossWeight != null && IsMeasurable != null; + public bool HasMeasuringValues() => Id > 0 && NetWeight > 0 && GrossWeight > 0 && IsMeasurable; } diff --git a/FruitBank.Common/Entities/ShippingItem.cs b/FruitBank.Common/Entities/ShippingItem.cs index 3a3dd27..d35894d 100644 --- a/FruitBank.Common/Entities/ShippingItem.cs +++ b/FruitBank.Common/Entities/ShippingItem.cs @@ -22,26 +22,27 @@ public class ShippingItem : MgEntityBase, IShippingItem public int ShippingDocumentId { get; set; } public string Name { get; set; } - public int Quantity { get; set; } + public int QuantityOnDocument { get; set; } - [Column(DataType = DataType.DecFloat)] public double NetWeight { get; set; } - [Column(DataType = DataType.DecFloat)] public double GrossWeight { get; set; } + [Column(DataType = DataType.DecFloat)] public double NetWeightOnDocument { get; set; } + [Column(DataType = DataType.DecFloat)] public double GrossWeightOnDocument { get; set; } - [Nullable] - [Column(CanBeNull = true)] + //[Nullable] + //[Column(CanBeNull = true)] [Range(1, 100000, ErrorMessage = "The MeasuredQuantity value should be a number between 1 and 100,000.")] - public int? MeasuredQuantity { get; set; } + public int MeasuredQuantity { get; set; } - [Nullable] - [Column(DataType = DataType.DecFloat, CanBeNull = true)] + //[Nullable] + [Column(DataType = DataType.DecFloat, CanBeNull = false)] [Range(1, 100000, ErrorMessage = "The MeasuredNetWeight value should be a number between 1 and 100,000.")] - public double? MeasuredNetWeight { get; set; } + public double MeasuredNetWeight { get; set; } - [Nullable] - [Column(DataType = DataType.DecFloat, CanBeNull = true)] + //[Nullable] + //Precision = 1 + [Column(DataType = DataType.DecFloat, CanBeNull = false)] [Range(1, 100000, ErrorMessage = "The MeasuredGrossWeight value should be a number between 1 and 100,000.")] - public double? MeasuredGrossWeight { get; set; } + public double MeasuredGrossWeight { get; set; } public bool IsMeasurable { get; set; } public bool IsMeasured { get; set; } @@ -52,6 +53,9 @@ public class ShippingItem : MgEntityBase, IShippingItem [LinqToDB.Mapping.Association(ThisKey = nameof(ShippingDocumentId), OtherKey = nameof(ShippingDocument.Id), CanBeNull = true)] public ShippingDocument? ShippingDocument { get; set; } + [LinqToDB.Mapping.Association(ThisKey = nameof(Id), OtherKey = nameof(ShippingItemPallet.ShippingItemId), CanBeNull = true)] + public List? ShippingItemPallets { get; set; } + [SkipValuesOnUpdate] public DateTime Created { get; set; } public DateTime Modified { get; set; } diff --git a/FruitBank.Common/Entities/ShippingItemPallet.cs b/FruitBank.Common/Entities/ShippingItemPallet.cs new file mode 100644 index 0000000..21dae0f --- /dev/null +++ b/FruitBank.Common/Entities/ShippingItemPallet.cs @@ -0,0 +1,45 @@ +using System.ComponentModel.DataAnnotations; +using FruitBank.Common.Interfaces; +using LinqToDB.Mapping; +using Mango.Nop.Core.Entities; +using DataType = LinqToDB.DataType; + +namespace FruitBank.Common.Entities; + +[Table(Name = FruitBankConstClient.ShippingItemPalletDbTableName)] +[System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.ShippingItemPalletDbTableName)] +public class ShippingItemPallet : MgEntityBase, IShippingItemPallet +{ + public int ShippingItemId { get; set; } + + //[Nullable] + //[Column(CanBeNull = true)] + [Range(1, 100000, ErrorMessage = "The Quantity value should be a number between 1 and 100,000.")] + public int Quantity { get; set; } + + //[Nullable] + [Column(DataType = DataType.DecFloat, CanBeNull = false)] + [Range(1, 100000, ErrorMessage = "The NetWeight value should be a number between 1 and 100,000.")] + public double NetWeight { get; set; } + + //[Nullable] + [Column(DataType = DataType.DecFloat, CanBeNull = false)] + [Range(1, 100000, ErrorMessage = "The GrossWeight value should be a number between 1 and 100,000.")] + public double GrossWeight { get; set; } + + [LinqToDB.Mapping.Association(ThisKey = nameof(ShippingItemId), OtherKey = nameof(ShippingItem.Id), CanBeNull = true)] + public ShippingItem? ShippingItem { get; set; } + + [SkipValuesOnUpdate] + public int? CreatorId { get; set; } + public int? ModifierId { get; set; } + + [SkipValuesOnUpdate] + public DateTime Created { get; set; } + public DateTime Modified { get; set; } + + public bool IsValidMeasuringValues() + { + return ShippingItemId > 0 && Quantity > 0 && NetWeight > 0 && GrossWeight > 0; + } +} \ No newline at end of file diff --git a/FruitBank.Common/FruitBankConstClient.cs b/FruitBank.Common/FruitBankConstClient.cs index 0fa419b..b04a461 100644 --- a/FruitBank.Common/FruitBankConstClient.cs +++ b/FruitBank.Common/FruitBankConstClient.cs @@ -18,6 +18,7 @@ public static class FruitBankConstClient public const string PartnerDbTableName = "fbPartner"; public const string ShippingDbTableName = "fbShipping"; public const string ShippingItemDbTableName = "fbShippingItem"; + public const string ShippingItemPalletDbTableName = "fbShippingItemPallet"; public const string ShippingDocumentDbTableName = "fbShippingDocument"; diff --git a/FruitBank.Common/Interfaces/IMeasuringAttributeValues.cs b/FruitBank.Common/Interfaces/IMeasuringAttributeValues.cs index ccced6a..0a7185c 100644 --- a/FruitBank.Common/Interfaces/IMeasuringAttributeValues.cs +++ b/FruitBank.Common/Interfaces/IMeasuringAttributeValues.cs @@ -2,12 +2,9 @@ namespace FruitBank.Common.Interfaces; -public interface IMeasuringAttributeValues : IEntityInt +public interface IMeasuringAttributeValues : IMeasuringWeights, IEntityInt { - double? NetWeight { get; set; } - double? GrossWeight { get; set; } + bool IsMeasurable { get; set; } - bool? IsMeasurable { get; set; } - - bool HasValues(); //=> Id > 0 && NetWeight != null && GrossWeight != null && IsMeasurable != null; + bool HasMeasuringValues(); //=> Id > 0 && NetWeight != null && GrossWeight != null && IsMeasurable != null; } \ No newline at end of file diff --git a/FruitBank.Common/Interfaces/IMeasuringValues.cs b/FruitBank.Common/Interfaces/IMeasuringValues.cs new file mode 100644 index 0000000..5788d5a --- /dev/null +++ b/FruitBank.Common/Interfaces/IMeasuringValues.cs @@ -0,0 +1,6 @@ +namespace FruitBank.Common.Interfaces; + +public interface IMeasuringValues : IMeasuringWeights +{ + int Quantity { get; set; } +} \ No newline at end of file diff --git a/FruitBank.Common/Interfaces/IMeasuringWeights.cs b/FruitBank.Common/Interfaces/IMeasuringWeights.cs new file mode 100644 index 0000000..c808efc --- /dev/null +++ b/FruitBank.Common/Interfaces/IMeasuringWeights.cs @@ -0,0 +1,7 @@ +namespace FruitBank.Common.Interfaces; + +public interface IMeasuringWeights +{ + double NetWeight { get; set; } + double GrossWeight { get; set; } +} \ No newline at end of file diff --git a/FruitBank.Common/Interfaces/IShippingItem.cs b/FruitBank.Common/Interfaces/IShippingItem.cs index 1c1cd94..5b44761 100644 --- a/FruitBank.Common/Interfaces/IShippingItem.cs +++ b/FruitBank.Common/Interfaces/IShippingItem.cs @@ -11,19 +11,20 @@ public interface IShippingItem : IEntityInt, ITimeStampInfo int? ProductId { get; set; } string Name { get; set; } - int Quantity { get; set; } - double NetWeight { get; set; } - double GrossWeight { get; set; } + int QuantityOnDocument { get; set; } + double NetWeightOnDocument { get; set; } + double GrossWeightOnDocument { get; set; } - int? MeasuredQuantity { get; set; } - double? MeasuredNetWeight { get; set; } - double? MeasuredGrossWeight { get; set; } + int MeasuredQuantity { get; set; } + double MeasuredNetWeight { get; set; } + double MeasuredGrossWeight { get; set; } bool IsMeasurable { get; set; } bool IsMeasured { get; set; } public Product? Product { get; set; } public ShippingDocument? ShippingDocument { get; set; } + public List? ShippingItemPallets { get; set; } public bool IsValidMeasuringValues(); } \ No newline at end of file diff --git a/FruitBank.Common/Interfaces/IShippingItemPallet.cs b/FruitBank.Common/Interfaces/IShippingItemPallet.cs new file mode 100644 index 0000000..796d8d1 --- /dev/null +++ b/FruitBank.Common/Interfaces/IShippingItemPallet.cs @@ -0,0 +1,16 @@ +using AyCode.Interfaces.Entities; +using AyCode.Interfaces.TimeStampInfo; +using FruitBank.Common.Entities; + +namespace FruitBank.Common.Interfaces; + +public interface IShippingItemPallet : IEntityInt, IMeasuringValues, ITimeStampInfo +{ + int ShippingItemId { get; set; } + public ShippingItem? ShippingItem { get; set; } + + public int? CreatorId { get; set; } + public int? ModifierId { get; set; } + + public bool IsValidMeasuringValues(); +} \ No newline at end of file diff --git a/FruitBank.Common/Models/MeasuringAttributeValues.cs b/FruitBank.Common/Models/MeasuringAttributeValues.cs index ba9db14..e2f6061 100644 --- a/FruitBank.Common/Models/MeasuringAttributeValues.cs +++ b/FruitBank.Common/Models/MeasuringAttributeValues.cs @@ -7,20 +7,20 @@ public class MeasuringAttributeValues : IMeasuringAttributeValues { public int Id { get; set; } - public double? NetWeight { get; set; } - public double? GrossWeight { get; set; } - public bool? IsMeasurable { get; set; } + public double NetWeight { get; set; } + public double GrossWeight { get; set; } + public bool IsMeasurable { get; set; } public MeasuringAttributeValues() { } - public MeasuringAttributeValues(int entityId, double? netWeight, double? grossWeight, bool? isMeasurable) + public MeasuringAttributeValues(int entityId, double netWeight, double grossWeight, bool isMeasurable) { Initialize(entityId, netWeight, grossWeight, isMeasurable); } - public void Initialize(int entityId, double? netWeight, double? grossWeight, bool? isMeasurable) + public void Initialize(int entityId, double netWeight, double grossWeight, bool isMeasurable) { Id = entityId; NetWeight = netWeight; @@ -28,7 +28,7 @@ public class MeasuringAttributeValues : IMeasuringAttributeValues IsMeasurable = isMeasurable; } - public bool HasValues() => Id > 0 && NetWeight != null && GrossWeight != null && IsMeasurable != null; + public bool HasMeasuringValues() => Id > 0 && NetWeight > 0 && GrossWeight > 0 && IsMeasurable; public override string ToString() { diff --git a/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs b/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs index 28e921f..73c63c9 100644 --- a/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs +++ b/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs @@ -1,13 +1,15 @@ using AyCode.Core.Enums; using AyCode.Core.Loggers; using AyCode.Utils.Extensions; +using FruitBank.Common; +using FruitBank.Common.Dtos; using FruitBank.Common.Entities; using FruitBank.Common.Interfaces; using FruitBank.Common.Loggers; using FruitBankHybrid.Shared.Services.SignalRs; using System.Diagnostics.CodeAnalysis; using System.Runtime.InteropServices.JavaScript; -using FruitBank.Common; +// ReSharper disable CompareOfFloatsByEqualityOperator namespace FruitBankHybrid.Shared.Tests { @@ -154,9 +156,9 @@ namespace FruitBankHybrid.Shared.Tests Assert.IsNotNull(shippingItem.Product, $"shippingItem.Product == null; shippingItem.Id: {shippingItem.ProductId}"); Assert.IsTrue(shippingItem.Id == shippingItemId); - Assert.IsTrue(shippingItem.Quantity > 0, "Quantity == 0"); - Assert.IsTrue(shippingItem.NetWeight > 0, "NetWeight == 0"); - Assert.IsTrue(shippingItem.GrossWeight > 0, "GrossWeight == 0"); + Assert.IsTrue(shippingItem.QuantityOnDocument > 0, "QuantityOnDocument == 0"); + Assert.IsTrue(shippingItem.NetWeightOnDocument > 0, "NetWeightOnDocument == 0"); + Assert.IsTrue(shippingItem.GrossWeightOnDocument > 0, "GrossWeightOnDocument == 0"); return shippingItem; } @@ -164,39 +166,50 @@ namespace FruitBankHybrid.Shared.Tests [DataTestMethod] [DataRow(1)] [DataRow(2)] - //[DataRow(3)] - //[DataRow(4)] + [DataRow(3)] + [DataRow(4)] + [DataRow(5)] public async Task UpdateShippingItemTest(int shippingItemId) { + const int incQuantity = 1; + var incNetWeight = 2.137563300001; + var incGrossWeight = 3.75238200001; + var originalShippingItem = await GetShippingItemByIdTest(shippingItemId); - var newName = GetFixtureName(originalShippingItem.Name); + var originalMeasuringProductDto = await GetMeasuringProductDtoByIdTest(originalShippingItem.ProductId!.Value, originalShippingItem.IsMeasurable); + + Assert.IsTrue(originalShippingItem.IsMeasurable == originalMeasuringProductDto.IsMeasurable); var shippingItem = await GetShippingItemByIdTest(shippingItemId); - shippingItem.Name = newName; - //shippingItem.MeasuredGrossWeight = 5; - shippingItem = await _signalRClient.UpdateShippingItem(shippingItem); - Assert.IsNotNull(shippingItem); - Assert.IsNotNull(shippingItem.Product); - Assert.IsTrue(shippingItem.Name == newName); - Assert.IsTrue(shippingItem.Product.StockQuantity == originalShippingItem.Product!.StockQuantity); + shippingItem.MeasuredQuantity += incQuantity; + shippingItem.MeasuredNetWeight += incNetWeight; + shippingItem.MeasuredGrossWeight += incGrossWeight; - shippingItem = await GetShippingItemByIdTest(shippingItemId); - - Assert.IsTrue(shippingItem.Name == newName); - Assert.IsTrue(shippingItem.Product!.StockQuantity == originalShippingItem.Product.StockQuantity); - //Assert.IsTrue(shippingItem.MeasuredGrossWeight is 5); - - shippingItem.Name = GetOriginalName(shippingItem.Name); shippingItem = await _signalRClient.UpdateShippingItem(shippingItem); Assert.IsNotNull(shippingItem); Assert.IsNotNull(shippingItem.Product); - shippingItem = await GetShippingItemByIdTest(shippingItemId); + //incNetWeight = double.Round(incNetWeight, 1); + //incGrossWeight = double.Round(incGrossWeight, 1); - Assert.IsTrue(shippingItem.Name == originalShippingItem.Name); - Assert.IsTrue(shippingItem.Product!.StockQuantity == originalShippingItem.Product.StockQuantity); + Assert.IsTrue(shippingItem.IsMeasured); + Assert.IsTrue(shippingItem.Product.StockQuantity == originalShippingItem.Product!.StockQuantity + incQuantity); + + Assert.IsTrue(shippingItem.IsMeasurable == originalMeasuringProductDto.IsMeasurable); + Assert.IsTrue(shippingItem.MeasuredQuantity == originalShippingItem.MeasuredQuantity + incQuantity); + + + var measuringProductDto = await GetMeasuringProductDtoByIdTest(originalShippingItem.ProductId!.Value, shippingItem.IsMeasurable); + + Assert.IsTrue(measuringProductDto.StockQuantity == originalMeasuringProductDto.StockQuantity + incQuantity); + + Assert.IsTrue(shippingItem.MeasuredNetWeight == double.Round(originalShippingItem.MeasuredNetWeight + (shippingItem.IsMeasurable ? incNetWeight : 0), 1)); + Assert.IsTrue(shippingItem.MeasuredGrossWeight == double.Round(originalShippingItem.MeasuredGrossWeight + (shippingItem.IsMeasurable ? incGrossWeight : 0), 1)); + + Assert.IsTrue(measuringProductDto.NetWeight == double.Round(originalMeasuringProductDto.NetWeight + (shippingItem.IsMeasurable ? incNetWeight : 0), 1)); + Assert.IsTrue(measuringProductDto.GrossWeight == double.Round(originalMeasuringProductDto.GrossWeight + (shippingItem.IsMeasurable ? incGrossWeight : 0), 1)); } #endregion ShippingItem @@ -289,22 +302,31 @@ namespace FruitBankHybrid.Shared.Tests Assert.IsTrue(measuringProductDtos.Count != 0); Assert.IsTrue(measuringProductDtos.All(x => !x.Name.IsNullOrEmpty() && !x.Deleted)); - Assert.IsTrue(measuringProductDtos.All(x => !x.IsMeasurable.GetValueOrDefault(false) || x.HasValues())); + Assert.IsTrue(measuringProductDtos.All(x => !x.IsMeasurable || x.HasMeasuringValues())); } - [TestMethod] - [DataRow(1)] - [DataRow(5)] - [DataRow(33)] - //[DataRow(3)] - public async Task GetMeasuringProductDtoByIdTest(int productId) + //[TestMethod] + //[DataRow(1)] + //[DataRow(5)] + //[DataRow(33)] + public async Task GetMeasuringProductDtoByIdTest(int productId, bool isMeasurableExcepted) { var measuringProductDto = await _signalRClient.GetMeasuringProductDtoById(productId); Assert.IsNotNull(measuringProductDto); - Assert.IsTrue(measuringProductDto.HasValues()); - //Assert.IsTrue(measuringProductDto.HasValues()); + + if (isMeasurableExcepted) Assert.IsTrue(measuringProductDto.HasMeasuringValues(), $"{measuringProductDto.IsMeasurable}, {measuringProductDto.NetWeight}, {measuringProductDto.GrossWeight}"); + else + { + Assert.IsTrue(measuringProductDto.Id > 0); + Assert.IsTrue(measuringProductDto.StockQuantity > 0); + Assert.IsTrue(measuringProductDto.NetWeight == 0); + Assert.IsTrue(measuringProductDto.GrossWeight == 0); + } + + return measuringProductDto; } + #endregion Product #region Login diff --git a/FruitBankHybrid.Shared/Pages/MeasuringIn.razor b/FruitBankHybrid.Shared/Pages/MeasuringIn.razor index 40e687d..83db8db 100644 --- a/FruitBankHybrid.Shared/Pages/MeasuringIn.razor +++ b/FruitBankHybrid.Shared/Pages/MeasuringIn.razor @@ -103,8 +103,8 @@ @* *@ - - + +