using System; using System.Data; using System.Globalization; using System.Linq; using System.Text.Json; namespace Erp.Platform.Queries; public class QueryHelper { /// gelen parametrelere gore [Value] yada 'Value' seklinde sonuc dondurur /// /// /// /// public static object GetFormattedValue(DbType fieldDbSource, object value) { object[] values = null; var isArray = false; if (value is JsonElement valueJson && valueJson.ValueKind == JsonValueKind.Array) { values = valueJson.EnumerateArray().Select(a => (object)a).ToArray(); isArray = true; } else if (value is object[] valueArray) { values = [.. valueArray]; isArray = true; } else { values = [value]; } switch (fieldDbSource) { case DbType.Guid: var guidValues = values.Select(a => { if (a == null) return (Guid?)null; var str = a.ToString(); if (string.IsNullOrWhiteSpace(str)) return (Guid?)null; return Guid.TryParse(str, out var g) ? g : (Guid?)null; }).ToArray(); value = isArray ? guidValues : guidValues[0]; break; case DbType.String: case DbType.AnsiString: var strValues = values.Select(a => a?.ToString()).ToArray(); value = string.Join(PlatformConsts.MultiValueDelimiter, strValues); break; case DbType.Date: case DbType.DateTime: case DbType.DateTime2: case DbType.DateTimeOffset: var dateTimeValues = values.Select(a => { if (a == null) return (DateTimeOffset?)null; var s = a as string ?? a.ToString(); if (string.IsNullOrWhiteSpace(s)) return (DateTimeOffset?)null; // 🔹 Kabul edilen olası tarih formatları (tüm dillerde yaygın) var possibleFormats = new[] { "yyyy-MM-dd", "dd.MM.yyyy", "dd/MM/yyyy", "MM/dd/yyyy", "yyyy/MM/dd", "yyyy-MM-ddTHH:mm:ss", "yyyy-MM-ddTHH:mm:ss.fff", "yyyy-MM-ddTHH:mm:ssZ", "yyyy-MM-dd HH:mm:ss", "dd.MM.yyyy HH:mm:ss", "dd/MM/yyyy HH:mm:ss", "MM/dd/yyyy HH:mm:ss" }; // 🔹 1. Önce ISO / Invariant formatları dene if (DateTimeOffset.TryParseExact(s, possibleFormats, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var dto)) { return dto.ToUniversalTime(); } // 🔹 2. Eğer olmadıysa kültür bağımlı genel parse denemesi if (DateTimeOffset.TryParse(s, CultureInfo.CurrentCulture, DateTimeStyles.AssumeLocal, out dto)) { return dto.ToUniversalTime(); } // 🔹 3. Son çare: system culture veya ISO fallback if (DateTimeOffset.TryParse(s, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out dto)) { return dto.ToUniversalTime(); } // 🔹 Parse edilemezse null return (DateTimeOffset?)null; }).ToArray(); value = isArray ? dateTimeValues : dateTimeValues[0]; break; case DbType.Int16: case DbType.Int32: case DbType.Int64: case DbType.VarNumeric: case DbType.Decimal: case DbType.Double: case DbType.Single: case DbType.UInt16: case DbType.UInt32: case DbType.UInt64: var numericValues = values.Select(a => { if (a == null) return (double?)null; var s = a.ToString(); if (string.IsNullOrWhiteSpace(s)) return (double?)null; return double.TryParse(s, NumberStyles.Any, CultureInfo.InvariantCulture, out var n) ? n : (double?)null; }).ToArray(); value = isArray ? numericValues : numericValues[0]; break; case DbType.Boolean: var boolValues = values.Select(a => a != null && a.ToString().ToLower() != "false" && a.ToString() != "0").ToArray(); value = isArray ? boolValues : boolValues[0]; break; } return value; } }