using AccountsDAL.DTO.Account; using AccountsDAL.Query.AccountBalance; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using Newtonsoft.Json; namespace AccountsDAL.CustomCode.AccountBalance { public class AccountBalanceDAL : IAccountBalanceDAL { private readonly IQueryExecutor _queryExecutor; public AccountBalanceDAL(IQueryExecutor queryExecutor) { _queryExecutor = queryExecutor; } public async Task GetAccountBalanceDetail(int ouId, CriteriaDTO criteriaDTO, LoginDTO loginDTO) { // GB4 default: CreditLimit absent/nonzero => full detail; CreditLimit == 0 => TACCOUNTPOST-only. int creditLimit = ReadNullableIntCriteria(criteriaDTO, null, "creditlimit") ?? 1; if (creditLimit == 0) { var closingParam = new { AccountId = ReadNullableIntCriteria(criteriaDTO, null, "accountid"), SubAccountId = ReadNullableIntCriteria(criteriaDTO, null, "subaccountid"), OUId = ReadNullableIntCriteria(criteriaDTO, null, "ouid"), PeriodId = ReadNullableIntCriteria(criteriaDTO, null, "periodid") }; var closingList = await _queryExecutor .QueryAsync(loginDTO, AccountBalanceQB.GET_ACCOUNT_POST_CLOSING, closingParam) .ConfigureAwait(false); return JsonConvert.SerializeObject(closingList); } var userCriteria = loginDTO.UserCriteriaDTO; var param = new { OUId = ouId, PeriodId = loginDTO.WorkPeriodId, CategoryId = ReadNullableIntCriteria(criteriaDTO, userCriteria, "categoryid"), AccountId = ReadNullableIntCriteria(criteriaDTO, userCriteria, "accountid"), AccountGroupId = ReadNullableIntCriteria(criteriaDTO, userCriteria, "accountgroupid"), AccountType = ReadNullableIntCriteria(criteriaDTO, userCriteria, "accounttype"), CreatedById = ReadNullableIntCriteria(criteriaDTO, userCriteria, "createdbyid"), FromAccountId = ReadNullableIntCriteria(criteriaDTO, userCriteria, "fromcode") ?? ReadNullableIntCriteria(criteriaDTO, userCriteria, "fromname"), ToAccountId = ReadNullableIntCriteria(criteriaDTO, userCriteria, "tocode") ?? ReadNullableIntCriteria(criteriaDTO, userCriteria, "toname"), PeriodFrom = ReadNullableDateCriteria(criteriaDTO, userCriteria, "periodfrom"), PeriodTo = ReadNullableDateCriteria(criteriaDTO, userCriteria, "periodto") }; var withBalance = await _queryExecutor .QueryAsync(loginDTO, AccountBalanceQB.GET_ACCOUNT_BALANCE_DETAILS, param) .ConfigureAwait(false); var withoutBalance = await _queryExecutor .QueryAsync(loginDTO, AccountBalanceQB.GET_ACCOUNT_BALANCE_SHADOW, param) .ConfigureAwait(false); var result = withBalance.Concat(withoutBalance).ToList(); return JsonConvert.SerializeObject(result); } private static int? ReadNullableIntCriteria(CriteriaDTO? criteriaDTO, CriteriaDTO? fallbackCriteriaDTO, string fieldName) { return ReadIntFromCriteria(criteriaDTO, fieldName) ?? ReadIntFromCriteria(fallbackCriteriaDTO, fieldName); } private static int? ReadIntFromCriteria(CriteriaDTO? criteriaDTO, string fieldName) { if (criteriaDTO?.SectionCriteriaList == null) return null; foreach (var section in criteriaDTO.SectionCriteriaList) { if (section?.AttributesCriteriaList == null) continue; foreach (var attr in section.AttributesCriteriaList) { if (!string.Equals(attr.FieldName, fieldName, StringComparison.OrdinalIgnoreCase)) continue; return int.TryParse(attr.FieldValue?.ToString(), out var value) ? value : null; } } return null; } private static DateTime? ReadNullableDateCriteria(CriteriaDTO? criteriaDTO, CriteriaDTO? fallbackCriteriaDTO, string fieldName) { return ReadDateFromCriteria(criteriaDTO, fieldName) ?? ReadDateFromCriteria(fallbackCriteriaDTO, fieldName); } private static DateTime? ReadDateFromCriteria(CriteriaDTO? criteriaDTO, string fieldName) { if (criteriaDTO?.SectionCriteriaList == null) return null; foreach (var section in criteriaDTO.SectionCriteriaList) { if (section?.AttributesCriteriaList == null) continue; foreach (var attr in section.AttributesCriteriaList) { if (!string.Equals(attr.FieldName, fieldName, StringComparison.OrdinalIgnoreCase)) continue; return DateTime.TryParse(attr.FieldValue?.ToString(), out var value) ? value : null; } } return null; } } }