DiakoniewerkEssen/Export/DiamantExporter - Künstliche Absonderung Faktor auf separate Erlöskonten
SupportOID=162560
This commit is contained in:
@@ -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"))
|
||||
|
||||
Reference in New Issue
Block a user