DiakoniewerkEssen/Export/DiamantExporter - Künstliche Absonderung Faktor auf separate Erlöskonten

SupportOID=162560
This commit is contained in:
2026-05-13 09:54:51 +02:00
parent 25b044a28d
commit 19ac3b5ee4

View File

@@ -60,13 +60,28 @@ namespace DiakonieWerkEssen.Export
private static String ProcessAbrechnungRows(DataTable dt)
{
// F-Zeile: Rechnungs-/Buchungsangaben, G-Zeile: Gegenbuchung Erlöskonto,
// F-Zeile: Rechnungs-/Buchungsangaben,
// G-Zeile: Gegenbuchung Erlöskonto, künstlich aufteilt für Faktor-Aufschläge
// K-Zeile: Kostenstelle/Position (kann mehrfach vorkommen bei mehreren Positionen)
const int startIdx = 1;
const int stopIdx1 = 34; // G-Zeile beginnt hier
const int stopIdx2 = 42; // K-Zeile beginnt hier
const int idxFaktorBetrag = 51; // vorberechneter Aufschlag aus SQL (negativ, wie K-Betrag)
// Erster Pass: Gesamtaufschlag je OID akkumulieren.
// Nötig weil eine Rechnung mehrere K-Positionen haben kann (je eine Zeile im DataTable),
// die G-Zeile aber nur einmal ausgegeben wird und um den Gesamtbetrag gekürzt werden muss.
var oid2TotalFaktor = new Dictionary<string, decimal>();
foreach (DataRow row in dt.Rows)
{
string orgName = row[36].ToString();
if (!orgName.Contains("FLS") && !orgName.Contains("DLS")) continue;
decimal faktorBetrag = row.ItemArray.Length > idxFaktorBetrag ? ErzeugeBetrag(row[idxFaktorBetrag]) : 0m;
if (faktorBetrag == 0m) continue;
string oid = row[0].ToString();
oid2TotalFaktor[oid] = Math.Round((oid2TotalFaktor.ContainsKey(oid) ? oid2TotalFaktor[oid] : 0m) + faktorBetrag, 2, MidpointRounding.AwayFromZero);
}
StringBuilder sb = new StringBuilder();
Dictionary<string, DataRow> oid2Row = new Dictionary<string, DataRow>();
foreach (DataRow row in dt.Rows)
@@ -74,9 +89,9 @@ namespace DiakonieWerkEssen.Export
string oid = row[0].ToString();
bool storno = false;
string orgName = row[36].ToString();
bool isFLSDLS = orgName.Contains("FLS") || orgName.Contains("DLS");
decimal FaktorBetrag = row.ItemArray.Length > idxFaktorBetrag ? ErzeugeBetrag(row[idxFaktorBetrag]) : 0m;
bool addFaktor = isFLSDLS && FaktorBetrag != 0m;
oid2TotalFaktor.TryGetValue(oid, out decimal totalFaktor);
bool addFaktor = totalFaktor != 0m;
string faktorKonto = orgName.Contains("FLS") ? "42410" : "42455";
if (!oid2Row.ContainsKey(oid))
{
@@ -119,7 +134,10 @@ namespace DiakonieWerkEssen.Export
}
else if (i == 39)
{
// G-Betrag: bei FLS/DLS um den Faktoranteil kürzen
decimal betrag = ErzeugeBetrag(item);
if (addFaktor)
betrag = Math.Round(betrag - totalFaktor, 2, MidpointRounding.AwayFromZero);
if (betrag != 0)
{
sb.Append(String.Format("{0:0.00}", betrag));
@@ -134,6 +152,17 @@ namespace DiakonieWerkEssen.Export
}
else if (i == stopIdx2)
{
// Zusätzliche G-Zeile für FLS/DLS-Faktoranteil vor der ersten K-Zeile
if (addFaktor)
{
sb.AppendLine();
sb.Append("G;0;");
sb.Append(faktorKonto);
sb.Append(";;;");
sb.Append(String.Format("{0:0.00}", totalFaktor));
sb.Append(";\"\"");
sb.Append(";");
}
sb.AppendLine();
sb.Append(item);
sb.Append(";");
@@ -185,18 +214,6 @@ namespace DiakonieWerkEssen.Export
}
}
}
// FLS/DLS-Aufschlag: vorberechneter Betrag aus SQL auf separates Erlöskonto
if (addFaktor)
{
string FaktorKonto = orgName.Contains("FLS") ? "42410" : "42455";
sb.AppendLine();
sb.Append("K;0;");
sb.Append(FaktorKonto);
sb.Append(";;;;;;");
sb.Append(String.Format("{0:0.00}", FaktorBetrag));
sb.Append(";");
}
}
return sb.ToString();
@@ -204,6 +221,7 @@ namespace DiakonieWerkEssen.Export
private static String GetErloeskonto(String orgName)
{
// zzgl. Erlöskonten Faktor: orgName.Contains("FLS") ? "42410" : "42455";
if (orgName.Contains("Jugendamt") || orgName.Contains("Essen"))
return "42425";
if (orgName.Contains("FLS"))