diff --git a/FruitBank.Common/Entities/EkaerHistory.cs b/FruitBank.Common/Entities/EkaerHistory.cs index d2113409..34b9f56a 100644 --- a/FruitBank.Common/Entities/EkaerHistory.cs +++ b/FruitBank.Common/Entities/EkaerHistory.cs @@ -92,18 +92,21 @@ public static class EkaerStatusExtensions public static bool NeedsCompletion(this EkaerStatus status) => status is EkaerStatus.SentWithMissingData; } -/// EkaerHistory-lekérdezés szűrő a tabokhoz. = 0 (minden) — szándékosan explicit, NEM nullable, -/// hogy ne kelljen null-t kezelni sehol; a default érték (0) automatikusan „minden", ami biztonságos. +/// EkaerHistory-lekérdezés szűrő a tabokhoz, . A kategóriák diszjunkt +/// StatusId-partíciók, ezért kombinálhatók (pl. ToSubmit | NeedsCompletion = minden, ami még nincs lezárva). +/// = 0 (nincs bit = nincs szűrő → minden), egyúttal a biztonságos default; szándékosan NEM nullable. +/// Vigyázat: HasFlag(All) mindig true (0 bit), ezért a szerver előbb a == All ágat nézi. +[Flags] public enum EkaerHistoryFilter { - /// Minden rekord (nincs szűrés). + /// Minden rekord (nincs szűrés). 0 = nincs bit → minden; egyúttal a biztonságos default. All = 0, /// Beküldésre váró: minden, ami még NINCS a NAV-nál (Pending/Generated/GeneratedWithWarning/ValidationError/SendError). - ToSubmit, + ToSubmit = 1, /// Elküldött és hiánytalan (). - Sent, + Sent = 2, /// Elküldve, de pótlásra vár (). - NeedsCompletion, + NeedsCompletion = 4, } //public sealed class EkaerHistoryShipping : EkaerHistoryBase diff --git a/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs b/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs index 4152eb0c..703e61fe 100644 --- a/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs +++ b/FruitBank.Common/Interfaces/IFruitBankDataControllerCommon.cs @@ -37,6 +37,7 @@ public interface IFruitBankDataControllerCommon public Task GenerateEkaerXmlDocument(int foreignKey, bool isOutgoing); public Task CreateEkaerHistory(int foreignKey, bool isOutgoing); public Task CreateMissingEkaerHistories(DateTime fromDate); + public Task GetEkaerHistoryCount(EkaerHistoryFilter filter); #endregion EkaerHistory #region CargoPartner diff --git a/FruitBank.Common/SignalRs/SignalRTags.cs b/FruitBank.Common/SignalRs/SignalRTags.cs index 3232da03..d62c2ec3 100644 --- a/FruitBank.Common/SignalRs/SignalRTags.cs +++ b/FruitBank.Common/SignalRs/SignalRTags.cs @@ -126,6 +126,7 @@ public class SignalRTags : AcSignalRTags public const int GenerateEkaerXmlDocument = 190; public const int CreateEkaerHistory = 191; public const int CreateMissingEkaerHistories = 192; + public const int GetEkaerHistoryCount = 193; public const int AuthenticateUser = 195; public const int RefreshToken = 200; diff --git a/FruitBankHybrid.Shared/Components/Grids/Ekaers/GridEkaerHistory.razor b/FruitBankHybrid.Shared/Components/Grids/Ekaers/GridEkaerHistory.razor index b8861425..6fb0fa17 100644 --- a/FruitBankHybrid.Shared/Components/Grids/Ekaers/GridEkaerHistory.razor +++ b/FruitBankHybrid.Shared/Components/Grids/Ekaers/GridEkaerHistory.razor @@ -143,6 +143,10 @@ /// Szerver-oldali szűrő (a tabok adják): ToSubmit / Sent / NeedsCompletion. Default All = minden. [Parameter] public EkaerHistoryFilter Filter { get; set; } = EkaerHistoryFilter.All; + /// A szülő (oldal) értesítése, ha egy művelet státuszt válthatott (generálás / kézi mentés / jövőbeni beküldés) — + /// hogy a fül-számlálók azonnal frissüljenek, mert a sor átkerülhet másik tabra. + [Parameter] public EventCallback OnDataChanged { get; set; } + public bool IsMasterGrid => ParentDataItem == null; private LoggerClient _logger; @@ -170,7 +174,10 @@ if (Grid == null) return; if (Grid.IsEditing() && !Grid.IsEditingNewRow()) + { await Grid.SaveChangesAsync(); + await NotifyDataChanged(); // kézi szerkesztés (pl. Status → SentWithMissingData) → fül-szám frissítése + } FocusedRowVisibleIndex = args.VisibleIndex; EditItemsEnabled = true; @@ -186,6 +193,9 @@ private static bool CanCopy(EkaerHistory ekaerHistory) => ekaerHistory.Status.IsSubmittable() && !string.IsNullOrWhiteSpace(ekaerHistory.XmlDoc); + // A szülő-oldal (fül-számlálók) értesítése egy státuszt érintő művelet után. Üres delegáltnál no-op. + private Task NotifyDataChanged() => OnDataChanged.HasDelegate ? OnDataChanged.InvokeAsync() : Task.CompletedTask; + private async Task OnGenerateClick(EkaerHistory ekaerHistory) { if (!_generatingIds.Add(ekaerHistory.Id)) return; @@ -217,6 +227,7 @@ { _generatingIds.Remove(ekaerHistory.Id); Grid?.Reload(); + await NotifyDataChanged(); } } diff --git a/FruitBankHybrid.Shared/Pages/Ekaer.razor b/FruitBankHybrid.Shared/Pages/Ekaer.razor index a4ce3750..8dda41ef 100644 --- a/FruitBankHybrid.Shared/Pages/Ekaer.razor +++ b/FruitBankHybrid.Shared/Pages/Ekaer.razor @@ -15,15 +15,15 @@ IndicatorAreaVisible="false" Text="Adatok szinkronizálása folyamatban..."> - + - + + + + - - - - + diff --git a/FruitBankHybrid.Shared/Pages/Ekaer.razor.cs b/FruitBankHybrid.Shared/Pages/Ekaer.razor.cs index d7c2ecef..ce186905 100644 --- a/FruitBankHybrid.Shared/Pages/Ekaer.razor.cs +++ b/FruitBankHybrid.Shared/Pages/Ekaer.razor.cs @@ -1,7 +1,9 @@ using AyCode.Core.Loggers; +using FruitBank.Common.Entities; using FruitBank.Common.Models; using FruitBankHybrid.Shared.Components.Grids.Ekaers; using FruitBankHybrid.Shared.Services.Loggers; +using FruitBankHybrid.Shared.Services.SignalRs; using Mango.Nop.Core.Loggers; using Microsoft.AspNetCore.Components; @@ -12,6 +14,7 @@ public partial class Ekaer : ComponentBase [Inject] public required IEnumerable LogWriters { get; set; } [Inject] public required NavigationManager NavManager { get; set; } [Inject] public required LoggedInModel LoggedInModel { get; set; } + [Inject] public required FruitBankSignalRClient FruitBankSignalRClient { get; set; } private GridEkaerHistory gridEkaerHistoryPending; private GridEkaerHistory gridEkaerHistorySent; @@ -20,20 +23,40 @@ public partial class Ekaer : ComponentBase private ILogger _logger = null!; public int ActiveTabIndex; - protected override Task OnInitializedAsync() + /// Pótlásra váró (SentWithMissingData) rekordok száma a fül feliratához — hogy ránézésre látsszon, ha van pótolnivaló. + private int _needsCompletionCount; + public string NeedsCompletionTabText => _needsCompletionCount > 0 ? $"Pótlásra váró ({_needsCompletionCount})" : "Pótlásra váró"; + + protected override async Task OnInitializedAsync() { if (!LoggedInModel.IsRevisor) NavManager.NavigateTo("/Login"); _logger = new LoggerClient(LogWriters.ToArray()); _logger.Info("OnInitializedAsync"); - return base.OnInitializedAsync(); + await base.OnInitializedAsync(); + await RefreshNeedsCompletionCountAsync(); } - protected Task OnActiveTabChanged(int activeTabIndex) + protected async Task OnActiveTabChanged(int activeTabIndex) { ActiveTabIndex = activeTabIndex; - // A fülek tartalma (EKÁER-grid) külön feladat — több előfeltétele van (kliens-metódus, szűrés). - return Task.CompletedTask; + // Fülváltáskor frissítjük a számlálót — a gridben végzett művelet (generálás/státusz-állítás) megváltoztathatta. + await RefreshNeedsCompletionCountAsync(); + } + + /// A „Pótlásra váró" rekordok számának frissítése a fül feliratához (a count endpointról, flag-szűrővel). + private async Task RefreshNeedsCompletionCountAsync() + { + try + { + //_needsCompletionCount = await FruitBankSignalRClient.GetEkaerHistoryCount(EkaerHistoryFilter.NeedsCompletion); + _needsCompletionCount = await FruitBankSignalRClient.GetEkaerHistoryCount(EkaerHistoryFilter.ToSubmit); + StateHasChanged(); + } + catch (Exception ex) + { + _logger.Error($"GetEkaerHistoryCount hiba: {ex.Message}"); + } } } diff --git a/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs b/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs index a620ea2a..b0a74468 100644 --- a/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs +++ b/FruitBankHybrid.Shared/Services/SignalRs/FruitBankSignalRClient.cs @@ -82,6 +82,7 @@ namespace FruitBankHybrid.Shared.Services.SignalRs public Task GenerateEkaerXmlDocument(int foreignKey, bool isOutgoing) => GetByIdAsync(SignalRTags.GenerateEkaerXmlDocument, [foreignKey, isOutgoing]); public Task CreateEkaerHistory(int foreignKey, bool isOutgoing) => GetByIdAsync(SignalRTags.CreateEkaerHistory, [foreignKey, isOutgoing]); public Task CreateMissingEkaerHistories(DateTime fromDate) => GetByIdAsync(SignalRTags.CreateMissingEkaerHistories, fromDate); + public Task GetEkaerHistoryCount(EkaerHistoryFilter filter) => GetByIdAsync(SignalRTags.GetEkaerHistoryCount, filter); #endregion EkaerHistory #region CargoPartner