using AccountsDAL.DTO.Account; using AccountsDAL.DTO.AccountsReports; using AccountsDAL.Query.AccountReports; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; namespace AccountsDAL.CustomCode.AccountReports.AccountOutstanding { public class AccountOutstandingKpiDAL : IAccountOutstandingKpiDAL { private readonly IQueryExecutor _queryExecutor; public AccountOutstandingKpiDAL(IQueryExecutor queryExecutor) { _queryExecutor = queryExecutor; } public async Task GetOutstandingKpiSummary(AccountReportCriteria criteria, LoginDTO loginDTO) { // Only the shared OU/BizTransaction narrowing filter — deliberately NOT // BuildOutstandingOnly(), which applies ReportType/Overdue as row-eliminating WHERE // filters. This query needs every pending bill in one pass so it can split // Receivable/Payable and overdue/not-overdue via CASE expressions in the SELECT list // instead — filtering rows out first would make that split impossible. var (filter, parameters) = AccountReportFilterBuilder.Build(criteria, loginDTO); // Same fix as AccountOutstandingSummaryDAL — Build() unconditionally adds // PeriodFromDate/PeriodToDate as DateTime params; this report has no period range. parameters.Add("PeriodFromDate", criteria.AsOnDate); parameters.Add("PeriodToDate", criteria.AsOnDate); parameters.Add("AsOnDate", criteria.AsOnDate); parameters.Add("InfoRequired", criteria.IncludeInformational ? 0 : 1); var sql = AccountOutstandingKpiQB.GET_OUTSTANDING_KPI.Replace("{DynamicFilter}", filter); var result = await _queryExecutor .QuerySingleAsync(loginDTO, sql, parameters) .ConfigureAwait(false); result ??= new AccountReceivableDTO(); result.ODReceivablePercent = result.ReceivableAmount == 0 ? 0 : Math.Round(result.ODReceivableAmount / result.ReceivableAmount * 100, 2); result.NoBillPercentage = result.NumberOfBills == 0 ? 0 : Math.Round((decimal)result.NoBillOverdue / result.NumberOfBills * 100, 2); result.PayableOverduePercent = result.UnAdjustedAmount == 0 ? 0 : Math.Round(result.ODPayableAmount / result.UnAdjustedAmount * 100, 2); return result; } } }