Files
BeWoPlaner/ReportImp/LebenshilfeAhrweiler/ServicesOverviewReport.cs

539 lines
17 KiB
C#
Raw Normal View History

using System;
using System.Collections;
2017-06-11 15:50:31 +02:00
using System.Collections.Generic;
using System.ComponentModel;
2017-07-25 10:52:20 +02:00
using BeWo.Data.Access;
2017-06-11 15:50:31 +02:00
using BeWo.Data.Entities;
using DevExpress.XtraReports.UI;
using BeWo.Report.ReportObjects;
using BeWo.Report;
2017-06-11 15:50:31 +02:00
using BeWo.Service.DCEntityMapper;
using BeWo.Service.Plugins;
using BS.Shared;
2017-07-25 10:52:20 +02:00
using BS.Shared.Core;
using BS.Shared.DataContracts;
2017-06-11 15:50:31 +02:00
using BS.Shared.Extensions;
2017-09-14 19:03:26 +02:00
using LebenshilfeAhrweiler.Calculations;
namespace LebenshilfeAhrweiler
{
public partial class Stundenzettel : DevExpress.XtraReports.UI.XtraReport, IBeWoReport<ServicesOverviewRO>
{
2017-07-25 10:52:20 +02:00
private Dictionary<long, ValueListEntryDC> goalDict = null;
public Stundenzettel()
{
InitializeComponent();
}
public void SetReportDataSource(ServicesOverviewRO pRO)
{
DateTime dt = DateTime.Now.Date.AddHours(pRO.TotalFLS);
2017-07-25 10:52:20 +02:00
InitGoalDict(pRO);
2017-06-11 15:50:31 +02:00
//lblGeleisteteStunden.Text = String.Format("(geleistete Std.: {0} Std. {1:00} Min.)", dt.TimeOfDay.Hours,dt.TimeOfDay.Minutes);
decimal minutenFl = 0;
decimal minutenAh = 0;
2017-10-11 14:43:49 +02:00
List<ServicesOverviewRO.ServiceDetail> servicesList = new List<ServicesOverviewRO.ServiceDetail>();
foreach (var sr in pRO.Services)
{
2017-07-25 10:52:20 +02:00
SetGoals(sr);
2017-06-11 15:50:31 +02:00
sr.Notice2 = String.Format("{0:0}", sr.Minutes);
2017-06-11 15:50:31 +02:00
if (sr.ServiceDescription == "FL-Stunde")
{
sr.Notice3 = "Fl";
minutenFl += (decimal)sr.Minutes;
2017-10-11 14:43:49 +02:00
servicesList.Add(sr);
2017-06-11 15:50:31 +02:00
}
else if (sr.ServiceDescription == "AH-Stunde")
{
sr.Notice3 = "aH";
minutenAh += (decimal)sr.Minutes;
2017-10-11 14:43:49 +02:00
servicesList.Add(sr);
2017-06-11 15:50:31 +02:00
}
if (sr.IsGroup)
{
sr.Notice3 = String.Format("{0} / {1}", sr.Notice3, sr.CustomerCount);
}
}
2017-10-11 14:43:49 +02:00
pRO.Services = servicesList;
2017-07-25 10:52:20 +02:00
cellGesamtFl.Text = String.Format("{0:0.00}", minutenFl / 60);
cellGesamtAh.Text = String.Format("{0:0.00}", minutenAh / 60);
2017-07-25 10:52:20 +02:00
//Stunden gesamtBewilligungVormonat = BerechneGesamtBewilligungVormonat(pRO);
2017-09-14 19:03:26 +02:00
//Stunden bewilligungDiesenMonat = BerechneBewilligungDiesenMonat(pRO);
//Stunden uebertragVormonat = BerechneUebertragAusVormonaten(pRO);
var c2s = GetCostBearer2SupportConcept(pRO);
Stunden bewilligungDiesenMonat = Berechnungen.BerechneBewilligungDiesenMonat(c2s, pRO.StartDate, pRO.EndDate);
Stunden uebertragVormonat = Berechnungen.BerechneUebertragAusVormonaten(c2s, pRO.StartDate);
//Stunden test1 = Berechnungen.BerechneUebertragAusVormonaten(c2s, new DateTime(2020, 1, 1));
//Stunden test = Berechnungen.BerechneUebertragAusVormonaten(c2s, new DateTime(2020, 2, 1));
2017-09-14 19:03:26 +02:00
Stunden zuLeisten = new Stunden();
2017-07-25 10:52:20 +02:00
zuLeisten.Fl = bewilligungDiesenMonat.Fl + uebertragVormonat.Fl;
zuLeisten.Ah = bewilligungDiesenMonat.Ah + uebertragVormonat.Ah;
2017-06-11 15:50:31 +02:00
2017-07-25 10:52:20 +02:00
Stunden uebertragNaechstenMonat = new Stunden();
2017-06-11 15:50:31 +02:00
2017-09-14 19:03:26 +02:00
uebertragNaechstenMonat.Fl = Berechnungen.BerechneDifferenzMitEinDrittelRegelung(zuLeisten.Fl, (minutenFl / 60), bewilligungDiesenMonat.Fl);
uebertragNaechstenMonat.Ah = Berechnungen.BerechneDifferenzMitEinDrittelRegelung(zuLeisten.Ah, (minutenAh / 60), bewilligungDiesenMonat.Ah);
2017-06-11 15:50:31 +02:00
2017-07-25 10:52:20 +02:00
//uebertragNaechstenMonat.Fl = zuLeisten.Fl -
// = (sollFl + bewilligteFl) - ((geleistetFlVormonat/60) + (minutenFl/60));
//var uebertragNaechstenMonatAh = (sollAh + bewilligteAh) - ((geleistetAhVormonat / 60) + (minutenAh / 60));
cellBewilligtFl.Text = String.Format("{0:0.00}", bewilligungDiesenMonat.Fl);
cellBewilligtAh.Text = String.Format("{0:0.00}", bewilligungDiesenMonat.Ah);
cellUebertragFl.Text = String.Format("{0:0.00}", uebertragVormonat.Fl);
cellUebertragAh.Text = String.Format("{0:0.00}", uebertragVormonat.Ah);
cellZuLeistenFl.Text = String.Format("{0:0.00}", zuLeisten.Fl);
cellZuLeistenAh.Text = String.Format("{0:0.00}", zuLeisten.Ah);
lblUebertragNachstenMonatFl.Text = String.Format("{0:0.00}", uebertragNaechstenMonat.Fl);
lblUebertragNachstenMonatAh.Text = String.Format("{0:0.00}", uebertragNaechstenMonat.Ah);
2017-06-11 15:50:31 +02:00
this.bindingSource1.DataSource = pRO;
}
2017-06-11 15:50:31 +02:00
2017-09-14 19:03:26 +02:00
private CostBearer2SupportConcept GetCostBearer2SupportConcept(ServicesOverviewRO pRo)
{
if (pRo.CostBearer2SupportConceptList != null && pRo.CostBearer2SupportConceptList.Count > 0)
{
foreach (var c2s in pRo.CostBearer2SupportConceptList)
{
if (c2s.StartDate <= pRo.EndDate && c2s.EndDate >= pRo.StartDate)
{
return c2s;
}
}
}
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
var customer = DAOFactory.GenericDAO.LoadByID<Customer>(pRo.CustomerOid);
foreach (var sc in customer.SupportConcepts)
{
if (sc.IsActive != ActivationTypeId.Deleted)
{
foreach (var c2s in sc.CostBearer2SupportConceptList)
{
if (c2s.StartDate <= pRo.EndDate && c2s.EndDate >= pRo.StartDate)
{
return c2s;
}
}
}
}
return null;
}
// private Stunden BerechneBewilligungDiesenMonat(ServicesOverviewRO pRo)
// {
// Stunden std = new Stunden();
//var c2s = GetCostBearer2SupportConcept(pRo);
// if (c2s != null)
// {
// foreach (var scap in c2s.ApprovalPeriodList)
// {
// if (scap.ServiceCategory != null)
// {
// var bewilligt = BerechneBewilligung(scap, pRo.StartDate, pRo.EndDate);
// if (scap.ServiceCategory.Name == "Direkte Leistung FL")
// {
// std.Fl += bewilligt;
// }
// else if (scap.ServiceCategory.Name == "Direkte Leistung aH")
// {
// std.Ah += bewilligt;
// }
// }
// }
// Customer c = GetGustomer(pRo);
// var at = BerechneAbwesenheitsTage(c, pRo.StartDate, pRo.EndDate);
// if (at > 0)
// {
// std.Fl -= (std.Fl / 30) * at;
// std.Ah -= (std.Ah / 30) * at;
// if (std.Fl < 0) std.Fl = 0;
// if (std.Ah < 0) std.Ah = 0;
// }
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
//}
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// return std;
// }
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// private Stunden BerechneUebertragAusVormonaten(ServicesOverviewRO pRo)
// {
// Stunden std = new Stunden();
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// var c2s = GetCostBearer2SupportConcept(pRo);
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// if (c2s != null)
// {
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// foreach (var scap in c2s.ApprovalPeriodList)
// {
// if (scap.ServiceCategory != null && scap.StartDate.HasValue)
// {
// var stdVormonat = BerechneUebertragAusVormonaten(pRo, c2s, scap);
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// std.Fl += stdVormonat.Fl;
// std.Ah += stdVormonat.Ah;
// }
// }
//}
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// return std;
// }
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
//private Stunden BerechneUebertragAusVormonaten(ServicesOverviewRO pRo, CostBearer2SupportConcept c2s, SupportConceptApprovalPeriod scap)
//{
// Stunden bewilligteStundenKumuliert = new Stunden();
// Stunden diffVormonat = new Stunden();
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// if (scap.StartDate < pRo.StartDate)
// {
// IList<ServiceRecord> allServiceRecords = c2s.ServiceRecords;
// Customer c = GetGustomer(pRo);
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// DateTime start = scap.StartDate.Value;
// DateTime end = pRo.StartDate.AddDays(-1);
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// if (scap.EndDate.HasValue && scap.EndDate < end)
// {
// end = scap.EndDate.Value;
// }
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// while (start <= end)
// {
// DateTime monatsEnde = new DateTime(start.Year, start.Month, DateTime.DaysInMonth(start.Year, start.Month));
// if (end < monatsEnde)
// {
// monatsEnde = end;
// }
// var bewilligteStunden = BerechneBewilligung(scap, start, monatsEnde);
// var at = BerechneAbwesenheitsTage(c, start, monatsEnde);
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// if (at > 0)
// {
// bewilligteStunden -= (bewilligteStunden / 30) * at;
// }
// var ist = BerechneIst(allServiceRecords, start, monatsEnde);
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// if (scap.ServiceCategory.Name == "Direkte Leistung FL")
// {
// bewilligteStundenKumuliert.Fl += bewilligteStunden;
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// diffVormonat.Fl = (bewilligteStunden + diffVormonat.Fl) - ist.Fl;
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// diffVormonat.Fl = BerechneDifferenz(diffVormonat.Fl, 0, bewilligteStunden);
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// }
// else if (scap.ServiceCategory.Name == "Direkte Leistung aH")
// {
// bewilligteStundenKumuliert.Ah += bewilligteStunden;
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// diffVormonat.Ah = (bewilligteStunden + diffVormonat.Ah) - ist.Ah;
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// diffVormonat.Ah = BerechneDifferenz(diffVormonat.Ah, 0, bewilligteStunden);
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// }
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// start = start.AddMonths(1);
// start = new DateTime(start.Year, start.Month, 1);
// }
// }
// return diffVormonat;
//}
// private decimal BerechneDifferenz(decimal soll, decimal ist, decimal bewilligtMax)
// {
// var diff = soll - ist;
// if (Math.Abs(diff) > bewilligtMax / 3)
// {
// if (diff >= 0)
// {
// diff = bewilligtMax / 3;
// }
// else
// {
// diff = -1 * (bewilligtMax / 3);
// }
// }
// return diff;
// }
// private Stunden BerechneIst(IList<ServiceRecord> allServiceRecords, DateTime start, DateTime end)
// {
// Stunden std = new Stunden();
// Dictionary<long, bool> groupBookingDict = new Dictionary<long, bool>();
// foreach (var item in allServiceRecords)
// {
// if (!item.GroupOid.HasValue || !groupBookingDict.ContainsKey(item.GroupOid.Value))
// {
// if (item.Start != null && item.Start >= start && item.Start.Value < end.Date.AddDays(1))
// {
// if (item.ServiceDescription.Name == "FL-Stunde")
// {
// std.Fl += item.RoundedDuration;
// }
// else if (item.ServiceDescription.Name == "AH-Stunde")
// {
// std.Ah += item.RoundedDuration;
// }
// if (item.GroupOid.HasValue)
// groupBookingDict.Add(item.GroupOid.Value, true);
// }
// }
// }
// std.Fl /= 60;
// std.Ah /= 60;
// return std;
// }
private Customer GetGustomer(ServicesOverviewRO pRO)
2017-07-25 10:52:20 +02:00
{
2017-09-14 19:03:26 +02:00
var c2s = GetCostBearer2SupportConcept(pRO);
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
if (c2s != null)
{
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
return c2s.SupportConcept.Customer;
2017-07-25 10:52:20 +02:00
}
return null;
}
2017-09-14 19:03:26 +02:00
//private decimal BerechneAbwesenheitsTage(Customer customer, DateTime start, DateTime end)
//{
// decimal abwesenheit = 0;
// foreach (var absenceTime in customer.AbsenceTimes)
// {
// if (absenceTime.Start.HasValue && absenceTime.Start <= end)
// {
// //if (absenceTime.Start < start)
// //{
// // DateTimeSpan spanvormonat = new DateTimeSpan();
// // spanvormonat.StartDate = absenceTime.Start.Value;
// // if (c2s.StartDate.HasValue && c2s.StartDate.Value > spanvormonat.StartDate)
// // {
// // spanvormonat.StartDate = c2s.StartDate.Value;
// // }
// // spanvormonat.EndDate = pRO.StartDate.AddDays(-1);
// // if (absenceTime.End.HasValue && absenceTime.End < spanvormonat.EndDate)
// // {
// // spanvormonat.EndDate = absenceTime.End.Value;
// // }
// // var daysVormonat = spanvormonat.EndDate.Subtract(spanvormonat.StartDate).Days + 1;
// // abwesenheitVormonate += daysVormonat;
// //}
// if (absenceTime.Start < end && (!absenceTime.End.HasValue || absenceTime.End >= start))
// {
// DateTimeSpan span = new DateTimeSpan();
// span.StartDate = start;
// if (absenceTime.Start > span.StartDate)
// {
// span.StartDate = absenceTime.Start.Value;
// }
// span.EndDate = end;
// if (absenceTime.End.HasValue && absenceTime.End < span.EndDate)
// {
// span.EndDate = absenceTime.End.Value;
// }
// var days = span.EndDate.Subtract(span.StartDate).Days + 1;
// abwesenheit += days;
// }
// }
// }
// return abwesenheit;
//}
2017-07-25 10:52:20 +02:00
2017-09-14 19:03:26 +02:00
// private decimal BerechneBewilligung(SupportConceptApprovalPeriod scap, DateTime start, DateTime end)
// {
// decimal bewilligt = 0;
// if (scap.ApprovedBEPerInterval.HasValue && scap.ApprovedBEInterval.HasValue)
// {
// if (scap.StartDate <= end && (!scap.EndDate.HasValue || scap.EndDate >= start))
// {
// DateTimeSpan span = new DateTimeSpan();
// span.StartDate = start;
// if (scap.StartDate > span.StartDate)
// {
// span.StartDate = scap.StartDate.Value;
// }
// span.EndDate = end;
// if (scap.EndDate < span.EndDate)
// {
// span.EndDate = scap.EndDate.Value;
// }
// decimal bpi = scap.ApprovedBEPerInterval.Value;
// switch (scap.ApprovedBEInterval.Value)
// {
// case SupportConceptApprovalInterval.Daily:
// bewilligt = bpi * 30;
// break;
// case SupportConceptApprovalInterval.Weekly:
// bewilligt = bpi * 4.34m;
// break;
// case SupportConceptApprovalInterval.Fortnightly:
// bewilligt = bpi * (4.34m / 2);
// break;
// case SupportConceptApprovalInterval.Monthly:
// bewilligt = bpi;
// break;
// case SupportConceptApprovalInterval.Quarterly:
// bewilligt = bpi / 3m;
// break;
// case SupportConceptApprovalInterval.HalfYearly:
// bewilligt = bpi / 6m;
// break;
// case SupportConceptApprovalInterval.Yearly:
// bewilligt = bpi / 12m;
// break;
// }
//int days = (int)span.EndDate.Subtract(span.StartDate).TotalDays + 1;
// if (days != DateTime.DaysInMonth(span.StartDate.Year, span.StartDate.Month))
// {
// bewilligt = (bewilligt / 30) * days;
// }
// }
// }
// return bewilligt;
// }
2017-07-25 10:52:20 +02:00
private void InitGoalDict(ServicesOverviewRO pRo)
{
goalDict = new Dictionary<long, ValueListEntryDC>();
var vle = DAOFactory.GenericDAO.GetAllActive<ValueListEntry>();
var vleDc = MapperFactory.ValueListEntryDC_ValueListEntry.MapToNewDCs(vle);
foreach (var valueListEntryDc in vleDc)
{
goalDict.Add(valueListEntryDc.ValueListEntryOid.Value, valueListEntryDc);
}
}
private void SetGoals(ServicesOverviewRO.ServiceDetail sd)
{
var serviceRecord = DAOFactory.GenericDAO.LoadByID<ServiceRecord>(sd.ServiceRecordOid);
var srDc = MapperFactory.ServiceRecordDC_ServiceRecord.MapToNewDC(serviceRecord);
Dictionary<String, bool> resultDict = new Dictionary<string, bool>();
sd.GoalList = String.Empty;
if (srDc.Goals != null && srDc.Goals.Count > 0)
{
foreach (var goal in srDc.Goals)
{
AddMainGoalToDict(goal, resultDict);
}
foreach (var goalDictKey in resultDict.Keys)
{
if (sd.GoalList.Length > 0)
sd.GoalList += ", ";
sd.GoalList += goalDictKey;
}
}
}
private void AddMainGoalToDict(ValueListEntryDC goal, Dictionary<string, bool> resultDict)
{
if (goal.ParentOid.HasValue)
{
if (goalDict.ContainsKey(goal.ParentOid.Value))
{
AddMainGoalToDict(goalDict[goal.ParentOid.Value], resultDict);
}
}
else
{
if (!resultDict.ContainsKey(goal.TypeDescription))
{
resultDict.Add(goal.TypeDescription, true);
}
}
}
}
2017-07-25 10:52:20 +02:00
public class Stunden
{
public decimal Fl { get; set; }
public decimal Ah { get; set; }
public decimal FlOhneDrittelRegelung { get; set; }
public decimal AhOhneDrittelRegelung { get; set; }
public override string ToString()
{
return String.Format("FL: {0:0.00}, AH: {1:0.00}", Fl, Ah);
}
2017-07-25 10:52:20 +02:00
}
}