389 lines
17 KiB
C#
389 lines
17 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 Pflegegrad? pflegegrad = null;
|
|
private Dictionary<long, decimal> oid2MonatAbschlag = new Dictionary<long, decimal>();
|
|
private Dictionary<string, Dictionary<String, bool>> key2TagesDict = new Dictionary<string, Dictionary<String, bool>>();
|
|
|
|
|
|
public override ServiceRecordStatisticsInfoDC GetServiceRecordStatisticInfo(long costBearer2SupportConceptOid, DateTime statisticsDate)
|
|
{
|
|
var stats = CreateSupportConceptStatisticsImpl(costBearer2SupportConceptOid, statisticsDate);
|
|
|
|
var dc = new ServiceRecordStatisticsInfoDC();
|
|
dc.Header = new string[4];
|
|
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:";
|
|
|
|
dc.ForegroundColor = new string[4];
|
|
dc.ForegroundColor[0] = "#FF2B508B";
|
|
dc.ForegroundColor[1] = "#FF2B508B";
|
|
dc.ForegroundColor[2] = "#FF2B508B";
|
|
dc.ForegroundColor[3] = "#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;
|
|
}
|
|
|
|
protected override SupportConceptCostBearerRelDC CreateCb2ScDC(CostBearer2SupportConcept cb2sc)
|
|
{
|
|
pflegegrad = cb2sc.SupportConcept.Customer.Pflegegrad;
|
|
return base.CreateCb2ScDC(cb2sc);
|
|
}
|
|
|
|
//public ServiceRecordPeriodStatisticsInfoDC CreateTotalStatistics(SupportConceptStatisticsDC stats, DateTime statisticsDate)
|
|
//{
|
|
// var dc = CreateDefaultServiceRecordPeriodStatisticsInfo(4);
|
|
// dc.LeftValues[0] = "Gesamt";
|
|
|
|
// dc.LeftValues[1] = String.Format("{0:0.00}", stats.MinutesProvidedThisMonth / 60);
|
|
// dc.RightValues[1] = String.Format("{0:0.00}", stats.MinutesProvidedTotalRounded / 60);
|
|
|
|
// dc.LeftValues[2] = String.Format("{0:0.00}", stats.MinutesApprovedPerMonth / 60);
|
|
// dc.RightValues[2] = String.Format("{0:0.00}", stats.MinutesApprovedTotal / 60);
|
|
|
|
// dc.LeftValues[3] = String.Format("{0:0.00}", (stats.MinutesApprovedPerMonth - stats.MinutesProvidedThisMonth) / 60);
|
|
// dc.RightValues[3] = String.Format("{0:0.00}", (stats.MinutesApprovedTotal - stats.MinutesProvidedTotalRounded) / 60);
|
|
|
|
// return dc;
|
|
//}
|
|
|
|
public ServiceRecordPeriodStatisticsInfoDC CreateServiceRecordPeriodStatisticsInfo(SupportConceptStatisticsDC stats, SupportConceptPeriodStatisticsDC periodStats, DateTime statisticsDate)
|
|
{
|
|
var dc = CreateDefaultServiceRecordPeriodStatisticsInfo(4);
|
|
|
|
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);
|
|
|
|
if (
|
|
oid2MonatAbschlag.ContainsKey(
|
|
periodStats.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value))
|
|
{
|
|
dc.RightValues[2] = String.Format("{0:c} (+ {1:c})", periodStats.FixedAmountApprovedTotal,
|
|
oid2MonatAbschlag[periodStats.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value
|
|
]);
|
|
}
|
|
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}", periodStats.FixedAmountApprovedTotal - periodStats.AmountConsumedTotal);
|
|
}
|
|
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);
|
|
}
|
|
|
|
|
|
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;
|
|
}
|
|
|
|
protected override void CalculateFixedAmountBudget(ServiceRecord sr, SupportConceptPeriodStatisticsDC periodStats, DateTime statisticsDate)
|
|
{
|
|
if (periodStats != null && periodStats.SupportConceptApprovalPeriod.ApprovedFixedAmount.HasValue)
|
|
{
|
|
if (!periodStats.FixedAmountApprovedTotal.HasValue)
|
|
{
|
|
BerechneBewilligungsBetrag(periodStats);
|
|
}
|
|
decimal preis = 0;
|
|
|
|
String sdName = sr.ServiceDescription.Name.ToLower();
|
|
|
|
if (sdName == "einzelbetreuung")
|
|
{
|
|
preis = AbrechnungsInfo.GetPreisForEinzelbetreuungEhrenamtlich(sr.Start.Value);
|
|
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"))
|
|
{
|
|
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;
|
|
|
|
if (periodStats.SupportConceptApprovalPeriod.MonthlyPayment.HasValue && periodStats.SupportConceptApprovalPeriod.MonthlyPayment.Value > 0)
|
|
{
|
|
var oidKey = periodStats.SupportConceptApprovalPeriod.SupportConceptApprovalPeriodOid.Value;
|
|
|
|
if (!oid2MonatAbschlag.ContainsKey(oidKey))
|
|
{
|
|
decimal payment = periodStats.SupportConceptApprovalPeriod.MonthlyPayment.Value;
|
|
oid2MonatAbschlag[oidKey] = payment;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
private void BerechneBewilligungsBetrag(SupportConceptPeriodStatisticsDC periodStats)
|
|
{
|
|
decimal monate = 0;
|
|
decimal tage = 0;
|
|
if (periodStats.SupportConceptApprovalPeriod != null && periodStats.SupportConceptApprovalPeriod.StartDate.HasValue && periodStats.SupportConceptApprovalPeriod.EndDate.HasValue)
|
|
{
|
|
DateTime start = periodStats.SupportConceptApprovalPeriod.StartDate.Value;
|
|
|
|
while (start < periodStats.SupportConceptApprovalPeriod.EndDate.Value)
|
|
{
|
|
monate++;
|
|
start = start.AddMonths(1);
|
|
}
|
|
tage = (decimal) periodStats.SupportConceptApprovalPeriod.EndDate.Value.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;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|