Files
BeWoPlaner/ReportImp/DiakonieMuelheim/CustomReportCreator.cs
2023-05-17 16:44:57 +02:00

674 lines
22 KiB
C#

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using BeWo.Data;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report;
using BeWo.Report.ReportObjects;
using BeWo.Service.DCEntityMapper;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.DataContracts.Compact;
using DevExpress.XtraReports.UI;
namespace DiakonieMuelheim
{
public class CustomReportCreator : DefaultReportCreator
{
public override XtraReport CreateQueryReport(long queryOid, string queryReportId)
{
if (queryOid == 300)
{
return CreateJahresstatistik(queryOid, queryReportId);
}
return base.CreateQueryReport(queryOid, queryReportId);
}
private XtraReport CreateJahresstatistik(long queryOid, string queryReportId)
{
var query = DAOFactory.GenericDAO.LoadByID<Query>(queryOid);
if (query == null)
return new XtraReport();
var path = Path.Combine(TempPath, queryReportId + ".xml");
var table = Utils.XMLDeserialize<DataTable>(path);
var qro = QueryRO.Create(query, table);
var customerOids = new List<long>();
DateTime start = DateTime.Now;
DateTime ende = DateTime.Now;
long teamOid = 0;
if (qro.Rows.Count > 0)
{
start = DateTime.Parse(qro.Rows[0].Field2.ToString());
if (start == DateTime.MinValue)
{
start = new DateTime(DateTime.Now.Year - 1, 1, 1);
}
ende = DateTime.Parse(qro.Rows[0].Field3.ToString());
if (ende.Year == 9999)
{
ende = new DateTime(DateTime.Now.Year - 1, 12, 31);
}
teamOid = Int64.Parse(qro.Rows[0].Field4.ToString());
foreach (var row in qro.Rows)
{
long cOid = Int64.Parse(row.Field1.ToString());
customerOids.Add(cOid);
}
}
JahresReportRO ro = CreateJahresReportRo(customerOids, start, ende, teamOid);
var druck = new Jahresstatistik();
druck.SetReportDataSource(ro);
return druck;
}
private JahresReportRO CreateJahresReportRo(List<long> customerOids, DateTime start, DateTime ende, long teamOid)
{
List<JahrestatisticCustomerInfo> alleKlienten = new List<JahrestatisticCustomerInfo>();
if (teamOid > 0)
{
var team = MapperFactory.CompactTeamDC_Team.MapToNewDC(DAOFactory.GenericDAO.LoadByID<Team>(teamOid));
var customers = DAOFactory.GenericDAO.LoadByIDs<Customer>(customerOids);
foreach (var customer in customers)
{
var info = GetJahrestatisticCustomerInfo(customer, start, ende);
if (info != null)
{
info.Team = team;
alleKlienten.Add(info);
}
}
}
List<AnnualReportDC> reports = new List<AnnualReportDC>();
reports.Add(BerechneGesamt(alleKlienten));
reports.Add(BerechneOrt(alleKlienten));
reports.Add(BerechneGeschlecht(alleKlienten));
reports.Add(BerechneAlterstruktur(alleKlienten, ende));
reports.Add(BerechneBeendigungsgrund(alleKlienten, start, ende));
reports.Add(BerechneVarfieldReport(alleKlienten, 1));
reports.Add(BerechneVarfieldReport(alleKlienten, 3));
reports.Add(BerechneVarfieldReport(alleKlienten, 30));
reports.Add(BerechneVarfieldReport(alleKlienten, 40));
reports.Add(BerechneVarfieldReport(alleKlienten, 50));
//reports.Add(BerechneVarfieldReport(alleKlienten, 60));
//reports.Add(BerechneVarfieldReport(alleKlienten, 70));
reports.Add(BerechneVarfieldReport(alleKlienten, 100));
reports.Add(BerechneVarfieldReport(alleKlienten, 110));
reports.Add(BerechneVarfieldReport(alleKlienten, 120));
reports.Add(BerechneVarfieldReport(alleKlienten, 140));
reports.Add(BerechneVarfieldReport(alleKlienten, 160));
return JahresReportRO.Create(reports);
}
private AnnualReportDC BerechneGesamt(List<JahrestatisticCustomerInfo> alleKlienten)
{
var report = new AnnualReportDC();
report.Name = "Personen insgesamt";
report.Data = new List<AnnualReportDataDC>();
var dataEk = new AnnualReportDataDC();
dataEk.Name = "davon Erstklienten EK";
dataEk.Value = 0;
var dataWk = new AnnualReportDataDC();
dataWk.Name = "Wiederholungs- und Altklienten WK";
dataWk.Value = 0;
report.Data.Add(dataEk);
report.Data.Add(dataWk);
foreach (var info in alleKlienten)
{
if (info.IstWiederholungsKlient)
{
dataWk.Value++;
dataWk.Value2 = ((int?)dataWk.Value2 ?? 0) + 1;
}
else
{
dataEk.Value++;
dataEk.Value1 = ((int?)dataEk.Value1 ?? 0) + 1;
}
}
return report;
}
private AnnualReportDC BerechneOrt(List<JahrestatisticCustomerInfo> alleKlienten)
{
var report = new AnnualReportDC();
report.Data = new List<AnnualReportDataDC>();
report.Name = "Ortsansässigkeit der Klienten";
Dictionary<String, AnnualReportDataDC> dataPerCity = new Dictionary<String, AnnualReportDataDC>();
foreach (var info in alleKlienten)
{
String city = "ohne Angaben";
if (!String.IsNullOrEmpty(info.Customer.Town))
{
city = info.Customer.Town.Trim();
}
AnnualReportDataDC data = null;
if (dataPerCity.ContainsKey(city))
{
data = dataPerCity[city];
}
else
{
data = new AnnualReportDataDC();
dataPerCity.Add(city, data);
}
data.Name = city;
data.Value = (data.Value ?? 0) + 1;
if (info.IstWiederholungsKlient)
{
data.Value2 = ((int?)data.Value2 ?? 0) + 1;
}
else
{
data.Value1 = ((int?)data.Value1 ?? 0) + 1;
}
}
report.Data.AddRange(dataPerCity.Values.OrderBy(d => d.Name).Where(d => d.Name != "ohne Angaben"));
report.Data.AddRange(dataPerCity.Values.Where(d => d.Name == "ohne Angaben"));
return report;
}
private AnnualReportDC BerechneGeschlecht(List<JahrestatisticCustomerInfo> alleKlienten)
{
var report = new AnnualReportDC();
report.Data = new List<AnnualReportDataDC>();
report.Name = "Geschlecht";
var dataM = new AnnualReportDataDC();
dataM.Name = "Anteil männlicher Klienten";
dataM.Value = 0;
var dataF = new AnnualReportDataDC();
dataF.Name = "Anteil weiblicher Klienten";
dataF.Value = 0;
var dataKA = new AnnualReportDataDC();
dataKA.Name = "ohne Angaben";
dataKA.Value = 0;
report.Data.Add(dataM);
report.Data.Add(dataF);
report.Data.Add(dataKA);
foreach (var info in alleKlienten)
{
if (info.Geschlecht.HasValue)
{
if (info.Geschlecht.Value == Sex.Male)
{
dataM.Value++;
if (info.IstWiederholungsKlient)
{
dataM.Value2 = ((int?)dataM.Value2 ?? 0) + 1;
}
else
{
dataM.Value1 = ((int?)dataM.Value1 ?? 0) + 1;
}
//dataM.Erstklient = info.IstWiederholungsKlient;
}
else if (info.Geschlecht.Value == Sex.Female)
{
if (info.IstWiederholungsKlient)
{
dataF.Value2 = ((int?)dataF.Value2 ?? 0) + 1;
}
else
{
dataF.Value1 = ((int?)dataF.Value1 ?? 0) + 1;
}
dataF.Value++;
}
}
else
{
dataKA.Value++;
if (info.IstWiederholungsKlient)
{
dataKA.Value2 = ((int?)dataKA.Value2 ?? 0) + 1;
}
else
{
dataKA.Value1 = ((int?)dataKA.Value1 ?? 0) + 1;
}
}
}
return report;
}
private AnnualReportDC BerechneAlterstruktur(List<JahrestatisticCustomerInfo> alleKlienten, DateTime datum)
{
var report = new AnnualReportDC();
report.Data = new List<AnnualReportDataDC>();
report.Name = "Altersstruktur";
var dataU18 = new AnnualReportDataDC();
dataU18.Name = "unter 18 Jahre";
var data18_21 = new AnnualReportDataDC();
data18_21.Name = "18 - 21 Jahre";
var data22_26 = new AnnualReportDataDC();
data22_26.Name = "22 - 26 Jahre";
var data27_33 = new AnnualReportDataDC();
data27_33.Name = "27 - 33 Jahre";
var data34_40 = new AnnualReportDataDC();
data34_40.Name = "34 - 40 Jahre";
var data41_50 = new AnnualReportDataDC();
data41_50.Name = "41 - 50 Jahre";
var data51_60 = new AnnualReportDataDC();
data51_60.Name = "51 - 60 Jahre";
var dataU60 = new AnnualReportDataDC();
dataU60.Name = "Über 60 Jahre";
var dataKA = new AnnualReportDataDC();
dataKA.Name = "keine Angaben";
foreach (var info in alleKlienten)
{
AnnualReportDataDC data = dataKA;
if (info.Customer.DateOfBirth.HasValue)
{
int alter = datum.Year - info.Customer.DateOfBirth.Value.Year;
var dt = info.Customer.DateOfBirth.Value.AddYears(alter);
if (datum.CompareTo(dt) < 0)
{
alter--;
}
if (alter < 18)
{
data = dataU18;
}
else if (alter >= 18 && alter <= 21)
{
data = data18_21;
}
else if (alter >= 22 && alter <= 26)
{
data = data22_26;
}
else if (alter >= 27 && alter <= 33)
{
data = data27_33;
}
else if (alter >= 34 && alter <= 40)
{
data = data34_40;
}
else if (alter >= 41 && alter <= 50)
{
data = data41_50;
}
else if (alter >= 51 && alter <= 60)
{
data = data51_60;
}
else if (alter > 60)
{
data = dataU60;
}
}
data.Value = (data.Value ?? 0) + 1;
if (info.IstWiederholungsKlient)
{
data.Value2 = ((int?)data.Value2 ?? 0) + 1;
}
else
{
data.Value1 = ((int?)data.Value1 ?? 0) + 1;
}
}
report.Data.Add(dataU18);
report.Data.Add(data18_21);
report.Data.Add(data22_26);
report.Data.Add(data27_33);
report.Data.Add(data34_40);
report.Data.Add(data41_50);
report.Data.Add(data51_60);
report.Data.Add(dataU60);
report.Data.Add(dataKA);
return report;
}
//private AnnualReportDC BerechneLebensunterhalt(List<JahrestatisticCustomerInfo> alleKlienten, long varFieldDefOid)
//{
// var report = new AnnualReportDC();
// report.Data = new List<AnnualReportDataDC>();
// report.Name = "Lebensunterhalt";
// Dictionary<String, AnnualReportDataDC> dataPerDef = new Dictionary<String, AnnualReportDataDC>();
// var def = DAOFactory.GenericDAO.LoadByID<VarFieldDef>(varFieldDefOid);
// var items = def.PossibleItems.Split(';');
// foreach (var item in items)
// {
// var data = new AnnualReportDataDC();
// report.Data.Add(data);
// data.Name = item;
// dataPerDef.Add(item, data);
// }
// foreach (var info in alleKlienten)
// {
// String name = "ohne Angaben";
// if (info.VarFieldValueList != null)
// {
// foreach (var vfv in info.VarFieldValueList)
// {
// if (vfv.VarFieldDefOid == varFieldDefOid)
// {
// var o = Utils.XMLDeserializeFromString(vfv.SerializedValue, Type.GetType(vfv.TypeName));
// if (o != null)
// {
// name = o.ToString();
// }
// }
// }
// }
// if (dataPerDef.ContainsKey(name))
// {
// var data = dataPerDef[name];
// data.Value = (data.Value ?? 0) + 1;
// if (info.IstWiederholungsKlient)
// {
// data.Value2 = ((int?)data.Value2 ?? 0) + 1;
// }
// else
// {
// data.Value1 = ((int?)data.Value1 ?? 0) + 1;
// }
// }
// }
// report.Data = report.Data.OrderBy(d => d.Name).ToList();
// return report;
//}
private AnnualReportDC BerechneVarfieldReport(List<JahrestatisticCustomerInfo> alleKlienten, long varFieldDefOid)
{
var report = new AnnualReportDC();
report.Data = new List<AnnualReportDataDC>();
Dictionary<String, AnnualReportDataDC> dataPerDef = new Dictionary<String, AnnualReportDataDC>();
String ka = "ohne Angaben";
var def = DAOFactory.GenericDAO.LoadByID<VarFieldDef>(varFieldDefOid);
report.Name = def.Label;
if (!String.IsNullOrEmpty(def.PossibleItems))
{
var items = def.PossibleItems.Split(';');
foreach (var item in items)
{
var data = new AnnualReportDataDC();
data.Name = item;
dataPerDef.Add(item, data);
if (item.ToLower().Contains("keine angabe") || item.ToLower().Contains("ohne angabe"))
{
ka = item;
}
}
}
foreach (var info in alleKlienten)
{
String name = ka;
if (info.VarFieldValueList != null)
{
foreach (var vfv in info.VarFieldValueList)
{
if (vfv.VarFieldDefOid == varFieldDefOid)
{
var o = Utils.XMLDeserializeFromString(vfv.SerializedValue, Type.GetType(vfv.TypeName));
if (o != null)
{
name = o.ToString();
}
}
}
}
AnnualReportDataDC data = null;
if (dataPerDef.ContainsKey(name))
{
data = dataPerDef[name];
}
else
{
data = new AnnualReportDataDC();
data.Name = name;
dataPerDef.Add(name, data);
}
data.Value = (data.Value ?? 0) + 1;
if (info.IstWiederholungsKlient)
{
data.Value2 = ((int?)data.Value2 ?? 0) + 1;
}
else
{
data.Value1 = ((int?)data.Value1 ?? 0) + 1;
}
}
report.Data.AddRange(dataPerDef.Values.OrderBy(d => d.Name).Where(d => d.Name != ka));
report.Data.AddRange(dataPerDef.Values.Where(d => d.Name == ka));
return report;
}
private AnnualReportDC BerechneBeendigungsgrund(List<JahrestatisticCustomerInfo> alleKlienten, DateTime start, DateTime end)
{
var report = new AnnualReportDC();
report.Data = new List<AnnualReportDataDC>();
report.Name = "Beendigungsgrund";
Dictionary<String, AnnualReportDataDC> dataPerGrund = new Dictionary<String, AnnualReportDataDC>();
foreach (var info in alleKlienten)
{
//String grund = "Übernahme in das Folgejahr";
String grund = "Ohne Angabe";
if (!String.IsNullOrEmpty(info.Customer.TerminationReason))
{
grund = info.Customer.TerminationReason;
}
if (info.Customer.TerminationDate.HasValue && info.Customer.TerminationDate >= start && info.Customer.TerminationDate < end)
{
AnnualReportDataDC data = null;
if (dataPerGrund.ContainsKey(grund))
{
data = dataPerGrund[grund];
}
else
{
data = new AnnualReportDataDC();
data.Name = grund;
dataPerGrund.Add(grund, data);
report.Data.Add(data);
}
data.Value = (data.Value ?? 0) + 1;
if (info.IstWiederholungsKlient)
{
data.Value2 = ((int?)data.Value2 ?? 0) + 1;
}
else
{
data.Value1 = ((int?)data.Value1 ?? 0) + 1;
}
}
}
return report;
}
private JahrestatisticCustomerInfo GetJahrestatisticCustomerInfo(Customer customer, DateTime start, DateTime ende)
{
JahrestatisticCustomerInfo info = null;
info = new JahrestatisticCustomerInfo();
info.Customer = MapperFactory.CompactCustomerDC_Customer.MapToNewDC(customer);
info.IstWiederholungsKlient = HatAltenHilfeplan(customer, start);
info.Geschlecht = customer.Person.Sex;
info.VarFieldValueList = customer.VarFieldValueList;
return info;
foreach (var sc in customer.SupportConcepts)
{
foreach (var c2s in sc.CostBearer2SupportConceptList)
{
foreach (var scap in c2s.ApprovalPeriodList)
{
//DateTime end = DateTime.Now;
//if (last == null && customer.AssistanceBegin.HasValue && customer.AssistanceBegin.Value < startdate)
//{
// startdate = customer.AssistanceBegin;
//}
if (scap.StartDate.HasValue && scap.EndDate.HasValue && scap.StartDate < ende && scap.EndDate >= start)
{
info = new JahrestatisticCustomerInfo();
info.Customer = MapperFactory.CompactCustomerDC_Customer.MapToNewDC(customer);
info.IstWiederholungsKlient = HatAltenHilfeplan(c2s, scap, customer, start);
info.Geschlecht = customer.Person.Sex;
var records = c2s.ServiceRecords.Where(r => r.Start >= start && r.Start < ende).ToList();
info.ServiceRecords = records;
info.VarFieldValueList = customer.VarFieldValueList;
}
}
}
}
return info;
}
private bool HatAltenHilfeplan(Customer customer, DateTime start)
{
if (customer.AssistanceBegin.HasValue && customer.AssistanceBegin.Value.Year < start.Year)
{
return true;
}
return false;
}
private bool HatAltenHilfeplan(CostBearer2SupportConcept basisC2S, SupportConceptApprovalPeriod basisScap, Customer customer, DateTime start)
{
if (customer.AssistanceBegin.HasValue && customer.AssistanceBegin.Value.Year < start.Year)
{
return true;
}
return false;
//foreach (var sc in customer.SupportConcepts)
//{
// foreach (var c2s in sc.CostBearer2SupportConceptList)
// {
// if (c2s.CostBearer.Oid == basisC2S.CostBearer.Oid)
// {
// foreach (var scap in c2s.ApprovalPeriodList)
// {
// if (scap.EndDate.HasValue && scap.EndDate.Value < start)
// {
// if ((basisScap.ServiceCategory == null && scap.ServiceCategory == null) ||
// (basisScap.ServiceCategory != null && scap.ServiceCategory != null &&
// basisScap.ServiceCategory.Oid == scap.ServiceCategory.Oid))
// {
// return true;
// }
// }
// }
// }
// }
//}
//return false;
}
}
public class JahrestatisticCustomerInfo
{
public CompactCustomerDC Customer { get; set; }
public CompactTeamDC Team { get; set; }
public Sex? Geschlecht { get; set; }
public bool IstWiederholungsKlient { get; set; }
public IList<ServiceRecord> ServiceRecords { get; set; }
public IList<VarFieldValue> VarFieldValueList { get; set; }
}
}