using AccountsDAL.DTO.Payment; using AccountsDAL.Query.Payment; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using MMDAL.DTO.CostCenterAllocation; using Newtonsoft.Json; namespace AccountsDAL.CustomCode.Payment { public class PaymentDAL : IPaymentDAL { // GB4's own inline magic constant identifying "Payment" as the ObjectHeaderTypeId in the // shared TCOSTCENTERALLOCATION table — not the same as GB5's unrelated // DELETEMODULEEVENTTYPEID constant, which coincidentally shares this numeric value. private const int PaymentObjectHeaderTypeId = -1399999514; private readonly IQueryExecutor _queryExecutor; public PaymentDAL(IQueryExecutor queryExecutor) { _queryExecutor = queryExecutor; } public async Task GetSelectListPayment(int firstNumber, int maxResult, CriteriaDTO criteriaDTO, LoginDTO loginDTO) { int? isFromScreen = ReadNullableIntCriteria(criteriaDTO, "isfromscreen"); string sql = isFromScreen == 0 ? PaymentQB.GET_SELECTLIST_PAYMENT_FROM_SCREEN : PaymentQB.GET_SELECTLIST_PAYMENT; var list = await _queryExecutor .QueryAsync(loginDTO, sql, new { FirstNumber = firstNumber, MaxResult = maxResult, Number = ReadStringCriteria(criteriaDTO, "number"), Id = ReadNullableIntCriteria(criteriaDTO, "id"), Status = ReadNullableIntCriteria(criteriaDTO, "status"), BizTransactionTypeId = ReadNullableIntCriteria(criteriaDTO, "biztransactiontypeid"), OUId = ReadNullableIntCriteria(criteriaDTO, "ouid") }) .ConfigureAwait(false); return JsonConvert.SerializeObject(list); } private static string? ReadStringCriteria(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; var text = attr.FieldValue?.ToString(); if (!string.IsNullOrWhiteSpace(text)) return text; } } return null; } private static int? ReadNullableIntCriteria(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; } // ── PaymentToVoucher ───────────────────────────────────────────────── public async Task GetPaymentHeaderForVoucher(int paymentId, LoginDTO loginDTO) { var rows = await _queryExecutor .QueryAsync(loginDTO, PaymentQB.GET_PAYMENT_HEADER_FOR_VOUCHER, new { PaymentId = paymentId }) .ConfigureAwait(false); return rows.FirstOrDefault(); } public async Task> GetPaymentDetailsForVoucher(int paymentId, LoginDTO loginDTO) { var rows = await _queryExecutor .QueryAsync(loginDTO, PaymentQB.GET_PAYMENT_DETAILS_FOR_VOUCHER, new { PaymentId = paymentId }) .ConfigureAwait(false); return rows.ToList(); } public async Task> GetCostCenterAllocationForPayment(int paymentId, LoginDTO loginDTO) { var rows = await _queryExecutor .QueryAsync(loginDTO, PaymentQB.GET_COST_CENTER_ALLOCATION_FOR_PAYMENT, new { PaymentId = paymentId, ObjectHeaderTypeId = PaymentObjectHeaderTypeId }) .ConfigureAwait(false); return rows.ToList(); } public async Task HasCostCategoryConditionForAccountGroup(int accountGroupId, LoginDTO loginDTO) { var rows = await _queryExecutor .QueryAsync(loginDTO, PaymentQB.CHECK_COST_CATEGORY_CONDITION_EXISTS_FOR_ACCOUNT_GROUP, new { AccountGroupId = accountGroupId, TenantId = loginDTO.ClientId }) .ConfigureAwait(false); return rows.Any(); } public async Task GetOrganizationUnitForVoucher(int ouId, LoginDTO loginDTO) { var rows = await _queryExecutor .QueryAsync(loginDTO, PaymentQB.GET_ORGANIZATION_UNIT_FOR_VOUCHER, new { OUId = ouId }) .ConfigureAwait(false); return rows.FirstOrDefault(); } } }