using Dapper; using GB5Shared.DTO.Framework.Criteria; namespace PayRollDAL.CustomeCode.Periodic { /// /// Builds a parameterized WHERE-fragment + DynamicParameters bag from a flattened CriteriaDTO, /// mirroring GB4's PeriodicDAL.GetPeriodicandaddonCriteria* helpers (HQL-based ApplyCriteria) /// without string-concatenating criteria VALUES into SQL — only column names are chosen per /// map (fixed, code-controlled), values are always bound via @p{N} parameters. /// public static class PeriodicCriteriaHelper { /// /// fieldToColumn: logical CriteriaDTO field name (case-insensitive) -> SQL column expression. /// Only fields present in the map AND present in the parsed criteria produce a filter. /// public static (string Filter, DynamicParameters Params) Build( CriteriaDTO? criteriaDTO, IReadOnlyDictionary fieldToColumn) { var parameters = new DynamicParameters(); if (criteriaDTO == null) return ("", parameters); var flat = CriteriaParser.Parse(criteriaDTO); if (flat.Count == 0) return ("", parameters); var sb = new System.Text.StringBuilder(); int i = 0; foreach (var kv in fieldToColumn) { if (!flat.TryGetValue(kv.Key, out var value) || value == null) continue; string paramName = $"CritP{i++}"; sb.Append(" AND ").Append(kv.Value).Append(" = @").Append(paramName); parameters.Add(paramName, value); } return (sb.ToString(), parameters); } } }