using System.Data.Common; using Dapper; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using Newtonsoft.Json; using PayRollDAL.DTO.NOCList; using PayRollDAL.Query.NOCList; using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Threading.Tasks; namespace PayRollDAL.CustomeCode.NOCList { public class NOCListDAL : INOCListDAL { private readonly IQueryExecutor _QueryExecutor; public NOCListDAL(IQueryExecutor queryExecutor) { _QueryExecutor = queryExecutor; } // ── Get header + all detail rows ───────────────────────────────── public async Task GetNOCList(int NOCListId, LoginDTO LoginDTO) { var param = new { noclistid = NOCListId }; var header = await _QueryExecutor.QuerySingleAsync( LoginDTO, NOCListQB.GET_NOCLIST, param).ConfigureAwait(false); if (header != null) { var details = await _QueryExecutor.QueryAsync( LoginDTO, NOCListQB.GET_NOCLISTDETAIL, param).ConfigureAwait(false); header.NOCListDetailArray = details?.ToList() ?? new List(); } return header!; } // ── Insert header + detail rows (transaction provided by BLL) ──── public async Task SaveNOCList(NOCListDTO NOCListDTO, LoginDTO LoginDTO, DbTransaction DbTransaction) { int rows = await _QueryExecutor.ExecuteAsync( LoginDTO, NOCListQB.SAVE_NOCLIST, NOCListDTO, DbTransaction).ConfigureAwait(false); if (rows > 0 && NOCListDTO.NOCListDetailArray?.Count > 0) { short slNo = 1; foreach (var detail in NOCListDTO.NOCListDetailArray) { detail.NOCListId = NOCListDTO.NOCListId; detail.NOCListDetailSlNo = slNo++; await _QueryExecutor.ExecuteAsync( LoginDTO, NOCListQB.SAVE_NOCLISTDETAIL, detail, DbTransaction).ConfigureAwait(false); } } return rows; } // ── Update header + replace detail rows (transaction provided by BLL) ─ public async Task UpdateNOCList(NOCListDTO NOCListDTO, LoginDTO LoginDTO, DbTransaction DbTransaction) { int rows = await _QueryExecutor.ExecuteAsync( LoginDTO, NOCListQB.UPDATE_NOCLIST, NOCListDTO, DbTransaction).ConfigureAwait(false); // GB4 parity: DeleteNOCListDetails then re-insert (NOCListBLL.SaveNOCList update path) await _QueryExecutor.ExecuteAsync( LoginDTO, NOCListQB.DELETE_NOCLISTDETAIL, new { noclistid = NOCListDTO.NOCListId }, DbTransaction).ConfigureAwait(false); if (NOCListDTO.NOCListDetailArray?.Count > 0) { short slNo = 1; foreach (var detail in NOCListDTO.NOCListDetailArray) { detail.NOCListId = NOCListDTO.NOCListId; detail.NOCListDetailSlNo = slNo++; await _QueryExecutor.ExecuteAsync( LoginDTO, NOCListQB.SAVE_NOCLISTDETAIL, detail, DbTransaction).ConfigureAwait(false); } } return rows; } // ── Delete header (details removed explicitly, matching GB4 order) ─ public async Task DeleteNOCList(int NOCListId, LoginDTO LoginDTO) { await _QueryExecutor.ExecuteAsync( LoginDTO, NOCListQB.DELETE_NOCLISTDETAIL, new { noclistid = NOCListId }).ConfigureAwait(false); int result = await _QueryExecutor.ExecuteAsync( LoginDTO, NOCListQB.DELETE_NOCLIST, new { noclistid = NOCListId }).ConfigureAwait(false); return result > 0 ? SuccessResponse.DeleteSuccessMessage : ErrorResponse.DeleteNotFoundMessage; } // ── Picklist for grid ───────────────────────────────────────────── public async Task GetSelectListNOCList(int FirstNumber, int MaxResult, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO) { string sql = NOCListQB.GET_SELECTLIST_NOCLIST; var parameters = new DynamicParameters(); string searchText = GetCriteriaStringValue(CriteriaDTO, "SearchText"); if (!string.IsNullOrWhiteSpace(searchText)) { sql += "\r\n AND (A.NOCLISTCODE LIKE @searchtext OR A.NOCLISTNAME LIKE @searchtext)"; parameters.Add("searchtext", $"%{searchText}%"); } sql += "\r\n ORDER BY A.NOCLISTNAME"; var result = await _QueryExecutor.QueryAsync(LoginDTO, sql, 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; } } } }