using System.Text.Json; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using MMDAL.DTO.NCR; using MMDAL.Query.NCR; using Newtonsoft.Json; namespace MMDAL.CustomCode.NCR { public class NCRDAL : INCRDAL { private readonly IQueryExecutor _QueryExecutor; public NCRDAL(IQueryExecutor queryExecutor) { _QueryExecutor = queryExecutor; } public async Task GetSelectListNCR(CriteriaDTO crt, LoginDTO loginDTO, int firstNumber, int maxResult) { var attrs = crt.SectionCriteriaList? .SelectMany(s => s.AttributesCriteriaList ?? []) .ToList() ?? []; int mmLoadNcr = ParseInt(attrs.FirstOrDefault(a => a.FieldName == "mmloadncr")?.FieldValue, 1); string? number = attrs.FirstOrDefault(a => a.FieldName == "Number")?.FieldValue?.ToString(); var pageParam = new { firstnumber = firstNumber < 0 ? 0 : firstNumber, maxresult = maxResult <= 0 ? 50 : maxResult, number = string.IsNullOrWhiteSpace(number) ? null : number }; // GB4 parity: mmloadncr==0 resolves NCRs already linked to a document's // corrective action; any other value (default) is the plain select list. if (mmLoadNcr == 0) { var docParam = new { biztransactiontypeid = ParseInt(attrs.FirstOrDefault(a => a.FieldName == "BIZTransactionTypeId")?.FieldValue, -1), biztransactionclassid = ParseInt(attrs.FirstOrDefault(a => a.FieldName == "BIZTransactionTypeClassId")?.FieldValue, -1), ouid = ParseInt(attrs.FirstOrDefault(a => a.FieldName == "OUId")?.FieldValue, -1), periodid = ParseInt(attrs.FirstOrDefault(a => a.FieldName == "PeriodId")?.FieldValue, -1), pageParam.number, pageParam.firstnumber, pageParam.maxresult }; var docResult = await _QueryExecutor.QueryAsync( loginDTO, NCRQB.GET_SELECTLIST_NCR_FOR_DOCUMENT, docParam); return JsonConvert.SerializeObject(docResult); } var param = new { biztransactiontypeid = ParseInt(attrs.FirstOrDefault(a => a.FieldName == "BIZTransactionType.Id")?.FieldValue, -1), ouid = ParseInt(attrs.FirstOrDefault(a => a.FieldName == "OU.Id")?.FieldValue, -1), status = ParseInt(attrs.FirstOrDefault(a => a.FieldName == "Status")?.FieldValue, -1), ncrstatus = ParseInt(attrs.FirstOrDefault(a => a.FieldName == "NCRStatus")?.FieldValue, -1), pageParam.number, pageParam.firstnumber, pageParam.maxresult }; var result = await _QueryExecutor.QueryAsync( loginDTO, NCRQB.GET_SELECTLIST_NCR, param); return JsonConvert.SerializeObject(result); } private static int ParseInt(object? value, int defaultValue) => value switch { null => defaultValue, JsonElement je => je.ValueKind == JsonValueKind.Number ? je.GetInt32() : int.Parse(je.GetString()!), IConvertible ic => Convert.ToInt32(ic), _ => int.Parse(value.ToString()!) }; } }