diff --git a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs index bc00e5b..61171a8 100644 --- a/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs +++ b/Nop.Plugin.Misc.AIPlugin/Controllers/FruitBankDataController.cs @@ -273,19 +273,14 @@ namespace Nop.Plugin.Misc.FruitBankPlugin.Controllers public async Task> GetEkaerHistories(EkaerHistoryFilter ekaerHistoryFilter) { _logger.Detail($"GetEkaerHistories invoked; ekaerHistoryFilter: {ekaerHistoryFilter}"); + return await ctx.EkaerHistories.GetByFilter(ekaerHistoryFilter).ToListAsync(); + } - // Szerver-oldali szűrés (a tabokhoz) a StatusId int-oszlopon — a helper-ek nem fordulnak SQL-re, - // ezért közvetlen StatusId-összehasonlítás. All / ismeretlen → minden. - IQueryable query = ctx.EkaerHistories.GetAll(); - query = ekaerHistoryFilter switch - { - EkaerHistoryFilter.ToSubmit => query.Where(eh => eh.StatusId != (int)EkaerStatus.Sent && eh.StatusId != (int)EkaerStatus.SentWithMissingData), - EkaerHistoryFilter.Sent => query.Where(eh => eh.StatusId == (int)EkaerStatus.Sent), - EkaerHistoryFilter.NeedsCompletion => query.Where(eh => eh.StatusId == (int)EkaerStatus.SentWithMissingData), - _ => query, - }; - - return await query.ToListAsync(); + [SignalR(SignalRTags.GetEkaerHistoryCount)] + public async Task GetEkaerHistoryCount(EkaerHistoryFilter ekaerHistoryFilter) + { + _logger.Detail($"GetEkaerHistoryCount invoked; ekaerHistoryFilter: {ekaerHistoryFilter}"); + return await ctx.EkaerHistories.CountByFilterAsync(ekaerHistoryFilter); } [SignalR(SignalRTags.GetEkaerHistoryById)] diff --git a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/EkaerHistoryDbTable.cs b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/EkaerHistoryDbTable.cs index 3e4923f..5931959 100644 --- a/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/EkaerHistoryDbTable.cs +++ b/Nop.Plugin.Misc.AIPlugin/Domains/DataLayer/EkaerHistoryDbTable.cs @@ -20,4 +20,27 @@ public class EkaerHistoryDbTable : MgDbTableBase public Task GetByIdAsync(int id) => GetAll().FirstOrDefaultAsync(p => p.Id == id); public IQueryable GetByForeignKey(int foreignKey) => GetAll().Where(p => p.ForeignKey == foreignKey); + + // A NAV-nál lévő partíciók fix StatusId-k; minden más (a jövőbeni új státuszok is) „beküldésre váró". + private static readonly int[] ToSubmitStatusIds = [.. Enum.GetValues().Select(s => (int)s).Except([(int)EkaerStatus.Sent, (int)EkaerStatus.SentWithMissingData])]; + + /// Flag-alapú szűrés a tabokhoz/count-hoz. (= 0) → minden; + /// egyébként a beállított flag-ek diszjunkt StatusId-partícióinak UNIÓJA (IN). A státusz-helperek (IsSent stb.) + /// nem fordulnak SQL-re, ezért közvetlen StatusId-halmazzal szűrünk. + public IQueryable GetByFilter(EkaerHistoryFilter filter) + { + // HasFlag(All) mindig true (0 bit), ezért előbb az All-ágat zárjuk rövidre. + if (filter == EkaerHistoryFilter.All) return GetAll(); + + var statusIds = new List(); + if (filter.HasFlag(EkaerHistoryFilter.ToSubmit)) statusIds.AddRange(ToSubmitStatusIds); + if (filter.HasFlag(EkaerHistoryFilter.Sent)) statusIds.Add((int)EkaerStatus.Sent); + if (filter.HasFlag(EkaerHistoryFilter.NeedsCompletion)) statusIds.Add((int)EkaerStatus.SentWithMissingData); + + return GetAll().Where(eh => statusIds.Contains(eh.StatusId)); + } + + // A CountAsync kétértelmű (a System.Linq.Async ÉS a LinqToDB is hozza ugyanazt a nevet, no-arg hívásnál mindkettő illik) + // → explicit a LinqToDB-é. (A ToListAsync nem ütközik, azt a hívó közvetlenül használhatja.) + public Task CountByFilterAsync(EkaerHistoryFilter filter) => LinqToDB.AsyncExtensions.CountAsync(GetByFilter(filter)); }