diff --git a/FruitBank.Common/Dtos/OrderDto.cs b/FruitBank.Common/Dtos/OrderDto.cs index ffdd599..5d9df04 100644 --- a/FruitBank.Common/Dtos/OrderDto.cs +++ b/FruitBank.Common/Dtos/OrderDto.cs @@ -1,8 +1,11 @@ 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; @@ -10,13 +13,12 @@ using Nop.Core.Domain.Orders; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Linq.Expressions; -using Newtonsoft.Json; namespace FruitBank.Common.Dtos; public class OrderDto : MgOrderDto, IOrderDto { - [NotColumn] + [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] private static Expression> RelationWithGenericAttribute => (orderDto, genericAttribute) => orderDto.Id == genericAttribute.EntityId && genericAttribute.KeyGroup == nameof(Order); @@ -24,6 +26,26 @@ public class OrderDto : MgOrderDto, IOrderDto [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 => OrderItemDtos.All(oi => oi.IsMeasured); + + [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 DateTime DateOfReceipt + { + get + { + var dateOfReceipt = GenericAttributes.SingleOrDefault(x => x.Key == nameof(IOrderDto.DateOfReceipt))?.Value ?? string.Empty; + return dateOfReceipt.IsNullOrWhiteSpace() ? CreatedOnUtc : CommonHelper.To(dateOfReceipt); + } + } + public OrderDto() :base() { } public OrderDto(int orderId) : base(orderId) diff --git a/FruitBank.Common/Dtos/OrderItemDto.cs b/FruitBank.Common/Dtos/OrderItemDto.cs index fbe06ae..ed5b0a7 100644 --- a/FruitBank.Common/Dtos/OrderItemDto.cs +++ b/FruitBank.Common/Dtos/OrderItemDto.cs @@ -11,9 +11,9 @@ using Nop.Core.Domain.Orders; namespace FruitBank.Common.Dtos; -public class OrderItemDto : MgOrderItemDto, IOrderItemDto, IMeasuringNetWeight +public class OrderItemDto : MgOrderItemDto, IOrderItemDto { - [NotColumn] + [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] private static Expression> RelationWithGenericAttribute => (orderItemDto, genericAttribute) => orderItemDto.Id == genericAttribute.EntityId && genericAttribute.KeyGroup == nameof(OrderItem); @@ -24,20 +24,28 @@ public class OrderItemDto : MgOrderItemDto, IOrderItemDto, IMeasurin [Association(ThisKey = nameof(Id), OtherKey = nameof(OrderItemPallet.OrderItemId), CanBeNull = true)] public List OrderItemPallets { get; set; } - [NotColumn] - [JsonIgnore] - [System.Text.Json.Serialization.JsonIgnore] + [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public double NetWeight { - get => CommonHelper.To(GenericAttributes?.FirstOrDefault(x => x.Key == nameof(IMeasuringNetWeight.NetWeight))?.Value ?? "0"); + get => CommonHelper.To(GenericAttributes.SingleOrDefault(x => x.Key == nameof(IMeasuringNetWeight.NetWeight))?.Value ?? "0"); set { //Direkt legyen exception! - J. - var ga = GenericAttributes?.FirstOrDefault(x => x.Key == nameof(IMeasuringNetWeight.NetWeight))!; + var ga = GenericAttributes?.SingleOrDefault(x => x.Key == nameof(IMeasuringNetWeight.NetWeight))!; ga.Value = value.ToString(CultureInfo.InvariantCulture); } } + [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] + public bool IsMeasured => OrderItemPallets.All(oip => oip.IsMeasured); + + [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] + public bool IsMeasurable + { + get => ProductDto!.IsMeasurable; + set => throw new Exception($"OrderItemDto.IsMeasurable not set"); + } + public OrderItemDto() : base() { } diff --git a/FruitBank.Common/Dtos/ProductDto.cs b/FruitBank.Common/Dtos/ProductDto.cs index cecadd7..920232e 100644 --- a/FruitBank.Common/Dtos/ProductDto.cs +++ b/FruitBank.Common/Dtos/ProductDto.cs @@ -1,15 +1,43 @@ using FruitBank.Common.Interfaces; +using LinqToDB.Mapping; using Mango.Nop.Core.Dtos; +using Newtonsoft.Json; +using Nop.Core; using Nop.Core.Domain.Catalog; +using Nop.Core.Domain.Common; +using Nop.Core.Domain.Orders; +using System.Globalization; +using System.Linq.Expressions; namespace FruitBank.Common.Dtos; public class ProductDto : MgProductDto, IProductDto { + [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] + private static Expression> RelationWithGenericAttribute => (orderItemDto, genericAttribute) => + orderItemDto.Id == genericAttribute.EntityId && genericAttribute.KeyGroup == nameof(Product); + + + [Association(ThisKey = nameof(Id), OtherKey = nameof(GenericAttribute.EntityId), ExpressionPredicate = nameof(RelationWithGenericAttribute), CanBeNull = true)] + public List GenericAttributes { get; set; } + public ProductDto() :base() { } public ProductDto(int productId) : base(productId) { } public ProductDto(Product product) : base(product) { } + + [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] + public bool IsMeasurable + { + get => CommonHelper.To(GenericAttributes.SingleOrDefault(x => x.Key == nameof(IMeasurable.IsMeasurable))?.Value ?? "false"); + set + { + //Direkt legyen exception! - J. + var ga = GenericAttributes.SingleOrDefault(x => x.Key == nameof(IMeasurable.IsMeasurable))!; + ga.Value = value.ToString(); + } + + } } \ No newline at end of file diff --git a/FruitBank.Common/Entities/OrderItemPallet.cs b/FruitBank.Common/Entities/OrderItemPallet.cs index 44ba3ca..993c6d5 100644 --- a/FruitBank.Common/Entities/OrderItemPallet.cs +++ b/FruitBank.Common/Entities/OrderItemPallet.cs @@ -14,7 +14,7 @@ public class OrderItemPallet : MeasuringItemPalletBase, IOrderItemPallet set => ForeignItemId = value; } - [LinqToDB.Mapping.Association(ThisKey = nameof(OrderItemId), OtherKey = nameof(OrderItem.Id), CanBeNull = true)] + [Association(ThisKey = nameof(OrderItemId), OtherKey = nameof(OrderItem.Id), CanBeNull = true)] public OrderItem? OrderItem { get; set; } public override double CalculateNetWeight() => base.CalculateNetWeight(); diff --git a/FruitBank.Common/FruitBank.Common.csproj b/FruitBank.Common/FruitBank.Common.csproj index 030b2d0..d0e9d1d 100644 --- a/FruitBank.Common/FruitBank.Common.csproj +++ b/FruitBank.Common/FruitBank.Common.csproj @@ -31,6 +31,9 @@ ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll + + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Utils.dll + ..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll diff --git a/FruitBank.Common/Interfaces/ICustomOrderSignalREndpointCommon.cs b/FruitBank.Common/Interfaces/ICustomOrderSignalREndpointCommon.cs index dfc0893..7c39269 100644 --- a/FruitBank.Common/Interfaces/ICustomOrderSignalREndpointCommon.cs +++ b/FruitBank.Common/Interfaces/ICustomOrderSignalREndpointCommon.cs @@ -6,6 +6,7 @@ namespace FruitBank.Common.Interfaces; public interface ICustomOrderSignalREndpointCommon { Task?> GetAllOrderDtos(); - Task GetOrderDtoById(int orderId); Task?> GetPendingOrderDtos(); + Task?> GetAllByIds(int[] orderIds); + Task GetOrderDtoById(int orderId); } \ No newline at end of file diff --git a/FruitBank.Common/Interfaces/IMeasured.cs b/FruitBank.Common/Interfaces/IMeasured.cs index b87db81..a981f90 100644 --- a/FruitBank.Common/Interfaces/IMeasured.cs +++ b/FruitBank.Common/Interfaces/IMeasured.cs @@ -2,5 +2,5 @@ public interface IMeasured { - bool IsMeasured { get; set; } + bool IsMeasured { get; } } \ No newline at end of file diff --git a/FruitBank.Common/Interfaces/IOrderDto.cs b/FruitBank.Common/Interfaces/IOrderDto.cs index 393571f..1dfe3b6 100644 --- a/FruitBank.Common/Interfaces/IOrderDto.cs +++ b/FruitBank.Common/Interfaces/IOrderDto.cs @@ -4,7 +4,7 @@ using Mango.Nop.Core.Interfaces; namespace FruitBank.Common.Interfaces; -public interface IOrderDto : IMgOrderDto +public interface IOrderDto : IMgOrderDto, IMeasured, IMeasurable { - + DateTime DateOfReceipt { get; } } \ No newline at end of file diff --git a/FruitBank.Common/Interfaces/IOrderItemDto.cs b/FruitBank.Common/Interfaces/IOrderItemDto.cs index 7775a35..025aa30 100644 --- a/FruitBank.Common/Interfaces/IOrderItemDto.cs +++ b/FruitBank.Common/Interfaces/IOrderItemDto.cs @@ -6,7 +6,7 @@ using Nop.Core.Domain.Catalog; namespace FruitBank.Common.Interfaces; -public interface IOrderItemDto : IMgOrderItemDto +public interface IOrderItemDto : IMgOrderItemDto, IMeasuringNetWeight, IMeasured, IMeasurable { public List OrderItemPallets { get; set; } public void InitializeOrderItemPallets(List orderItemPallets); diff --git a/FruitBank.Common/Interfaces/IProductDto.cs b/FruitBank.Common/Interfaces/IProductDto.cs index 597b408..6e44132 100644 --- a/FruitBank.Common/Interfaces/IProductDto.cs +++ b/FruitBank.Common/Interfaces/IProductDto.cs @@ -2,7 +2,7 @@ namespace FruitBank.Common.Interfaces; -public interface IProductDto : IMgProductDto +public interface IProductDto : IMgProductDto, IMeasurable { } \ No newline at end of file diff --git a/FruitBank.Common/SignalRs/SignalRTags.cs b/FruitBank.Common/SignalRs/SignalRTags.cs index 958f01c..878e1b9 100644 --- a/FruitBank.Common/SignalRs/SignalRTags.cs +++ b/FruitBank.Common/SignalRs/SignalRTags.cs @@ -47,6 +47,7 @@ public class SignalRTags : AcSignalRTags public const int GetAllOrderDtos = 111; public const int GetOrderDtoById = 112; + public const int GetAllByIdList = 114; public const int GetPendingOrderDtos = 115; public const int AuthenticateUser = 160; diff --git a/FruitBankHybrid.Shared.Tests/OrderClientTests.cs b/FruitBankHybrid.Shared.Tests/OrderClientTests.cs index 41f3e23..fff168c 100644 --- a/FruitBankHybrid.Shared.Tests/OrderClientTests.cs +++ b/FruitBankHybrid.Shared.Tests/OrderClientTests.cs @@ -35,17 +35,6 @@ public sealed class OrderClientTests Assert.IsTrue(orderDtos.All(o => o.OrderItemDtos.All(oi => oi.ProductDto != null && oi.ProductDto.Id == oi.ProductId))); } - [TestMethod] - public async Task GetPendingOrderDtos() - { - var pendingOrderDtos = await _signalRClient.GetPendingOrderDtos(); - - Assert.IsNotNull(pendingOrderDtos); - - Assert.IsTrue(pendingOrderDtos.All(o => o.OrderStatus == OrderStatus.Pending)); - Assert.IsTrue(pendingOrderDtos.Count != 0); - } - [TestMethod] [DataRow(1)] [DataRow(2)] @@ -59,4 +48,27 @@ public sealed class OrderClientTests Assert.IsTrue(orderDto.OrderStatusId >= 10); Assert.IsTrue(orderDto.CustomOrderNumber == orderId.ToString()); } + + [TestMethod] + public async Task GetPendingOrderDtos() + { + var pendingOrderDtos = await _signalRClient.GetPendingOrderDtos(); + + Assert.IsNotNull(pendingOrderDtos); + + Assert.IsTrue(pendingOrderDtos.All(o => o.OrderStatus == OrderStatus.Pending)); + Assert.IsTrue(pendingOrderDtos.Count != 0); + } + + [TestMethod] + [DataRow(new int[] {1,2,4,7})] + public async Task GetOrderDtoById(int[] orderIds) + { + var orderDtoList = await _signalRClient.GetAllByIds(orderIds); + + Assert.IsNotNull(orderDtoList); + + Assert.IsTrue(orderDtoList.Count == orderIds.Length); + Assert.IsTrue(orderDtoList.All(x => orderIds.Contains(x.Id))); + } } \ No newline at end of file diff --git a/FruitBankHybrid.Shared/Models/MeasuringDateSelectorModel.cs b/FruitBankHybrid.Shared/Models/MeasuringDateSelectorModel.cs new file mode 100644 index 0000000..8c0ae6b --- /dev/null +++ b/FruitBankHybrid.Shared/Models/MeasuringDateSelectorModel.cs @@ -0,0 +1,15 @@ +namespace FruitBankHybrid.Shared.Models; + +public class MeasuringDateSelectorModel +{ + public int ShippingId { get; set; } + public DateTime DateTime { get; set; } + public bool IsMeasured { get; set; } + + public MeasuringDateSelectorModel(int shippingId, DateTime dateTime, bool isMeasured) + { + ShippingId = shippingId; + DateTime = dateTime; + IsMeasured = isMeasured; + } +} \ No newline at end of file diff --git a/FruitBankHybrid.Shared/Pages/MeasuringIn.razor b/FruitBankHybrid.Shared/Pages/MeasuringIn.razor index cc0a790..45f76f3 100644 --- a/FruitBankHybrid.Shared/Pages/MeasuringIn.razor +++ b/FruitBankHybrid.Shared/Pages/MeasuringIn.razor @@ -10,21 +10,21 @@
- + @{ - var cssClass = GetShippingDateCssClassNames(ctxShippingDate); + var cssClass = GetMeasuringDateCssClassNames(ctxShippingDate); if (!cssClass.IsNullOrWhiteSpace()) { - @ctxShippingDate.Day.ToString() + @ctxShippingDate.Day.ToString() } else { diff --git a/FruitBankHybrid.Shared/Pages/MeasuringIn.razor.cs b/FruitBankHybrid.Shared/Pages/MeasuringIn.razor.cs index 409a591..ec23ca5 100644 --- a/FruitBankHybrid.Shared/Pages/MeasuringIn.razor.cs +++ b/FruitBankHybrid.Shared/Pages/MeasuringIn.razor.cs @@ -5,6 +5,8 @@ using FruitBank.Common.Entities; using FruitBank.Common.Helpers; using FruitBank.Common.Interfaces; using FruitBank.Common.Models; +using FruitBankHybrid.Shared.Models; +using FruitBankHybrid.Shared.Services; using FruitBankHybrid.Shared.Services.Loggers; using FruitBankHybrid.Shared.Services.SignalRs; using Microsoft.AspNetCore.Components; @@ -13,19 +15,6 @@ using ILogger = Mango.Nop.Core.Loggers.ILogger; namespace FruitBankHybrid.Shared.Pages { - public class ShippingDateModel - { - public int ShippingId { get; set; } - public DateTime DateTime { get; set; } - public bool IsMeasured { get; set; } - - public ShippingDateModel(int shippingId, DateTime dateTime, bool isMeasured) - { - ShippingId = shippingId; - DateTime = dateTime; - IsMeasured = isMeasured; - } - } public partial class MeasuringIn : ComponentBase { [Inject] public required IEnumerable LogWriters { get; set; } @@ -40,10 +29,9 @@ namespace FruitBankHybrid.Shared.Pages private ShippingDocument? SelectedShippingDocument { get; set; } private ShippingItem? SelectedShippingItem { get; set; } - DateTime DateTimeValue { get; set; } = DateTime.Today; protected bool BtnSaveEnabled { get; set; } - private List _shippingDates = null!; + private List _measuringDates = null!; protected override async Task OnInitializedAsync() { @@ -58,76 +46,25 @@ namespace FruitBankHybrid.Shared.Pages { var shippings = await FruitBankSignalRClient.GetNotMeasuredShippings() ?? []; - _shippingDates = shippings.Select(shipping => new ShippingDateModel(shipping.Id, shipping.ShippingDate.Date, shipping.IsAllMeasured)).ToList(); - NotMeasuredShippings = shippings.Where(shipping => DaysEqual(shipping.ShippingDate.Date, dateTime)).ToList(); + _measuringDates = shippings.Select(shipping => new MeasuringDateSelectorModel(shipping.Id, shipping.ShippingDate.Date, shipping.IsAllMeasured)).ToList(); + NotMeasuredShippings = shippings.Where(shipping => MeasuringService.DaysEqual(shipping.ShippingDate.Date, dateTime)).ToList(); SelectedShipping = NotMeasuredShippings.FirstOrDefault(); } - private async Task OnSelectedShippingDateChanged(DateTime selectedDateTime) + private async Task OnMeasuringDateChanged(DateTime selectedDateTime) => await RefreshShippingsFromDb(selectedDateTime); - - private void OnCustomDisabledDate(CalendarCustomDisabledDateEventArgs args) - => args.IsDisabled = !_shippingDates.Exists(shippingDateModel => DaysEqual(shippingDateModel.DateTime, args.Date)); - private string GetShippingDateCssClassNames(DateTime date) - { - if (_shippingDates.Exists(shipping => !shipping.IsMeasured && shipping.DateTime.Date <= DateTime.Now.Date && DaysEqual(shipping.DateTime, date))) - return "fw-bold text-danger"; + private void OnCustomDisabledMeasuringDate(CalendarCustomDisabledDateEventArgs args) + => MeasuringService.OnCustomDisabledDate(args, _measuringDates); - if (_shippingDates.Exists(shipping => shipping.IsMeasured && DaysEqual(shipping.DateTime, date))) - return "fw-bold text-success"; + private string GetMeasuringDateCssClassNames(DateTime date) + => MeasuringService.GetShippingDateCssClassNames(date, _measuringDates); - if (_shippingDates.Exists(shipping => !shipping.IsMeasured && DaysEqual(shipping.DateTime, date))) - return "fw-bold"; - - return string.Empty; - } - - private static bool DaysEqual(DateTime date1, DateTime date2) - => (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear); - private string GetShippingPalletsCssClassNames(string fieldName, ShippingItemPallet shippingItemPallet) - { - //if (shippingItemPallet.NetWeight < 0) return "text-danger"; - - switch (fieldName) - { - case nameof(ShippingItemPallet.TareWeight): - return IsShippingitemPalletMeasuredAndValid(shippingItemPallet) ? "text-success" : - (shippingItemPallet.TareWeight < 0 || shippingItemPallet.NetWeight < 0 ? "text-danger" : ""); - break; - case nameof(ShippingItemPallet.PalletWeight): - return IsShippingitemPalletMeasuredAndValid(shippingItemPallet) ? "text-success" : - (shippingItemPallet.PalletWeight < 0 || shippingItemPallet.NetWeight < 0 ? "text-danger" : ""); - break; - case nameof(ShippingItemPallet.Quantity): - return IsShippingitemPalletMeasuredAndValid(shippingItemPallet) ? "text-success" : - (shippingItemPallet.Quantity < 0 ? "text-danger" : ""); - break; - case nameof(ShippingItemPallet.GrossWeight): - return IsShippingitemPalletMeasuredAndValid(shippingItemPallet) ? "text-success" : - (shippingItemPallet.GrossWeight < 0 || shippingItemPallet.NetWeight < 0 ? "text-danger" : ""); - break; - case nameof(ShippingItemPallet.NetWeight): - return IsShippingitemPalletMeasuredAndValid(shippingItemPallet) ? "text-success" : - (shippingItemPallet.NetWeight < 0 ? "text-danger" : ""); - break; - } - - //if (_shippingDates.Exists(shipping => !shipping.IsMeasured && shipping.DateTime.Date <= DateTime.Now.Date && DaysEqual(shipping.DateTime, date))) - // return "fw-bold text-danger"; - - //if (_shippingDates.Exists(shipping => shipping.IsMeasured && DaysEqual(shipping.DateTime, date))) - // return "fw-bold text-success"; - - //if (_shippingDates.Exists(shipping => !shipping.IsMeasured && DaysEqual(shipping.DateTime, date))) - // return "fw-bold"; - - return string.Empty; - } - + => MeasuringService.GetCustomItemPalletsCssClassNames(fieldName, shippingItemPallet, SelectedShippingItem!.IsMeasurable); + private void OnSelectedShippingChanged(SelectedDataItemChangedEventArgs eventArgs) { SelectedShippingDocument = eventArgs.DataItem?.ShippingDocuments?.FirstOrDefault(); @@ -152,7 +89,7 @@ namespace FruitBankHybrid.Shared.Pages SelectedShippingDocument!.IsAllMeasured = SelectedShippingDocument.ShippingItems?.All(si => si.IsMeasured) ?? false; SelectedShipping!.IsAllMeasured = SelectedShipping.ShippingDocuments?.All(sd => sd.IsAllMeasured) ?? false; - var shippingDate = _shippingDates.FirstOrDefault(shipping => shipping.ShippingId == SelectedShipping.Id); + var shippingDate = _measuringDates.FirstOrDefault(shipping => shipping.ShippingId == SelectedShipping.Id); if (shippingDate != null) shippingDate.IsMeasured = SelectedShipping.IsAllMeasured; MeasuringValuesHelper.SetShippingItemTotalMeasuringValues(shippingItem); @@ -232,7 +169,7 @@ namespace FruitBankHybrid.Shared.Pages private bool IsShippingitemPalletMeasuredAndValid(ShippingItemPallet shippingItemPallet) - => shippingItemPallet.IsMeasuredAndValid(SelectedShippingItem!.IsMeasurable); + => MeasuringService.IsCustomItemPalletMeasuredAndValid(shippingItemPallet, SelectedShippingItem!.IsMeasurable); private async Task HandleValidSubmit() { diff --git a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor index 52c35b8..edfb949 100644 --- a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor +++ b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor @@ -1,6 +1,136 @@ @page "/MeasuringOut" +@using AyCode.Utils.Extensions +@using FruitBank.Common.Dtos +@using FruitBank.Common.Entities +@using FruitBankHybrid.Shared.Services

Kimenő mérés

+ +
+ + + + + @{ + var cssClass = GetMeasuringDateCssClassNames(ctxOrderDate); + if (!cssClass.IsNullOrWhiteSpace()) + { + @ctxOrderDate.Day.ToString() + } + else + { + @ctxOrderDate.Day.ToString() + } + } + + + + + + + + + @ctxOrder.DisplayText + + + + + @* + + + @ctxShippingDocument.DisplayText + + + + + + + + @ctxShippingitem.DisplayText) + + + *@ + + +
+ + + + + + + @{ + string text = "empty"; + if (context.Level == 0) + { + text = ((OrderItemDto)(context.DataItem)).ProductName + " dfgdfsg"; + } + else if (context.Level == 1) + { + text = ((OrderItemPallet)(context.DataItem)).OrderItemId.ToString() + " dfgdfsg"; + } + } + @text + + + +@* + +
+ aaa + @(((OrderItemPallet)context.DataItem).Id.ToString()) +
+
+
+ *@ + @* + + + + + *@ +
+
@code { } \ No newline at end of file diff --git a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs index c992158..f6fe2e5 100644 --- a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs +++ b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs @@ -1,5 +1,11 @@ using AyCode.Core.Loggers; +using DevExpress.Blazor; +using FruitBank.Common.Dtos; +using FruitBank.Common.Entities; using FruitBank.Common.Models; +using FruitBankHybrid.Shared.Models; +using FruitBankHybrid.Shared.Services; +using FruitBankHybrid.Shared.Services.Loggers; using FruitBankHybrid.Shared.Services.SignalRs; using Mango.Nop.Core.Loggers; using Microsoft.AspNetCore.Components; @@ -18,5 +24,70 @@ namespace FruitBankHybrid.Shared.Pages [Inject] public required LoggedInModel LoggedInModel { get; set; } private ILogger _logger = null!; + private string _errorText; + + private List SelectedDayOrders { get; set; } = null!; + private OrderDto? SelectedOrder { get; set; } + private OrderItemDto? SelectedOrderItem { get; set; } + + private List _measuringDates = null!; + + protected override async Task OnInitializedAsync() + { + _logger = new LoggerClient(LogWriters.ToArray()); + _logger.Info("OnInitializedAsync"); + + await RefreshOrdersFromDb(DateTime.Now); + await base.OnInitializedAsync(); + } + + private async Task RefreshOrdersFromDb(DateTime dateTime) + { + var orders = await FruitBankSignalRClient.GetPendingOrderDtos() ?? []; + + _measuringDates = orders.Select(order => new MeasuringDateSelectorModel(order.Id, order.DateOfReceipt, order.IsMeasured)).ToList(); + + SelectedDayOrders = orders.Where(order => MeasuringService.DaysEqual(order.DateOfReceipt, dateTime)).ToList(); + SelectedOrder = SelectedDayOrders.FirstOrDefault(); + + foreach (var order in SelectedDayOrders) + { + foreach (var orderItem in order.OrderItemDtos.Where(orderItem => orderItem.OrderItemPallets.Count == 0)) + { + orderItem.OrderItemPallets.Add(new OrderItemPallet + { + OrderItemId = orderItem.Id, + //OrderItem = orderItem, + }); + + orderItem.OrderItemPallets.Add(new OrderItemPallet + { + OrderItemId = orderItem.Id, + //OrderItem = orderItem, + }); + + } + } + } + + private async Task OnMeasuringDateChanged(DateTime selectedDateTime) + => await RefreshOrdersFromDb(selectedDateTime); + + private void OnCustomDisabledMeasuringDate(CalendarCustomDisabledDateEventArgs args) + => MeasuringService.OnCustomDisabledDate(args, _measuringDates); + + private string GetMeasuringDateCssClassNames(DateTime date) + => MeasuringService.GetShippingDateCssClassNames(date, _measuringDates); + + private string GetOrderItemPalletsCssClassNames(string fieldName, OrderItemPallet orderItemPallet) + => MeasuringService.GetCustomItemPalletsCssClassNames(fieldName, orderItemPallet, SelectedOrderItem!.IsMeasurable); + + private bool IsOrderItemPalletMeasuredAndValid(OrderItemPallet orderItemPallet) + => MeasuringService.IsCustomItemPalletMeasuredAndValid(orderItemPallet, SelectedOrderItem!.IsMeasurable); + + private void OnSelectedOrderChanged(SelectedDataItemChangedEventArgs eventArgs) + { + //SelectedOrderItem = eventArgs.DataItem?.OrderItemDtos?.FirstOrDefault(); + } } } diff --git a/FruitBankHybrid.Shared/Services/MeasuringService.cs b/FruitBankHybrid.Shared/Services/MeasuringService.cs new file mode 100644 index 0000000..7cbd652 --- /dev/null +++ b/FruitBankHybrid.Shared/Services/MeasuringService.cs @@ -0,0 +1,57 @@ +using DevExpress.Blazor; +using FruitBank.Common.Entities; +using FruitBankHybrid.Shared.Models; + +namespace FruitBankHybrid.Shared.Services; + +public class MeasuringService +{ + public static bool DaysEqual(DateTime date1, DateTime date2) + => (date1.Year == date2.Year && date1.DayOfYear == date2.DayOfYear); + + public static void OnCustomDisabledDate(CalendarCustomDisabledDateEventArgs args, List measuringDates) + => args.IsDisabled = !measuringDates.Exists(shippingDateModel => DaysEqual(shippingDateModel.DateTime, args.Date)); + + public static string GetShippingDateCssClassNames(DateTime date, List measuringDates) + { + if (measuringDates.Exists(shipping => !shipping.IsMeasured && shipping.DateTime.Date <= DateTime.Now.Date && DaysEqual(shipping.DateTime, date))) + return "fw-bold text-danger"; + + if (measuringDates.Exists(shipping => shipping.IsMeasured && DaysEqual(shipping.DateTime, date))) + return "fw-bold text-success"; + + if (measuringDates.Exists(shipping => !shipping.IsMeasured && DaysEqual(shipping.DateTime, date))) + return "fw-bold"; + + return string.Empty; + } + + public static string GetCustomItemPalletsCssClassNames(string fieldName, MeasuringItemPalletBase shippingItemPallet, bool isMeasurable) + { + //if (shippingItemPallet.NetWeight < 0) return "text-danger"; + + switch (fieldName) + { + case nameof(ShippingItemPallet.TareWeight): + return IsCustomItemPalletMeasuredAndValid(shippingItemPallet, isMeasurable) ? "text-success" : (shippingItemPallet.TareWeight < 0 || shippingItemPallet.NetWeight < 0 ? "text-danger" : ""); + break; + case nameof(ShippingItemPallet.PalletWeight): + return IsCustomItemPalletMeasuredAndValid(shippingItemPallet, isMeasurable) ? "text-success" : (shippingItemPallet.PalletWeight < 0 || shippingItemPallet.NetWeight < 0 ? "text-danger" : ""); + break; + case nameof(ShippingItemPallet.Quantity): + return IsCustomItemPalletMeasuredAndValid(shippingItemPallet, isMeasurable) ? "text-success" : (shippingItemPallet.Quantity < 0 ? "text-danger" : ""); + break; + case nameof(ShippingItemPallet.GrossWeight): + return IsCustomItemPalletMeasuredAndValid(shippingItemPallet, isMeasurable) ? "text-success" : (shippingItemPallet.GrossWeight < 0 || shippingItemPallet.NetWeight < 0 ? "text-danger" : ""); + break; + case nameof(ShippingItemPallet.NetWeight): + return IsCustomItemPalletMeasuredAndValid(shippingItemPallet, isMeasurable) ? "text-success" : (shippingItemPallet.NetWeight < 0 ? "text-danger" : ""); + break; + } + + return string.Empty; + } + + public static bool IsCustomItemPalletMeasuredAndValid(MeasuringItemPalletBase customItemPallet, bool isMeasurable) + => customItemPallet.IsMeasuredAndValid(isMeasurable); +} \ No newline at end of file diff --git a/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs b/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs index e8f3dab..036ec4c 100644 --- a/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs +++ b/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs @@ -133,6 +133,10 @@ namespace FruitBankHybrid.Shared.Services.SignalRs public Task?> GetPendingOrderDtos() => GetAllAsync>(SignalRTags.GetPendingOrderDtos); + + public Task?> GetAllByIds(int[] orderIds) + => GetAllAsync>(SignalRTags.GetAllByIdList, [orderIds]); + #endregion Orders } }