rename: QuantityOnDocument, NetWeightOnDocument, GrossWeightOnDocument; improvements, fixes, etc...

This commit is contained in:
Loretta 2025-10-02 07:23:13 +02:00
parent d7e58e28f5
commit 158713a869
13 changed files with 185 additions and 75 deletions

View File

@ -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; }
/// <summary>
/// Reference to StockQuantity, always equals!
/// </summary>
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;
}

View File

@ -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<ShippingItemPallet>? ShippingItemPallets { get; set; }
[SkipValuesOnUpdate] public DateTime Created { get; set; }
public DateTime Modified { get; set; }

View File

@ -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;
}
}

View File

@ -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";

View File

@ -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;
}

View File

@ -0,0 +1,6 @@
namespace FruitBank.Common.Interfaces;
public interface IMeasuringValues : IMeasuringWeights
{
int Quantity { get; set; }
}

View File

@ -0,0 +1,7 @@
namespace FruitBank.Common.Interfaces;
public interface IMeasuringWeights
{
double NetWeight { get; set; }
double GrossWeight { get; set; }
}

View File

@ -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<ShippingItemPallet>? ShippingItemPallets { get; set; }
public bool IsValidMeasuringValues();
}

View File

@ -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();
}

View File

@ -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()
{

View File

@ -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<MeasuringProductDto> 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

View File

@ -103,8 +103,8 @@
@* <DataAnnotationsValidator /> *@
<DxFormLayout Data="@SelectedShippingItem" CaptionPosition="CaptionPosition.Vertical" CssClass="w-100" ItemUpdating="@((pair) => OnItemUpdating(pair.Key, pair.Value))">
<DxFormLayoutItem CaptionCssClass="@(SelectedShippingItem.IsMeasured ? "text-success" : "")" Field="@nameof(ShippingItem.Name)" Caption="Item Name:" Enabled="false" ColSpanMd="6" />
<DxFormLayoutItem Visible="false" CaptionCssClass="@(SelectedShippingItem.IsMeasured ? "text-success" : "")" Field="@nameof(ShippingItem.GrossWeight)" Caption="GrossWeight:" Enabled="false" ColSpanMd="3" />
<DxFormLayoutItem Visible="false" CaptionCssClass="@(SelectedShippingItem.IsMeasured ? "text-success" : "")" Field="@nameof(ShippingItem.NetWeight)" Caption="NetWeight:" Enabled="false" ColSpanMd="3" />
<DxFormLayoutItem Visible="false" CaptionCssClass="@(SelectedShippingItem.IsMeasured ? "text-success" : "")" Field="@nameof(ShippingItem.GrossWeightOnDocument)" Caption="GrossWeightOnDocument:" Enabled="false" ColSpanMd="3" />
<DxFormLayoutItem Visible="false" CaptionCssClass="@(SelectedShippingItem.IsMeasured ? "text-success" : "")" Field="@nameof(ShippingItem.NetWeightOnDocument)" Caption="NetWeightOnDocument:" Enabled="false" ColSpanMd="3" />
<DxFormLayoutItem CaptionCssClass="@(SelectedShippingItem.IsMeasured ? "text-success" : "")"
Field="@nameof(ShippingItem.MeasuredQuantity)"

View File

@ -189,13 +189,13 @@ namespace FruitBankHybrid.Shared.Pages
// SelectedShippingItem.NetWeight = (double)newValue;
// break;
case nameof(ShippingItem.MeasuredQuantity):
SelectedShippingItem.MeasuredQuantity = (int)newValue <= 0 ? null : (int)newValue;
SelectedShippingItem.MeasuredQuantity = (int)newValue <= 0 ? 0 : (int)newValue;
break;
case nameof(ShippingItem.MeasuredNetWeight):
SelectedShippingItem.MeasuredNetWeight = !SelectedShippingItem.IsMeasurable || (double)newValue <= 0 ? null : (double)newValue;
SelectedShippingItem.MeasuredNetWeight = !SelectedShippingItem.IsMeasurable || (double)newValue <= 0 ? 0 : (double)newValue;
break;
case nameof(ShippingItem.MeasuredGrossWeight):
SelectedShippingItem.MeasuredGrossWeight = !SelectedShippingItem.IsMeasurable || (double)newValue <= 0 ? null : (double)newValue;
SelectedShippingItem.MeasuredGrossWeight = !SelectedShippingItem.IsMeasurable || (double)newValue <= 0 ? 0 : (double)newValue;
break;
}