using Dapper; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using MMDAL.DTO.Costing; using MMDAL.Query.Costing; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text.Json; using System.Threading.Tasks; namespace MMDAL.CustomCode.Costing { public class CostingDAL : ICostingDAL { private readonly IQueryExecutor _QueryExecutor; public CostingDAL(IQueryExecutor queryExecutor) { _QueryExecutor = queryExecutor; } // ── ProductCosting/CostingSelectList ───────────────────────────────── // GB4 parity: CostingBLL.CostingSelectlist public async Task CostingSelectlist(int FirstNumber, int MaxResult, CriteriaDTO CriteriaDTO, LoginDTO LoginDTO) { string number = null!; int type = -1, itemId = -1, costingId = -1, biztransactionTypeId = -1, documentId = -1, objectTypeId = -1, status = -1, costAnalysisType = -1; foreach (var section in CriteriaDTO?.SectionCriteriaList ?? Enumerable.Empty()) { foreach (var attr in section.AttributesCriteriaList ?? new List()) { var field = attr.FieldName?.Trim().ToLower(); switch (field) { case "number": number = GetString(attr.FieldValue); break; case "type": type = GetInt(attr.FieldValue, -1); break; case "itemid": itemId = GetInt(attr.FieldValue, -1); break; case "costingid": costingId = GetInt(attr.FieldValue, -1); break; case "biztransactiontypeid": biztransactionTypeId = GetInt(attr.FieldValue, -1); break; case "documentid": documentId = GetInt(attr.FieldValue, -1); break; case "objecttypeid": objectTypeId = GetInt(attr.FieldValue, -1); break; case "status": status = GetInt(attr.FieldValue, -1); break; case "costanalysistype": costAnalysisType = GetInt(attr.FieldValue, -1); break; } } } var parameters = new DynamicParameters(); parameters.Add("searchtext", string.IsNullOrWhiteSpace(number) ? null : $"%{number}%"); parameters.Add("type", type); parameters.Add("itemid", itemId); parameters.Add("costingid", costingId); parameters.Add("biztransactiontypeid", biztransactionTypeId); parameters.Add("documentid", documentId); parameters.Add("objecttypeid", objectTypeId); parameters.Add("status", status); parameters.Add("costanalysistype", costAnalysisType); parameters.Add("firstnumber", FirstNumber); parameters.Add("maxresult", MaxResult); var result = await _QueryExecutor.QueryAsync(LoginDTO, CostingQB.GET_COSTING_SELECTLIST_SQL, parameters).ConfigureAwait(false); return JsonConvert.SerializeObject(result); } private static string GetString(object value) { if (value == null) return string.Empty; if (value is JsonElement je) return je.ToString(); return Convert.ToString(value) ?? string.Empty; } private static int GetInt(object value, int def) { if (value == null) return def; if (value is JsonElement je && je.TryGetInt32(out int i)) return i; return Convert.ToInt32(value); } } }