Files
BeWoPlaner/ReportImp/HphBersenbrueckFreizeitUndReisen/Calculations/HphServiceRecordStatisticFactory.cs
2022-07-19 11:16:48 +02:00

904 lines
39 KiB
C#

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.Plugins;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;
using BS.Shared.Services;
using HphBersenbrueckFreizeitUndReisen.Abrechnung;
namespace HphBersenbrueckFreizeitUndReisen.Calculations
{
public class HphServiceRecordStatisticFactory : ServiceRecordStatisticFactory
{
private bool containsEntlastungsbetrag = false;
private Pflegegrad? pflegegrad = null;
//private Dictionary<long, decimal> oid2MonatAbschlag = new Dictionary<long, decimal>();
public Dictionary<String, decimal> cat2BetragVorjahrAb17Halbjahr1 = new Dictionary<String, decimal>();
public Dictionary<String, decimal> cat2BetragVorjahrAb17Halbjahr2 = new Dictionary<String, decimal>();
public Dictionary<String, decimal> cat2BetragVorjahr16 = new Dictionary<String, decimal>();
private Dictionary<string, Dictionary<String, bool>> key2TagesDict = new Dictionary<string, Dictionary<String, bool>>();
private int hilfeplanJahr = DateTime.Now.Year;
//private Dictionary<String, decimal> preisFuerEinzelbetreuung = new Dictionary<string, decimal>();
public HphServiceRecordStatisticFactory()
{
}
public override ServiceRecordStatisticsInfoDC GetServiceRecordStatisticInfo(long costBearer2SupportConceptOid, DateTime statisticsDate)
{
var stats = CreateSupportConceptStatisticsImpl(costBearer2SupportConceptOid, statisticsDate);
int rowCount = 4;
if (containsEntlastungsbetrag)
{
if (hilfeplanJahr >= 2019)
{
rowCount = 5;
}
else
{
rowCount = 6;
}
}
var dc = new ServiceRecordStatisticsInfoDC();
dc.Header = new string[rowCount];
dc.Header[0] = "Bewilligungszeitraum:";
dc.Header[1] = "Geleistet diesen Monat/Gesamt:";
dc.Header[2] = "Bewilligt diesen Monat/Gesamt:";
dc.Header[3] = "Frei diesen Monat/Gesamt:";
if (containsEntlastungsbetrag)
{
if (hilfeplanJahr >= 2019)
{
dc.Header[4] = String.Format("Restbetrag aus {0}", hilfeplanJahr - 1);
}
else
{
dc.Header[4] = "Restbetrag aus 2015/2016:";
dc.Header[5] = "Restbetrag aus 2017:";
}
}
dc.ForegroundColor = new string[rowCount];
for (int i = 0; i < rowCount; i++)
{
dc.ForegroundColor[i] = "#FF2B508B";
}
dc.PeriodStatisticInfos = new List<ServiceRecordPeriodStatisticsInfoDC>();
if (stats != null)
{
if (stats.PeriodStatistics.Count > 1 && !TimeSpanIsEqual(stats))
{
//dc.PeriodStatisticInfos.Add(CreateTotalStatistics(stats, statisticsDate));
}
foreach (var pdc in stats.PeriodStatistics)
{
dc.PeriodStatisticInfos.Add(CreateServiceRecordPeriodStatisticsInfo(stats, pdc, statisticsDate));
}
}
return dc;
}
public override SupportConceptStatisticsDC CreateSupportConceptStatisticsImpl(long costBearer2SupportConceptOid,
DateTime statisticsDate, long? ignoreServiceRecordOid)
{
var stats = base.CreateSupportConceptStatisticsImpl(costBearer2SupportConceptOid, statisticsDate, ignoreServiceRecordOid);
CalculateFixedAmountBudget(stats, statisticsDate);
return stats;
}
protected override SupportConceptCostBearerRelDC CreateCb2ScDC(CostBearer2SupportConcept cb2sc)
{
pflegegrad = cb2sc.SupportConcept.Customer.Pflegegrad;
if (cb2sc.EndDate.HasValue && cb2sc.EndDate.Value.Year < hilfeplanJahr)
{
hilfeplanJahr = cb2sc.EndDate.Value.Year;
}
return base.CreateCb2ScDC(cb2sc);
}
public ServiceRecordPeriodStatisticsInfoDC CreateServiceRecordPeriodStatisticsInfo(SupportConceptStatisticsDC stats, SupportConceptPeriodStatisticsDC periodStats, DateTime statisticsDate)
{
int rowCount = 4;
if (containsEntlastungsbetrag)
{
if (hilfeplanJahr >= 2019)
{
rowCount = 5;
}
else
{
rowCount = 6;
}
}
var dc = CreateDefaultServiceRecordPeriodStatisticsInfo(rowCount);
bool showFixedAmount = false;
if (periodStats.SupportConceptApprovalPeriod != null)
{
if (periodStats.SupportConceptApprovalPeriod.ServiceCategory != null)
{
bool showDateRange = false;
if (stats.StatisticsStartDate != periodStats.SupportConceptApprovalPeriod.StartDate ||
stats.StatisticsEndDate != periodStats.SupportConceptApprovalPeriod.EndDate)
{
showDateRange = true;
}
if (showDateRange)
{
dc.LeftValues[0] = String.Format("{0}: {1:dd.MM.yy} - {2:dd.MM.yy}",
periodStats.SupportConceptApprovalPeriod.ServiceCategory.Name,
periodStats.SupportConceptApprovalPeriod.StartDate,
periodStats.SupportConceptApprovalPeriod.EndDate);
}
else
{
dc.LeftValues[0] = periodStats.SupportConceptApprovalPeriod.ServiceCategory.Name;
}
}
else
{
dc.LeftValues[0] = String.Format("{0:dd.MM.yy} - {1:dd.MM.yy}",
periodStats.SupportConceptApprovalPeriod.StartDate,
periodStats.SupportConceptApprovalPeriod.EndDate);
}
if (periodStats.SupportConceptApprovalPeriod.ApprovedFixedAmount.HasValue)
{
showFixedAmount = true;
}
}
if (showFixedAmount)
{
dc.LeftValues[1] = String.Format("{0:c}", periodStats.AmountConsumedThisInterval);
dc.RightValues[1] = String.Format("{0:c}", periodStats.AmountConsumedTotal);
dc.LeftValues[2] = String.Format("{0:c}", periodStats.FixedAmountApprovedPerInterval);
decimal restBetrag = (periodStats.FixedAmountApprovedTotal ?? 0) - periodStats.AmountConsumedTotal;
if (periodStats.SupportConceptApprovalPeriod != null && periodStats.SupportConceptApprovalPeriod.ServiceCategory != null && periodStats.SupportConceptApprovalPeriod.ServiceCategory.Name.Contains("Entlastungsbetrag"))
{
//Berechne Beträge
hilfeplanJahr = statisticsDate.Year;
if (periodStats.SupportConceptApprovalPeriod != null)
{
hilfeplanJahr = periodStats.SupportConceptApprovalPeriod.EndDate.Value.Year;
}
decimal gesamtRestVorjahr = 0;
if (hilfeplanJahr >= 2019)
{
gesamtRestVorjahr = periodStats.SupportConceptApprovalPeriod.MonthlyPayment ?? 0;
}
decimal rest2016 = periodStats.Custom1 ?? 0;
decimal restVorjahr = periodStats.Custom2 ?? 0;
decimal dazugekommenesBudgetLaufendesJahr = periodStats.FixedAmountApprovedTotal ?? 0;
decimal verwendetErstesHalbjahr = periodStats.Custom3 ?? 0;
decimal verwendetZweitesHalbjahr = periodStats.Custom4 ?? 0;
decimal verwendeterGesamtBetragLaufendesJahr = periodStats.AmountConsumedTotal;
if (hilfeplanJahr >= 2020)
{
gesamtRestVorjahr += restVorjahr;
restBetrag += gesamtRestVorjahr;
if (restBetrag > 0 && !periodStats.SupportConceptApprovalPeriod.MonthlyPayment.HasValue)
{
var scapDb = DAOFactory.GenericDAO.LoadByID<SupportConceptApprovalPeriod>(periodStats
.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value);
scapDb.MonthlyPayment = gesamtRestVorjahr;
DAOFactory.GenericDAO.Update(scapDb);
}
}
else
{
restBetrag += rest2016 + restVorjahr;
}
decimal angezeigterRest2017 = restVorjahr;
if (hilfeplanJahr == 2017)
{
angezeigterRest2017 = dazugekommenesBudgetLaufendesJahr - verwendeterGesamtBetragLaufendesJahr;
if (angezeigterRest2017 < 0)
{
angezeigterRest2017 = 0;
}
}
else if (hilfeplanJahr == 2018 && statisticsDate >= new DateTime(2018, 7, 1))
{
decimal betragVerfaellt = 0;
if (verwendetErstesHalbjahr < restVorjahr)
{
betragVerfaellt = restVorjahr - verwendetErstesHalbjahr;
}
if (betragVerfaellt > 0)
{
restBetrag -= betragVerfaellt;
}
}
else if (hilfeplanJahr >= 2022 && statisticsDate >= new DateTime(hilfeplanJahr, 7, 1))
{
decimal betragVerfaellt = 0;
if (verwendetErstesHalbjahr < gesamtRestVorjahr)
{
betragVerfaellt = gesamtRestVorjahr - verwendetErstesHalbjahr;
}
if (betragVerfaellt > 0)
{
restBetrag -= betragVerfaellt;
}
}
else if (hilfeplanJahr == 2021 && statisticsDate >= new DateTime(hilfeplanJahr + 1, 1, 1))
{
decimal betragVerfaellt = 0;
if (verwendetErstesHalbjahr < gesamtRestVorjahr)
{
betragVerfaellt = gesamtRestVorjahr - verwendetErstesHalbjahr;
}
if (betragVerfaellt > 0)
{
restBetrag -= betragVerfaellt;
}
}
else if ((hilfeplanJahr == 2019 || hilfeplanJahr == 2020) && statisticsDate >= new DateTime(hilfeplanJahr, 9, 1))
{
decimal betragVerfaellt = 0;
if (verwendetErstesHalbjahr < gesamtRestVorjahr)
{
betragVerfaellt = gesamtRestVorjahr - verwendetErstesHalbjahr;
}
if (betragVerfaellt > 0)
{
restBetrag -= betragVerfaellt;
}
}
if (dc.LeftValues.Length > 4)
{
if (hilfeplanJahr >= 2019)
{
dc.LeftValues[4] = String.Format("{0:c}", gesamtRestVorjahr);
}
else
{
dc.LeftValues[4] = String.Format("{0:c}", rest2016);
dc.LeftValues[5] = String.Format("{0:c}", angezeigterRest2017);
}
}
}
else
{
dc.LeftValues[2] = ""; // String.Format("{0:c}", periodStats.FixedAmountApprovedPerInterval);
}
//if (vortagVorjahr.HasValue)
//{
// dc.RightValues[2] = String.Format("{0:c} (+ {1:c})", periodStats.FixedAmountApprovedTotal, vortagVorjahr);
//}
//else
//{
dc.RightValues[2] = String.Format("{0:c}", periodStats.FixedAmountApprovedTotal);
//}
dc.LeftValues[3] = ""; //String.Format("{0:c}", periodStats.FixedAmountApprovedPerInterval - periodStats.AmountConsumedThisInterval);
dc.RightValues[3] = String.Format("{0:c}", restBetrag);
if (periodStats.FixedAmountApprovedPerInterval - periodStats.AmountConsumedThisInterval < 0)
{
dc.LeftValueColors[3] = "#FFFF0000";
}
if (restBetrag < 0)
{
dc.RightValueColors[3] = "#FFFF0000";
}
}
else
{
dc.LeftValues[1] = String.Format("{0:0.00} Std.", periodStats.MinutesProvidedThisMonth / 60);
dc.RightValues[1] = String.Format("{0:0.00} Std.", periodStats.MinutesProvidedTotalRounded / 60);
dc.LeftValues[2] = String.Format("{0:0.00} Std.", periodStats.MinutesApprovedPerMonth / 60);
dc.RightValues[2] = String.Format("{0:0.00} Std.", periodStats.MinutesApprovedTotal / 60);
dc.LeftValues[3] = String.Format("{0:0.00} Std.", (periodStats.MinutesApprovedPerMonth - periodStats.MinutesProvidedThisMonth) / 60);
dc.RightValues[3] = String.Format("{0:0.00} Std.", (periodStats.MinutesApprovedTotal - periodStats.MinutesProvidedTotalRounded) / 60);
if (periodStats.MinutesApprovedPerMonth - periodStats.MinutesProvidedThisMonth < 0)
{
dc.LeftValueColors[3] = "#FFFF0000";
}
if (periodStats.MinutesApprovedTotal - periodStats.MinutesProvidedTotalRounded < 0)
{
dc.RightValueColors[3] = "#FFFF0000";
}
}
return dc;
}
public override SupportConceptStatisticsDC CreateSupportConceptStatistics(long costBearer2SupportConceptOid, DateTime statisticsDate)
{
return null;
}
public override decimal GetApprovedMinutesPerMonth(SupportConceptPeriodStatisticsDC periodStats)
{
if (periodStats.SupportConceptApprovalPeriod != null)
{
if (periodStats.SupportConceptApprovalPeriod.ApprovedBEPerInterval.HasValue &&
periodStats.SupportConceptApprovalPeriod.ApprovedBEInterval.HasValue)
{
var be = periodStats.SupportConceptApprovalPeriod.ApprovedBEPerInterval.Value;
switch (periodStats.SupportConceptApprovalPeriod.ApprovedBEInterval.Value)
{
case SupportConceptApprovalInterval.Daily:
be *= 30;
break;
case SupportConceptApprovalInterval.Weekly:
be *= 4.34m;
break;
case SupportConceptApprovalInterval.Fortnightly:
be *= 4.34m / 2;
break;
case SupportConceptApprovalInterval.Monthly:
break;
case SupportConceptApprovalInterval.Quarterly:
be /= 3;
break;
case SupportConceptApprovalInterval.HalfYearly:
be /= 6;
break;
case SupportConceptApprovalInterval.Yearly:
be /= 12;
break;
default:
throw new ArgumentOutOfRangeException();
}
return be*60;
}
}
return base.GetApprovedMinutesPerMonth(periodStats);
}
public override decimal GetApprovedMinutesPerMonth(SupportConceptStatisticsDC stats)
{
if (stats.PeriodStatistics != null)
{
return stats.PeriodStatistics.Sum(p => p.MinutesApprovedPerMonth);
}
return base.GetApprovedMinutesPerMonth(stats);
}
protected override IEnumerable<ServiceRecord> GetServiceRecordsForStatistic(long costBearer2SupportConceptOid)
{
var srList = base.GetServiceRecordsForStatistic(costBearer2SupportConceptOid);
foreach (var sr in srList)
{
String leistung = sr.ServiceDescription.ServiceCategory.Name.ToLower().Trim();
if (!key2TagesDict.ContainsKey(leistung))
{
key2TagesDict[leistung] = new Dictionary<String, bool>();
}
if (sr.ServiceDescription.Name == "Kurzurlaub")
{
DateTime start = sr.Start.Value;
DateTime end = sr.End.Value;
while (start <= end)
{
String key = String.Format("{0:dd.MM.yyyy}", start);
if (!key2TagesDict[leistung].ContainsKey(key))
{
key2TagesDict[leistung].Add(key, true);
}
start = start.AddDays(1);
}
}
}
return srList;
}
private void CalculateFixedAmountBudget(SupportConceptStatisticsDC stats, DateTime date)
{
if (stats.PeriodStatistics != null)
{
foreach (var pstat in stats.PeriodStatistics)
{
if (pstat != null && pstat.SupportConceptApprovalPeriod != null &&
pstat.SupportConceptApprovalPeriod.ServiceCategory != null)
{
bool isEntlastung = false;
if (pstat.SupportConceptApprovalPeriod.ServiceCategory.Name.Contains("Entlastungsbetrag"))
{
containsEntlastungsbetrag = true;
isEntlastung = true;
}
if (!pstat.FixedAmountApprovedTotal.HasValue)
{
bool berechneGesamt = !isEntlastung;
BerechneBewilligungsBetrag(pstat, date, berechneGesamt);
}
if (isEntlastung)
{
if (pstat.SupportConceptApprovalPeriod.StartDate.HasValue &&
pstat.SupportConceptApprovalPeriod.StartDate.Value < date)
{
CalculateEntlastungsbetragBudget(pstat, date);
}
}
}
}
}
}
//periodStats.Custom1 = Restbudget 2016 (wird eingetragen im monatlicher Abschlag) verfällt Ende 2018
//periodStats.Custom2 = Restbudget 2017 - später, verfällt am 1.7. im Nachfolgejahr
//periodStats.Custom3 = verbraucht erstes Halbjahr
//periodStats.Custom4 = verbraucht zweites Halbjahr
private void CalculateEntlastungsbetragBudget(SupportConceptPeriodStatisticsDC pstat, DateTime date)
{
if (pstat != null && pstat.SupportConceptApprovalPeriod.ApprovedFixedAmount.HasValue)
{
if (pstat.SupportConceptApprovalPeriod.MonthlyPayment.HasValue && pstat.SupportConceptApprovalPeriod.MonthlyPayment.Value > 0)
{
if (!pstat.Custom1.HasValue)
{
decimal payment = pstat.SupportConceptApprovalPeriod.MonthlyPayment.Value;
pstat.Custom1 = payment;
}
}
else if (hilfeplanJahr < 2019)
{
if (pstat.SupportConceptApprovalPeriod.ServiceCategory != null)
{
var scap = DAOFactory.GenericDAO.LoadByID<SupportConceptApprovalPeriod>(pstat.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value);
var customer = scap.CostBearer2SupportConcept.SupportConcept.Customer;
BerechneRestBetragVorjahr(customer, pstat, pstat.SupportConceptApprovalPeriod.StartDate.Value.Year);
}
}
if (hilfeplanJahr > 2019)
{
if (!pstat.SupportConceptApprovalPeriod.MonthlyPayment.HasValue)
{
if (pstat.SupportConceptApprovalPeriod.ServiceCategory != null)
{
var scap = DAOFactory.GenericDAO.LoadByID<SupportConceptApprovalPeriod>(
pstat.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value);
var customer = scap.CostBearer2SupportConcept.SupportConcept.Customer;
BerechneRestBetragVorjahr(customer, pstat,
pstat.SupportConceptApprovalPeriod.StartDate.Value.Year);
}
}
}
}
}
protected override void CalculateFixedAmountBudget(ServiceRecord sr, SupportConceptPeriodStatisticsDC periodStats, DateTime statisticsDate)
{
if (periodStats != null && periodStats.SupportConceptApprovalPeriod.ApprovedFixedAmount.HasValue)
{
decimal preis = 0;
String sdName = sr.ServiceDescription.Name.ToLower();
if (sdName == "einzelbetreuung")
{
//String key = String.Format("{0}_{1}_{2}", sr.ServiceDescription.ServiceCategory.Name, sr.ServiceDescription.Name, sr.Start.m);
//if (!preisFuerEinzelbetreuung.ContainsKey(key))
//{
//var neuerPreis = GetPreisVonServiceDescription(sr.ServiceDescription, sr.Start.Value);
//}
preis = GetPreisVonServiceDescription(sr.ServiceDescription, sr.Start.Value) ?? 0;
preis *= (sr.RoundedDuration/60);
}
else if (sdName.Contains("hauptamt"))
{
preis = AbrechnungsInfo.GetPreisForEinzelbetreuungHauptamtlich(sr.Start.Value);
preis *= (sr.RoundedDuration/60);
}
else if (sdName.Contains("kurzurlaub") || sdName.Contains("reisen"))
{
DateTime start = sr.Start.Value;
DateTime end = sr.End.Value;
decimal summe = 0;
while (start <= end)
{
if (sdName.Contains("reisen"))
{
summe += AbrechnungsInfo.GetPreisForReisen(pflegegrad, start);
}
else
{
var key2Date = key2TagesDict[sr.ServiceDescription.ServiceCategory.Name.ToLower().Trim()];
summe += AbrechnungsInfo.GetPreisForKurzurlaub(pflegegrad, key2Date, start);
}
start = start.AddDays(1);
}
preis = summe;
}
else if (sdName.Contains("freizeitangebote"))
{
preis = AbrechnungsInfo.GetPreisForFreizeitangebot(pflegegrad, sr.Start.Value);
}
else if (sdName.Contains("ausflüge") || sdName.Contains("ausflug"))
{
preis = AbrechnungsInfo.GetPreisForAusflugFreizeittreff(pflegegrad, sr.Start.Value);
}
var firstOfMonthDt = new DateTime(statisticsDate.Year, statisticsDate.Month, 1);
if (sr.Start >= firstOfMonthDt && sr.Start < firstOfMonthDt.AddMonths(1))
{
periodStats.AmountConsumedThisInterval += preis;
}
if (sr.GroupEmployeeCount.HasValue)
{
preis /= sr.GroupEmployeeCount.Value;
}
periodStats.AmountConsumedTotal += preis;
var jahrBeginn = new DateTime(sr.Start.Value.Year, 1, 1);
if (sr.Start >= jahrBeginn && sr.Start < jahrBeginn.AddMonths(6))
{
periodStats.Custom3 = preis + (periodStats.Custom3 ?? 0);
}
else
{
periodStats.Custom4 = preis + (periodStats.Custom4 ?? 0);
}
//var oidKey = periodStats.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value;
// if (!oid2BetragVorjahrAb17.ContainsKey(oidKey) && periodStats.SupportConceptApprovalPeriod.ServiceCategory != null)
//{
// decimal restVorjahr = 0;
// decimal restVorVorjahr = 0;
// BerechneRestBetragVorjahr(sr.CustomerOid.Value, periodStats.SupportConceptApprovalPeriod.StartDate.Value.Year, periodStats.SupportConceptApprovalPeriod.ServiceCategory.Name, out restVorjahr, out restVorVorjahr);
// oid2BetragVorjahrAb17[oidKey] = restVorjahr;
// oid2BetragVorjahr16[oidKey] = restVorVorjahr;
// }
}
}
private decimal? GetPreisVonServiceDescription(ServiceDescription serviceDescription, DateTime monat)
{
if (serviceDescription != null && serviceDescription.CostRatePeriods != null)
{
var crpDcList = MapperFactory.CostRatePeriodDC_CostRatePeriod.MapToNewDCs(serviceDescription.CostRatePeriods);
var crp = crpDcList.GetCostRatePeriodForDate(CostRatePeriodType.AmountOfMoney, monat);
if (crp != null)
{
return crp.CostRateValue;
}
}
return null;
}
private void BerechneBewilligungsBetrag(SupportConceptPeriodStatisticsDC periodStats, DateTime statisticsDate, bool berechneGesamtBewilligung)
{
decimal monate = 0;
decimal tage = 0;
if (periodStats.SupportConceptApprovalPeriod != null && periodStats.SupportConceptApprovalPeriod.StartDate.HasValue && periodStats.SupportConceptApprovalPeriod.EndDate.HasValue)
{
DateTime start = periodStats.SupportConceptApprovalPeriod.StartDate.Value;
DateTime end = periodStats.SupportConceptApprovalPeriod.EndDate.Value;
if (berechneGesamtBewilligung)
{
while (start < end)
{
monate++;
start = start.AddMonths(1);
}
tage = (decimal)end.Subtract(periodStats.SupportConceptApprovalPeriod.StartDate.Value).TotalDays + 1;
}
else
{
if (statisticsDate < end)
{
end = new DateTime(statisticsDate.Year, statisticsDate.Month, 1);
}
while (start < end)
{
monate++;
start = start.AddMonths(1);
}
if (statisticsDate < periodStats.SupportConceptApprovalPeriod.EndDate.Value && statisticsDate.Day >= 15)
{
monate++;
}
tage = (decimal)end.Subtract(
periodStats.SupportConceptApprovalPeriod.StartDate.Value).TotalDays + 1;
}
}
periodStats.FixedAmountApprovedTotal = periodStats.SupportConceptApprovalPeriod.ApprovedFixedAmount;
periodStats.FixedAmountApprovedPerInterval = periodStats.FixedAmountApprovedTotal;
if (periodStats.SupportConceptApprovalPeriod.ApprovedFixedAmountInterval.HasValue)
{
switch (periodStats.SupportConceptApprovalPeriod.ApprovedFixedAmountInterval.Value)
{
case SupportConceptApprovalInterval.Daily:
periodStats.FixedAmountApprovedPerInterval *= 30;
periodStats.FixedAmountApprovedTotal = tage * periodStats.FixedAmountApprovedPerInterval;
break;
case SupportConceptApprovalInterval.Weekly:
periodStats.FixedAmountApprovedPerInterval *= 4.34m;
periodStats.FixedAmountApprovedTotal = periodStats.FixedAmountApprovedPerInterval*monate;
break;
case SupportConceptApprovalInterval.Fortnightly:
periodStats.FixedAmountApprovedPerInterval *= (4.34m / 2);
periodStats.FixedAmountApprovedTotal = periodStats.FixedAmountApprovedPerInterval * monate;
break;
case SupportConceptApprovalInterval.Monthly:
periodStats.FixedAmountApprovedTotal = periodStats.FixedAmountApprovedPerInterval * monate;
break;
case SupportConceptApprovalInterval.Quarterly:
periodStats.FixedAmountApprovedPerInterval /= 3;
periodStats.FixedAmountApprovedTotal = periodStats.FixedAmountApprovedPerInterval * monate;
break;
case SupportConceptApprovalInterval.HalfYearly:
periodStats.FixedAmountApprovedPerInterval /= 6;
periodStats.FixedAmountApprovedTotal = periodStats.FixedAmountApprovedPerInterval * monate;
break;
case SupportConceptApprovalInterval.Yearly:
periodStats.FixedAmountApprovedPerInterval /= 12;
periodStats.FixedAmountApprovedTotal = periodStats.FixedAmountApprovedPerInterval * monate;
break;
}
}
}
private void BerechneRestBetragVorjahr( Customer c, SupportConceptPeriodStatisticsDC pstat, int folgeJahr)
{
int jahr = folgeJahr - 1;
foreach (var sc in c.SupportConcepts)
{
foreach (var c2s in sc.CostBearer2SupportConceptList)
{
foreach (var scap in c2s.ApprovalPeriodList)
{
if (scap.ApprovedFixedAmount.HasValue && scap.EndDate.HasValue && scap.EndDate.Value.Date == new DateTime(jahr, 12, 31) && scap.ServiceCategory != null && scap.ServiceCategory.Name == pstat.SupportConceptApprovalPeriod.ServiceCategory.Name)
{
var statsFactory = new HphServiceRecordStatisticFactory();
var statsVorjahr = statsFactory.CreateSupportConceptStatisticsImpl(c2s.Oid.Value, new DateTime(jahr, 12, 31));
if (statsVorjahr != null && statsVorjahr.PeriodStatistics != null && statsVorjahr.PeriodStatistics.Count > 0)
{
foreach (var pstatVj in statsVorjahr.PeriodStatistics)
{
if (pstatVj.SupportConceptApprovalPeriod != null &&
pstatVj.SupportConceptApprovalPeriod.ServiceCategory != null &&
pstatVj.SupportConceptApprovalPeriod.ServiceCategory.Name ==
pstat.SupportConceptApprovalPeriod.ServiceCategory.Name)
{
//periodStats.Custom1 = Restbudget 2016 (wird eingetragen im monatlicher Abschlag) verfällt Ende 2018
//periodStats.Custom2 = Restbudget 2017 - später, verfällt am 1.7. im Nachfolgejahr
//periodStats.Custom3 = verbraucht erstes Halbjahr
//periodStats.Custom4 = verbraucht zweites Halbjahr
decimal rest2016 = pstatVj.Custom1 ?? 0;
decimal restVorjahr = pstatVj.Custom2 ?? 0;
decimal dazugekommenesBudgetLaufendesJahr = pstatVj.FixedAmountApprovedTotal ?? 0;
decimal verwendetErstesHalbjahr = pstatVj.Custom3 ?? 0;
decimal verwendetZweitesHalbjahr = pstatVj.Custom4 ?? 0;
decimal verwendeterGesamtBetragLaufendesJahr = pstatVj.AmountConsumedTotal;
if (jahr == 2017)
{
//Benutze Budget aus 2017:
restVorjahr += dazugekommenesBudgetLaufendesJahr - verwendeterGesamtBetragLaufendesJahr;
if (restVorjahr < 0)
{
rest2016 += restVorjahr;
if (rest2016 < 0)
{
restVorjahr = rest2016;
rest2016 = 0;
}
else
{
restVorjahr = 0;
}
}
}
//else if (jahr == 2019)
//{
// var insgesamtBudget = rest2016 + dazugekommenesBudgetLaufendesJahr;
// var budgetMinus1Hj = insgesamtBudget - verwendetErstesHalbjahr;
// var verfallen = rest2016 - verwendetErstesHalbjahr;
// if (verfallen < 0)
// {
// verfallen = 0;
// }
// var restBudget = budgetMinus1Hj - verfallen;
// restBudget -= verwendetZweitesHalbjahr;
// restVorjahr +=
// dazugekommenesBudgetLaufendesJahr -
// verwendeterGesamtBetragLaufendesJahr;
// //jetzt noch ermitteln wieviel vom Vorjahr mitte des Jahres verfallen ist.
// //if (restVorjahr < 0) //zuviel verbraucht
// //{
// rest2016 += restVorjahr;
// restVorjahr = rest2016;
// rest2016 = 0;
// //}
//}
else if (jahr >= 2019)
{
var insgesamtBudget = rest2016 + dazugekommenesBudgetLaufendesJahr;
var budgetMinus1Hj = insgesamtBudget - verwendetErstesHalbjahr;
var verfallen = rest2016 - verwendetErstesHalbjahr;
if (verfallen < 0)
{
verfallen = 0;
}
var restBudget = budgetMinus1Hj - verfallen;
restBudget -= verwendetZweitesHalbjahr;
restVorjahr = restBudget;
rest2016 = 0;
}
pstat.Custom1 = rest2016;
pstat.Custom2 = restVorjahr;
//if (restVorjahrAb2017 > 0)
//{
// if (restVorjahrAb2017 > verbrauchtVorjahrErstesHalbJahr)
// {
// verbrauchtVorjahrErstesHalbJahr = 0;
// }
// else
// {
// verbrauchtVorjahrErstesHalbJahr -= restVorjahrAb2017;
// }
//}
//decimal verbrauchtInsgesamt =
// verbrauchtVorjahrErstesHalbJahr + verbrauchtVorjahrZweitesHalbJahr;
////Rest von 2016 darf bis Ende 2018 verbraucht werden
//if (rest2016 > 0 && aktuellesJahr <= 2018)
//{
// if (rest2016 > verbrauchtInsgesamt)
// {
// pstat.Custom1 = rest2016 - verbrauchtInsgesamt;
// verbrauchtInsgesamt = 0;
// }
// else
// {
// verbrauchtInsgesamt -= rest2016;
// }
//}
//decimal rest = bewilligtVorjahr - verbrauchtInsgesamt;
//if (rest > 0)
//{
//pstat.Custom2 = rest;
//}
}
}
}
}
}
}
}
}
}
}