using System; using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using AccountsDAL.CustomCode.AccountReports; using AccountsDAL.DTO.AccountsReports; using AccountsDAL.Query.AccountReports; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; namespace AccountsDAL.CustomCode.AccountReports.AccountRegisterSummary { public class AccountRegisterSummaryDAL : IAccountRegisterSummaryDAL { private readonly IQueryExecutor _queryExecutor; public AccountRegisterSummaryDAL(IQueryExecutor queryExecutor) { _queryExecutor = queryExecutor; } public async Task GetAccountRegisterSummaryReport( int firstNumber, int maxResult, AccountReportCriteria criteria, List sortBy, LoginDTO loginDTO, CancellationToken ct = default) { // Detail-only filters (V1-V5, ModeOfPayment) are never applied here — this query has no // TMMHEAD/TBIZDIMENSION join, unlike the detail report. var (filter, parameters) = AccountReportFilterBuilder.Build(criteria, loginDTO); parameters.Add("Offset", Math.Max(0, firstNumber - 1)); parameters.Add("PageSize", maxResult); var orderBy = AccountReportSortBuilder.BuildSummaryOrderBy(sortBy); var sql = AccountReportsQB.GET_ACCOUNT_REGISTER_SUMMARY .Replace("{DynamicFilter}", filter) .Replace("{OrderBy}", orderBy); var paged = await _queryExecutor .QueryPagedAsync(loginDTO, sql, parameters) .ConfigureAwait(false); var totalsSql = AccountReportsQB.GET_ACCOUNT_REGISTER_SUMMARY_TOTALS.Replace("{DynamicFilter}", filter); var totals = await _queryExecutor .QuerySingleAsync(loginDTO, totalsSql, parameters) .ConfigureAwait(false); return new AccountRegisterSummaryReportResultDTO { Items = paged.Items ?? Enumerable.Empty(), TotalCount = paged.TotalCount, TotalDebit = totals?.TotalDebit ?? 0, TotalCredit = totals?.TotalCredit ?? 0 }; } // Report export / NDJSON stream — same query as the paged path, still bounded by // firstNumber/maxResult (matching AccountRegisterReportDAL.GetAccountRegisterDetailReportStream). public async IAsyncEnumerable GetAccountRegisterSummaryReportStream( int firstNumber, int maxResult, AccountReportCriteria criteria, List sortBy, LoginDTO loginDTO, [EnumeratorCancellation] CancellationToken ct = default) { var (filter, parameters) = AccountReportFilterBuilder.Build(criteria, loginDTO); parameters.Add("Offset", Math.Max(0, firstNumber - 1)); parameters.Add("PageSize", maxResult > 0 ? maxResult : 500); var orderBy = AccountReportSortBuilder.BuildSummaryOrderBy(sortBy); var sql = AccountReportsQB.GET_ACCOUNT_REGISTER_SUMMARY .Replace("{DynamicFilter}", filter) .Replace("{OrderBy}", orderBy); await foreach (var row in _queryExecutor .QueryStreamAsync(loginDTO, sql, parameters, ct) .ConfigureAwait(false)) { yield return row; } } } }