erp-platform/api/src/Erp.Platform.Domain/Queries/QueryHelper.cs
2025-11-11 22:49:52 +03:00

145 lines
5.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Data;
using System.Globalization;
using System.Linq;
using System.Text.Json;
namespace Erp.Platform.Queries;
public class QueryHelper
{
/// <summary> gelen parametrelere gore [Value] yada 'Value' seklinde sonuc dondurur
/// </summary>
/// <param name="fieldDbSource"></param>
/// <param name="value"></param>
/// <returns></returns>
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;
}
}