Files
BeWoPlaner/AICore/Context/SummaryParser/CsvContextSummaryParser.cs
2025-09-08 15:17:51 +02:00

135 lines
3.7 KiB
C#

using AICore.Context.Entry;
using AICore.Context.Summary;
using BS.Shared;
using BS.Shared.Exceptions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
namespace AICore.Context.SummaryParser
{
internal class CsvContextSummaryParser : BaseContextSummaryParser
{
private string _Delimiter;
private bool _StrictEscapeCsvField;
public CsvContextSummaryParser(string delimiter = ",", bool strictEscapeCsvField = false)
{
_Delimiter = delimiter;
_StrictEscapeCsvField = strictEscapeCsvField;
}
public override string Parse(AiContextType uicontext, BaseContextSummary context)
{
if (context is null || context.Context is null)
return string.Empty;
if (context.Context is IEnumerable<BaseContextEntry> values)
{
return ToCsvString(values, _Delimiter);
}
else if(context.Context is BaseContextEntry value)
{
return ToCsvString(value, _Delimiter);
}
else if(context is ServiceRecordNavigationContextSummary summary)
{
var sb = new StringBuilder();
sb.AppendLine($"Hilfeplan:{summary.SupportConcept}");
sb.AppendLine($"Kostenträger:{summary.CostBearer}");
sb.AppendLine("Klient:");
sb.Append(ToCsvString(summary.Customer, _Delimiter));
sb.AppendLine("Zeiterfassungseinträge:");
sb.AppendLine(ToCsvString(summary.DataContext, _Delimiter));
return sb.ToString();
}
throw BeWoNotImplementedException.CreateFromEnum(uicontext);
}
public string ToCsvString(BaseContextEntry entry, string delimiter, bool includeHeaders = true)
{
var list = new List<BaseContextEntry>() { entry };
var csv = ToCsvString(list, _Delimiter);
return csv;
}
/// <summary>
/// Konvertiert eine Liste von Objekten zu einem CSV-String
/// </summary>
/// <param name="objects">Liste der zu konvertierenden Objekte</param>
/// <param name="delimiter">CSV-Trennzeichen (Standard: ",")</param>
/// <param name="includeHeaders">Ob Spaltenüberschriften eingefügt werden sollen</param>
/// <returns>CSV-String</returns>
public string ToCsvString<T>(IEnumerable<T> objects, string delimiter, bool includeHeaders = true)
{
if (objects == null || objects.Count() == 0)
return string.Empty;
var sb = new StringBuilder();
var type = objects.First().GetType();
var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
// Headers hinzufügen
if (includeHeaders)
{
for (int i = 0; i < properties.Length; i++)
{
if (i > 0) sb.Append(delimiter);
sb.Append(EscapeCsvField(properties[i].Name));
}
sb.AppendLine();
}
// Datenzeilen hinzufügen
foreach (var obj in objects)
{
for (int i = 0; i < properties.Length; i++)
{
if (i > 0) sb.Append(delimiter);
var value = properties[i].GetValue(obj);
var stringValue = value?.ToString() ?? string.Empty;
sb.Append(EscapeCsvField(stringValue));
}
sb.AppendLine();
}
return sb.ToString();
}
/// <summary>
/// CSV-Feld escapen (Anführungszeichen und Kommas behandeln)
/// </summary>
private string EscapeCsvField(string field)
{
if (string.IsNullOrEmpty(field))
return string.Empty;
if (_StrictEscapeCsvField)
{
return $"\"{field}\"";
}
else
{
// Wenn das Feld Kommas, Anführungszeichen oder Zeilumbrüche enthält,
// muss es in Anführungszeichen gesetzt werden
if (field.Contains(_Delimiter) || field.Contains("\"") || field.Contains("\n") || field.Contains("\r"))
{
// Anführungszeichen im Feld verdoppeln
field = field.Replace("\"", "\"\"");
return $"\"{field}\"";
}
}
return field;
}
}
}