From 35e71cb75c6f69cb8e95efe9f073deccdde50e42 Mon Sep 17 00:00:00 2001 From: Loretta Date: Mon, 20 Oct 2025 16:46:40 +0200 Subject: [PATCH 1/3] Add MeasurementOwnerId; RevisorId generic attributes to Order; improvements, fixes, etc.. --- FruitBank.Common/Dtos/OrderDto.cs | 33 +- FruitBank.Common/Dtos/OrderItemDto.cs | 3 + .../ICustomOrderSignalREndpointCommon.cs | 4 +- FruitBank.Common/Interfaces/IOrderDto.cs | 8 + FruitBank.Common/Interfaces/IOrderItemDto.cs | 8 +- FruitBank.Common/Models/LoggedInModel.cs | 4 +- FruitBank.Common/SignalRs/SignalRTags.cs | 5 +- .../FruitBankClientTests.cs | 37 +- .../Components/PalletItemComponent.razor | 35 +- .../DevextremeComponentExtension.cs | 20 ++ FruitBankHybrid.Shared/Pages/Login.razor | 2 +- FruitBankHybrid.Shared/Pages/Login.razor.cs | 6 +- .../Pages/MeasuringOut.razor | 332 ++++++++++-------- .../Pages/MeasuringOut.razor.cs | 102 +++++- .../Services/MeasuringService.cs | 6 +- .../SignalRs/FruitBankSignalRClient.cs | 7 +- 16 files changed, 414 insertions(+), 198 deletions(-) create mode 100644 FruitBankHybrid.Shared/Extensions/DevextremeComponentExtension.cs diff --git a/FruitBank.Common/Dtos/OrderDto.cs b/FruitBank.Common/Dtos/OrderDto.cs index 2079ce1..f7f4890 100644 --- a/FruitBank.Common/Dtos/OrderDto.cs +++ b/FruitBank.Common/Dtos/OrderDto.cs @@ -2,8 +2,10 @@ using AyCode.Utils.Extensions; using FruitBank.Common.Entities; using FruitBank.Common.Interfaces; +using FruitBank.Common.Models; using LinqToDB.Mapping; using Mango.Nop.Core.Dtos; +using Mango.Nop.Core.Extensions; using Mango.Nop.Core.Interfaces; using Newtonsoft.Json; using Nop.Core; @@ -13,7 +15,6 @@ 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; @@ -42,7 +43,21 @@ public class OrderDto : MgOrderDto, IOrderDto } [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] - public string TimeOfReceiptText => $"{DateOfReceiptOrCreated:H:mm} - {Customer.Company}"; + public string TimeOfReceiptText + { + get + { + var resultText = string.Empty; + + if (IsComplete) resultText = "[AUDITED]"; + else if (IsMeasured) resultText = "[KÉSZ]"; + else if (MeasurementOwnerId > 0) resultText = "[FOLYAMATBAN]"; + //else if (MeasurementOwnerId == ??) resultText = "[SAJÁT MÉRÉS]"; + //else if (MeasurementOwnerId > 0) resultText = "[MÁSOK MÉRIK]"; + + return $"{resultText} {DateOfReceiptOrCreated:H:mm} - {Customer.Company}"; + } + } [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public DateTime DateOfReceiptOrCreated => DateOfReceipt ?? CreatedOnUtc; @@ -50,6 +65,12 @@ public class OrderDto : MgOrderDto, IOrderDto [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] public DateTime? DateOfReceipt => GenericAttributes.GetValueOrNull(nameof(IOrderDto.DateOfReceipt)); + [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] + public int RevisorId => GenericAttributes.GetValueOrDefault(nameof(IOrderDto.RevisorId), 0); + + [NotColumn, JsonIgnore, System.Text.Json.Serialization.JsonIgnore] + public int MeasurementOwnerId => GenericAttributes.GetValueOrDefault(nameof(IOrderDto.MeasurementOwnerId), 0); + //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); @@ -60,7 +81,15 @@ public class OrderDto : MgOrderDto, IOrderDto public OrderDto(Order order) : base(order) { } + public bool IsComplete => OrderStatus == OrderStatus.Complete; + + public bool HasMeasuringAccess(int? customerId, bool isRevisorUser = false) + => isRevisorUser || (customerId.HasValue && OrderStatus != OrderStatus.Complete && (customerId.Value == MeasurementOwnerId || MeasurementOwnerId == 0)); + public bool IsMeasuredAndValid() => Id > 0 && OrderItemDtos.Count > 0 && OrderItemDtos.All(x => x.IsMeasured); public bool IsValidMeasuringValues() => OrderItemDtos.Count > 0 && OrderItemDtos.All(x => x.IsValidMeasuringValues()); + public bool IsOtherMeasuringInProgress(int? customerId) + => customerId.GetValueOrDefault(0) != 0 && OrderItemDtos.Any(oi => oi.IsOtherMeasuringInProgress(customerId)); + } \ No newline at end of file diff --git a/FruitBank.Common/Dtos/OrderItemDto.cs b/FruitBank.Common/Dtos/OrderItemDto.cs index 453619c..fad5c72 100644 --- a/FruitBank.Common/Dtos/OrderItemDto.cs +++ b/FruitBank.Common/Dtos/OrderItemDto.cs @@ -108,4 +108,7 @@ public class OrderItemDto : MgOrderItemDto, IOrderItemDto 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); } \ No newline at end of file diff --git a/FruitBank.Common/Interfaces/ICustomOrderSignalREndpointCommon.cs b/FruitBank.Common/Interfaces/ICustomOrderSignalREndpointCommon.cs index 0218743..718dfab 100644 --- a/FruitBank.Common/Interfaces/ICustomOrderSignalREndpointCommon.cs +++ b/FruitBank.Common/Interfaces/ICustomOrderSignalREndpointCommon.cs @@ -11,5 +11,7 @@ public interface ICustomOrderSignalREndpointCommon Task?> GetAllOrderDtoByIds(int[] orderIds); Task GetOrderDtoById(int orderId); Task AddOrUpdateMeasuredOrderItemPallet(OrderItemPallet orderItemPallet); - Task SetOrderStatusToComplete(int orderId); + + Task StartMeasuring(int orderId, int userId); + Task SetOrderStatusToComplete(int orderId, int revisorId); } \ No newline at end of file diff --git a/FruitBank.Common/Interfaces/IOrderDto.cs b/FruitBank.Common/Interfaces/IOrderDto.cs index d2923be..58e5e1c 100644 --- a/FruitBank.Common/Interfaces/IOrderDto.cs +++ b/FruitBank.Common/Interfaces/IOrderDto.cs @@ -10,4 +10,12 @@ public interface IOrderDto : IMgOrderDto, IMeasured, I DateTime DateOfReceiptOrCreated { get; } string TimeOfReceiptText { get; } + + int RevisorId { get; } + int MeasurementOwnerId { get; } + + bool IsComplete { get; } + bool HasMeasuringAccess(int? customerId, bool isRevisorUser = false); + + bool IsOtherMeasuringInProgress(int? customerId); } \ No newline at end of file diff --git a/FruitBank.Common/Interfaces/IOrderItemDto.cs b/FruitBank.Common/Interfaces/IOrderItemDto.cs index 08c7ecc..d49122c 100644 --- a/FruitBank.Common/Interfaces/IOrderItemDto.cs +++ b/FruitBank.Common/Interfaces/IOrderItemDto.cs @@ -8,7 +8,9 @@ namespace FruitBank.Common.Interfaces; public interface IOrderItemDto : IMgOrderItemDto, IMeasuringValues, IMeasured, IMeasurable { - public OrderDto OrderDto { get; set; } - public List OrderItemPallets { get; set; } - public void InitializeOrderItemPallets(List orderItemPallets); + OrderDto OrderDto { get; set; } + List OrderItemPallets { get; set; } + + bool IsOtherMeasuringInProgress(int? customerId); + void InitializeOrderItemPallets(List orderItemPallets); } \ No newline at end of file diff --git a/FruitBank.Common/Models/LoggedInModel.cs b/FruitBank.Common/Models/LoggedInModel.cs index 1b7cb00..607eee7 100644 --- a/FruitBank.Common/Models/LoggedInModel.cs +++ b/FruitBank.Common/Models/LoggedInModel.cs @@ -8,10 +8,12 @@ namespace FruitBank.Common.Models; public class LoggedInModel { public bool IsLoggedIn => CustomerDto != null; - + public bool IsRevisor => IsLoggedIn && CustomerRoles.Any(x => x.SystemName.ToLowerInvariant() == "measuringrevisor"); + public CustomerDto? CustomerDto { get; private set; } public List CustomerRoles { get; private set; } = []; + public List MeasuringUsers { get; set; } = []; public LoggedInModel() { } diff --git a/FruitBank.Common/SignalRs/SignalRTags.cs b/FruitBank.Common/SignalRs/SignalRTags.cs index 5a53e44..470b4be 100644 --- a/FruitBank.Common/SignalRs/SignalRTags.cs +++ b/FruitBank.Common/SignalRs/SignalRTags.cs @@ -49,8 +49,9 @@ public class SignalRTags : AcSignalRTags public const int GetOrderDtoById = 112; public const int GetAllOrderDtoByIds = 114; public const int GetPendingOrderDtos = 115; - public const int SetOrderStatusToComplete = 116; - + public const int StartMeasuring = 116; + public const int SetOrderStatusToComplete = 117; + public const int AddOrderItemPallet = 131; public const int UpdateOrderItemPallet = 132; public const int AddOrUpdateMeasuredOrderItemPallet = 133; diff --git a/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs b/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs index cbeec84..298a984 100644 --- a/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs +++ b/FruitBankHybrid.Shared.Tests/FruitBankClientTests.cs @@ -484,24 +484,33 @@ namespace FruitBankHybrid.Shared.Tests #endregion Product #region OrderItem - //[return: NotNull] - //public async Task GetOrderDtoByIdAsync(int orderId) - //{ - // var orderDto = await _signalRClient.GetOrderDtoById(orderId); - // Assert.IsNotNull(orderDto, $"orderDto: {orderId}"); + [DataTestMethod] + [DataRow(1)] + public async Task GetOrderDtoByIdTest(int orderId) => await GetOrderDtoByIdAsync(orderId); - // if (orderDto.IsMeasurable) Assert.IsNotNull(orderDto.Pallet, $"orderDto.Pallet == null; orderDto.PalletId: {orderDto.PalletId}"); + [return: NotNull] + public async Task GetOrderDtoByIdAsync(int orderId) + { + var orderDto = await _signalRClient.GetOrderDtoById(orderId); - // Assert.IsNotNull(orderDto.ProductDto, $"orderDto.Product == null; orderDto.ProductId: {orderDto.ProductId}"); - // Assert.IsTrue(orderDto.Id == orderId); + ValidateOrderDto(orderId, orderDto); - // Assert.IsTrue(orderDto.QuantityOnDocument > 0, "QuantityOnDocument == 0"); - // Assert.IsTrue(orderDto.NetWeightOnDocument > 0, "NetWeightOnDocument == 0"); - // Assert.IsTrue(orderDto.GrossWeightOnDocument > 0, "GrossWeightOnDocument == 0"); + return orderDto!; + } - // return orderDto; - //} + private static bool ValidateOrderDto(int orderId, [NotNullWhen(true)] OrderDto? orderDto) + { + Assert.IsNotNull(orderDto, $"orderId: {orderId}"); + Assert.IsNotNull(orderDto.Customer); + + Assert.IsTrue(orderDto.Id == orderId); + Assert.IsTrue(orderDto.OrderItemDtos.Count > 0); + + Assert.IsTrue(orderDto.OrderItemDtos.All(oi => oi.ProductDto != null)); + + return true; + } //[DataTestMethod] //[DataRow(1, -1, -2.137563300001, -333.75238200001, 2.12545)] @@ -611,7 +620,7 @@ namespace FruitBankHybrid.Shared.Tests // } // Assert.IsTrue(shippingItem.MeasuredQuantity == originalShippingItem.MeasuredQuantity + incQuantity); - + // Assert.IsTrue(shippingItem.ShippingItemPallets!.All(x => x.IsValidSafeMeasuringValues())); // Assert.IsTrue(shippingItem.ShippingItemPallets!.All(x => x.IsValidMeasuringValues(shippingItem.IsMeasurable))); diff --git a/FruitBankHybrid.Shared/Components/PalletItemComponent.razor b/FruitBankHybrid.Shared/Components/PalletItemComponent.razor index 091c644..23082fd 100644 --- a/FruitBankHybrid.Shared/Components/PalletItemComponent.razor +++ b/FruitBankHybrid.Shared/Components/PalletItemComponent.razor @@ -19,7 +19,7 @@ + Caption="Rakl.súly(kg)" ColSpanMd="2" /> - + @@ -55,6 +55,8 @@ [Parameter] public required int MeasuringIndex { get; set; } [Parameter] public int? AddOrUpdateSignalRTag { get; set; } = null; + [Parameter] public int? MaxTrayQuantity { get; set; } = null; + //[Parameter] public EventCallback OnPalletItemSaveClick { get; set; } [Parameter] public Func? OnPalletItemSaved { get; set; } [Parameter] public Func? OnPalletItemValueChanged { get; set; } @@ -63,12 +65,15 @@ [Inject] public required FruitBankSignalRClient FruitBankSignalRClient { get; set; } [Inject] public required LoggedInModel LoggedInModel { get; set; } - private DxFormLayoutItem _weightFormLayoutItem; - public bool _btnSaveEnabled { get; set; } + //public bool LoadingPanelVisible { get; set; } = false; + public bool BtnSaveEnabled { get; set; } + + private bool GetBtnSaveEnabled() + => PalletItem.IsValidMeasuringValues(IsMeasurable) && !PalletItem.IsMeasured && (!MaxTrayQuantity.HasValue || PalletItem.TrayQuantity <= MaxTrayQuantity.Value); protected override async Task OnInitializedAsync() { - _btnSaveEnabled = PalletItem.IsValidMeasuringValues(IsMeasurable) && !PalletItem.IsMeasured; + BtnSaveEnabled = GetBtnSaveEnabled();// PalletItem.IsValidMeasuringValues(IsMeasurable) && !PalletItem.IsMeasured; //((DxSpinEdit)_weightFormLayoutItem.Template.Target).DisplayFormat = "N3"; await base.OnInitializedAsync(); @@ -80,7 +85,8 @@ private async Task PalletItemSaveClick() { - _btnSaveEnabled = false; + BtnSaveEnabled = false; + //LoadingPanelVisible = true; if (AddOrUpdateSignalRTag == null) throw new Exception($"PalletItemComponent->PalletItemSaveClick(); AddOrUpdateSignalRTag == null"); @@ -91,29 +97,38 @@ //else _logger.Error($"Sikertelen volt a raklap adatainak mentése!"); if (OnPalletItemSaved != null) await OnPalletItemSaved.Invoke(responseShippingItemPallet); + //LoadingPanelVisible = false; } protected async Task OnItemUpdating(string fieldName, object newValue, TPalletItem palletItem) { - _btnSaveEnabled = false; + BtnSaveEnabled = false; // if (SelectedOrderItem == null) return; switch (fieldName) { case nameof(IMeasuringItemPalletBase.PalletWeight): palletItem.PalletWeight = (double)newValue; + + if (palletItem.PalletWeight < 0) palletItem.PalletWeight = 0; break; case nameof(IMeasuringItemPalletBase.TareWeight): palletItem.TareWeight = (double)newValue; - break; + if (palletItem.TareWeight < 0) palletItem.TareWeight = 0; + break; case nameof(IMeasuringItemPalletBase.TrayQuantity): palletItem.TrayQuantity = (int)newValue; - break; + if (palletItem.TrayQuantity < 0) palletItem.TrayQuantity = 0; + //else if (MaxTrayQuantity.HasValue && palletItem.TrayQuantity > MaxTrayQuantity.Value) palletItem.TrayQuantity = MaxTrayQuantity.Value; + + break; case nameof(IMeasuringItemPalletBase.GrossWeight): palletItem.GrossWeight = (double)newValue; + + if (palletItem.GrossWeight < 0) palletItem.GrossWeight = 0; break; } @@ -121,7 +136,7 @@ //MeasuringValuesHelper.SetShippingItemTotalMeasuringValues(palletItem); //BtnSaveEnabled = SelectedShippingItem.IsValidMeasuringValues() && shippingItemPallet.IsValidMeasuringValues(SelectedShippingItem.IsMeasurable); - _btnSaveEnabled = palletItem.IsValidMeasuringValues(IsMeasurable) && !palletItem.IsMeasured; + BtnSaveEnabled = GetBtnSaveEnabled();// palletItem.IsValidMeasuringValues(IsMeasurable) && !palletItem.IsMeasured && (MaxTrayQuantity.HasValue && palletItem.TrayQuantity <= MaxTrayQuantity.Value); if (OnPalletItemValueChanged != null) await OnPalletItemValueChanged.Invoke(palletItem); } diff --git a/FruitBankHybrid.Shared/Extensions/DevextremeComponentExtension.cs b/FruitBankHybrid.Shared/Extensions/DevextremeComponentExtension.cs new file mode 100644 index 0000000..131842d --- /dev/null +++ b/FruitBankHybrid.Shared/Extensions/DevextremeComponentExtension.cs @@ -0,0 +1,20 @@ +using DevExpress.Blazor; +using DevExpress.Blazor.Internal; + +namespace FruitBankHybrid.Shared.Extensions; + +public static class DevextremeComponentExtension +{ + public static async Task ShowMessageBoxAsync(this IDialogService messageBox, string title, string text, MessageBoxRenderStyle messageBoxRenderStyle, MessageBoxType messageBoxType = MessageBoxType.Alert) + { + var messageBoxOptions = new MessageBoxOptions + { + Title = title, + Text = text, + RenderStyle = messageBoxRenderStyle, + }; + + if (messageBoxType == MessageBoxType.Alert) await messageBox.AlertAsync(messageBoxOptions); + else await messageBox.ConfirmAsync(messageBoxOptions); + } +} \ No newline at end of file diff --git a/FruitBankHybrid.Shared/Pages/Login.razor b/FruitBankHybrid.Shared/Pages/Login.razor index 6dd9489..3a5dc65 100644 --- a/FruitBankHybrid.Shared/Pages/Login.razor +++ b/FruitBankHybrid.Shared/Pages/Login.razor @@ -8,7 +8,7 @@ { - Users { get; set; } + //private List Users { get; set; } private CustomerDto? SelectedUser { get; set; } private string PasswordValue { get; set; } = string.Empty; @@ -37,8 +37,8 @@ public partial class Login : ComponentBase if (!LoggedInModel.IsLoggedIn) { - Users = await FruitBankSignalRClient.GetMeasuringUsers() ?? []; - SelectedUser = Users.FirstOrDefault(); + LoggedInModel.MeasuringUsers = await FruitBankSignalRClient.GetMeasuringUsers() ?? []; + SelectedUser = LoggedInModel.MeasuringUsers.FirstOrDefault(); } else _rolesText = string.Join("; ", LoggedInModel.CustomerRoles.Select(x => x.Name)); diff --git a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor index a20530b..87ac9c5 100644 --- a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor +++ b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor @@ -9,158 +9,198 @@ @using Nop.Core.Domain.Orders

Kimenő mérés

+
- - - - - @{ - var cssClass = GetMeasuringDateCssClassNames(ctxOrderDate); - if (!cssClass.IsNullOrWhiteSpace()) - { - @ctxOrderDate.Day.ToString() - } - else - { - @ctxOrderDate.Day.ToString() - } - } + - - - - - - - - @ctxOrder.DisplayText - - - - - - @if (SelectedOrder != null && LoggedInModel.IsLoggedIn && LoggedInModel.CustomerRoles.Any(x => x.SystemName.ToLowerInvariant() == "measuringrevisor")) - { - var isCompleteOrder = SelectedOrder.OrderStatus == OrderStatus.Complete; - - - - - } - - -
- - - - @* *@ - - - @{ - if (context.Level == 0) - { - var cssClass = "text-danger"; - - var selectedOrderItemDto = (OrderItemDto)(context.DataItem); - var trayQuantity = selectedOrderItemDto.TrayQuantity; //selectedOrderItemDto.OrderItemPallets.Where(x => x.IsMeasured).Sum(x => x.TrayQuantity); - - var isValid = selectedOrderItemDto.IsValidMeasuringValues(); - var isValidAndMeasured = isValid && selectedOrderItemDto.IsMeasuredAndValid();// && selectedOrderItemDto.; - - if (isValidAndMeasured) cssClass = "text-success"; - else if (isValid) cssClass = string.Empty; - -
@($"{selectedOrderItemDto.ProductName} - {trayQuantity}/{selectedOrderItemDto.Quantity} rekesz, {(selectedOrderItemDto.IsMeasurable ? "net súly: " + selectedOrderItemDto.NetWeight + "kg." : "nem mérendő!")}")
- } - } -
- - @{ - if (context.Level == 0) - { - //var orderItemPallet = ((OrderItemPallet)(context.DataItem)); - //text = ((OrderItemPallet)(context.DataItem)).OrderItemId.ToString() + " dfgdfsg"; - //var selectedOrderItemDto = SelectedOrder!.OrderItemDtos.First(x => x.Id == orderItemPallet.OrderItemId); - var selectedOrderItemDto = (OrderItemDto)(context.DataItem); - - - @for (var index = 0; index < (selectedOrderItemDto?.OrderItemPallets?.Count ?? 0); index++) - { - var localI = index + 1; - var currentOrderItemPallet = selectedOrderItemDto!.OrderItemPallets![index]; - - - - } - - - - - - - - - - - - - TOTAL: - - - - @(selectedOrderItemDto.TrayQuantity) db - @(selectedOrderItemDto.GrossWeight) kg - @(selectedOrderItemDto.NetWeight) kg - - - - - @if (!_errorText.IsNullOrWhiteSpace()) + + + + + @{ + var cssClass = GetMeasuringDateCssClassNames(ctxOrderDate); + if (!cssClass.IsNullOrWhiteSpace()) { - - HIBA! @_errorText - - //_errorText = string.Empty; + @ctxOrderDate.Day.ToString() } - -
- } - } -
-
-
+ else + { + @ctxOrderDate.Day.ToString() + } + } + + + + + + + + + @ctxOrder.DisplayText + + + + + + + + + + + + @if (SelectedOrder != null && LoggedInModel.IsRevisor) + { + var isCompleteOrder = SelectedOrder.IsComplete; + + + + + } + + + @if (SelectedOrder == null) + { + } + else if (!HasMeasuringAccess) + { + @* var userIds = @SelectedOrder.OrderItemDtos.SelectMany(oi => oi.OrderItemPallets.Where(x => x.Id > 0 && x.CreatorId.HasValue).Select(x => x.CreatorId!.Value)).ToHashSet(); + var a = string.Join("; ", LoggedInModel.MeasuringUsers.Where(x => userIds.Contains(x.Id)).Select(x => x.Email)); + + Mérést végzi: @a *@ + Mások végzik a mérést! Mérést végzi: @(LoggedInModel.MeasuringUsers.FirstOrDefault(x => x.Id == SelectedOrder.MeasurementOwnerId)?.Email) + } + else + { + @* var userIds = @SelectedOrder.OrderItemDtos.SelectMany(oi => oi.OrderItemPallets.Where(x => x.Id > 0 && x.CreatorId.HasValue).Select(x => x.CreatorId!.Value)).ToHashSet(); + var a = string.Join("; ", LoggedInModel.MeasuringUsers.Where(x => userIds.Contains(x.Id)).Select(x => x.Email)); + + Mérést végzi: @a *@ + Mérést végzi: @(LoggedInModel.MeasuringUsers.FirstOrDefault(x => x.Id == SelectedOrder.MeasurementOwnerId)?.Email) + +
+ + + + @* *@ + + + @{ + if (context.Level == 0) + { + var cssClass = "text-danger"; + + var selectedOrderItemDto = (OrderItemDto)(context.DataItem); + var trayQuantity = selectedOrderItemDto.TrayQuantity; //selectedOrderItemDto.OrderItemPallets.Where(x => x.IsMeasured).Sum(x => x.TrayQuantity); + + var isValid = selectedOrderItemDto.IsValidMeasuringValues(); + var isValidAndMeasured = isValid && selectedOrderItemDto.IsMeasuredAndValid(); // && selectedOrderItemDto.; + + if (isValidAndMeasured) cssClass = "text-success"; + else if (isValid) cssClass = string.Empty; + +
@($"{selectedOrderItemDto.ProductName} - {trayQuantity}/{selectedOrderItemDto.Quantity} rekesz, {(selectedOrderItemDto.IsMeasurable ? "net súly: " + selectedOrderItemDto.NetWeight + "kg." : "nem mérendő!")}")
+ } + } +
+ + @{ + if (context.Level == 0) + { + //var orderItemPallet = ((OrderItemPallet)(context.DataItem)); + //text = ((OrderItemPallet)(context.DataItem)).OrderItemId.ToString() + " dfgdfsg"; + //var selectedOrderItemDto = SelectedOrder!.OrderItemDtos.First(x => x.Id == orderItemPallet.OrderItemId); + var selectedOrderItemDto = (OrderItemDto)(context.DataItem); + + + + @for (var index = 0; index < (selectedOrderItemDto?.OrderItemPallets?.Count ?? 0); index++) + { + var localI = index + 1; + var currentOrderItemPallet = selectedOrderItemDto!.OrderItemPallets![index]; + + + + } + + + + + + + + + + + + + TOTAL: + + + + @(selectedOrderItemDto.TrayQuantity) db + @(selectedOrderItemDto.GrossWeight) kg + @(selectedOrderItemDto.NetWeight) kg + + + + + @if (!_errorText.IsNullOrWhiteSpace()) + { + + HIBA! @_errorText + + //_errorText = string.Empty; + } + +
+ } + } +
+
+
+ } +
@code { - } \ No newline at end of file diff --git a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs index 352648c..f027787 100644 --- a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs +++ b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs @@ -17,6 +17,8 @@ using System.Threading.Tasks; using FruitBank.Common.Helpers; using FruitBank.Common.Interfaces; using AyCode.Core.Extensions; +using FruitBankHybrid.Shared.Extensions; +using Mango.Nop.Core.Extensions; using Nop.Core.Domain.Orders; namespace FruitBankHybrid.Shared.Pages @@ -25,11 +27,16 @@ namespace FruitBankHybrid.Shared.Pages { [Inject] public required IEnumerable LogWriters { get; set; } [Inject] public required FruitBankSignalRClient FruitBankSignalRClient { get; set; } + [Inject] private IDialogService DialogService { get; set; } = null!; [Inject] public required LoggedInModel LoggedInModel { get; set; } private ILogger _logger = null!; private string _errorText; + public bool HasMeasuringAccess; + + public bool LoadingPanelVisible { get; set; } = true; + private List SelectedDayOrders { get; set; } = null!; private OrderDto? SelectedOrder { get; set; } private OrderItemDto? SelectedOrderItem { get; set; } @@ -38,6 +45,7 @@ namespace FruitBankHybrid.Shared.Pages protected override async Task OnInitializedAsync() { + LoadingPanelVisible = true; _logger = new LoggerClient(LogWriters.ToArray()); _logger.Info("OnInitializedAsync"); @@ -47,17 +55,21 @@ namespace FruitBankHybrid.Shared.Pages private async Task RefreshOrdersFromDb(DateTime dateTime) { - var orders = await FruitBankSignalRClient.GetPendingOrderDtos() ?? []; + LoadingPanelVisible = true; + var orders = (await FruitBankSignalRClient.GetPendingOrderDtos() ?? []).Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).ToList(); _measuringDates = orders.Select(order => new MeasuringDateSelectorModel(order.Id, order.DateOfReceiptOrCreated, order.IsMeasured)).ToList(); SelectedDayOrders = orders.Where(order => MeasuringService.DaysEqual(order.DateOfReceiptOrCreated, dateTime)).ToList(); - SelectedOrder = SelectedDayOrders.FirstOrDefault(); - foreach (var orderItem in SelectedDayOrders.SelectMany(order => order.OrderItemDtos.Where(orderItem => orderItem.OrderItemPallets.Count == 0))) - { - orderItem.OrderItemPallets.Add(MeasuringService.CreateNewOrderItemPallet(orderItem, LoggedInModel.CustomerDto)); - } + foreach (var orderDto in SelectedDayOrders) PrepareOrderDto(orderDto); + + SelectedOrder = LoggedInModel.IsRevisor + ? SelectedDayOrders.FirstOrDefault(o => o is { IsComplete: false, IsMeasured: true }) + : SelectedDayOrders.FirstOrDefault(o => o.MeasurementOwnerId == 0 || (o.MeasurementOwnerId == (LoggedInModel.CustomerDto?.Id ?? 0) && !o.IsMeasured)); + + SelectedOrder ??= SelectedDayOrders.FirstOrDefault(); + LoadingPanelVisible = false; } private async Task OnMeasuringDateChanged(DateTime selectedDateTime) @@ -75,9 +87,36 @@ namespace FruitBankHybrid.Shared.Pages private bool IsOrderItemPalletMeasuredAndValid(OrderItemPallet orderItemPallet) => MeasuringService.IsCustomItemPalletMeasuredAndValid(orderItemPallet, orderItemPallet.OrderItemDto!.IsMeasurable); - private void OnSelectedOrderChanged(SelectedDataItemChangedEventArgs eventArgs) + private async Task OnSelectedOrderChanged(SelectedDataItemChangedEventArgs eventArgs) { - //SelectedOrderItem = eventArgs.DataItem?.OrderItemDtos?.FirstOrDefault(); + //var orderDtosFromDb = await FruitBankSignalRClient.GetPendingOrderDtos(); + //if (orderDtosFromDb != null) RefreshOrderGenericAttributes(orderDtosFromDb, SelectedDayOrders); + //else MessageBox.ShowMessageBox("Hiba", "Az adatok letöltése sikertelen!", MessageBoxRenderStyle.Danger); + + var orderDto = eventArgs.DataItem; + if (orderDto != null) + { + var orderFromDb = await FruitBankSignalRClient.GetOrderDtoById(orderDto.Id); + if (orderFromDb != null) + { + orderDto.OrderStatus = orderFromDb.OrderStatus; + orderDto.GenericAttributes.UpdateBaseEntityCollection(orderFromDb.GenericAttributes, false); + + if (LoggedInModel.IsRevisor) + { + var orderItemPalletsByOrderId = orderFromDb.OrderItemDtos.Where(o => o.OrderItemPallets.Count > 0).ToDictionary(k => k.Id, v => v.OrderItemPallets); + foreach (var orderItemDto in orderDto.OrderItemDtos) + { + if (orderItemPalletsByOrderId.TryGetValue(orderDto.Id, out var orderItemPallets)) + orderItemDto.OrderItemPallets.UpdateCollection(orderItemPallets, false); + } + } + } + } + + HasMeasuringAccess = orderDto?.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor) ?? false; + + if (!HasMeasuringAccess) await DialogService.ShowMessageBoxAsync("Információ", "A mérés már folyamatban, válasszon másik rendelést", MessageBoxRenderStyle.Info); } private Task OnOrderItemPalletValueChanged(OrderItemPallet orderItemPallet, OrderItemDto selectedOrderItemDto) @@ -123,13 +162,36 @@ namespace FruitBankHybrid.Shared.Pages return Task.CompletedTask; } - private async Task OnMeasuringAuditorClick() + private async Task OnOrdersRefreshClick() + => await RefreshOrdersFromDb(SelectedDayOrders.FirstOrDefault()?.DateOfReceiptOrCreated ?? DateTime.Now); + + private async Task OnStartMeasuringClick() { - if (SelectedOrder != null && SelectedOrder.IsMeasured && SelectedOrder.OrderStatus != OrderStatus.Complete) + if (SelectedOrder != null && LoggedInModel.IsLoggedIn && SelectedOrder.MeasurementOwnerId == 0) { - var responseOrderDto = await FruitBankSignalRClient.SetOrderStatusToComplete(SelectedOrder.Id); + var responseOrderDto = await FruitBankSignalRClient.StartMeasuring(SelectedOrder.Id, LoggedInModel.CustomerDto!.Id); if (responseOrderDto != null) { + PrepareOrderDto(responseOrderDto); + + //SelectedOrder.GenericAttributes.UpdateBaseEntityCollection(responseOrderDto.GenericAttributes, false); + SelectedDayOrders.UpdateCollection(responseOrderDto, false); + SelectedOrder = responseOrderDto; + } + + StateHasChanged(); + } + } + + private async Task OnMeasuringAuditorClick() + { + if (SelectedOrder != null && LoggedInModel.IsRevisor && SelectedOrder.IsMeasured && SelectedOrder.OrderStatus != OrderStatus.Complete) + { + var responseOrderDto = await FruitBankSignalRClient.SetOrderStatusToComplete(SelectedOrder.Id, LoggedInModel.CustomerDto!.Id); + if (responseOrderDto != null) + { + PrepareOrderDto(responseOrderDto); + SelectedDayOrders.UpdateCollection(responseOrderDto, false); SelectedOrder = responseOrderDto; } @@ -138,5 +200,23 @@ namespace FruitBankHybrid.Shared.Pages } } + + private void PrepareOrderDto(OrderDto orderDto) + { + foreach (var orderItemDto in orderDto.OrderItemDtos.Where(orderItem => orderItem.OrderItemPallets.Count == 0)) + { + orderItemDto.OrderItemPallets.Add(MeasuringService.CreateNewOrderItemPallet(orderItemDto, LoggedInModel.CustomerDto)); + } + } + + private static void RefreshOrderGenericAttributes(List srcOrderDtos, List destOrderDtos) + { + var orderAttributesByOrderId = srcOrderDtos.Where(o => o.GenericAttributes.Count > 0).ToDictionary(k => k.Id, v => v.GenericAttributes); + foreach (var orderDto in destOrderDtos) + { + if (orderAttributesByOrderId.TryGetValue(orderDto.Id, out var genericAttributes)) + orderDto.GenericAttributes.UpdateBaseEntityCollection(genericAttributes, false); + } + } } } diff --git a/FruitBankHybrid.Shared/Services/MeasuringService.cs b/FruitBankHybrid.Shared/Services/MeasuringService.cs index 2f6abda..59e55fd 100644 --- a/FruitBankHybrid.Shared/Services/MeasuringService.cs +++ b/FruitBankHybrid.Shared/Services/MeasuringService.cs @@ -17,11 +17,13 @@ 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) + public static void OnCustomDisabledDate(CalendarCustomDisabledDateEventArgs args, List? measuringDates) => args.IsDisabled = measuringDates == null || !measuringDates.Exists(shippingDateModel => DaysEqual(shippingDateModel.DateTime, args.Date)); - public static string GetShippingDateCssClassNames(DateTime date, List measuringDates) + public static string GetShippingDateCssClassNames(DateTime date, List? measuringDates) { + if (measuringDates == null) return string.Empty; + if (measuringDates.Exists(shipping => !shipping.IsMeasured && shipping.DateTime.Date <= DateTime.Now.Date && DaysEqual(shipping.DateTime, date))) return "fw-bold text-danger"; diff --git a/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs b/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs index 8436090..b8f224b 100644 --- a/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs +++ b/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs @@ -143,8 +143,11 @@ namespace FruitBankHybrid.Shared.Services.SignalRs public Task AddOrUpdateMeasuredOrderItemPallet(OrderItemPallet orderItemPallet) => PostDataAsync(SignalRTags.AddOrUpdateMeasuredOrderItemPallet, orderItemPallet); - public Task SetOrderStatusToComplete(int orderId) - => GetByIdAsync(SignalRTags.SetOrderStatusToComplete, orderId); + public Task StartMeasuring(int orderId, int userId) + => GetByIdAsync(SignalRTags.StartMeasuring, [orderId, userId]); + + public Task SetOrderStatusToComplete(int orderId, int revisorId) + => GetByIdAsync(SignalRTags.SetOrderStatusToComplete, [orderId, revisorId]); #endregion Orders } From 153a639ba2c99bf8aaace238328c74a8e56a7f1f Mon Sep 17 00:00:00 2001 From: Loretta Date: Mon, 20 Oct 2025 17:08:13 +0200 Subject: [PATCH 2/3] fixes --- .../Pages/MeasuringOut.razor.cs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs index f027787..5821fa4 100644 --- a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs +++ b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs @@ -56,7 +56,7 @@ namespace FruitBankHybrid.Shared.Pages private async Task RefreshOrdersFromDb(DateTime dateTime) { LoadingPanelVisible = true; - var orders = (await FruitBankSignalRClient.GetPendingOrderDtos() ?? []).Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).ToList(); + var orders = (await FruitBankSignalRClient.GetPendingOrderDtos() ?? []);//.Where(o => o.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor)).ToList(); _measuringDates = orders.Select(order => new MeasuringDateSelectorModel(order.Id, order.DateOfReceiptOrCreated, order.IsMeasured)).ToList(); @@ -69,7 +69,7 @@ namespace FruitBankHybrid.Shared.Pages : SelectedDayOrders.FirstOrDefault(o => o.MeasurementOwnerId == 0 || (o.MeasurementOwnerId == (LoggedInModel.CustomerDto?.Id ?? 0) && !o.IsMeasured)); SelectedOrder ??= SelectedDayOrders.FirstOrDefault(); - LoadingPanelVisible = false; + LoadingPanelVisible = SelectedOrder != null; //Lefut a change és ott lesz false! - J. } private async Task OnMeasuringDateChanged(DateTime selectedDateTime) @@ -94,9 +94,11 @@ namespace FruitBankHybrid.Shared.Pages //else MessageBox.ShowMessageBox("Hiba", "Az adatok letöltése sikertelen!", MessageBoxRenderStyle.Danger); var orderDto = eventArgs.DataItem; - if (orderDto != null) + if (orderDto != null && !LoadingPanelVisible) { + //LoadingPanelVisible = true; var orderFromDb = await FruitBankSignalRClient.GetOrderDtoById(orderDto.Id); + if (orderFromDb != null) { orderDto.OrderStatus = orderFromDb.OrderStatus; @@ -104,6 +106,8 @@ namespace FruitBankHybrid.Shared.Pages if (LoggedInModel.IsRevisor) { + orderDto.OrderItemDtos.UpdateCollection(orderFromDb.OrderItemDtos, false); + var orderItemPalletsByOrderId = orderFromDb.OrderItemDtos.Where(o => o.OrderItemPallets.Count > 0).ToDictionary(k => k.Id, v => v.OrderItemPallets); foreach (var orderItemDto in orderDto.OrderItemDtos) { @@ -114,9 +118,14 @@ namespace FruitBankHybrid.Shared.Pages } } + LoadingPanelVisible = false; HasMeasuringAccess = orderDto?.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor) ?? false; - if (!HasMeasuringAccess) await DialogService.ShowMessageBoxAsync("Információ", "A mérés már folyamatban, válasszon másik rendelést", MessageBoxRenderStyle.Info); + if (!HasMeasuringAccess) + { + //await Task.Delay(250); + await DialogService.ShowMessageBoxAsync("Információ", "A mérés már folyamatban, válasszon másik rendelést!", MessageBoxRenderStyle.Info); + } } private Task OnOrderItemPalletValueChanged(OrderItemPallet orderItemPallet, OrderItemDto selectedOrderItemDto) From 6400278830568418ea178abea77ae428fd738869 Mon Sep 17 00:00:00 2001 From: Loretta Date: Mon, 20 Oct 2025 17:16:41 +0200 Subject: [PATCH 3/3] add warning dialog --- FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs index 5821fa4..2c62c8a 100644 --- a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs +++ b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs @@ -134,17 +134,16 @@ namespace FruitBankHybrid.Shared.Pages return Task.CompletedTask; } - private Task OnOrderItemPalletSaved(OrderItemPallet? orderItemPallet, OrderItemDto selectedOrderItemDto) + private async Task OnOrderItemPalletSaved(OrderItemPallet? orderItemPallet, OrderItemDto selectedOrderItemDto) { if (orderItemPallet != null) { selectedOrderItemDto.OrderItemPallets.UpdateCollection(orderItemPallet, false); //MeasuringValuesHelper.SetShippingItemTotalMeasuringValues(SelectedShippingItem); } - //else LogErrorAndDisplayText($"Sikertelen volt a raklap adatainak mentése! {orderItemPallet}"); + else await DialogService.ShowMessageBoxAsync("Hiba", "Adatok mentése sikertelen volt!", MessageBoxRenderStyle.Danger); StateHasChanged(); - return Task.CompletedTask; } private Task AddNewPalletItemClick(OrderItemDto selectedOrderItemDto) @@ -187,6 +186,7 @@ namespace FruitBankHybrid.Shared.Pages SelectedDayOrders.UpdateCollection(responseOrderDto, false); SelectedOrder = responseOrderDto; } + else await DialogService.ShowMessageBoxAsync("Hiba", "Nem sikerült a mérést elindítani!", MessageBoxRenderStyle.Danger); StateHasChanged(); } @@ -203,10 +203,12 @@ namespace FruitBankHybrid.Shared.Pages SelectedDayOrders.UpdateCollection(responseOrderDto, false); SelectedOrder = responseOrderDto; + + //await DialogService.ShowMessageBoxAsync("Információ", "Adatok mentése sikeres volt!", MessageBoxRenderStyle.Info); } + else await DialogService.ShowMessageBoxAsync("Hiba", "Rendelés jóváhagyása sikertelen volt!", MessageBoxRenderStyle.Danger); StateHasChanged(); - } }