diff --git a/FruitBank.Common.Server/FruitBank.Common.Server.csproj b/FruitBank.Common.Server/FruitBank.Common.Server.csproj index c31b4f30..596a520d 100644 --- a/FruitBank.Common.Server/FruitBank.Common.Server.csproj +++ b/FruitBank.Common.Server/FruitBank.Common.Server.csproj @@ -8,6 +8,8 @@ + + @@ -15,7 +17,6 @@ - @@ -26,25 +27,22 @@ - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Core.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Interfaces.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.Server.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Models.Server.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.Server.dll - - - C:\Program Files\dotnet\packs\Microsoft.AspNetCore.App.Ref\9.0.13\ref\net9.0\Microsoft.AspNetCore.SignalR.Core.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.Server.dll - ..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll + ..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\$(Configuration)\net9.0\Mango.Nop.Core.dll diff --git a/FruitBank.Common/FruitBank.Common.csproj b/FruitBank.Common/FruitBank.Common.csproj index 7e9f0e76..e9d8d297 100644 --- a/FruitBank.Common/FruitBank.Common.csproj +++ b/FruitBank.Common/FruitBank.Common.csproj @@ -18,25 +18,25 @@ - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Core.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Entities.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Entities.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Interfaces.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Models.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Utils.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Utils.dll - ..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll + ..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\$(Configuration)\net9.0\Mango.Nop.Core.dll diff --git a/FruitBankHybrid.Shared/Components/GridShippingDocument.razor b/FruitBankHybrid.Shared/Components/GridShippingDocument.razor index 08c783a9..2fc79752 100644 --- a/FruitBankHybrid.Shared/Components/GridShippingDocument.razor +++ b/FruitBankHybrid.Shared/Components/GridShippingDocument.razor @@ -43,6 +43,7 @@ + + CssClass="@GridCss" ValidationEnabled="false" OnGridFocusedRowChanged="Grid_FocusedRowChanged"> + @* CustomizeGroupValueDisplayText="Grid_CustomizeGroupValueDisplayText"> *@ - + - - - @(((StockTakingItem)context.DataItem)?.StockTaking?.StartDateTime.ToString("g") ?? "") - - - - + + + + - + - - + + @@ -41,8 +39,8 @@ - - + + @@ -103,22 +101,14 @@ EditItemsEnabled = true; } - // void Grid_CustomGroup(GridCustomGroupEventArgs e) + // static void Grid_CustomizeGroupValueDisplayText(GridCustomizeGroupValueDisplayTextEventArgs e) // { - // if (e.FieldName != "StockTaking.StartDateTime") return; + // if (e.FieldName != nameof(StockTakingItem.StockTakingId)) return; - // e.SameGroup = ((StockTakingItem)e.DataItem1).StockTakingId == ((StockTakingItem)e.DataItem2).StockTakingId; - // e.Handled = true; - // } - - // void Grid_CustomizeGroupValueDisplayText(GridCustomizeGroupValueDisplayTextEventArgs e) - // { - // return; - - // if (e.FieldName != "StockTaking.StartDateTime") return; - - // var startDate = (DateTime)e.Value; - // e.DisplayText = startDate.ToString("g"); + // if (e.GetRowValue("StockTaking.StartDateTime") is DateTime startDateTime) + // { + // e.DisplayText = startDateTime.ToString("g"); + // } // } } diff --git a/FruitBankHybrid.Shared/FruitBankHybrid.Shared.csproj b/FruitBankHybrid.Shared/FruitBankHybrid.Shared.csproj index 7aaf2101..a05e9eea 100644 --- a/FruitBankHybrid.Shared/FruitBankHybrid.Shared.csproj +++ b/FruitBankHybrid.Shared/FruitBankHybrid.Shared.csproj @@ -29,25 +29,25 @@ - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Core.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Entities.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Entities.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Interfaces.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Models.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.Server.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.Server.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Utils.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Utils.dll @@ -65,7 +65,7 @@ - ..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll + ..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\$(Configuration)\net9.0\Mango.Nop.Core.dll diff --git a/FruitBankHybrid.Shared/Pages/MeasuringIn.razor b/FruitBankHybrid.Shared/Pages/MeasuringIn.razor index 08dfd587..27c7e14b 100644 --- a/FruitBankHybrid.Shared/Pages/MeasuringIn.razor +++ b/FruitBankHybrid.Shared/Pages/MeasuringIn.razor @@ -3,14 +3,16 @@ @using DevExpress.Blazor @using DevExpress.Blazor.Internal @using FruitBank.Common.Entities +@using FruitBank.Common.Enums @using FruitBank.Common.SignalRs @using FruitBankHybrid.Shared.Components @using FruitBankHybrid.Shared.Services +@using AyCode.Blazor.Components.Components.CardViews @using Mango.Nop.Core.Dtos

Áru bevételezés

-
+
- - + + - - - - - @ctxShipping.DisplayText - - - - - @* - - - @ctxShippingDocument.DisplayText - - - - *@ - - - - @*
- - -
- @ctxShippingitem.DisplayText -
-
- *@ - @ctxShippingitem.DisplayText) -
- - - - -
-
- - - @{ - var sd = SelectedShippingItem?.ShippingDocument; - if (sd != null) - { - var partnerName = sd.Partner?.Name; - - - @($"{partnerName}, {sd.ShippingItems?.Count(si => si.IsMeasured) ?? 0}/{sd.ShippingItems?.Count ?? 0} kész.") - - } - } - -
-
- @if (SelectedShippingItem is { ProductId: > 0 }) - { -

- #@(SelectedShippingItem.ProductId). @(SelectedShippingItem.ProductName) -

- - - - @for (var index = 0; index < (SelectedShippingItem?.ShippingItemPallets?.Count ?? 0); index++) - { - var localI = index + 1; - var currentShippingItemPallet = SelectedShippingItem!.ShippingItemPallets![index]; - - - - } - - - - - TOTAL: - - - Rekesz: @(SelectedShippingItem.MeasuredQuantity) db - Br: @(SelectedShippingItem.MeasuredGrossWeight) kg - Net: @(SelectedShippingItem.MeasuredNetWeight) kg - - - - - @* - - *@ - - @if (!_errorText.IsNullOrWhiteSpace()) - { - - HIBA! @_errorText + + +
+ + + + + +
+
@context.LicencePlate
+ @(MeasurementService.GetMeasuringStatusText(MeasurementService.GetShippingMeasuringStatus(context))) +
+
+ @context.ShippingDate.ToString("yyyy.MM.dd") + @if (!string.IsNullOrWhiteSpace(context.CargoCompany)) + { + — @context.CargoCompany + } +
+ @{ + var allItems = context.ShippingDocuments? + .Where(sd => sd.ShippingItems is not null) + .SelectMany(sd => sd.ShippingItems!); + } + @if (allItems is not null) + { + @foreach (var item in allItems) + { +
+ @item.ProductName — @item.MeasuredQuantity/@item.QuantityOnDocument rekesz +
+ } + } + @if (!string.IsNullOrWhiteSpace(context.Comment)) + { +
+ 📝 @context.Comment +
+ } +
+
+
+
+ +
+ + + + + @ctxShipping.DisplayText + + - //_errorText = string.Empty; - } - - } -
+ +@* + + + @ctxShippingDocument.DisplayText + + + *@ + + + + +@*
+ + +
+ @ctxShippingitem.DisplayText +
+
*@ + @ctxShippingitem.DisplayText) +
+ + + +
+
+ + + @{ + var sd = SelectedShippingItem?.ShippingDocument; + if (sd != null) + { + var partnerName = sd.Partner?.Name; + + + @($"{partnerName}, {sd.ShippingItems?.Count(si => si.IsMeasured) ?? 0}/{sd.ShippingItems?.Count ?? 0} kész.") + + } + } + +
+ +
+ @if (SelectedShippingItem is { ProductId: > 0 }) + { +

+ #@(SelectedShippingItem.ProductId). @(SelectedShippingItem.ProductName) +

+ + + + @for (var index = 0; index < (SelectedShippingItem?.ShippingItemPallets?.Count ?? 0); index++) + { + var localI = index + 1; + var currentShippingItemPallet = SelectedShippingItem!.ShippingItemPallets![index]; + + + + } + + + + + TOTAL: + + + Rekesz: @(SelectedShippingItem.MeasuredQuantity) db + Br: @(SelectedShippingItem.MeasuredGrossWeight) kg + Net: @(SelectedShippingItem.MeasuredNetWeight) kg + + + + + @* + + *@ + + @if (!_errorText.IsNullOrWhiteSpace()) + { + + HIBA! @_errorText + + //_errorText = string.Empty; + } + + } +
+
+ +
+ +@code { +} diff --git a/FruitBankHybrid.Shared/Pages/MeasuringIn.razor.cs b/FruitBankHybrid.Shared/Pages/MeasuringIn.razor.cs index a774466f..42a9d4b0 100644 --- a/FruitBankHybrid.Shared/Pages/MeasuringIn.razor.cs +++ b/FruitBankHybrid.Shared/Pages/MeasuringIn.razor.cs @@ -3,6 +3,7 @@ using AyCode.Core.Loggers; using DevExpress.Blazor; using FruitBank.Common.Dtos; using FruitBank.Common.Entities; +using FruitBank.Common.Enums; using FruitBank.Common.Helpers; using FruitBank.Common.Interfaces; using FruitBank.Common.Models; @@ -26,6 +27,15 @@ namespace FruitBankHybrid.Shared.Pages private ILogger _logger = null!; private string _errorText; + private enum MeasuringTab + { + DailyTasks = 0, + Measuring = 1 + } + + private MeasuringTab _activeTab = MeasuringTab.DailyTasks; + private IEnumerable _statusFilter = []; + private List NotMeasuredShippings { get; set; } = null!; private Shipping? SelectedShipping { get; set; } //private ShippingDocument? SelectedShippingDocument { get; set; } @@ -37,6 +47,12 @@ namespace FruitBankHybrid.Shared.Pages private List? _shippingItemsDataSource; private List _measuringDates = null!; + private IReadOnlyList FilteredShippings => NotMeasuredShippings is null + ? [] + : _statusFilter.Any() + ? NotMeasuredShippings.Where(s => _statusFilter.Contains(MeasurementService.GetShippingMeasuringStatus(s))).ToList() + : NotMeasuredShippings; + protected override async Task OnInitializedAsync() { LoadingPanelVisible = true; @@ -181,6 +197,20 @@ namespace FruitBankHybrid.Shared.Pages //Nem végezhető el a mérés, nincs megadva a ProductId! Jelezze a vezetőségnek... } + /// + /// Navigates from a card click (Napi feladatok tab) to the Mérés tab with the selected shipping. + /// + private void NavigateToMeasuringTab(Shipping shipping) + { + SelectedShipping = shipping; + + PrepareShippingItems(shipping); + _shippingItemsDataSource = GetShippingItemsDataSource(shipping); + SelectedShippingItem = _shippingItemsDataSource?.FirstOrDefault(); + + _activeTab = MeasuringTab.Measuring; + } + private void PrepareShippingItems(Shipping? shipping) { if (shipping?.ShippingDocuments == null) return; diff --git a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor index 65ec04bc..b831cded 100644 --- a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor +++ b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor @@ -7,13 +7,13 @@ @using FruitBank.Common.SignalRs @using FruitBankHybrid.Shared.Components @using FruitBankHybrid.Shared.Services +@using AyCode.Blazor.Components.Components.CardViews @using Nop.Core.Domain.Orders

Áru kiadás

-
- +
- - + -
-
-
- - - @{ - var cssClass = GetMeasuringDateCssClassNames(ctxOrderDate); - if (!cssClass.IsNullOrWhiteSpace()) - { - @ctxOrderDate.Day.ToString() - } - else - { - @ctxOrderDate.Day.ToString() - } - } - - -
-
- -
-
-
+ + + @{ + var cssClass = GetMeasuringDateCssClassNames(ctxOrderDate); + if (!cssClass.IsNullOrWhiteSpace()) + { + @ctxOrderDate.Day.ToString() + } + else + { + @ctxOrderDate.Day.ToString() + } + } + +
- - - - - @ctxOrder.DisplayText - - - - - + + - - @if (SelectedOrder == null) - { - - } - else - { - if (SelectedOrder is { MeasurementOwnerId: 0, IsComplete: false } && HasMeasuringAccess) - { - - - - } - else - { - - - - } - } - - @* *@ - @if (SelectedOrder != null && LoggedInModel.IsRevisor) - { - var isCompleteOrder = SelectedOrder.IsComplete; - - - - - }
- @if (SelectedOrder == null || LoadingPanelVisible) - { - } - else if (!HasMeasuringAccess) - { -
-

Mások végzik a mérést!

-
- } - else - { - string? orderNote; - if (!(orderNote = SelectedOrder?.OrderNotes.LastOrDefault(x => x.Note.StartsWith('*'))?.Note).IsNullOrWhiteSpace()) - { -
- Megjegyzés: @(orderNote) + + +
+ + + + + +
+
#@context.CustomOrderNumber
+ @(MeasurementService.GetMeasuringStatusText(context.MeasuringStatus)) +
+
+ @context.DateOfReceiptOrCreated.ToString("HH:mm") — @context.Customer.Company +
+ @foreach (var item in context.OrderItemDtos) + { +
+ @item.ProductName — @item.TrayQuantity/@item.Quantity rekesz +
+ } + @{ + var cardOrderNote = MeasurementService.GetOrderNote(context.OrderNotes); + } + @if (!string.IsNullOrWhiteSpace(cardOrderNote)) + { +
+ 📝 @cardOrderNote +
+ } +
+
- } +
+ +
+ + + + + @ctxOrder.DisplayText + + + + + + -
-

- Rendelés azonosító: #@(SelectedOrder?.CustomOrderNumber) -

- - - - - @* *@ - - - @{ - if (context.Level == 0) + @if (SelectedOrder == null) + { + + + + } + else + { + if (SelectedOrder is { MeasurementOwnerId: 0, IsComplete: false } && HasMeasuringAccess) { - 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 (isValid && !selectedOrderItemDto.AverageWeightIsValid) cssClass = "text-warning"; - else if (isValidAndMeasured) cssClass = "text-success"; - else if (isValid) cssClass = string.Empty; - - var displayText = $"{selectedOrderItemDto.ProductName} - [{trayQuantity}/{selectedOrderItemDto.Quantity} rekesz, {(selectedOrderItemDto.IsMeasurable ? "net.súly: " + selectedOrderItemDto.NetWeight + "kg." : "nem mérendő!")}]"; - if (selectedOrderItemDto.MeasuringStatus == MeasuringStatus.Audited) displayText = $"[{selectedOrderItemDto.MeasuringStatus}] " + displayText; - -
@(displayText)
+ + + + } + else + { + + + } } -
- - @{ - if (context.Level == 0) - { - var selectedOrderItem = (OrderItemDto)(context.DataItem); - - - @for (var index = 0; index < (selectedOrderItem?.OrderItemPallets?.Count ?? 0); index++) + @if (SelectedOrder != null && LoggedInModel.IsRevisor) + { + var isCompleteOrder = SelectedOrder.IsComplete; + + + + + } + + + @if (SelectedOrder == null || LoadingPanelVisible) + { + } + else if (!HasMeasuringAccess) + { + + } + else + { + var orderNote = MeasurementService.GetOrderNote(SelectedOrder?.OrderNotes); + if (!string.IsNullOrWhiteSpace(orderNote)) + { + + } + +
+

+ Rendelés azonosító: #@(SelectedOrder?.CustomOrderNumber) +

+ + + + + + + @{ + if (context.Level == 0) { - var localI = index + 1; - var currentOrderItemPallet = selectedOrderItem!.OrderItemPallets![index]; + 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 (isValid && !selectedOrderItemDto.AverageWeightIsValid) cssClass = "text-warning"; + else if (isValidAndMeasured) cssClass = "text-success"; + else if (isValid) cssClass = string.Empty; + + var displayText = $"{selectedOrderItemDto.ProductName} - [{trayQuantity}/{selectedOrderItemDto.Quantity} rekesz, {(selectedOrderItemDto.IsMeasurable ? "net.súly: " + selectedOrderItemDto.NetWeight + "kg." : "nem mérendő!")}]"; + if (selectedOrderItemDto.MeasuringStatus == MeasuringStatus.Audited) displayText = $"[{selectedOrderItemDto.MeasuringStatus}] " + displayText; + +
@(displayText)
} - - - - - - - - - - - - - - TOTAL: - - - - Rekesz: @(selectedOrderItem.TrayQuantity) db - Br: @(selectedOrderItem.GrossWeight) kg - Net: @(selectedOrderItem.NetWeight) kg - - - - - @if (!_errorText.IsNullOrWhiteSpace()) - { - - HIBA! @_errorText - - //_errorText = string.Empty; } - -
- } - } - -
-
- } + + + @{ + if (context.Level == 0) + { + var selectedOrderItem = (OrderItemDto)(context.DataItem); + + + + @for (var index = 0; index < (selectedOrderItem?.OrderItemPallets?.Count ?? 0); index++) + { + var localI = index + 1; + var currentOrderItemPallet = selectedOrderItem!.OrderItemPallets![index]; + + + + } + + + + + + + + + + + + + + TOTAL: + + + + Rekesz: @(selectedOrderItem.TrayQuantity) db + Br: @(selectedOrderItem.GrossWeight) kg + Net: @(selectedOrderItem.NetWeight) kg + + + + + @if (!_errorText.IsNullOrWhiteSpace()) + { + + + + } + +
+ } + } +
+
+
+ } +
+
+
diff --git a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs index 85858aa0..96511bd7 100644 --- a/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs +++ b/FruitBankHybrid.Shared/Pages/MeasuringOut.razor.cs @@ -4,6 +4,7 @@ using AyCode.Services.SignalRs; using DevExpress.Blazor; using FruitBank.Common.Dtos; using FruitBank.Common.Entities; +using FruitBank.Common.Enums; using FruitBank.Common.Models; using FruitBank.Common.SignalRs; using FruitBankHybrid.Shared.Extensions; @@ -30,8 +31,16 @@ namespace FruitBankHybrid.Shared.Pages private LoggerClient _logger = null!; private string _errorText; + private enum MeasuringTab + { + DailyTasks = 0, + Measuring = 1 + } + private bool _enablePalletItems = true; private int _lastDaysCount = 1; + private MeasuringTab _activeTab = MeasuringTab.DailyTasks; + private IEnumerable _statusFilter = [MeasuringStatus.NotStarted, MeasuringStatus.Started, MeasuringStatus.Finnished]; public bool HasMeasuringAccess; public bool LoadingPanelVisible { get; set; } = true; public bool IsAllOrderItemPalletAudited => SelectedOrder?.IsAllOrderItemAudited ?? false; @@ -42,6 +51,12 @@ namespace FruitBankHybrid.Shared.Pages private List _measuringDates = null!; + private IReadOnlyList FilteredOrders => SelectedDayOrders is null + ? [] + : _statusFilter.Any() + ? SelectedDayOrders.Where(o => _statusFilter.Contains(o.MeasuringStatus)).ToList() + : SelectedDayOrders; + protected override async Task OnInitializedAsync() { LoadingPanelVisible = true; @@ -187,7 +202,7 @@ namespace FruitBankHybrid.Shared.Pages SelectedOrder ??= SelectedDayOrders.FirstOrDefault(); } - LoadingPanelVisible = SelectedOrder != null; //Lefut a change és ott lesz false! - J. + LoadingPanelVisible = false; } private async Task OnMeasuringDateChanged(DateTime selectedDateTime) => await RefreshOrdersFromDb(selectedDateTime, _lastDaysCount); @@ -206,42 +221,11 @@ namespace FruitBankHybrid.Shared.Pages private async Task OnSelectedOrderChanged(SelectedDataItemChangedEventArgs eventArgs) { - //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 && !LoadingPanelVisible) - { - //LoadingPanelVisible = true; - var orderFromDb = await FruitBankSignalRClient.GetOrderDtoById(orderDto.Id); + await RefreshOrderStatusFromDbAsync(orderDto); - if (orderFromDb != null) - { - orderDto.OrderStatus = orderFromDb.OrderStatus; - orderDto.GenericAttributes.UpdateBaseEntityCollection(orderFromDb.GenericAttributes, false); - - //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) - // { - // if (orderItemPalletsByOrderId.TryGetValue(orderDto.Id, out var orderItemPallets)) - // orderItemDto.OrderItemPallets.UpdateCollection(orderItemPallets, false); - // } - //} - } - } - - LoadingPanelVisible = false; - HasMeasuringAccess = orderDto?.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor) ?? false; - - StateHasChanged(); - - if (!HasMeasuringAccess && orderDto != null) - await DialogService.ShowMessageBoxAsync("Információ", "A mérés már folyamatban, válasszon másik rendelést!", MessageBoxRenderStyle.Info); + await ApplyMeasuringAccessAsync(orderDto); } private Task OnOrderItemPalletValueChanged(OrderItemPallet orderItemPallet, OrderItemDto selectedOrderItemDto) @@ -383,6 +367,49 @@ namespace FruitBankHybrid.Shared.Pages } } + /// + /// Navigates from a card click (Napi feladatok tab) to the Mérés tab with the selected order. + /// Loads the full order from DB and switches the active tab. + /// + private async Task NavigateToMeasuringTab(OrderDto order) + { + LoadingPanelVisible = true; + SelectedOrder = order; + + await RefreshOrderStatusFromDbAsync(order); + + _activeTab = MeasuringTab.Measuring; + + await ApplyMeasuringAccessAsync(order); + } + + /// + /// Fetches the latest order data from DB and updates status and generic attributes. + /// + private async Task RefreshOrderStatusFromDbAsync(OrderDto order) + { + var orderFromDb = await FruitBankSignalRClient.GetOrderDtoById(order.Id); + if (orderFromDb != null) + { + order.OrderStatus = orderFromDb.OrderStatus; + order.GenericAttributes.UpdateBaseEntityCollection(orderFromDb.GenericAttributes, false); + } + } + + /// + /// Sets measuring access, hides loading panel, refreshes UI, and shows info dialog if access is denied. + /// + private async Task ApplyMeasuringAccessAsync(OrderDto? order) + { + HasMeasuringAccess = order?.HasMeasuringAccess(LoggedInModel.CustomerDto?.Id, LoggedInModel.IsRevisor) ?? false; + LoadingPanelVisible = false; + + StateHasChanged(); + + if (!HasMeasuringAccess && order != null) + await DialogService.ShowMessageBoxAsync("Információ", "A mérés már folyamatban, válasszon másik rendelést!", MessageBoxRenderStyle.Info); + } + public void Dispose() { FruitBankSignalRClient.OnMessageReceived -= SignalRClientOnMessageReceived; diff --git a/FruitBankHybrid.Shared/Services/MeasurementService.cs b/FruitBankHybrid.Shared/Services/MeasurementService.cs index 6db0a97a..38688f1b 100644 --- a/FruitBankHybrid.Shared/Services/MeasurementService.cs +++ b/FruitBankHybrid.Shared/Services/MeasurementService.cs @@ -2,12 +2,14 @@ using DevExpress.Blazor; using FruitBank.Common.Dtos; using FruitBank.Common.Entities; +using FruitBank.Common.Enums; using FruitBank.Common.Interfaces; using FruitBank.Common.Services; using FruitBankHybrid.Shared.Models; using FruitBankHybrid.Shared.Services.Loggers; using Mango.Nop.Core.Dtos; using Mango.Nop.Core.Loggers; +using Nop.Core.Domain.Orders; namespace FruitBankHybrid.Shared.Services; @@ -109,4 +111,66 @@ public class MeasurementService(IEnumerable logWriters) public static bool IsCustomItemPalletMeasuredAndValid(IMeasuringItemPalletBase customItemPallet, bool isMeasurable) => customItemPallet.IsMeasuredAndValid(isMeasurable); + + /// + /// Returns the last order note starting with '*', or null if none exists. + /// + public static string? GetOrderNote(IEnumerable? orderNotes) + => orderNotes?.LastOrDefault(x => x.Note.StartsWith('*'))?.Note; + + /// + /// Returns a Bootstrap badge CSS class for the given measuring status. + /// When is false, Finnished is treated as the final state (success/green). + /// + public static string GetMeasuringStatusBadgeCssClass(MeasuringStatus status, bool hasAuditedStage = true) => status switch + { + MeasuringStatus.Audited => "bg-success", + MeasuringStatus.Finnished => hasAuditedStage ? "bg-primary" : "bg-success", + MeasuringStatus.Started => "bg-warning text-dark", + _ => "bg-secondary" + }; + + /// + /// Returns a localized display text for the given measuring status. + /// + public static string GetMeasuringStatusText(MeasuringStatus status) => status switch + { + MeasuringStatus.Audited => "Lezárva", + MeasuringStatus.Finnished => "Kész", + MeasuringStatus.Started => "Folyamatban", + _ => "Nem kezdett" + }; + + /// + /// Returns a text color CSS class for the given measuring status. + /// When is false, Finnished is treated as the final state (success/green). + /// + public static string GetMeasuringStatusCssClass(MeasuringStatus status, bool hasAuditedStage = true) => status switch + { + MeasuringStatus.Audited => "text-success", + MeasuringStatus.Finnished => hasAuditedStage ? "text-primary" : "text-success", + MeasuringStatus.Started => "text-warning", + _ => "text-muted" + }; + + /// + /// Computes a shipping-level MeasuringStatus from its items. + /// + public static MeasuringStatus GetShippingMeasuringStatus(Shipping shipping) + { + var items = shipping.ShippingDocuments? + .Where(sd => sd.ShippingItems is not null) + .SelectMany(sd => sd.ShippingItems!); + + if (items is null || !items.Any()) + return MeasuringStatus.NotStarted; + + if (items.All(si => si.IsMeasured)) + return MeasuringStatus.Finnished; + + if (items.Any(si => si.MeasuringStatus == MeasuringStatus.Started || si.IsMeasured)) + return MeasuringStatus.Started; + + return MeasuringStatus.NotStarted; + } } \ No newline at end of file diff --git a/FruitBankHybrid.Shared/wwwroot/app.css b/FruitBankHybrid.Shared/wwwroot/app.css index 7f7ea73c..71e41aa0 100644 --- a/FruitBankHybrid.Shared/wwwroot/app.css +++ b/FruitBankHybrid.Shared/wwwroot/app.css @@ -79,12 +79,19 @@ h1:focus { .measuring-form-layout { margin-top: 15px; - margin-bottom: 25px; + margin-bottom: 10px; padding: 8px; - background-color: lightgrey; + background-color: #e9eff5; + border: 1px solid #d5dde6; border-radius: 8px; } +.measuring-tabs { + border: 1px solid #d5dde6; + border-radius: 8px; + padding: 0; +} + .dd-body-class, .dd-body-class .dxbl-list-box-render-container { max-height: 600px !important; diff --git a/FruitBankHybrid.Web.Client/FruitBankHybrid.Web.Client.csproj b/FruitBankHybrid.Web.Client/FruitBankHybrid.Web.Client.csproj index c835016f..e1b552ea 100644 --- a/FruitBankHybrid.Web.Client/FruitBankHybrid.Web.Client.csproj +++ b/FruitBankHybrid.Web.Client/FruitBankHybrid.Web.Client.csproj @@ -28,37 +28,37 @@ - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Core.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Core.Server.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Core.Server.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Entities.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Entities.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Entities.Server.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Entities.Server.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Interfaces.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Interfaces.Server.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Interfaces.Server.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Models.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Models.Server.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Models.Server.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Services.Server.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Services.Server.dll - ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\Debug\net9.0\AyCode.Utils.dll + ..\..\..\..\Aycode\Source\AyCode.Core\AyCode.Services.Server\bin\FruitBank\$(Configuration)\net9.0\AyCode.Utils.dll @@ -66,7 +66,7 @@ - ..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\Debug\net9.0\Mango.Nop.Core.dll + ..\..\NopCommerce.Common\4.70\Libraries\Mango.Nop.Core\bin\FruitBank\$(Configuration)\net9.0\Mango.Nop.Core.dll diff --git a/FruitBankHybrid.Web/Components/App.razor b/FruitBankHybrid.Web/Components/App.razor index 354fe3a0..65f5e74c 100644 --- a/FruitBankHybrid.Web/Components/App.razor +++ b/FruitBankHybrid.Web/Components/App.razor @@ -26,6 +26,7 @@ +