Files
BeWoPlaner/ReportImp/HphBersenbrueckFreizeitUndReisen/Calculations/HphServiceRecordStatisticFactory.cs
Christian bce313c146 Reports
2017-06-28 09:00:09 +02:00

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;
}
}
}
}
}