+
-
-
+
+
-
-
-
-
- @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()
+ }
+ }
+
+
-
-
-
-
- @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)
+ {
+
+
+ ℹ Válasszon ki egy rendelést a mérés indításához.
+
+
+ }
+ 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)
+ {
+
+ ⚠ Figyelem! Jelenleg más felhasználó végzi a mérést ennél a rendelésnél.
+
+ }
+ else
+ {
+ var orderNote = MeasurementService.GetOrderNote(SelectedOrder?.OrderNotes);
+ if (!string.IsNullOrWhiteSpace(orderNote))
+ {
+
+ 📝 Megjegyzés: @(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())
+ {
+
+
+ ⚠ Hiba: @_errorText
+
+
+ }
+
+
+ }
+ }
+
+
+
+ }
+
+
+
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 @@
+
-
-
+
+
+