using AccountsDAL.DTO.AccountsReports; using AccountsDAL.DTO.Reports; using AccountsDAL.Query.AccountReports; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; namespace AccountsDAL.CustomCode.AccountReports.AccountOutstanding { public class AccountOutstandingSummaryDAL : IAccountOutstandingSummaryDAL { private readonly IQueryExecutor _queryExecutor; public AccountOutstandingSummaryDAL(IQueryExecutor queryExecutor) { _queryExecutor = queryExecutor; } public async Task GetOutstandingSummaryReport( int firstNumber, int maxResult, AccountReportCriteria criteria, List sortBy, LoginDTO loginDTO) { var (sharedFilter, parameters) = AccountReportFilterBuilder.Build(criteria, loginDTO); var (outstandingFilter, outstandingParameters) = AccountReportFilterBuilder.BuildOutstandingOnly(criteria); parameters.AddDynamicParams(outstandingParameters); // See AccountOutstandingReportDAL's identical fix — Build() unconditionally adds // PeriodFromDate/PeriodToDate as DateTime params; Outstanding never sets them, leaving // DateTime.MinValue, which ADO.NET rejects as "SqlDateTime overflow" the moment the // parameter value is assigned, unrelated to whether the SQL text references it. parameters.Add("PeriodFromDate", criteria.AsOnDate); parameters.Add("PeriodToDate", criteria.AsOnDate); parameters.Add("AsOnDate", criteria.AsOnDate); parameters.Add("InfoRequired", criteria.IncludeInformational ? 0 : 1); parameters.Add("Offset", Math.Max(0, firstNumber - 1)); parameters.Add("PageSize", maxResult); var isList = criteria.OutstandingReportMode == 0; var filter = sharedFilter + outstandingFilter; var (groupBySelect, groupByColumns) = AccountOutstandingGroupByBuilder.Build(criteria.GroupType, isList); var orderBy = AccountReportSortBuilder.BuildOutstandingSummaryOrderBy(sortBy, groupByColumns); var sql = AccountOutstandingReportsQB.GET_OUTSTANDING_SUMMARY .Replace("{GroupBySelect}", groupBySelect) .Replace("{GroupByColumns}", groupByColumns) .Replace("{DynamicFilter}", filter) .Replace("{OrderBy}", orderBy); var paged = await _queryExecutor .QueryPagedAsync(loginDTO, sql, parameters) .ConfigureAwait(false); var totalsSql = AccountOutstandingReportsQB.GET_OUTSTANDING_SUMMARY_TOTALS.Replace("{DynamicFilter}", filter); var totals = await _queryExecutor .QuerySingleAsync(loginDTO, totalsSql, parameters) .ConfigureAwait(false); return new OutstandingSummaryReportResultDTO { Items = paged.Items ?? Enumerable.Empty(), TotalCount = paged.TotalCount, TotalReceivable = totals?.TotalReceivable ?? 0, TotalPayable = totals?.TotalPayable ?? 0, TotalBalance = totals?.TotalBalance ?? 0 }; } } }