Merge branch 'master' of ssh://float.ownsoft.de/git/beyondSoft/BeWo
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -417,3 +417,4 @@ FodyWeavers.xsd
|
||||
/ReportImp/RatPlusTat/CustomBudgetnachweisAnhangRO.cs
|
||||
/.claude/worktrees
|
||||
/.claude
|
||||
/CLAUDE.md
|
||||
|
||||
@@ -16,124 +16,124 @@ using DevExpress.XtraReports.UI;
|
||||
|
||||
namespace BeWoDarmstadt
|
||||
{
|
||||
public class CustomReportCreator : DefaultReportCreator
|
||||
{
|
||||
public override XtraReport CreateQueryReport(long queryOid, string queryReportId)
|
||||
{
|
||||
if (queryOid == 100 || queryOid == 101)
|
||||
{
|
||||
return CreateZeitzuschlagsbeleg(queryOid, queryReportId);
|
||||
}
|
||||
if (queryOid == 110)
|
||||
{
|
||||
return CreateTeamuebersichtByCategory(queryOid, queryReportId, "qualifiziert");
|
||||
}
|
||||
if (queryOid == 111)
|
||||
{
|
||||
return CreateTeamuebersichtByCategory(queryOid, queryReportId, "kompensatorisch");
|
||||
}
|
||||
return base.CreateQueryReport(queryOid, queryReportId);
|
||||
public class CustomReportCreator : DefaultReportCreator
|
||||
{
|
||||
public override XtraReport CreateQueryReport(long queryOid, string queryReportId)
|
||||
{
|
||||
if (queryOid == 100 || queryOid == 101)
|
||||
{
|
||||
return CreateZeitzuschlagsbeleg(queryOid, queryReportId);
|
||||
}
|
||||
if (queryOid == 110)
|
||||
{
|
||||
return CreateTeamuebersichtByCategory(queryOid, queryReportId, "qualifiziert");
|
||||
}
|
||||
if (queryOid == 111)
|
||||
{
|
||||
return CreateTeamuebersichtByCategory(queryOid, queryReportId, "kompensatorisch");
|
||||
}
|
||||
return base.CreateQueryReport(queryOid, queryReportId);
|
||||
}
|
||||
|
||||
private XtraReport CreateZeitzuschlagsbeleg(long queryOid, string queryReportId)
|
||||
{
|
||||
var query = DAOFactory.GenericDAO.LoadByID<Query>(queryOid);
|
||||
private XtraReport CreateZeitzuschlagsbeleg(long queryOid, string queryReportId)
|
||||
{
|
||||
var query = DAOFactory.GenericDAO.LoadByID<Query>(queryOid);
|
||||
|
||||
if (query == null)
|
||||
return new XtraReport();
|
||||
if (query == null)
|
||||
return new XtraReport();
|
||||
|
||||
var path = Path.Combine(TempPath, queryReportId + ".xml");
|
||||
var table = Utils.XMLDeserialize<DataTable>(path);
|
||||
var qro = QueryRO.Create(query, table);
|
||||
var path = Path.Combine(TempPath, queryReportId + ".xml");
|
||||
var table = Utils.XMLDeserialize<DataTable>(path);
|
||||
var qro = QueryRO.Create(query, table);
|
||||
|
||||
if (qro.Rows.Count > 0)
|
||||
{
|
||||
long? employeeOid = BeWo.Data.Security.UserRightHelper.GetLoggedInUser().Employee.Oid;
|
||||
if (qro.Rows[0].Field2 != null && qro.Rows[0].Field2.ToString() != "0")
|
||||
employeeOid = Int64.Parse(qro.Rows[0].Field2.ToString());
|
||||
if (qro.Rows.Count > 0)
|
||||
{
|
||||
long? employeeOid = BeWo.Data.Security.UserRightHelper.GetLoggedInUser().Employee.Oid;
|
||||
if (qro.Rows[0].Field2 != null && qro.Rows[0].Field2.ToString() != "0")
|
||||
employeeOid = Int64.Parse(qro.Rows[0].Field2.ToString());
|
||||
|
||||
DateTime monat = DateTime.Parse(qro.Rows[0].Field1.ToString());
|
||||
DateTimeSpan span = new DateTimeSpan();
|
||||
span.StartDateTime = monat;
|
||||
span.EndDateTime = monat.AddMonths(1).AddTicks(-1);
|
||||
DateTime monat = DateTime.Parse(qro.Rows[0].Field1.ToString());
|
||||
DateTimeSpan span = new DateTimeSpan();
|
||||
span.StartDateTime = monat;
|
||||
span.EndDateTime = monat.AddMonths(1).AddTicks(-1);
|
||||
|
||||
MitarbeiterstundenkontoRO ro = MitarbeiterstundenkontoRO.Create(employeeOid, null, monat, monat.AddMonths(1), null);
|
||||
MitarbeiterstundenkontoRO ro = MitarbeiterstundenkontoRO.Create(employeeOid, null, monat, monat.AddMonths(1), null);
|
||||
var msb = new CustomMitarbeiterstundenkontoBerechnung();
|
||||
msb.CreateReport(ro);
|
||||
msb.CreateReport(ro);
|
||||
|
||||
XtraReport allReports = null;
|
||||
XtraReport allReports = null;
|
||||
|
||||
foreach (var ed in ro.EmployeeDetailList)
|
||||
{
|
||||
ed.StundenGesamtIst += ed.Custom10;
|
||||
foreach (var ed in ro.EmployeeDetailList)
|
||||
{
|
||||
ed.StundenGesamtIst += ed.Custom10;
|
||||
|
||||
Zeitzuschlagsbeleg beleg = new Zeitzuschlagsbeleg();
|
||||
Zeitzuschlagsbeleg beleg = new Zeitzuschlagsbeleg();
|
||||
|
||||
beleg.SetReportDataSource(ro.ReportStartDate, ed);
|
||||
beleg.SetReportDataSource(ro.ReportStartDate, ed);
|
||||
|
||||
beleg.CreateDocument();
|
||||
if (allReports == null)
|
||||
allReports = beleg;
|
||||
else
|
||||
allReports.Pages.AddRange(beleg.Pages);
|
||||
}
|
||||
beleg.CreateDocument();
|
||||
if (allReports == null)
|
||||
allReports = beleg;
|
||||
else
|
||||
allReports.Pages.AddRange(beleg.Pages);
|
||||
}
|
||||
|
||||
if (allReports != null)
|
||||
{
|
||||
return allReports;
|
||||
}
|
||||
}
|
||||
return new XtraReport();
|
||||
if (allReports != null)
|
||||
{
|
||||
return allReports;
|
||||
}
|
||||
}
|
||||
return new XtraReport();
|
||||
}
|
||||
|
||||
private XtraReport CreateTeamuebersichtByCategory(long queryOid, string queryReportId, string leistungskategorie)
|
||||
{
|
||||
var query = DAOFactory.GenericDAO.LoadByID<Query>(queryOid);
|
||||
private XtraReport CreateTeamuebersichtByCategory(long queryOid, string queryReportId, string leistungskategorie)
|
||||
{
|
||||
var query = DAOFactory.GenericDAO.LoadByID<Query>(queryOid);
|
||||
|
||||
if (query == null)
|
||||
return new XtraReport();
|
||||
if (query == null)
|
||||
return new XtraReport();
|
||||
|
||||
var path = Path.Combine(TempPath, queryReportId + ".xml");
|
||||
var table = Utils.XMLDeserialize<DataTable>(path);
|
||||
var qro = QueryRO.Create(query, table);
|
||||
var path = Path.Combine(TempPath, queryReportId + ".xml");
|
||||
var table = Utils.XMLDeserialize<DataTable>(path);
|
||||
var qro = QueryRO.Create(query, table);
|
||||
|
||||
if (qro.Rows.Count > 0)
|
||||
{
|
||||
DateTime param = DateTime.Parse(qro.Rows[0].Field1.ToString());
|
||||
DateTime start = new DateTime(param.Year, 1, 1);
|
||||
DateTime end = param.AddMonths(1).AddDays(-1);
|
||||
if (qro.Rows.Count > 0)
|
||||
{
|
||||
DateTime param = DateTime.Parse(qro.Rows[0].Field1.ToString());
|
||||
DateTime start = new DateTime(param.Year, 1, 1);
|
||||
DateTime end = param.AddMonths(1).AddDays(-1);
|
||||
|
||||
var ro = FinanceRO.Create(start, end, true, false);
|
||||
ro.SupportConceptFinanceList = ro.SupportConceptFinanceList.Where(sc => sc.Leistungskategorie != null &&
|
||||
sc.Leistungskategorie.IndexOf(leistungskategorie, StringComparison.OrdinalIgnoreCase) >= 0).ToList();
|
||||
var ro = FinanceRO.Create(start, end, true, false);
|
||||
ro.SupportConceptFinanceList = ro.SupportConceptFinanceList.Where(sc => sc.Leistungskategorie == null ||
|
||||
sc.Leistungskategorie.IndexOf(leistungskategorie, StringComparison.OrdinalIgnoreCase) >= 0).ToList();
|
||||
|
||||
var druck = new Teamuebersicht();
|
||||
druck.SetReportDataSource(ro);
|
||||
return druck;
|
||||
}
|
||||
var druck = new Teamuebersicht();
|
||||
druck.SetReportDataSource(ro);
|
||||
return druck;
|
||||
}
|
||||
|
||||
return new XtraReport();
|
||||
}
|
||||
return new XtraReport();
|
||||
}
|
||||
|
||||
public override XtraReport CreateAuslastungReport(long? employeeOid, IList<long> teamOids, DateTime startDate, DateTime endDate)
|
||||
{
|
||||
IBeWoReport<MitarbeiterauslastungRO> report;
|
||||
MitarbeiterauslastungRO x;
|
||||
if (teamOids != null && teamOids.Count > 0)
|
||||
{
|
||||
IList<long> employeeOids = new List<long>();
|
||||
report = FindReportImp<MitarbeiterauslastungRO>("TeamauslastungNachMitarbeiter");
|
||||
x = MitarbeiterauslastungRO.Create(employeeOids, teamOids, startDate, endDate, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
report = FindReportImp<MitarbeiterauslastungRO>("Mitarbeiterauslastung");
|
||||
x = MitarbeiterauslastungRO.Create(employeeOid, teamOids, startDate, endDate);
|
||||
}
|
||||
public override XtraReport CreateAuslastungReport(long? employeeOid, IList<long> teamOids, DateTime startDate, DateTime endDate)
|
||||
{
|
||||
IBeWoReport<MitarbeiterauslastungRO> report;
|
||||
MitarbeiterauslastungRO x;
|
||||
if (teamOids != null && teamOids.Count > 0)
|
||||
{
|
||||
IList<long> employeeOids = new List<long>();
|
||||
report = FindReportImp<MitarbeiterauslastungRO>("TeamauslastungNachMitarbeiter");
|
||||
x = MitarbeiterauslastungRO.Create(employeeOids, teamOids, startDate, endDate, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
report = FindReportImp<MitarbeiterauslastungRO>("Mitarbeiterauslastung");
|
||||
x = MitarbeiterauslastungRO.Create(employeeOid, teamOids, startDate, endDate);
|
||||
}
|
||||
|
||||
report.SetReportDataSource(x);
|
||||
report.SetReportDataSource(x);
|
||||
|
||||
return report as XtraReport;
|
||||
}
|
||||
}
|
||||
return report as XtraReport;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,9 @@ using BeWo.Data.Entities;
|
||||
using BeWo.Report;
|
||||
using BeWo.Report.ReportObjects;
|
||||
using BeWo.Service.DCEntityMapper;
|
||||
using BS.Shared;
|
||||
using BS.Shared.DataContracts;
|
||||
using BS.Shared.DataContracts.Compact;
|
||||
using BS.Shared.Extensions;
|
||||
using BS.Shared.Services;
|
||||
|
||||
@@ -25,6 +27,13 @@ namespace BeWoDarmstadt
|
||||
DateTime end = pRO.ReportEndDate.Value;
|
||||
DateTime monthStart = new DateTime(pRO.ReportEndDate.Value.Year, pRO.ReportEndDate.Value.Month, 1);
|
||||
|
||||
// ServiceDescriptions einmal vorladen, falls QA-Einträge vorhanden sind
|
||||
Dictionary<long, ServiceDescriptionDC> serviceDictCache = null;
|
||||
if (pRO.SupportConceptFinanceList != null && pRO.SupportConceptFinanceList.Any(sc => sc.Leistungskategorie != null && sc.Leistungskategorie.IndexOf("qualifiziert", StringComparison.OrdinalIgnoreCase) >= 0))
|
||||
{
|
||||
serviceDictCache = LoadServiceDescriptionDict();
|
||||
}
|
||||
|
||||
if (pRO.SupportConceptFinanceList != null)
|
||||
{
|
||||
foreach (var scRo in pRO.SupportConceptFinanceList)
|
||||
@@ -39,22 +48,40 @@ namespace BeWoDarmstadt
|
||||
scRo.Custom1 = team;
|
||||
}
|
||||
if (scRo.Costbearer2Supportconcept.SupportConcept.Customer.CustomerAlias == null)
|
||||
{
|
||||
scRo.Costbearer2Supportconcept.SupportConcept.Customer.CustomerAlias = scRo.Costbearer2Supportconcept.SupportConcept.CustomerFullName;
|
||||
if (scRo.Costbearer2Supportconcept.SupportConcept.Customer.CustomerAlias == "513")
|
||||
{
|
||||
var Test = 1;
|
||||
}
|
||||
}
|
||||
//if (scRo.Costbearer2Supportconcept.SupportConcept.Customer.CustomerAlias == "160")
|
||||
// {
|
||||
// var Test = 1;
|
||||
// }
|
||||
|
||||
//Hole zus<EFBFBD>tzlich Werte nur f<EFBFBD>r einzelnen Monat
|
||||
//Hole zusätzlich Werte nur für einzelnen Monat
|
||||
var cb2sc = scRo.Costbearer2Supportconcept;
|
||||
var costRateDcs = cb2sc.CostBearer.CostRatePeriods;
|
||||
var calc = BS.Shared.Services.Calculations.GetInstance(cb2sc.CostBearer.CostBearerID);
|
||||
scRo.ApprovedHours = GetApprovedHoursOhneFahrzeitForPeriod(cb2sc, monthStart, end, scRo.SupportConceptApprovalPeriod);
|
||||
scRo.BillableHours = 0;
|
||||
scRo.BillableHoursInReportTimeSpan = 0;
|
||||
|
||||
scRo.AmountPaid = 0;
|
||||
scRo.AmountTotal = 0;
|
||||
|
||||
// Bei qualifizierter Assistenz: alle abrechenbaren, nicht-kompensatorischen Records des Hilfeplanis hinzufügen, die noch nicht in ServiceRecords enthalten sind
|
||||
// die dokumentieren teilweise völlig beliebig bei Gruppenbuchungen
|
||||
if (scRo.Leistungskategorie != null && scRo.Leistungskategorie.IndexOf("qualifiziert", StringComparison.OrdinalIgnoreCase) >= 0 && serviceDictCache != null)
|
||||
{
|
||||
var existingOids = new HashSet<long>((scRo.ServiceRecords ?? new List<ServiceRecordDC>()).Where(r => r.ServiceRecordOid.HasValue).Select(r => r.ServiceRecordOid.Value));
|
||||
var additionalRecords = LoadBillableNonKompensatorischRecords(cb2sc, scRo, existingOids, serviceDictCache);
|
||||
if (scRo.ServiceRecords == null)
|
||||
{
|
||||
scRo.ServiceRecords = additionalRecords;
|
||||
}
|
||||
else
|
||||
{
|
||||
scRo.ServiceRecords.AddRange(additionalRecords);
|
||||
}
|
||||
}
|
||||
|
||||
if (scRo.ServiceRecords != null)
|
||||
{
|
||||
@@ -68,6 +95,10 @@ namespace BeWoDarmstadt
|
||||
{
|
||||
scRo.BillableHours += calc.GetBillableDurationInMinutes(sr, false) / 60;
|
||||
}
|
||||
if (sr.Start >= start && sr.Start.Value.Date <= end)
|
||||
{
|
||||
scRo.BillableHoursInReportTimeSpan += calc.GetBillableDurationInMinutes(sr, false) / 60;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -78,6 +109,75 @@ namespace BeWoDarmstadt
|
||||
this.bindingSource1.DataSource = pRO;
|
||||
}
|
||||
|
||||
private Dictionary<long, ServiceDescriptionDC> LoadServiceDescriptionDict()
|
||||
{
|
||||
var allServiceDescs = DAOFactory.GenericDAO.GetAll<ServiceDescription>();
|
||||
var dict = new Dictionary<long, ServiceDescriptionDC>();
|
||||
foreach (var sd in allServiceDescs)
|
||||
{
|
||||
if (sd.Oid.HasValue)
|
||||
{
|
||||
dict[sd.Oid.Value] = MapperFactory.ServiceDescriptionDC_ServiceDescription.MapToNewDC(sd);
|
||||
}
|
||||
}
|
||||
return dict;
|
||||
}
|
||||
|
||||
private List<ServiceRecordDC> LoadBillableNonKompensatorischRecords(
|
||||
SupportConceptCostBearerRelDC cb2sc,
|
||||
FinanceRO.SupportConceptFinanceRO scRo,
|
||||
HashSet<long> existingOids,
|
||||
Dictionary<long, ServiceDescriptionDC> serviceDict)
|
||||
{
|
||||
var result = new List<ServiceRecordDC>();
|
||||
|
||||
string sql = string.Format(
|
||||
"SELECT Oid, Version, StartDate, EndDate, DistanceInMeter, CostBearer2SupportConceptOid, Betrag, ServiceDescriptionOid, RoundedDuration, GroupEmployeeCount, GroupPersonCount, GroupRoundedDuration, GroupOid " +
|
||||
"FROM servicerecord WHERE CostBearer2SupportConceptOid = {0}", cb2sc.CostBearer2SupportConceptOid.Value);
|
||||
|
||||
var sqlresult = DAOFactory.SearchDAO.GetSqlResult(sql);
|
||||
|
||||
foreach (object[] row in sqlresult)
|
||||
{
|
||||
long? oid = (long?)row[0];
|
||||
if (!oid.HasValue || existingOids.Contains(oid.Value))
|
||||
continue;
|
||||
|
||||
long? sdOid = (long?)row[7];
|
||||
if (!sdOid.HasValue || !serviceDict.ContainsKey(sdOid.Value))
|
||||
continue;
|
||||
|
||||
var sd = serviceDict[sdOid.Value];
|
||||
if (sd.Category == null ||
|
||||
!sd.Category.IsBillable ||
|
||||
(sd.Category.Name ?? "").IndexOf("kompensatorisch", StringComparison.OrdinalIgnoreCase) >= 0)
|
||||
continue;
|
||||
|
||||
var sr = new ServiceRecordDC();
|
||||
sr.ServiceRecordOid = oid;
|
||||
sr.ServiceRecordVersion = (long?)row[1];
|
||||
sr.Start = (DateTime?)row[2];
|
||||
sr.End = (DateTime?)row[3];
|
||||
sr.CostBearer2SupportConceptOid = (long?)row[5];
|
||||
sr.Betrag = (decimal?)row[6];
|
||||
sr.ServiceDescription = sd;
|
||||
sr.RoundedDuration = (decimal)row[8];
|
||||
sr.GroupEmployeeCount = (int?)row[9];
|
||||
sr.GroupPersonCount = (int?)row[10];
|
||||
sr.GroupRoundedDuration = (decimal?)row[11];
|
||||
sr.GroupOid = (long?)row[12];
|
||||
// Pflichtfelder für GetBillableDurationInMinutes (analog zu FinanceRO.Create)
|
||||
sr.Employee = new CompactEmployeeDC { ValueListEntries = new Dictionary<long, ValueListEntryType>() };
|
||||
sr.CostBearer = cb2sc.CostBearer;
|
||||
sr.SupportConcept = scRo.Costbearer2Supportconcept.SupportConcept;
|
||||
sr.Customer = scRo.Costbearer2Supportconcept.SupportConcept.Customer;
|
||||
|
||||
result.Add(sr);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private string GetTeams(FinanceRO.SupportConceptFinanceRO scRo)
|
||||
{
|
||||
var c = DAOFactory.GenericDAO.GetByID<Customer>(scRo.Costbearer2Supportconcept.SupportConcept.Customer.CustomerOid);
|
||||
@@ -88,12 +188,8 @@ namespace BeWoDarmstadt
|
||||
return scRo.Costbearer2Supportconcept.SupportConcept.Customer.RelatedTeams;
|
||||
}
|
||||
|
||||
private decimal GetApprovedHoursOhneFahrzeitForPeriod(SupportConceptCostBearerRelDC relDC,
|
||||
DateTime pStart,
|
||||
DateTime pEnd,
|
||||
SupportConceptApprovalPeriodDC filterScap = null)
|
||||
private decimal GetApprovedHoursOhneFahrzeitForPeriod(SupportConceptCostBearerRelDC relDC, DateTime pStart, DateTime pEnd, SupportConceptApprovalPeriodDC filterScap = null)
|
||||
{
|
||||
|
||||
var costRatePeriods = relDC.CostBearer.CostRatePeriods;
|
||||
decimal approvedHours = 0;
|
||||
DateTime start = pStart;
|
||||
|
||||
@@ -303,7 +303,7 @@ namespace BeWoDarmstadt
|
||||
this.lblTitel.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
|
||||
this.lblTitel.SizeF = new System.Drawing.SizeF(652.9166F, 23F);
|
||||
this.lblTitel.StylePriority.UseFont = false;
|
||||
this.lblTitel.Text = "Monats<EFBFBD>bersicht je Team f<EFBFBD>r [ReportEndDate!MMMM] [ReportEndDate!yyyy] ";
|
||||
this.lblTitel.Text = "Monatsübersicht je Team für [ReportEndDate!MMMM] [ReportEndDate!yyyy] ";
|
||||
//
|
||||
// DetailReport
|
||||
//
|
||||
|
||||
@@ -32,6 +32,9 @@ namespace CaritasGuenzburgNeuUlm
|
||||
var table = Utils.XMLDeserialize<DataTable>(path);
|
||||
var qro = QueryRO.Create(query, table);
|
||||
|
||||
// filterAbove20Percent: gibt noch mal eine Auswertung wo nur die Hilfepläne auftauchen,
|
||||
// die über den Grenzen liegen und anders abgrechnet werden müssen
|
||||
// Grenzen 20 % für Unterqualifizierung und 30 % für Überqualifizierung
|
||||
var ro = SupportConceptListRO.Create(null, null, null, null, null, false, null, null);
|
||||
var druckAuffaellig = new KorridorUebersicht();
|
||||
druckAuffaellig.SetReportDataSource(ro, filterAbove20Percent: true);
|
||||
|
||||
@@ -29,6 +29,10 @@ namespace CaritasGuenzburgNeuUlm
|
||||
System.Globalization.CultureInfo.InvariantCulture, out var v) ? v : 0m;
|
||||
}
|
||||
|
||||
// filterAbove20Percent: gibt noch mal eine Auswertung wo nur die Hilfepläne auftauchen,
|
||||
// die über den Grenzen liegen und anders abgrechnet werden müssen
|
||||
// Grenzen 20 % für Unterqualifizierung und 30 % für Überqualifizierung
|
||||
|
||||
public void SetReportDataSource(SupportConceptListRO pRO, bool filterAbove20Percent = false)
|
||||
{
|
||||
string[] CatsQuali = { "Qualifiziert", "FLS Q1", "FLS Q2" };
|
||||
|
||||
@@ -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