diff --git a/FruitBank.Common/Entities/CargoPartner.cs b/FruitBank.Common/Entities/CargoPartner.cs new file mode 100644 index 00000000..565bff5a --- /dev/null +++ b/FruitBank.Common/Entities/CargoPartner.cs @@ -0,0 +1,17 @@ +using AyCode.Core.Serializers.Attributes; +using AyCode.Core.Serializers.Toons; +using FruitBank.Common.Interfaces; +using LinqToDB.Mapping; +using Mango.Nop.Core.Entities; + +namespace FruitBank.Common.Entities; + +[AcBinarySerializable(false, true, false, true, false, false)] +//[ToonDescription("Business partner with address and tax information", Purpose = "Represents an external legal entity, specifically a Supplier who provides goods or a business partner involved in the procurement chain")] +[Table(Name = FruitBankConstClient.CargoPartnerDbTableName)] +[System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.CargoPartnerDbTableName)] +public sealed class CargoPartner : PartnerBase, ICargoPartner +{ + [Association(ThisKey = nameof(Id), OtherKey = nameof(CargoTruck.CargoPartnerId), CanBeNull = true)] + public List? CargoTrucks { get; set; } +} \ No newline at end of file diff --git a/FruitBank.Common/Entities/CargoTruck.cs b/FruitBank.Common/Entities/CargoTruck.cs new file mode 100644 index 00000000..b5168995 --- /dev/null +++ b/FruitBank.Common/Entities/CargoTruck.cs @@ -0,0 +1,14 @@ +using AyCode.Core.Serializers.Attributes; +using LinqToDB.Mapping; +using Mango.Nop.Core.Entities; + +namespace FruitBank.Common.Entities; + +[AcBinarySerializable(false, true, false, true, false, false)] +//[ToonDescription("Business partner with address and tax information", Purpose = "Represents an external legal entity, specifically a Supplier who provides goods or a business partner involved in the procurement chain")] +[Table(Name = FruitBankConstClient.CargoTruckDbTableName)] +[System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.CargoTruckDbTableName)] +public sealed class CargoTruck: MgEntityBase//, ICargoPartner +{ + public int CargoPartnerId { get; set; } +} diff --git a/FruitBank.Common/Entities/CustomerCredit.cs b/FruitBank.Common/Entities/CustomerCredit.cs index 145a5aa3..06909eca 100644 --- a/FruitBank.Common/Entities/CustomerCredit.cs +++ b/FruitBank.Common/Entities/CustomerCredit.cs @@ -4,7 +4,7 @@ using Mango.Nop.Core.Entities; namespace FruitBank.Common.Entities; -public class CustomerCredit: MgEntityBase, IEntityComment +public sealed class CustomerCredit: MgEntityBase, IEntityComment { public int CustomerId { get; set; } public decimal CreditLimit { get; set; } diff --git a/FruitBank.Common/Entities/Files.cs b/FruitBank.Common/Entities/Files.cs index 858e0454..35c76482 100644 --- a/FruitBank.Common/Entities/Files.cs +++ b/FruitBank.Common/Entities/Files.cs @@ -10,7 +10,7 @@ namespace FruitBank.Common.Entities; [ToonDescription("Uploaded file with extracted text content", Purpose = "A centralized repository for all uploaded binary content and metadata, featuring a 'RawText' field that stores OCR-extracted information for full-text search and automated data validation across the system")] [Table(Name = FruitBankConstClient.FilesDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.FilesDbTableName)] -public class Files : MgEntityBase, IFiles +public sealed class Files : MgEntityBase, IFiles { public string FileName { get; set; } public string FileSubPath { get; set; } diff --git a/FruitBank.Common/Entities/OrderItemPallet.cs b/FruitBank.Common/Entities/OrderItemPallet.cs index 2959ad04..42b253c6 100644 --- a/FruitBank.Common/Entities/OrderItemPallet.cs +++ b/FruitBank.Common/Entities/OrderItemPallet.cs @@ -16,7 +16,7 @@ namespace FruitBank.Common.Entities; [ToonDescription("Pallet measurements for order items with audit tracking", Purpose = "A measurement record for outgoing goods, used to verify that the net weight being sent to the customer is accurate and audited. NOTE: Despite the 'Pallet' name, this is a general measurement record that is ALWAYS created for every item. If the product is not measurable (IsMeasurable=false), weights are recorded as 0.0 and only TrayQuantity is stored.")] [Table(Name = FruitBankConstClient.OrderItemPalletDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.OrderItemPalletDbTableName)] -public class OrderItemPallet : MeasuringItemPalletBase, IOrderItemPallet +public sealed class OrderItemPallet : MeasuringItemPalletBase, IOrderItemPallet { public int OrderItemId { diff --git a/FruitBank.Common/Entities/Pallet.cs b/FruitBank.Common/Entities/Pallet.cs index 991e46d9..cf92b91e 100644 --- a/FruitBank.Common/Entities/Pallet.cs +++ b/FruitBank.Common/Entities/Pallet.cs @@ -11,7 +11,7 @@ namespace FruitBank.Common.Entities; [ToonDescription("Pallet type definition with size and weight")] [Table(Name = FruitBankConstClient.PalletDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.PalletDbTableName)] -public class Pallet : MgEntityBase, IPallet +public sealed class Pallet : MgEntityBase, IPallet { public string Name { get; set; } public string Size { get; set; } diff --git a/FruitBank.Common/Entities/Partner.cs b/FruitBank.Common/Entities/Partner.cs index 1d6b8fff..f4793dee 100644 --- a/FruitBank.Common/Entities/Partner.cs +++ b/FruitBank.Common/Entities/Partner.cs @@ -10,24 +10,8 @@ namespace FruitBank.Common.Entities; [ToonDescription("Business partner with address and tax information", Purpose = "Represents an external legal entity, specifically a Supplier who provides goods or a business partner involved in the procurement chain")] [Table(Name = FruitBankConstClient.PartnerDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.PartnerDbTableName)] -public class Partner : MgEntityBase, IPartner +public sealed class Partner : PartnerBase, IPartner { - public string Name { get; set; } - public string TaxId { get; set; } - public string CertificationNumber { get; set; } - - public string PostalCode { get; set; } - public string Country { get; set; } - public string State { get; set; } - public string County { get; set; } - public string City { get; set; } - public string Street { get; set; } - [Association(ThisKey = nameof(Id), OtherKey = nameof(ShippingDocument.ShippingId), CanBeNull = true)] public List? ShippingDocuments { get; set; } - - - [SkipValuesOnUpdate] - public DateTime Created { get; set; } - public DateTime Modified { get; set; } } \ No newline at end of file diff --git a/FruitBank.Common/Entities/PartnerBase.cs b/FruitBank.Common/Entities/PartnerBase.cs new file mode 100644 index 00000000..74bd8f7a --- /dev/null +++ b/FruitBank.Common/Entities/PartnerBase.cs @@ -0,0 +1,25 @@ +using FruitBank.Common.Interfaces; +using LinqToDB.Mapping; +using Mango.Nop.Core.Entities; + +namespace FruitBank.Common.Entities; + +public abstract class PartnerBase : MgEntityBase, IPartnerBase +{ + public string Name { get; set; } + public string TaxId { get; set; } + public string CertificationNumber { get; set; } + + public string CountryCode { get; set; } + public string PostalCode { get; set; } + public string Country { get; set; } + public string State { get; set; } + public string County { get; set; } + public string City { get; set; } + public string Street { get; set; } + + + [SkipValuesOnUpdate] + public DateTime Created { get; set; } + public DateTime Modified { get; set; } +} \ No newline at end of file diff --git a/FruitBank.Common/Entities/Preorder.cs b/FruitBank.Common/Entities/Preorder.cs index 781fd7fe..a9c987be 100644 --- a/FruitBank.Common/Entities/Preorder.cs +++ b/FruitBank.Common/Entities/Preorder.cs @@ -1,12 +1,16 @@ -using FruitBank.Common.Enums; +using AyCode.Core.Serializers.Attributes; +using AyCode.Core.Serializers.Toons; +using FruitBank.Common.Enums; using LinqToDB.Mapping; using Mango.Nop.Core.Entities; namespace FruitBank.Common.Entities; +[AcBinarySerializable(false, true, false, true, false, false)] [Table(Name = FruitBankConstClient.PreOrderDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.PreOrderDbTableName)] -public class Preorder : MgEntityBase +//[ToonDescription("Shipping document with partner, items and files", Purpose = "A digital representation of a supplier's delivery note or invoice associated with the shipment, used for reconciling paper-based data with measured reality")] +public sealed class Preorder : MgEntityBase { public int CustomerId { get; set; } public int StoreId { get; set; } diff --git a/FruitBank.Common/Entities/PreorderItem.cs b/FruitBank.Common/Entities/PreorderItem.cs index 0c94cb6e..54829345 100644 --- a/FruitBank.Common/Entities/PreorderItem.cs +++ b/FruitBank.Common/Entities/PreorderItem.cs @@ -1,12 +1,16 @@ -using FruitBank.Common.Enums; +using AyCode.Core.Serializers.Attributes; +using AyCode.Core.Serializers.Toons; +using FruitBank.Common.Enums; using LinqToDB.Mapping; using Mango.Nop.Core.Entities; namespace FruitBank.Common.Entities; +[AcBinarySerializable(false, true, false, true, false, false)] [Table(Name = FruitBankConstClient.PreOrderItemDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.PreOrderItemDbTableName)] -public class PreorderItem : MgEntityBase +//[ToonDescription("Shipping document with partner, items and files", Purpose = "A digital representation of a supplier's delivery note or invoice associated with the shipment, used for reconciling paper-based data with measured reality")] +public sealed class PreorderItem : MgEntityBase { public int PreorderId { get; set; } public int ProductId { get; set; } diff --git a/FruitBank.Common/Entities/Shipping.cs b/FruitBank.Common/Entities/Shipping.cs index c6a59dc3..85e4ae45 100644 --- a/FruitBank.Common/Entities/Shipping.cs +++ b/FruitBank.Common/Entities/Shipping.cs @@ -11,7 +11,7 @@ namespace FruitBank.Common.Entities; [ToonDescription("Shipping record with documents and measurement tracking", Purpose = "Represents a physical inbound delivery event (truck arrival) at the warehouse, tracking the vehicle and the overall measurement status of the shipment")] [Table(Name = FruitBankConstClient.ShippingDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.ShippingDbTableName)] -public class Shipping : MgEntityBase, IShipping, IEntityComment +public sealed class Shipping : MgEntityBase, IShipping, IEntityComment { public DateTime ShippingDate { get; set; } = DateTime.Now; public string LicencePlate { get; set; } diff --git a/FruitBank.Common/Entities/ShippingDocument.cs b/FruitBank.Common/Entities/ShippingDocument.cs index 5e21440f..ef51c669 100644 --- a/FruitBank.Common/Entities/ShippingDocument.cs +++ b/FruitBank.Common/Entities/ShippingDocument.cs @@ -11,7 +11,7 @@ namespace FruitBank.Common.Entities; [ToonDescription("Shipping document with partner, items and files", Purpose = "A digital representation of a supplier's delivery note or invoice associated with the shipment, used for reconciling paper-based data with measured reality")] [Table(Name = FruitBankConstClient.ShippingDocumentDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.ShippingDocumentDbTableName)] -public class ShippingDocument : MgEntityBase, IShippingDocument +public sealed class ShippingDocument : MgEntityBase, IShippingDocument { public int PartnerId { get; set; } public int? ShippingId { get; set; } diff --git a/FruitBank.Common/Entities/ShippingDocumentToFiles.cs b/FruitBank.Common/Entities/ShippingDocumentToFiles.cs index 6f0fc701..4b7947b5 100644 --- a/FruitBank.Common/Entities/ShippingDocumentToFiles.cs +++ b/FruitBank.Common/Entities/ShippingDocumentToFiles.cs @@ -12,7 +12,7 @@ namespace FruitBank.Common.Entities; [ToonDescription("Links shipping documents to files with document type", Purpose = "A many-to-many link table that associates general uploaded files with specific shipping documents, assigning a functional context (DocumentType) to each file, such as identifying which PDF is the supplier's invoice versus the packing list")] [LinqToDB.Mapping.Table(Name = FruitBankConstClient.ShippingDocumentToFilesDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.ShippingDocumentToFilesDbTableName)] -public class ShippingDocumentToFiles : MgEntityBase, IShippingDocumentToFiles +public sealed class ShippingDocumentToFiles : MgEntityBase, IShippingDocumentToFiles { public int FilesId { get; set; } diff --git a/FruitBank.Common/Entities/ShippingItemPallet.cs b/FruitBank.Common/Entities/ShippingItemPallet.cs index e94ae084..e7b7c59a 100644 --- a/FruitBank.Common/Entities/ShippingItemPallet.cs +++ b/FruitBank.Common/Entities/ShippingItemPallet.cs @@ -12,7 +12,7 @@ namespace FruitBank.Common.Entities; [ToonDescription("Pallet measurements for shipping items", Purpose = "The smallest unit of measurement tracking, representing a single physical measurement event. NOTE: Technically named 'Pallet' for legacy reasons, but it is ALWAYS created even if goods arrive without a physical pallet. For non-measurable products, weights are 0.0 and only TrayQuantity is tracked for tare-weight calculations.")] [LinqToDB.Mapping.Table(Name = FruitBankConstClient.ShippingItemPalletDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.ShippingItemPalletDbTableName)] -public class ShippingItemPallet : MeasuringItemPalletBase, IShippingItemPallet +public sealed class ShippingItemPallet : MeasuringItemPalletBase, IShippingItemPallet { public int ShippingItemId { diff --git a/FruitBank.Common/Entities/StockQuantityHistoryExt.cs b/FruitBank.Common/Entities/StockQuantityHistoryExt.cs index 07d9a976..ef8fd622 100644 --- a/FruitBank.Common/Entities/StockQuantityHistoryExt.cs +++ b/FruitBank.Common/Entities/StockQuantityHistoryExt.cs @@ -19,7 +19,7 @@ namespace FruitBank.Common.Entities [Table(Name = FruitBankConstClient.StockQuantityHistoryExtDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.StockQuantityHistoryExtDbTableName)] [ToonDescription("Extended weight-metadata for StockQuantityHistory", Purpose = "Validates quantity deltas against measured weight to detect inconsistencies")] - public class StockQuantityHistoryExt : MgEntityBase, IStockQuantityHistoryExt + public sealed class StockQuantityHistoryExt : MgEntityBase, IStockQuantityHistoryExt { public int StockQuantityHistoryId { get; set; } diff --git a/FruitBank.Common/Entities/StockTaking.cs b/FruitBank.Common/Entities/StockTaking.cs index d69075c3..18406a8c 100644 --- a/FruitBank.Common/Entities/StockTaking.cs +++ b/FruitBank.Common/Entities/StockTaking.cs @@ -9,7 +9,7 @@ namespace FruitBank.Common.Entities; [ToonDescription("Inventory session record", Purpose = "Orchestrates inventory sessions by freezing logical stock states")] [Table(Name = FruitBankConstClient.StockTakingDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.StockTakingDbTableName)] -public class StockTaking : MgStockTaking +public sealed class StockTaking : MgStockTaking { public override bool IsReadyForClose() { diff --git a/FruitBank.Common/Entities/StockTakingItem.cs b/FruitBank.Common/Entities/StockTakingItem.cs index 8883374e..93c21e02 100644 --- a/FruitBank.Common/Entities/StockTakingItem.cs +++ b/FruitBank.Common/Entities/StockTakingItem.cs @@ -15,7 +15,7 @@ namespace FruitBank.Common.Entities; [ToonDescription("Line item for product reconciliation", Purpose = "Reconciles snapshot quantity with physical count to calculate final stock delta")] [Table(Name = FruitBankConstClient.StockTakingItemDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.StockTakingItemDbTableName)] -public class StockTakingItem : MgStockTakingItem +public sealed class StockTakingItem : MgStockTakingItem { public bool IsMeasurable { get; set; } diff --git a/FruitBank.Common/Entities/StockTakingItemPallet.cs b/FruitBank.Common/Entities/StockTakingItemPallet.cs index 3bb65087..c799944d 100644 --- a/FruitBank.Common/Entities/StockTakingItemPallet.cs +++ b/FruitBank.Common/Entities/StockTakingItemPallet.cs @@ -18,7 +18,7 @@ public interface IStockTakingItemPallet : IMeasuringItemPalletBase [ToonDescription("Weight record for inventory item", Purpose = "Granular weight-based evidence for a stock taking line item. NOTE: This record is mandatory for every inventory item. If weighing is skipped (non-measurable), it serves as a container for TrayQuantity with zeroed weight fields. The term 'Pallet' is a legacy naming convention.")] [LinqToDB.Mapping.Table(Name = FruitBankConstClient.StockTakingItemPalletDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.StockTakingItemPalletDbTableName)] -public class StockTakingItemPallet : MeasuringItemPalletBase, IStockTakingItemPallet +public sealed class StockTakingItemPallet : MeasuringItemPalletBase, IStockTakingItemPallet { public int StockTakingItemId { diff --git a/FruitBank.Common/FruitBankConstClient.cs b/FruitBank.Common/FruitBankConstClient.cs index b6d0ed53..a6e97f58 100644 --- a/FruitBank.Common/FruitBankConstClient.cs +++ b/FruitBank.Common/FruitBankConstClient.cs @@ -49,6 +49,9 @@ public static class FruitBankConstClient public const string PreOrderDbTableName = "fbPreorder"; public const string PreOrderItemDbTableName = "fbPreorderItem"; + public const string CargoPartnerDbTableName = "fbCargoPartner"; + public const string CargoTruckDbTableName = "fbCargoTruck"; + public const string DomainDescription = "This is a nopCommerce plugin developed for FruitBank, a fruit and vegetable wholesaler. The plugin manages supplier inbound delivery (receiving), warehouse weighing (net/gross/pallet/tare weights), and inventory stocktaking. The business logic is centered around FruitBank's requirement for precise physical measurement and quantity tracking."; //public static Guid[] DevAdminIds = new Guid[2] { Guid.Parse("dcf451d2-cc4c-4ac2-8c1f-da00041be1fd"), Guid.Parse("4cbaed43-2465-4d99-84f1-c8bc6b7025f7") }; diff --git a/FruitBank.Common/Interfaces/IPartner.cs b/FruitBank.Common/Interfaces/IPartner.cs index 24d5a552..f5f53ab3 100644 --- a/FruitBank.Common/Interfaces/IPartner.cs +++ b/FruitBank.Common/Interfaces/IPartner.cs @@ -4,17 +4,27 @@ using FruitBank.Common.Entities; namespace FruitBank.Common.Interfaces; -public interface IPartner : IEntityInt, ITimeStampInfo + +public interface ICargoPartner : IPartnerBase +{ + List? CargoTrucks { get; set; } +} + +public interface IPartner : IPartnerBase +{ + List? ShippingDocuments { get; set; } +} + +public interface IPartnerBase : IEntityInt, ITimeStampInfo { string Name { get; set; } string TaxId { get; set; } string CertificationNumber { get; set; } + string CountryCode { get; set; } string PostalCode { get; set; } string Country { get; set; } string State { get; set; } string County { get; set; } string City { get; set; } string Street { get; set; } - - List? ShippingDocuments { get; set; } } \ No newline at end of file diff --git a/FruitBankHybrid.Shared/Databases/DatabaseClient.cs b/FruitBankHybrid.Shared/Databases/DatabaseClient.cs index 65e0cc87..29ba205c 100644 --- a/FruitBankHybrid.Shared/Databases/DatabaseClient.cs +++ b/FruitBankHybrid.Shared/Databases/DatabaseClient.cs @@ -19,14 +19,11 @@ using AyCode.Core.Helpers; namespace FruitBankHybrid.Shared.Databases; -public class ShippingTableItem : Shipping -{ } -public class ShippingDocumentTableItem : ShippingDocument -{ } +//public class ShippingTableItem : Shipping { } +//public class ShippingDocumentTableItem : ShippingDocument { } public class ShippingItemTableItem : ShippingItem { } -public class ShippingItemPalletTableItem : ShippingItemPallet -{ } +//public class ShippingItemPalletTableItem : ShippingItemPallet { } public class ProductDtoTableItem : ProductDto { //[Newtonsoft.Json.JsonProperty] diff --git a/FruitBankHybrid.Shared/appsettings.json b/FruitBankHybrid.Shared/appsettings.json index 0757ca8f..82af839e 100644 --- a/FruitBankHybrid.Shared/appsettings.json +++ b/FruitBankHybrid.Shared/appsettings.json @@ -38,7 +38,7 @@ "AcBinaryHubProtocol": { "ProtocolMode": "AsyncSegment", "BufferSize": 4096, - "FlushPolicy": "DoubleBuffered", + "FlushPolicy": "Coalesced", "FlushTimeout": "00:00:10" } } diff --git a/FruitBankHybrid.Web.Client/wwwroot/appsettings.json b/FruitBankHybrid.Web.Client/wwwroot/appsettings.json index 0757ca8f..82af839e 100644 --- a/FruitBankHybrid.Web.Client/wwwroot/appsettings.json +++ b/FruitBankHybrid.Web.Client/wwwroot/appsettings.json @@ -38,7 +38,7 @@ "AcBinaryHubProtocol": { "ProtocolMode": "AsyncSegment", "BufferSize": 4096, - "FlushPolicy": "DoubleBuffered", + "FlushPolicy": "Coalesced", "FlushTimeout": "00:00:10" } } diff --git a/FruitBankHybrid.Web/appsettings.json b/FruitBankHybrid.Web/appsettings.json index 0757ca8f..82af839e 100644 --- a/FruitBankHybrid.Web/appsettings.json +++ b/FruitBankHybrid.Web/appsettings.json @@ -38,7 +38,7 @@ "AcBinaryHubProtocol": { "ProtocolMode": "AsyncSegment", "BufferSize": 4096, - "FlushPolicy": "DoubleBuffered", + "FlushPolicy": "Coalesced", "FlushTimeout": "00:00:10" } }