Files
BeWoPlaner/ReportImp/MuenchenerAidsHilfeEV/UeberUnterbelegungReport.cs

134 lines
7.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using BeWo.Report;
using BeWo.Report.ReportObjects;
using BeWo.Service.DCEntityMapper;
using BS.Shared.Core;
using BS.Shared.Extensions;
namespace MuenchenerAidsHilfeEV
{
[IDSpecificClass(Identifier = "Mitarbeiterauslastung")]
public partial class UeberUnterbelegungReport : DevExpress.XtraReports.UI.XtraReport/*, IBeWoReport<MitarbeiterauslastungRO>*/
{
public UeberUnterbelegungReport()
{
InitializeComponent();
}
public void SetReportDataSource(MitarbeiterauslastungRO pRO)
{
AuslastungBerechnung b = new AuslastungBerechnung();
b.CreateReport(pRO);
decimal summeMitarbeitende = 0m;
decimal summeKlientInnen = 0m;
Dictionary<decimal, decimal> betreuungsschluesselZuAnzahl = new Dictionary<decimal, decimal>();
foreach (var empDetail in pRO.EmployeeDetailList)
{
decimal betreuungsumfangInProzentGesamt = 0;
// Nur aktive Hilfepläne sollen bedacht werden
empDetail.SupportConceptDetailList = empDetail.SupportConceptDetailList.Where(s => s.CostBearer2SupportConcept.SupportConcept.IsActive == BS.Shared.ActivationTypeId.Active).ToList();
// Stelle in % steht in "beschäftigt als" im Vertrag.
var contract = empDetail.Employee.GetValidContractForDate(pRO.ReportStartDate);
if (contract != null && contract.EmploymentType != null && !contract.EmploymentType.Name.IsNullOrEmpty() && contract.EmploymentType.Name.Contains("%"))
{
empDetail.Employee.Text1 = contract.EmploymentType.Name.Split('%')[0]; // Stelle in %
summeMitarbeitende += Convert.ToDecimal(contract.EmploymentType.Name.Split('%')[0]);
}
// Gesamtsumme der einzelnen Klientenbetreuungsumfänge zusammenzählen
// Die einzelnen Umfänge stehen in der Leistungskategorie in den Bewilligungen
foreach (var scDetail in empDetail.SupportConceptDetailList)
{
foreach (var ap in scDetail.CostBearer2SupportConcept.ApprovalPeriodList)
{
if (ap.StartDate.HasValue && ap.EndDate.HasValue)
{
if (pRO.ReportEndDate >= ap.StartDate && pRO.ReportStartDate <= ap.EndDate)
{
// Benötigten Umfang pro Klient berechnen, also 100 / Nenner im Schlüssel (also bei 1:6 Schlüssel 100 / 6 = 16,67%)
// Wenn es einen korrekt angelegten Betreuungsschlüssel gibt, gibt es einen :, welcher nicht das letzte Zeichen ist
if (ap.ServiceCategory != null && ap.ServiceCategory.Name.Contains(":") && ap.ServiceCategory.Name[ap.ServiceCategory.Name.Length - 1] != ':')
{
var schluessel = ap.ServiceCategory.Name;
// Nenner des Schlüssels raussuchen, da der mit 100/Nenner den Betreuungsumfang ergibt
var nenner = Convert.ToDecimal(ap.ServiceCategory.Name.Split(':')[1]);
// Die 1:2.92-Schlüssel werden warum auch immer mit 1:4 berechnet, daher hier manuell umsetzen
if (nenner == 2.92m)
nenner = 4;
// Wenn es eine anteilige Betreuung in der Bewilligung gibt muss sich diese auch auf den Betreuungsumfang auswirken
decimal betreuungsanteil = 1.0m;
if (ap.SupportConceptApprovalPeriod2Employee != null && ap.SupportConceptApprovalPeriod2Employee.Count > 0)
{
foreach (var item in ap.SupportConceptApprovalPeriod2Employee)
{
if (item.Employee.Oid == empDetail.Employee.Oid)
{
// Betreuungsanteil setzen, wenn er nicht absolut, also in Minuten, ist
if (item.IsAbsolut == false && item.Betreuungsschluessel != 0)
betreuungsanteil = item.Betreuungsschluessel / 100;
//nenner /= betreuungsanteil;
}
}
}
if (betreuungsanteil != 1)
{ }
// Letztendlichen Umfang mit dem Nenner und dem eventuellen Anteil an der Betreuung
betreuungsumfangInProzentGesamt += 100m / (nenner / betreuungsanteil);
summeKlientInnen += 100m / (nenner / betreuungsanteil);
// für zweite Tabelle, die zeigt, welche Schlüssel es gibt und wie viele Klient*innen die jeweils haben, in Dict speichern
if (!betreuungsschluesselZuAnzahl.ContainsKey(nenner))
betreuungsschluesselZuAnzahl.Add(nenner, 0);
betreuungsschluesselZuAnzahl[nenner] += betreuungsanteil;
}
}
}
}
}
empDetail.Employee.Text2 = string.Format("{0:0.00}", betreuungsumfangInProzentGesamt);
}
tcSummeMitarbeitende.Text = string.Format("{0:0.00}", summeMitarbeitende / 100);
tcSummeKlientInnen.Text = string.Format("{0:0.00}", summeKlientInnen / 100);
// Tabelle 2
decimal summeStellen = 0m;
foreach (var pair in betreuungsschluesselZuAnzahl)
{
var key = pair.Key;
var value = pair.Value;
var row = new DevExpress.XtraReports.UI.XRTableRow();
row.Cells.Add(new DevExpress.XtraReports.UI.XRTableCell() { Text = string.Format("{0:0.##}", key), Font = new Font("Arial", 10, FontStyle.Bold) });
row.Cells.Add(new DevExpress.XtraReports.UI.XRTableCell() { Text = "" });
row.Cells.Add(new DevExpress.XtraReports.UI.XRTableCell() { Text = string.Format("{0:0.####}", value) });
row.Cells.Add(new DevExpress.XtraReports.UI.XRTableCell() { Text = string.Format("{0:0.0000}", value / key), TextAlignment = DevExpress.XtraPrinting.TextAlignment.MiddleRight });
summeStellen += value / key;
tableCustomerSummary.Rows.Add(row);
}
tcSummeInBetreuung.Text = string.Format("{0:0.####}", betreuungsschluesselZuAnzahl.Sum(s => s.Value));
tcSummeStellen.Text = string.Format("{0}", string.Format("{0:0.0000}", summeStellen));
this.bindingSource1.DataSource = pRO;
}
}
}