using AyCode.Interfaces.Entities; using AyCode.Interfaces.TimeStampInfo; using Newtonsoft.Json; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq.Expressions; using static System.Net.Mime.MediaTypeNames; namespace AyCode.Core.Tests.Serialization; public abstract partial class BaseEntity : IBaseEntity { /// /// Gets or sets the entity identifier /// public int Id { get; set; } public override string ToString() { return $"{GetType().Name} [Id: {Id}]"; } } public interface IBaseEntity //: IEntityInt { public int Id { get; set; } } public abstract class MgEntityBase : BaseEntity, IEntityInt { public override string ToString() { return $"{GetType().Name}; Id: {Id}"; } } public interface IMgStockTaking : IEntityInt, ITimeStampInfo { DateTime StartDateTime { get; set; } bool IsClosed { get; set; } bool IsReadyForClose(); } public abstract class MgStockTaking : MgEntityBase, IMgStockTaking where TStockTakingItem : class, IMgStockTakingItem { public DateTime StartDateTime { get; set; } public bool IsClosed { get; set; } public abstract bool IsReadyForClose(); public List? StockTakingItems { get; set; } public int Creator { get; set; } public DateTime Created { get; set; } public DateTime Modified { get; set; } } public interface IMgStockTakingItem : IEntityInt, ITimeStampInfo { int StockTakingId { get; set; } int ProductId { get; set; } bool IsMeasured { get; set; } int OriginalStockQuantity { get; set; } int MeasuredStockQuantity { get; set; } } public abstract class MgStockTakingItem : MgEntityBase, IMgStockTakingItem where TStockTaking : class, IMgStockTaking where TProduct : class, IMgProductDto { public int StockTakingId { get; set; } public int ProductId { get; set; } public bool IsMeasured { get; set; } public int OriginalStockQuantity { get; set; } public int MeasuredStockQuantity { get; set; } public TStockTaking? StockTaking { get; set; } public TProduct? Product { get; set; } public DateTime Created { get; set; } public DateTime Modified { get; set; } } public class StockTaking : MgStockTaking { public override bool IsReadyForClose() { if (StockTakingItems == null || StockTakingItems.Count == 0) return false; return StockTakingItems .Where(stockTakingItem => stockTakingItem is { IsRequiredForMeasuring: true, IsInvalid: false }) .All(x => x.IsMeasured); } } public class StockTakingItem : MgStockTakingItem { public bool IsMeasurable { get; set; } public double OriginalNetWeight { get; set; } public double MeasuredNetWeight { get; set; } public int InProcessOrdersQuantity { get; set; } [NotMapped, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public int TotalOriginalQuantity => OriginalStockQuantity + InProcessOrdersQuantity; [NotMapped, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public int QuantityDiff => IsMeasured ? MeasuredStockQuantity - TotalOriginalQuantity : 0; [NotMapped, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public double NetWeightDiff => IsMeasurable && IsMeasured ? double.Round(MeasuredNetWeight - OriginalNetWeight, 1) : 0d; public List? StockTakingItemPallets { get; set; } [NotMapped, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public bool IsRequiredForMeasuring => !IsInvalid && (TotalOriginalQuantity != 0 || OriginalNetWeight != 0); [NotMapped, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public bool IsInvalid => TotalOriginalQuantity < 0; [NotMapped, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public string DisplayText { get { if (IsInvalid) return $"[HIBA] {Product!.Name}"; if (IsMeasured) return $"[KÉSZ] {Product!.Name}"; return IsRequiredForMeasuring ? $"[KÖT] {Product!.Name}" : $"{Product!.Name}"; } } } public class StockTakingItemPallet : MeasuringItemPalletBase { public int StockTakingItemId { get => ForeignItemId; set => ForeignItemId = value; } public StockTakingItem? StockTakingItem { get; set; } public override double CalculateNetWeight() => base.CalculateNetWeight(); public override bool IsValidSafeMeasuringValues() { return StockTakingItemId > 0 && TrayQuantity >= 0 && TareWeight >= 0 && PalletWeight >= 0 && NetWeight >= 0 && GrossWeight >= 0; } public override bool IsValidMeasuringValues(bool isMeasurable) { return StockTakingItemId > 0 && TrayQuantity >= 0 && ((!isMeasurable && NetWeight == 0 && GrossWeight == 0 && PalletWeight == 0 && TareWeight == 0) || (isMeasurable && NetWeight >= 0 && GrossWeight >= 0 && PalletWeight >= 0 && TareWeight >= 0)); } public override void SetParentPropToNull() => StockTakingItem = null; } public abstract class MeasuringItemPalletBase : MgEntityBase { private double _palletWeight; private double _grossWeight; private double _tareWeight; protected int ForeignItemId; public int ForeignKey => ForeignItemId; public int TrayQuantity { get; set; } public double TareWeight { get => _tareWeight; set => _tareWeight = double.Round(value, 1); } public double PalletWeight { get => _palletWeight; set => _palletWeight = double.Round(value, 0); } [System.ComponentModel.DataAnnotations.Schema.NotMapped, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public double NetWeight { get => CalculateNetWeight(); set => throw new Exception($"MeasuringItemPalletBase.NetWeight not set"); } public double GrossWeight { get => _grossWeight; set => _grossWeight = double.Round(value, 1); } public bool IsMeasured { get; set; } public int? CreatorId { get; set; } public int? ModifierId { get; set; } public DateTime Created { get; set; } public DateTime Modified { get; set; } public abstract void SetParentPropToNull(); public void SetForeignKey(int foreignKey) => ForeignItemId = foreignKey; public virtual double CalculateNetWeight() => double.Round(GrossWeight - PalletWeight - (TareWeight * TrayQuantity), 1); public virtual bool IsValidSafeMeasuringValues() { return TrayQuantity > 0 && TareWeight >= 0 && PalletWeight >= 0 && NetWeight >= 0 && GrossWeight >= 0; } public virtual bool IsValidMeasuringValues(bool isMeasurable) { return TrayQuantity > 0 && ((!isMeasurable && NetWeight == 0 && GrossWeight == 0 && PalletWeight == 0 && TareWeight == 0) || (isMeasurable && NetWeight > 0 && GrossWeight > 0 && PalletWeight >= 0 && TareWeight >= 0)); } public bool IsMeasuredAndValid(bool isMeasurable) { return Id > 0 && IsMeasured && IsValidMeasuringValues(isMeasurable); } public virtual void SetupCustomItemPalletMeauringValues(bool isMeasurable) { if (!isMeasurable) { TareWeight = 0; PalletWeight = 0; GrossWeight = 0; } IsMeasured = IsValidMeasuringValues(isMeasurable); } public override string ToString() { return $"{base.ToString()} [ForeignItemId: {ForeignItemId}; IsMeasured: {IsMeasured}; PalletWeight: {PalletWeight}; TareWeight: {TareWeight}; Quantity: {TrayQuantity}; NetWeight: {NetWeight}; GrossWeight: {GrossWeight}]"; } } public interface IMgProductDto : IEntityInt { int ProductTypeId { get; set; } int ParentGroupedProductId { get; set; } string Name { get; set; } string ShortDescription { get; set; } string FullDescription { get; set; } int WarehouseId { get; set; } decimal Price { get; set; } int StockQuantity { get; set; } decimal ProductCost { get; set; } decimal Weight { get; set; } decimal Length { get; set; } decimal Width { get; set; } decimal Height { get; set; } } public class ProductDto : MgProductDto { public List GenericAttributes { get; set; } public ProductDto() :base() { } public ProductDto(int productId) : base(productId) { } //public ProductDto(Product product) : base(product) //{ } [NotMapped, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public int AvailableQuantity => StockQuantity; public bool HasMeasuringValues() => Id > 0; } public abstract class MgProductDto : MgEntityBase, /*Product,*/ IMgProductDto//IModelDtoBase//, IDiscountSupported { //public int Id { get; set; } public int ProductTypeId { get; set; } public int ParentGroupedProductId { get; set; } public string Name { get; set; } public string ShortDescription { get; set; } public string FullDescription { get; set; } public int WarehouseId { get; set; } public decimal Price { get; set; } public int StockQuantity { get; set; } public decimal ProductCost { get; set; } public decimal Weight { get; set; } public decimal Length { get; set; } public decimal Width { get; set; } public decimal Height { get; set; } public bool Deleted { get; set; } public bool SubjectToAcl { get; set; } public bool LimitedToStores { get; set; } protected MgProductDto() :base() { } protected MgProductDto(int productId) { Id = productId; } } public class GenericAttributeDto : MgGenericAttributeDto { } public abstract class MgGenericAttributeDto : GenericAttribute { public GenericAttribute CreateMainEntity() { var mainEntity = Activator.CreateInstance(); CopyDtoValuesToEntity(mainEntity); mainEntity.CreatedOrUpdatedDateUTC = DateTime.UtcNow; return mainEntity; } public void CopyDtoValuesToEntity(GenericAttribute entity) { entity.Id = Id; entity.Key = Key; entity.Value = Value; entity.EntityId = EntityId; entity.KeyGroup = KeyGroup; entity.StoreId = StoreId; entity.CreatedOrUpdatedDateUTC = CreatedOrUpdatedDateUTC; } public void CopyEntityValuesToDto(GenericAttribute entity) { Id = entity.Id; Key = entity.Key; Value = entity.Value; EntityId = entity.EntityId; KeyGroup = entity.KeyGroup; StoreId = entity.StoreId; CreatedOrUpdatedDateUTC = entity.CreatedOrUpdatedDateUTC; } } public partial class GenericAttribute : BaseEntity { /// /// Gets or sets the entity identifier /// public int EntityId { get; set; } /// /// Gets or sets the key group /// public string KeyGroup { get; set; } /// /// Gets or sets the key /// public string Key { get; set; } /// /// Gets or sets the value /// public string Value { get; set; } /// /// Gets or sets the store identifier /// public int StoreId { get; set; } /// /// Gets or sets the created or updated date /// public DateTime? CreatedOrUpdatedDateUTC { get; set; } }