using Dapper; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using Newtonsoft.Json; using PayRollDAL.DTO.TDSChallan; using PayRollDAL.Query.TDSChallan; using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Threading.Tasks; using static GB5Shared.GB5Constant.Constant; namespace PayRollDAL.CustomeCode.TDSChallan { public class TDSChallanDAL : ITDSChallanDAL { private readonly IQueryExecutor _QueryExecutor; public TDSChallanDAL(IQueryExecutor queryExecutor) { _QueryExecutor = queryExecutor; } // ── Picklist for grid ───────────────────────────────────────────── public async Task GetSelectListTDSChallan(int FirstNumber, int MaxResult, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO, bool IsCount = false) { string innerSql = LoginDTO.DatabaseType switch { DBType.SQL => TDSChallanQB.GET_SELECTLIST_TDSCHALLAN_INNER_SQL, DBType.PostGre => TDSChallanQB.GET_SELECTLIST_TDSCHALLAN_INNER_PG, _ => throw new Exception("Unsupported database type") }; string outerSql = LoginDTO.DatabaseType switch { DBType.SQL => TDSChallanQB.GET_SELECTLIST_TDSCHALLAN_OUTER_SQL, DBType.PostGre => TDSChallanQB.GET_SELECTLIST_TDSCHALLAN_OUTER_PG, _ => throw new Exception("Unsupported database type") }; var parameters = new DynamicParameters(); string challanNumber = GetCriteriaStringValue(CriteriaDTO, "ChallanNumber"); if (!string.IsNullOrWhiteSpace(challanNumber)) { innerSql += "\r\n AND a.CHALLANNUMBER LIKE @challannumber"; parameters.Add("challannumber", $"%{challanNumber}%"); } if (IsCount) { string countSql = $"SELECT COUNT(*) FROM ({innerSql}) AS CountResult"; var countRows = await _QueryExecutor.QueryAsync(LoginDTO, countSql, parameters).ConfigureAwait(false); return countRows.FirstOrDefault().ToString(); } string fullSql = $"WITH PagedTDSChallan AS ({innerSql}) {outerSql}"; parameters.Add("firstnumber", FirstNumber); parameters.Add("maxresult", MaxResult); var result = await _QueryExecutor.QueryAsync(LoginDTO, fullSql, parameters).ConfigureAwait(false); return JsonConvert.SerializeObject(result); } private string GetCriteriaStringValue(CriteriaDTO criteriaDTO, string fieldName) { try { var attr = criteriaDTO?.SectionCriteriaList? .SelectMany(s => s.AttributesCriteriaList) .FirstOrDefault(a => string.Equals(a.FieldName, fieldName, StringComparison.OrdinalIgnoreCase)); if (attr?.FieldValue is JsonElement je) return je.ValueKind == JsonValueKind.String ? je.GetString() : je.ToString(); return attr?.FieldValue?.ToString(); } catch { return null; } } } }