LwvKASpitzabrechnung - 1.0

This commit is contained in:
2024-07-15 17:00:01 +02:00
parent 5c3aefcb07
commit 37e2fbd9a0
2 changed files with 272 additions and 713 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -21,6 +21,7 @@ namespace BeWo.Report.ReportObjects
public DateTime BewilligtStart { get; set; }
public DateTime BewilligtEnde { get; set; }
public List<LwvKASpitzabrechnungsWochenZeile> WochenZeilen { get; set; }
public List<Preiszeitraum> Preiszeitraeume { get; set; }
public decimal SummeBewilligteStunden { get; set; }
public decimal SummeErbrachteStunden { get; set; }
public decimal SummeStundenDifferenz { get; set; }
@@ -28,7 +29,7 @@ namespace BeWo.Report.ReportObjects
public decimal SummeBetragErbracht { get; set; }
public virtual LwvKASpitzabrechnungRO Create(long c2sOid, long? scapOid)
public static LwvKASpitzabrechnungRO Create(long c2sOid, long? scapOid, long? catOid)
{
var ro = new LwvKASpitzabrechnungRO();
var c2s = DAOFactory.GenericDAO.LoadByID<CostBearer2SupportConcept>(c2sOid);
@@ -36,16 +37,41 @@ namespace BeWo.Report.ReportObjects
ro.CustomerDC = MapperFactory.CustomerDC_Customer.MapToNewDC(c2s.SupportConcept.Customer);
ro.BewilligtStart = c2s.StartDate.Value;
ro.BewilligtEnde = c2s.EndDate.Value;
SupportConceptApprovalPeriodDC scap;
var calc = PluginLoader.FindClass<Calculations>();
var scap = ro.Costbearer2SupportConceptDC.ApprovalPeriodList.FirstOrDefault(i => ro.BewilligtStart.InBetween(i.Span, true)
&& i.ServiceCategory != null && (i.ServiceCategory.Name.StartsWith("Kompensatorisch") || (i.ServiceCategory.Name.Contains("KA") && !i.ServiceCategory.Name.Contains("Fahrzeit"))));
// Für Aufruf aus Spitzabrechnung mit scapOid, ansonsten als Bericht mit Auswahl der Leistungskategorie für alle user bzw. ggf. im CustomReportCreator anpassen
if (!scapOid.HasValue)
{
if (catOid.HasValue)
{
scap = ro.Costbearer2SupportConceptDC.ApprovalPeriodList.FirstOrDefault(i => ro.BewilligtStart.InBetween(i.Span, true) && i.ServiceCategory.ServiceCategoryOid == catOid.Value);
if (catOid.HasValue && scap.ServiceCategory.ServiceCategoryOid != catOid.Value)
{
return ro;
}
}
else
{
scap = ro.Costbearer2SupportConceptDC.ApprovalPeriodList.FirstOrDefault(i => ro.BewilligtStart.InBetween(i.Span, true));
//&& i.ServiceCategory != null && (i.ServiceCategory.Name.StartsWith("Kompensatorisch") || (i.ServiceCategory.Name.Contains("KA") && !i.ServiceCategory.Name.Contains("Fahrzeit"))));
}
}
else
{
scap = ro.Costbearer2SupportConceptDC.ApprovalPeriodList.FirstOrDefault(i => i.SupportConceptApprovalPeriodOid == scapOid.Value);
}
var bewilligtProWoche = scap.ApprovedBEPerInterval ?? 0;
ro.WochenZeilen = new List<LwvKASpitzabrechnungsWochenZeile>();
ro.Preiszeitraeume = new List<Preiszeitraum>();
var zeilenDict = new Dictionary<String, LwvKASpitzabrechnungsWochenZeile>();
int year = ro.BewilligtStart.Year;
int idx = 0;
//Erstelle über gesamten Bewilligungszeitraum eine leere Zeile pro Kalenderwoche und fülle mit Bewilligungsdaten
//Erstelle über gesamten Bewilligungszeitraum eine leere Zeile pro Kalenderwoche und Jahr und fülle mit Bewilligungsdaten
DateTime dt = ro.BewilligtStart;
while (dt <= ro.BewilligtEnde)
{
@@ -66,7 +92,7 @@ namespace BeWo.Report.ReportObjects
wz.bewilligteStunden = Math.Round(bewilligtProWoche/60, 2, MidpointRounding.AwayFromZero);
if (days != 7)
{
wz.bewilligteStunden = wz.bewilligteStunden / 7 * days;
wz.bewilligteStunden = Math.Round(wz.bewilligteStunden / 7 * days, 2, MidpointRounding.AwayFromZero);
}
var data = calc.GetFixedBillingData(scap, wz.kwStartDate, wz.kwEndDate);
if (data != null && data.Count != 0)
@@ -80,7 +106,31 @@ namespace BeWo.Report.ReportObjects
ro.WochenZeilen.Add(wz);
zeilenDict.Add(kwKey, wz);
// setze Jahresdaten
if (idx == 0 || year != dt.Year)
{
idx++;
year = dt.Year;
var pz = new Preiszeitraum();
pz.Index = idx;
pz.Stundensatz = wz.BetragPauschal;
pz.SummeBewilligteStunden = wz.bewilligteStunden;
pz.SummeErbrachteStunden = 0;
pz.SummeStundenDifferenz = 0;
pz.SummeBetragPauschal = 0;
pz.SummeBetragErbracht = 0;
pz.SummeBetragDifferenz = 0;
ro.Preiszeitraeume.Add(pz);
}
else
{
var aktPz = ro.Preiszeitraeume.FirstOrDefault(i => i.Index == idx);
aktPz.SummeBewilligteStunden += wz.bewilligteStunden;
}
wz.Preiszeitraum = idx;
}
dt = dt.AddDays(1);
}
@@ -108,14 +158,26 @@ namespace BeWo.Report.ReportObjects
{
wz.nachgeholteStunden = wz.erbrachteStunden - wz.bewilligteStunden;
}
wz.BetragErbracht = wz.erbrachteStunden * wz.Stundensatz;
wz.BetragErbracht = Math.Round(wz.erbrachteStunden * wz.Stundensatz.Value, 2, MidpointRounding.AwayFromZero);
wz.BetragPauschal = Math.Round(bewilligtProWoche * (decimal)Math.Round((double)wz.Stundensatz / 60, 4, MidpointRounding.AwayFromZero), 2, MidpointRounding.AwayFromZero);
ro.SummeStundenDifferenz += wz.StundenDifferenz ?? 0;
ro.SummeErbrachteStunden += wz.erbrachteStunden;
ro.SummeBetragErbracht += wz.BetragErbracht ?? 0;
// Fülle die Jahresdaten
var aktPz = ro.Preiszeitraeume.FirstOrDefault(i => i.Index == wz.Preiszeitraum);
aktPz.SummeErbrachteStunden += wz.erbrachteStunden;
aktPz.SummeStundenDifferenz += wz.StundenDifferenz;
aktPz.SummeBetragPauschal += wz.BetragPauschal;
aktPz.SummeBetragErbracht += wz.BetragErbracht;
}
foreach (var pz in ro.Preiszeitraeume)
{
//pz.SummeBetragDifferenz = pz.SummeBetragErbracht - pz.SummeBetragPauschal;
pz.SummeBetragDifferenz = Math.Round(pz.SummeStundenDifferenz.Value * pz.Stundensatz.Value, 2, MidpointRounding.AwayFromZero);
}
return ro;
}
@@ -148,11 +210,12 @@ namespace BeWo.Report.ReportObjects
public class Preiszeitraum
{
public int Index { get; set; }
public decimal Stundensatz { get; set; }
public decimal SummeBewilligteStunden { get; set; }
public decimal SummeErbrachteStunden { get; set; }
public decimal SummeStundenDifferenz { get; set; }
public decimal SummeBetragPauschal { get; set; }
public decimal SummeBetragErbracht { get; set; }
public decimal? Stundensatz { get; set; }
public decimal? SummeBewilligteStunden { get; set; }
public decimal? SummeErbrachteStunden { get; set; }
public decimal? SummeStundenDifferenz { get; set; }
public decimal? SummeBetragPauschal { get; set; }
public decimal? SummeBetragErbracht { get; set; }
public decimal? SummeBetragDifferenz { get; set; }
}
}