753 lines
33 KiB
C#
753 lines
33 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;
|
|
|
|
namespace LebenshilfeBadKreuznachFUD.Statistics
|
|
{
|
|
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)
|
|
{
|
|
dc.Header[0] = "Bewilligungszeitraum:";
|
|
dc.Header[1] = "Geleistet diesen Monat:";
|
|
dc.Header[2] = "Bewilligt diesen Monat:";
|
|
dc.Header[3] = "Frei diesen Monat:";
|
|
|
|
//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));
|
|
}
|
|
|
|
|
|
|
|
if (containsEntlastungsbetrag && stats.PeriodStatistics.Count > 1)
|
|
{
|
|
//Fasse Einzelstatistiken zusammen
|
|
var first = stats.PeriodStatistics[0];
|
|
|
|
for (int i = 1; i < stats.PeriodStatistics.Count; i++)
|
|
{
|
|
var ps = stats.PeriodStatistics[i];
|
|
first.FixedAmountApprovedPerInterval = (first.FixedAmountApprovedPerInterval ?? 0) + (ps.FixedAmountApprovedPerInterval ?? 0);
|
|
first.AmountConsumedThisInterval = first.AmountConsumedThisInterval + ps.AmountConsumedThisInterval;
|
|
|
|
}
|
|
stats.PeriodStatistics = new List<SupportConceptPeriodStatisticsDC>();
|
|
stats.PeriodStatistics.Add(first);
|
|
}
|
|
|
|
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)
|
|
{
|
|
if (!periodStats.SupportConceptApprovalPeriod.EndDate.HasValue)
|
|
{
|
|
dc.LeftValues[0] = String.Format("{0}: ab {1:dd.MM.yy}",
|
|
periodStats.SupportConceptApprovalPeriod.ServiceCategory.Name,
|
|
periodStats.SupportConceptApprovalPeriod.StartDate);
|
|
}
|
|
else
|
|
{
|
|
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 (containsEntlastungsbetrag)
|
|
{
|
|
|
|
dc.LeftValues[1] = "";
|
|
dc.RightValues[1] = String.Format("{0:c}", periodStats.AmountConsumedThisInterval);
|
|
dc.LeftValues[2] = "";
|
|
dc.RightValues[2] = String.Format("{0:c}", periodStats.FixedAmountApprovedPerInterval);
|
|
|
|
decimal restBetrag = (periodStats.FixedAmountApprovedPerInterval ?? 0) - periodStats.AmountConsumedThisInterval;
|
|
|
|
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("Entlastung"))
|
|
{
|
|
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;
|
|
preis = GetPreisVonServiceDescription(sr.ServiceDescription, sr.Start.Value) ?? 0;
|
|
preis *= (sr.RoundedDuration/60);
|
|
var fahrtkosten = GetPreis("Hausbesuchspauschale", sr.Start.Value); //Einmal Fahrtkosten pro Tag an dem ein Termin stattgefunden hat
|
|
var firstOfMonthDt = new DateTime(statisticsDate.Year, statisticsDate.Month, 1);
|
|
|
|
if (sr.Start >= firstOfMonthDt && sr.Start < firstOfMonthDt.AddMonths(1))
|
|
{
|
|
periodStats.AmountConsumedThisInterval += preis;
|
|
if (!periodStats.ServiceRecords.Any(r => r.ServiceRecordOid != sr.Oid && r.ServiceDescription.CategoryName.ToLower().StartsWith("entlastung") && r.Start.HasValue && r.Start.Value.Date == sr.Start.Value.Date))
|
|
periodStats.AmountConsumedThisInterval += fahrtkosten;
|
|
}
|
|
if (sr.GroupEmployeeCount.HasValue)
|
|
{
|
|
preis /= sr.GroupEmployeeCount.Value;
|
|
}
|
|
|
|
periodStats.AmountConsumedTotal += preis;
|
|
periodStats.AmountConsumedTotal += fahrtkosten;
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
public decimal GetPreis(String preisBezeichnung, DateTime datum)
|
|
{
|
|
|
|
var preise = DAOFactory.GenericDAO.GetAllActive<Preis>();
|
|
|
|
var preis = preise.Where(p => p.Name.Contains(preisBezeichnung)).FirstOrDefault();
|
|
if (preis != null)
|
|
{
|
|
var crlist = MapperFactory.CostRatePeriodDC_CostRatePeriod.MapToNewDCs(preis.CostRatePeriods);
|
|
|
|
var cr = crlist.GetCostRatePeriodForDate(CostRatePeriodType.AmountOfMoney, datum);
|
|
if (cr != null && cr.CostRateValue.HasValue)
|
|
{
|
|
return cr.CostRateValue.Value;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
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;
|
|
//}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|