From 19ac3b5ee425c4e891a1214c1891cfbfe4d191f5 Mon Sep 17 00:00:00 2001 From: Alexandra Date: Wed, 13 May 2026 09:54:51 +0200 Subject: [PATCH] =?UTF-8?q?DiakoniewerkEssen/Export/DiamantExporter=20-=20?= =?UTF-8?q?K=C3=BCnstliche=20Absonderung=20Faktor=20auf=20separate=20Erl?= =?UTF-8?q?=C3=B6skonten=20SupportOID=3D162560?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Export/DiamantExporter.cs | 50 +++++++++++++------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/ReportImp/DiakoniewerkEssen/Export/DiamantExporter.cs b/ReportImp/DiakoniewerkEssen/Export/DiamantExporter.cs index fa92baa96..14b04442b 100644 --- a/ReportImp/DiakoniewerkEssen/Export/DiamantExporter.cs +++ b/ReportImp/DiakoniewerkEssen/Export/DiamantExporter.cs @@ -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(); + 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 oid2Row = new Dictionary(); 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"))