using System.Globalization; using System.Linq.Expressions; using FruitBank.Common.Entities; using FruitBank.Common.Interfaces; using LinqToDB.Mapping; using Mango.Nop.Core.Dtos; using Newtonsoft.Json; using Nop.Core; using Nop.Core.Domain.Common; using Nop.Core.Domain.Orders; namespace FruitBank.Common.Dtos; public class OrderItemDto : MgOrderItemDto, IOrderItemDto { [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] private static Expression> RelationWithGenericAttribute => (orderItemDto, genericAttribute) => orderItemDto.Id == genericAttribute.EntityId && genericAttribute.KeyGroup == nameof(OrderItem); [Association(ThisKey = nameof(Id), OtherKey = nameof(GenericAttribute.EntityId), ExpressionPredicate = nameof(RelationWithGenericAttribute), CanBeNull = true)] public List GenericAttributes { get; set; } [Association(ThisKey = nameof(Id), OtherKey = nameof(OrderItemPallet.OrderItemId), CanBeNull = true)] public List OrderItemPallets { get; set; } [Association(ThisKey = nameof(OrderId), OtherKey = nameof(OrderDto.Id), CanBeNull = false)] public OrderDto OrderDto { get; set; } [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public bool IsMeasured { get => IsMeasuredAndValid(); set => throw new Exception($"OrderItemDto.IsMeasured not set"); } [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public bool IsMeasurable { get => ProductDto!.IsMeasurable; set => throw new Exception($"OrderItemDto.IsMeasurable not set"); } [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public int TrayQuantity { get => OrderItemPallets.Sum(x => x.TrayQuantity); set => throw new Exception($"OrderItemDto.TrayQuantity not set"); } [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public double NetWeight { get { return double.Round(OrderItemPallets.Sum(x => x.NetWeight), 1); //return CommonHelper.To(GenericAttributes.SingleOrDefault(x => x.Key == nameof(IMeasuringNetWeight.NetWeight))?.Value ?? "0"); } set { throw new Exception($"OrderItemDto.NetWeight not set"); ////Direkt legyen exception! - J. //var ga = GenericAttributes?.SingleOrDefault(x => x.Key == nameof(IMeasuringNetWeight.NetWeight))!; //ga.Value = value.ToString(CultureInfo.InvariantCulture); } } [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public double GrossWeight { get { return double.Round(OrderItemPallets.Sum(x => x.NetWeight), 1); //CommonHelper.To(GenericAttributes.SingleOrDefault(x => x.Key == nameof(IMeasuringGrossWeight.GrossWeight))?.Value ?? "0"); } set { throw new Exception($"OrderItemDto.GrossWeight not set"); //Direkt legyen exception! - J. var ga = GenericAttributes?.SingleOrDefault(x => x.Key == nameof(IMeasuringGrossWeight.GrossWeight))!; ga.Value = value.ToString(CultureInfo.InvariantCulture); } } public OrderItemDto() : base() { } public OrderItemDto(int orderItemId) : base(orderItemId) { } public OrderItemDto(OrderItem orderItem) : base(orderItem) { } public void CopyEntityValuesToDto(OrderItem entity, ProductDto productDto, List orderItemPallets) { base.CopyEntityValuesToDto(entity, productDto); InitializeOrderItemPallets(orderItemPallets); } public void InitializeOrderItemPallets(List orderItemPallets) { OrderItemPallets = orderItemPallets; } public bool IsMeasuredAndValid() => Id > 0 && IsValidMeasuringValues() && OrderItemPallets.All(oip => oip.IsMeasuredAndValid(IsMeasurable)); public bool IsValidMeasuringValues() => OrderItemPallets.Count > 0 && (!IsMeasurable || NetWeight > 0) && TrayQuantity == Quantity; public bool IsOtherMeasuringInProgress(int? customerId) => customerId.GetValueOrDefault(0) != 0 && OrderItemPallets.Any(oip => oip.Id > 0 && oip.CreatorId.GetValueOrDefault(0) != customerId); }