using AyCode.Core.Interfaces; using FruitBank.Common.Dtos; using FruitBank.Common.Enums; using FruitBank.Common.Interfaces; using LinqToDB; using LinqToDB.Mapping; using Mango.Nop.Core.Entities; using Newtonsoft.Json; using Nop.Core.Domain.Customers; using Nop.Core.Domain.Orders; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; //using Nop.Core.Domain.Catalog; using DataType = LinqToDB.DataType; using Column = LinqToDB.Mapping.ColumnAttribute; using Table = LinqToDB.Mapping.TableAttribute; namespace FruitBank.Common.Entities; [Table(Name = FruitBankConstClient.ShippingItemDbTableName)] [System.ComponentModel.DataAnnotations.Schema.Table(FruitBankConstClient.ShippingItemDbTableName)] public class ShippingItem : MgEntityBase, IShippingItem { public int ShippingDocumentId { get; set; } public int? PalletId { get; set; } public int? ProductId { get; set; } public string Name { get; set; } public string NameOnDocument { get; set; } public string HungarianName { get; set; } /// /// get => ProductDto?.Name ?? Name /// [NotColumn, NotMapped, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public string ProductName => ProductDto?.Name ?? Name; public int PalletsOnDocument { get; set; } public int QuantityOnDocument { get; set; } [Column(DataType = DataType.DecFloat)] public double NetWeightOnDocument { get; set; } [Column(DataType = DataType.DecFloat)] public double GrossWeightOnDocument { get; set; } [Column(DataType = DataType.DecFloat)] public double UnitPriceOnDocument { get; set; } /// /// Általában megegyezik a PalletsOnDocument-el, de minimum 1! Ha nincs raklap, akkor is 1! Néha előfordulhat, hogy kevesebb raklap érkezik és olyankor kell tudni módosítani a mérések számát. /// [Range(1, 100000, ErrorMessage = "The MeasuringCount value should be a number between 1 and 100,000.")] public int MeasuringCount { get; set; } = 1; //[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; } //[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; } //[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 bool IsMeasurable { get; set; } public bool IsMeasured { get; set; } [LinqToDB.Mapping.Association(ThisKey = nameof(PalletId), OtherKey = nameof(Pallet.Id), CanBeNull = true)] public Pallet? Pallet { get; set; } [LinqToDB.Mapping.Association(ThisKey = nameof(ProductId), OtherKey = nameof(ProductDto.Id), CanBeNull = true)] public ProductDto? ProductDto { get; set; } [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; } [NotColumn, NotMapped, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public MeasuringStatus MeasuringStatus { get { if (IsMeasured) return MeasuringStatus.Finnished; return ShippingItemPallets?.Any(oip => oip.MeasuringStatus == MeasuringStatus.Started) ?? false ? MeasuringStatus.Started : MeasuringStatus.NotStarted; } } public bool IsValidMeasuringValues() { return /*ProductId > 0 && */MeasuringCount > 0 && MeasuredQuantity > 0 && (!IsMeasurable || (MeasuredNetWeight > 0 && MeasuredGrossWeight > 0)); } }