using AccountsDAL.DTO.AccountsReports; using AccountsDAL.DTO.Reports; using AccountsDAL.Query.AccountReports; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; namespace AccountsDAL.CustomCode.AccountReports.AccountCollectionProjection { public class AccountCollectionProjectionReportDAL : IAccountCollectionProjectionReportDAL { private readonly IQueryExecutor _queryExecutor; public AccountCollectionProjectionReportDAL(IQueryExecutor queryExecutor) { _queryExecutor = queryExecutor; } public async Task GetCollectionProjectionReport( 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); // Same SqlDateTime-overflow avoidance as Outstanding/Ageing — this report uses AsOnDate, not // a real period range, so Build()'s PeriodFromDate/PeriodToDate must be overwritten with a // valid date before Dapper binds them. parameters.Add("PeriodFromDate", criteria.AsOnDate); parameters.Add("PeriodToDate", criteria.AsOnDate); parameters.Add("AsOnDate", criteria.AsOnDate); parameters.Add("InfoRequired", criteria.IncludeInformational ? 0 : 1); parameters.Add("OverallDays", criteria.OverallDays); parameters.Add("Offset", Math.Max(0, firstNumber - 1)); parameters.Add("PageSize", maxResult); var filter = sharedFilter + outstandingFilter; var orderBy = AccountReportSortBuilder.BuildCollectionProjectionOrderBy(sortBy); var sql = AccountCollectionProjectionReportsQB.GET_COLLECTION_PROJECTION_DETAIL .Replace("{DynamicFilter}", filter) .Replace("{OrderBy}", orderBy); var paged = await _queryExecutor .QueryPagedAsync(loginDTO, sql, parameters) .ConfigureAwait(false); var totalsSql = AccountCollectionProjectionReportsQB.GET_COLLECTION_PROJECTION_TOTALS.Replace("{DynamicFilter}", filter); var totals = await _queryExecutor .QuerySingleAsync(loginDTO, totalsSql, parameters) .ConfigureAwait(false); return new CollectionProjectionResultDTO { Items = paged.Items ?? Enumerable.Empty(), TotalCount = paged.TotalCount, TotalReceivable = totals?.TotalReceivable ?? 0, TotalPayable = totals?.TotalPayable ?? 0, TotalBalance = totals?.TotalBalance ?? 0, TotalCashDiscountAmount = totals?.TotalCashDiscountAmount ?? 0 }; } } }