135 lines
3.7 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|