using AyCode.Core.Extensions; using AyCode.Utils.Extensions; using FruitBank.Common.Entities; using FruitBank.Common.Interfaces; using LinqToDB.Mapping; using Mango.Nop.Core.Dtos; using Mango.Nop.Core.Interfaces; using Newtonsoft.Json; using Nop.Core; using Nop.Core.Domain.Catalog; using Nop.Core.Domain.Common; using Nop.Core.Domain.Orders; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Linq.Expressions; using Mango.Nop.Core.Extensions; namespace FruitBank.Common.Dtos; public class OrderDto : MgOrderDto, IOrderDto { [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] private static Expression> RelationWithGenericAttribute => (orderDto, genericAttribute) => orderDto.Id == genericAttribute.EntityId && genericAttribute.KeyGroup == nameof(Order); [Association(ThisKey = nameof(Id), OtherKey = nameof(GenericAttribute.EntityId), ExpressionPredicate = nameof(RelationWithGenericAttribute), CanBeNull = true)] public List GenericAttributes { get; set; } [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public bool IsMeasured { get => IsMeasuredAndValid(); set => throw new Exception($"OrderDto.IsMeasured not set"); } [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public bool IsMeasurable { get => OrderItemDtos.Any(oi => oi.IsMeasurable); set => throw new Exception($"OrderDto.IsMeasurable not set"); } [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public string TimeOfReceiptText => $"{DateOfReceiptOrCreated:H:mm} - {Customer.Company}"; [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public DateTime DateOfReceiptOrCreated => DateOfReceipt ?? CreatedOnUtc; [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public DateTime? DateOfReceipt => GenericAttributes.GetValueOrNull(nameof(IOrderDto.DateOfReceipt)); //if (GenericAttributes.TryGetValue(nameof(IOrderDto.DateOfReceipt), out var value)) return value; //var dateOfReceipt = GenericAttributes.SingleOrDefault(x => x.Key == nameof(IOrderDto.DateOfReceipt))?.Value ?? string.Empty; //return dateOfReceipt.IsNullOrWhiteSpace() ? null : CommonHelper.To(dateOfReceipt); public OrderDto() :base() { } public OrderDto(int orderId) : base(orderId) { } public OrderDto(Order order) : base(order) { } public bool IsMeasuredAndValid() => Id > 0 && OrderItemDtos.Count > 0 && OrderItemDtos.All(x => x.IsMeasured); public bool IsValidMeasuringValues() => OrderItemDtos.Count > 0 && OrderItemDtos.All(x => x.IsValidMeasuringValues()); }