using System; using System.Collections.Generic; using System.Linq; using System.Text; using BS.Shared; using BS.Shared.Core; using BS.Shared.DataContracts; using BS.Shared.Services; using BeWo.Data.Access; using BeWo.Data.Entities; using BeWo.Service.DCEntityMapper; using BeWo.Service.Plugins; using Castle.Components.DictionaryAdapter; using NHibernate.Linq; namespace BeWo.Service.Reporting { public class AnnualReportFactory : AbstractIDSpecificDefaultClass { protected DateTime ReportStartDate { get; set; } protected DateTime ReportEndDate { get; set; } protected CostBearer CostBearer { get; set; } protected long? TeamOid { get; set; } protected long? CustomerCareTypeValueListEntryOid { get; set; } protected Dictionary> Cb2ScListPerCustomerOid { get; set; } protected Dictionary CustomerByOid { get; set; } protected Dictionary LiegtImStichtagByCustomerOid { get; set; } protected Dictionary LiegtImStichtagByC2SOid { get; set; } protected DateTime Stichtag { get { return new DateTime(ReportStartDate.Year, 12, 31); } } protected virtual bool StichtagsbezogenAuswerten { get { return true; } } public virtual List CreateAnnualReport(CostBearer cb, long? teamOid, long? customerCareTypeValueListEntryOid, DateTime reportStartDate, DateTime reportEndDate) { ReportStartDate = reportStartDate; ReportEndDate = reportEndDate; CostBearer = cb; TeamOid = teamOid; CustomerCareTypeValueListEntryOid = customerCareTypeValueListEntryOid; Cb2ScListPerCustomerOid = new Dictionary>(); CustomerByOid = new Dictionary(); LiegtImStichtagByC2SOid = new Dictionary(); LiegtImStichtagByCustomerOid = new Dictionary(); var reports = new List(); //Dictionary customer2TerminationProcessed = new Dictionary(); Dictionary countPerTerminationReasonAll = new Dictionary(); Dictionary> countPerTerminationReasonNames = new Dictionary>(); Dictionary countPerTerminationReasonMale = new Dictionary(); Dictionary countPerTerminationReasonFemale = new Dictionary(); Dictionary countPerTerminationReasonDivers = new Dictionary(); Dictionary oid2VarfieldDef = new Dictionary(); //Dictionary customer2VarfieldProcessed = new Dictionary(); Dictionary countPerWohnformAll = new Dictionary(); Dictionary> countPerWohnformNames = new Dictionary>(); Dictionary countPerWohnformMale = new Dictionary(); Dictionary countPerWohnformFemale = new Dictionary(); Dictionary countPerWohnformDivers = new Dictionary(); Dictionary countPerCityAll = new Dictionary(); Dictionary> countPerCityNames = new Dictionary>(); Dictionary countPerCityMale = new Dictionary(); Dictionary countPerCityFemale = new Dictionary(); Dictionary countPerCityDivers = new Dictionary(); Dictionary countPerVarfielddef2All = new Dictionary(); Dictionary> countPerVarfielddefNames = new Dictionary>(); Dictionary countPerVarfielddef2Male = new Dictionary(); Dictionary countPerVarfielddef2Female = new Dictionary(); Dictionary countPerVarfielddef2Divers = new Dictionary(); Dictionary year2NewSCCountAll = new Dictionary(); Dictionary> year2NewSCNames = new Dictionary>(); Dictionary year2NewSCCountMale = new Dictionary(); Dictionary year2NewSCCountFemale = new Dictionary(); Dictionary year2NewSCCountDivers = new Dictionary(); Dictionary customerOid2Hours = new Dictionary(); Dictionary> customerOid2ApprovalDateTimeSpan = new Dictionary>(); bool hatWohnform = false; bool hatWohnraumAngemietet = false; var varFieldDefs = DAOFactory.GenericDAO.GetAllActive(); foreach (var varFieldDef in varFieldDefs) { oid2VarfieldDef.Add(varFieldDef.Oid.Value, varFieldDef); } InitData(); Dictionary customerOid2Days = new Dictionary(); StringBuilder sb = new StringBuilder(); foreach (var customerOid in Cb2ScListPerCustomerOid.Keys) { List csList = Cb2ScListPerCustomerOid[customerOid]; Customer customer = CustomerByOid[customerOid]; if (customerOid == 352) { int t = 0; } CostBearer2SupportConcept last = null; int days = 0; bool hatLaufendenHPAmStichtag = false; foreach (var c2s in csList) { var startdate = c2s.StartDate; if (last == null && customer.AssistanceBegin.HasValue && customer.AssistanceBegin.Value < startdate) { startdate = customer.AssistanceBegin; } DateTime enddate = DateTime.MaxValue; if (last != null && last.EndDate.Value.Date < DateTime.MaxValue.Date) enddate = last.EndDate.Value.Date.AddDays(1); bool isNewSc = !(last != null && (enddate == c2s.StartDate.Value.Date)); if (last == null) { if (startdate.Value.Year == 2015) { sb.AppendLine(String.Format("{0}, {1}: {2:dd.MM.yyyy} - {3:dd.MM.yyyy} ({4:dd.MM.yyyy} - {5:dd.MM.yyyy})", customer.Person.LastName, customer.Person.FirstName, startdate, enddate, c2s.StartDate, c2s.EndDate)); } days = 0; if (!year2NewSCCountAll.ContainsKey(startdate.Value.Year)) year2NewSCCountAll[startdate.Value.Year] = 0; year2NewSCCountAll[startdate.Value.Year] += 1; if (!year2NewSCNames.ContainsKey(startdate.Value.Year)) { year2NewSCNames[startdate.Value.Year] = new List(); } year2NewSCNames[startdate.Value.Year].Add(String.Format("{0}, {1}", c2s.SupportConcept.Customer.Person.LastName, c2s.SupportConcept.Customer.Person.FirstName)); if (!year2NewSCCountMale.ContainsKey(startdate.Value.Year)) year2NewSCCountMale[startdate.Value.Year] = 0; if (!year2NewSCCountFemale.ContainsKey(startdate.Value.Year)) year2NewSCCountFemale[startdate.Value.Year] = 0; if (!year2NewSCCountDivers.ContainsKey(startdate.Value.Year)) year2NewSCCountDivers[startdate.Value.Year] = 0; if (c2s.SupportConcept.Customer.Person.Sex.HasValue && c2s.SupportConcept.Customer.Person.Sex.Value == Sex.Male) { year2NewSCCountMale[startdate.Value.Year] += 1; } if (c2s.SupportConcept.Customer.Person.Sex.HasValue && c2s.SupportConcept.Customer.Person.Sex.Value == Sex.Female) { year2NewSCCountFemale[startdate.Value.Year] += 1; } if (c2s.SupportConcept.Customer.Person.Sex.HasValue && c2s.SupportConcept.Customer.Person.Sex.Value == Sex.Divers) { year2NewSCCountDivers[startdate.Value.Year] += 1; } } if (LiegtImStichtagByC2SOid.ContainsKey(c2s.Oid.Value)) { days += (int)Stichtag.Subtract(startdate.Value).TotalDays + 1; hatLaufendenHPAmStichtag = true; if (customerOid == 49) { int test = 0; } if (!customerOid2Hours.ContainsKey(customerOid)) customerOid2Hours.Add(customerOid, 0); var calc = PluginLoader.FindClass(c2s.CostBearer.ID) ?? Calculations.GetInstance(c2s.CostBearer.ID); SupportConceptCostBearerRelDC relDC = MapperFactory.SupportConceptCostBearerRelDC_CostBearer2SupportConcept.MapToNewDC(c2s); DateTimeSpan span = new DateTimeSpan(); span.StartDateTime = relDC.StartDate ?? DateTime.MinValue; span.EndDate = relDC.EndDate ?? DateTime.MaxValue; DateTime dt = Stichtag; if (!StichtagsbezogenAuswerten) { if (relDC.EndDate.HasValue && relDC.EndDate < dt && relDC.EndDate >= reportStartDate) { dt = relDC.EndDate.Value; } } decimal hours = calc.GetApprovedHoursPerWeek(relDC, dt) ?? 0; bool addHours = true; if (!StichtagsbezogenAuswerten) { if (!customerOid2ApprovalDateTimeSpan.ContainsKey(customerOid)) { customerOid2ApprovalDateTimeSpan.Add(customerOid, new List()); } else { var spans = customerOid2ApprovalDateTimeSpan[customerOid]; bool overlaps = false; foreach (var span2 in spans) { if (span.Overlaps(span2)) { overlaps = true; } } if (!overlaps) { addHours = false; if (hours > customerOid2Hours[customerOid]) { customerOid2Hours[customerOid] = hours; } } } customerOid2ApprovalDateTimeSpan[customerOid].Add(span); } if (addHours) { customerOid2Hours[customerOid] += hours; } } else { if (c2s.EndDate.Value < Stichtag) days += (int)c2s.EndDate.Value.Subtract(startdate.Value).TotalDays + 1; } last = c2s; } //if (!customerOid2Days.ContainsKey(customerOid)) // customerOid[customerOid] if (hatLaufendenHPAmStichtag) { customerOid2Days[customerOid] = days; } if (customer.TerminationDate.HasValue && customer.TerminationDate >= reportStartDate && customer.TerminationDate < reportEndDate) { String grund = "Unbekannter Grund"; if (customer.TerminationReason != null) { grund = customer.TerminationReason.Value; } if (!countPerTerminationReasonAll.ContainsKey(grund)) countPerTerminationReasonAll[grund] = 0; countPerTerminationReasonAll[grund] += 1; if (!countPerTerminationReasonMale.ContainsKey(grund)) countPerTerminationReasonMale[grund] = 0; if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Male) { countPerTerminationReasonMale[grund] += 1; } if (!countPerTerminationReasonFemale.ContainsKey(grund)) countPerTerminationReasonFemale[grund] = 0; if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Female) { countPerTerminationReasonFemale[grund] += 1; } if (!countPerTerminationReasonDivers.ContainsKey(grund)) countPerTerminationReasonDivers[grund] = 0; if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Divers) { countPerTerminationReasonDivers[grund] += 1; } if (!countPerTerminationReasonNames.ContainsKey(grund)) { countPerTerminationReasonNames[grund] = new List(); } countPerTerminationReasonNames[grund].Add(String.Format("{0}, {1}", customer.Person.LastName, customer.Person.FirstName)); } if (customer.VarFieldValueList != null && customer.VarFieldValueList.Count > 0) { if (hatLaufendenHPAmStichtag) { foreach (var varfield in customer.VarFieldValueList) { if (oid2VarfieldDef.ContainsKey(varfield.VarFieldDefOid.Value)) { VarFieldDef def = oid2VarfieldDef[varfield.VarFieldDefOid.Value]; if (!String.IsNullOrEmpty(def.Label)) { if (def.Label.Equals("Wohnform")) { hatWohnform = true; Type type = Type.GetType(varfield.TypeName); var varFieldValue = Utils.XMLDeserializeFromString(varfield.SerializedValue, type); if (varFieldValue != null) { String str = varFieldValue.ToString(); if (!countPerWohnformAll.ContainsKey(str)) countPerWohnformAll[str] = 0; countPerWohnformAll[str] += 1; if (!countPerWohnformNames.ContainsKey(str)) { countPerWohnformNames[str] = new List(); } countPerWohnformNames[str].Add(String.Format("{0}, {1}", customer.Person.LastName, customer.Person.FirstName)); if (!countPerWohnformMale.ContainsKey(str)) countPerWohnformMale[str] = 0; if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Male) { countPerWohnformMale[str] += 1; } if (!countPerWohnformFemale.ContainsKey(str)) countPerWohnformFemale[str] = 0; if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Female) { countPerWohnformFemale[str] += 1; } if (!countPerWohnformDivers.ContainsKey(str)) countPerWohnformDivers[str] = 0; if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Divers) { countPerWohnformDivers[str] += 1; } } } else if (def.Label.IndexOf("Wohnraum") >= 0 && def.Label.IndexOf("angemietet") >= 0) { hatWohnraumAngemietet = true; if (!countPerVarfielddef2All.ContainsKey(def)) countPerVarfielddef2All[def] = 0; countPerVarfielddef2All[def] += 1; if (!countPerVarfielddefNames.ContainsKey(def)) { countPerVarfielddefNames[def] = new List(); } countPerVarfielddefNames[def].Add(String.Format("{0}, {1}", customer.Person.LastName, customer.Person.FirstName)); if (!countPerVarfielddef2Male.ContainsKey(def)) countPerVarfielddef2Male[def] = 0; if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Male) { countPerVarfielddef2Male[def] += 1; } if (!countPerVarfielddef2Female.ContainsKey(def)) countPerVarfielddef2Female[def] = 0; if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Female) { countPerVarfielddef2Female[def] += 1; } if (!countPerVarfielddef2Divers.ContainsKey(def)) countPerVarfielddef2Divers[def] = 0; if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Divers) { countPerVarfielddef2Divers[def] += 1; } } } } //if (varfield.) } } } if (hatLaufendenHPAmStichtag) { //Auswertung nach City String city = "Ohne Angabe"; if (customer.Person.Address != null && !String.IsNullOrEmpty(customer.Person.Address.Town)) { city = customer.Person.Address.Town.Trim(); } if (!countPerCityAll.ContainsKey(city)) { countPerCityAll[city] = 0; } countPerCityAll[city] += 1; if (!countPerCityNames.ContainsKey(city)) { countPerCityNames[city] = new List(); } countPerCityNames[city].Add(String.Format("{0}, {1}", customer.Person.LastName, customer.Person.FirstName)); if (!countPerCityMale.ContainsKey(city)) countPerCityMale[city] = 0; if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Male) { countPerCityMale[city] += 1; } if (!countPerCityFemale.ContainsKey(city)) countPerCityFemale[city] = 0; if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Female) { countPerCityFemale[city] += 1; } if (!countPerCityDivers.ContainsKey(city)) countPerCityDivers[city] = 0; if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Divers) { countPerCityDivers[city] += 1; } } ProcessCustomer(customer, csList); } // anz Betreuungen AnnualReportDC report; if (StichtagsbezogenAuswerten) { report = CreateCountPerYearReport(); reports.Add(report); } else { report = CreateCountPerYearReportGesamtJahr(); reports.Add(report); } // anz Zugänge report = new AnnualReportDC(); report.Name = "Anzahl der Zugänge"; reports.Add(report); report.Data = new List(); var startYear = new DateTime(reportStartDate.Year - 5, 1, 1); //reportStartDate.AddYears(-1); //Vorjahr var index = 1; while (startYear < reportEndDate) { AnnualReportDataDC data = new AnnualReportDataDC(); report.Data.Add(data); data.Index = index++; data.Name = String.Format("{0:yyyy}", new DateTime(startYear.Year, 1, 1)); data.Value = 0; if (year2NewSCCountAll.ContainsKey(startYear.Year)) data.Value = year2NewSCCountAll[startYear.Year]; if (year2NewSCCountMale.ContainsKey(startYear.Year)) data.Male = year2NewSCCountMale[startYear.Year]; if (year2NewSCCountFemale.ContainsKey(startYear.Year)) data.Female = year2NewSCCountFemale[startYear.Year]; if (year2NewSCCountDivers.ContainsKey(startYear.Year)) data.Divers = year2NewSCCountDivers[startYear.Year]; if (year2NewSCNames.ContainsKey(startYear.Year)) data.CustomerNames = year2NewSCNames[startYear.Year]; startYear = startYear.AddYears(1); } StringBuilder testsb = new StringBuilder(); if (report.Data.Count > 5 && report.Data[5].CustomerNames != null) { foreach (var str in report.Data[5].CustomerNames.OrderBy(s => s)) { testsb.AppendLine(str); } } var teststr = testsb.ToString(); // anz Beendigungen report = new AnnualReportDC(); report.Name = "Anzahl der Beendigungen der Betreuungen"; reports.Add(report); report.Data = new List(); index = 1; foreach (var reason in countPerTerminationReasonAll.Keys) { AnnualReportDataDC data = new AnnualReportDataDC(); report.Data.Add(data); data.Index = index++; data.Name = reason; data.Value = countPerTerminationReasonAll[reason]; if (countPerTerminationReasonMale.ContainsKey(reason)) data.Male = countPerTerminationReasonMale[reason]; if (countPerTerminationReasonFemale.ContainsKey(reason)) data.Female = countPerTerminationReasonFemale[reason]; if (countPerTerminationReasonDivers.ContainsKey(reason)) data.Divers = countPerTerminationReasonDivers[reason]; if (countPerTerminationReasonNames.ContainsKey(reason)) data.CustomerNames = countPerTerminationReasonNames[reason]; } testsb = new StringBuilder(); foreach (var dd in report.Data) { if (dd.CustomerNames != null) { foreach (var str in dd.CustomerNames.OrderBy(s => s)) { testsb.AppendLine(str); } } } teststr = testsb.ToString(); // Betreuungsdauer report = new AnnualReportDC(); report.Name = "Aktuelle Betreuungsdauer der betreuten Personen"; reports.Add(report); report.Data = new List(); index = 1; int below3All = 0; int three2FiveAll = 0; int above5All = 0; List below3AllNames = new List(); List three2FiveAllNames = new List(); List above5AllNames = new List(); int below3Male = 0; int three2FiveMale = 0; int above5Male = 0; int below3Female = 0; int three2FiveFemale = 0; int above5Female = 0; int below3Divers = 0; int three2FiveDivers = 0; int above5Divers = 0; foreach (var customerOid in customerOid2Days.Keys) { int days = customerOid2Days[customerOid]; if (days > 0) { if (days < (365*3)) below3All++; else if (days < (365*5)) three2FiveAll++; else { above5All++; } if (CustomerByOid.ContainsKey(customerOid)) { Customer customer = CustomerByOid[customerOid]; String customerName = String.Format("{0}, {1}", customer.Person.LastName, customer.Person.FirstName); if (days < (365 * 3)) below3AllNames.Add(customerName); else if (days < (365 * 5)) three2FiveAllNames.Add(customerName); else { above5AllNames.Add(customerName); } if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Male) { if (days < (365*3)) below3Male++; else if (days < (365*5)) three2FiveMale++; else { above5Male++; } } if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Female) { if (days < (365*3)) below3Female++; else if (days < (365*5)) three2FiveFemale++; else { above5Female++; } } if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Divers) { if (days < (365 * 3)) below3Divers++; else if (days < (365 * 5)) three2FiveDivers++; else { above5Divers++; } } } } } AnnualReportDataDC d = new AnnualReportDataDC(); report.Data.Add(d); d.Index = index++; d.Name = "unter 3 Jahre"; d.Value = below3All; d.Male = below3Male; d.Female = below3Female; d.Divers = below3Divers; d.CustomerNames = below3AllNames; d = new AnnualReportDataDC(); report.Data.Add(d); d.Index = index++; d.Name = "3-5 Jahre"; d.Value = three2FiveAll; d.Male = three2FiveMale; d.Female = three2FiveFemale; d.Divers = three2FiveDivers; d.CustomerNames = three2FiveAllNames; d = new AnnualReportDataDC(); report.Data.Add(d); d.Index = index++; d.Name = "über 5 Jahre"; d.Value = above5All; d.Male = above5Male; d.Female = above5Female; d.Divers = above5Divers; d.CustomerNames = above5AllNames; // Betreuungsumfang report = new AnnualReportDC(); report.Name = "Betreuungsumfang der betreuten Personen in FLS pro Woche"; reports.Add(report); report.Data = new List(); index = 1; int less1All = 0; int less1Male = 0; int less1Female = 0; int less1Divers = 0; List less1AllNames = new List(); int less2All = 0; int less2Male = 0; int less2Female = 0; int less2Divers = 0; List less2AllNames = new List(); int less3All = 0; int less3Male = 0; int less3Female = 0; int less3Divers = 0; List less3AllNames = new List(); int less4All = 0; int less4Male = 0; int less4Female = 0; int less4Divers = 0; List less4AllNames = new List(); int less6All = 0; int less6Male = 0; int less6Female = 0; int less6Divers = 0; List less6AllNames = new List(); int less8All = 0; int less8Male = 0; int less8Female = 0; int less8Divers = 0; List less8AllNames = new List(); int greater8All = 0; int greater8Male = 0; int greater8Female = 0; int greater8Divers = 0; List greater8AllNames = new List(); foreach (var customerOid in customerOid2Hours.Keys) { decimal hours = customerOid2Hours[customerOid]; if (hours <= 1) less1All++; else if (hours <= 2) less2All++; else if (hours <= 3) less3All++; else if (hours <= 4) less4All++; else if (hours <= 6) less6All++; else if (hours <= 8) less8All++; else greater8All++; if (CustomerByOid.ContainsKey(customerOid)) { Customer customer = CustomerByOid[customerOid]; String customerName = String.Format("{0}, {1}", customer.Person.LastName, customer.Person.FirstName); if (hours <= 1) less1AllNames.Add(customerName); else if (hours <= 2) less2AllNames.Add(customerName); else if (hours <= 3) less3AllNames.Add(customerName); else if (hours <= 4) less4AllNames.Add(customerName); else if (hours <= 6) less6AllNames.Add(customerName); else if (hours <= 8) less8AllNames.Add(customerName); else greater8AllNames.Add(customerName); if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Male) { if (hours <= 1) less1Male++; else if (hours <= 2) less2Male++; else if (hours <= 3) less3Male++; else if (hours <= 4) less4Male++; else if (hours <= 6) less6Male++; else if (hours <= 8) less8Male++; else greater8Male++; } if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Female) { if (hours <= 1) less1Female++; else if (hours <= 2) less2Female++; else if (hours <= 3) less3Female++; else if (hours <= 4) less4Female++; else if (hours <= 6) less6Female++; else if (hours <= 8) less8Female++; else greater8Female++; } if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Divers) { if (hours <= 1) less1Divers++; else if (hours <= 2) less2Divers++; else if (hours <= 3) less3Divers++; else if (hours <= 4) less4Divers++; else if (hours <= 6) less6Divers++; else if (hours <= 8) less8Divers++; else greater8Divers++; } } } d = new AnnualReportDataDC(); report.Data.Add(d); d.Index = index++; d.Name = "<= 1 FLS"; d.Value = less1All; d.Male = less1Male; d.Female = less1Female; d.Divers = less1Divers; d.CustomerNames = less1AllNames; d = new AnnualReportDataDC(); report.Data.Add(d); d.Index = index++; d.Name = "> 1 <= 2 FLS"; d.Value = less2All; d.Male = less2Male; d.Female = less2Female; d.Divers = less2Divers; d.CustomerNames = less2AllNames; d = new AnnualReportDataDC(); report.Data.Add(d); d.Index = index++; d.Name = "> 2 <= 3 FLS"; d.Value = less3All; d.Male = less3Male; d.Female = less3Female; d.Divers = less3Divers; d.CustomerNames = less3AllNames; d = new AnnualReportDataDC(); report.Data.Add(d); d.Index = index++; d.Name = "> 3 <= 4 FLS"; d.Value = less4All; d.Male = less4Male; d.Female = less4Female; d.Divers = less4Divers; d.CustomerNames = less4AllNames; d = new AnnualReportDataDC(); report.Data.Add(d); d.Index = index++; d.Name = "> 4 <= 6 FLS"; d.Value = less6All; d.Male = less6Male; d.Female = less6Female; d.Divers = less6Divers; d.CustomerNames = less6AllNames; d = new AnnualReportDataDC(); report.Data.Add(d); d.Index = index++; d.Name = "> 6 <= 8 FLS"; d.Value = less8All; d.Male = less8Male; d.Female = less8Female; d.Divers = less8Divers; d.CustomerNames = less8AllNames; d = new AnnualReportDataDC(); report.Data.Add(d); d.Index = index++; d.Name = "> 8 FLS"; d.Value = greater8All; d.Male = greater8Male; d.Female = greater8Female; d.Divers = greater8Divers; d.CustomerNames = greater8AllNames; // Nach Ort report = new AnnualReportDC(); report.Name = "Anzahl der betreuten Personen nach Ort"; reports.Add(report); report.Data = new List(); index = 1; foreach (var vd in countPerCityAll.Keys) { AnnualReportDataDC data = new AnnualReportDataDC(); report.Data.Add(data); data.Index = index++; data.Name = vd; data.Value = countPerCityAll[vd]; data.Male = countPerCityMale[vd]; data.Female = countPerCityFemale[vd]; data.Divers = countPerCityDivers[vd]; data.CustomerNames = countPerCityNames[vd]; } report.Data.Sort((a, b) => a.Name.CompareTo(b.Name)); if (hatWohnform) { // anz der betreuten Personen report = new AnnualReportDC(); report.Name = "Anzahl der betreuten Personen nach Wohnform"; reports.Add(report); report.Data = new List(); index = 1; foreach (var wohnform in countPerWohnformAll.Keys) { AnnualReportDataDC data = new AnnualReportDataDC(); report.Data.Add(data); data.Index = index++; data.Name = wohnform; data.Value = countPerWohnformAll[wohnform]; data.Male = countPerWohnformMale[wohnform]; data.Female = countPerWohnformFemale[wohnform]; data.Divers = countPerWohnformDivers[wohnform]; data.CustomerNames = countPerWohnformNames[wohnform]; } } if (hatWohnraumAngemietet) { // Wohnraum vom Leistungserbringer/Kooperationspartner des Leistungserbringers angemietet report = new AnnualReportDC(); report.Name = "Wohnraum vom Leistungserbringer/Kooperationspartner angemietet"; reports.Add(report); report.Data = new List(); index = 1; foreach (var vd in countPerVarfielddef2All.Keys) { AnnualReportDataDC data = new AnnualReportDataDC(); report.Data.Add(data); data.Index = index++; data.Name = "anz"; data.Value = countPerVarfielddef2All[vd]; data.Male = countPerVarfielddef2Male[vd]; data.Female = countPerVarfielddef2Female[vd]; data.Divers = countPerVarfielddef2Divers[vd]; data.CustomerNames = countPerVarfielddefNames[vd]; } } return reports; } public virtual void InitData() { foreach (var iCb2Sc in DAOFactory.GenericDAO.GetAllActiveAndArchived()) { if (CostBearer == null || iCb2Sc.CostBearer.Oid == CostBearer.Oid) { var sc = iCb2Sc.SupportConcept; var customer = sc.Customer; if (ShouldProcessSupportConcept(iCb2Sc, sc, customer)) { ProcessSupportConcept(iCb2Sc, sc, customer); if (!CustomerByOid.ContainsKey(customer.Oid.Value)) { CustomerByOid.Add(customer.Oid.Value, customer); } List list; if (Cb2ScListPerCustomerOid.ContainsKey(customer.Oid.Value)) { list = Cb2ScListPerCustomerOid[customer.Oid.Value]; } else { list = new List(); Cb2ScListPerCustomerOid.Add(customer.Oid.Value, list); } //if (iCb2Sc.StartDate < ReportEndDate) //{ list.Add(iCb2Sc); list.Sort((a, b) => a.StartDate.Value.CompareTo(b.StartDate.Value)); //} } } } foreach (var customerOid in Cb2ScListPerCustomerOid.Keys) { var customer = CustomerByOid[customerOid]; var c2sList = Cb2ScListPerCustomerOid[customerOid]; bool isFirst = true; foreach (var c2s in c2sList) { var startDate = c2s.StartDate; if (isFirst && customer.AssistanceBegin.HasValue && customer.AssistanceBegin < startDate) { startDate = customer.AssistanceBegin; } isFirst = false; var endDate = c2s.EndDate; if (customer.TerminationDate.HasValue && customer.TerminationDate < endDate) { endDate = customer.TerminationDate; } if ((StichtagsbezogenAuswerten && startDate <= Stichtag && endDate >= Stichtag) || (!StichtagsbezogenAuswerten && startDate <= Stichtag && endDate >= new DateTime(Stichtag.Year, 1, 1))) { if (!LiegtImStichtagByCustomerOid.ContainsKey(customer.Oid.Value)) { LiegtImStichtagByCustomerOid.Add(customer.Oid.Value, true); } if (!LiegtImStichtagByC2SOid.ContainsKey(c2s.Oid.Value)) { LiegtImStichtagByC2SOid.Add(c2s.Oid.Value, true); } } } } } //Stichtagsbezogene Auswertung nach Jahr public virtual AnnualReportDC CreateCountPerYearReport() { var countPerYearEndAll = new Dictionary(); var countPerYearEndMale = new Dictionary(); var countPerYearEndFemale = new Dictionary(); var countPerYearEndDivers = new Dictionary(); var countPerYearEndNames = new Dictionary>(); var countPerYearMidAll = new Dictionary(); var countPerYearMidMale = new Dictionary(); var countPerYearMidFemale = new Dictionary(); var countPerYearMidDivers = new Dictionary(); var countPerYearMidNames = new Dictionary>(); countPerYearMidAll.Add(ReportStartDate.Year, 0); countPerYearMidAll.Add(ReportStartDate.Year - 1, 0); countPerYearMidAll.Add(ReportStartDate.Year - 2, 0); countPerYearMidMale.Add(ReportStartDate.Year, 0); countPerYearMidMale.Add(ReportStartDate.Year - 1, 0); countPerYearMidMale.Add(ReportStartDate.Year - 2, 0); countPerYearMidFemale.Add(ReportStartDate.Year, 0); countPerYearMidFemale.Add(ReportStartDate.Year - 1, 0); countPerYearMidFemale.Add(ReportStartDate.Year - 2, 0); countPerYearMidDivers.Add(ReportStartDate.Year, 0); countPerYearMidDivers.Add(ReportStartDate.Year - 1, 0); countPerYearMidDivers.Add(ReportStartDate.Year - 2, 0); countPerYearMidNames.Add(ReportStartDate.Year, new List()); countPerYearMidNames.Add(ReportStartDate.Year - 1, new List()); countPerYearMidNames.Add(ReportStartDate.Year - 2, new List()); countPerYearEndAll.Add(ReportStartDate.Year, 0); countPerYearEndAll.Add(ReportStartDate.Year - 1, 0); countPerYearEndAll.Add(ReportStartDate.Year - 2, 0); countPerYearEndMale.Add(ReportStartDate.Year, 0); countPerYearEndMale.Add(ReportStartDate.Year - 1, 0); countPerYearEndMale.Add(ReportStartDate.Year - 2, 0); countPerYearEndFemale.Add(ReportStartDate.Year, 0); countPerYearEndFemale.Add(ReportStartDate.Year - 1, 0); countPerYearEndFemale.Add(ReportStartDate.Year - 2, 0); countPerYearEndDivers.Add(ReportStartDate.Year, 0); countPerYearEndDivers.Add(ReportStartDate.Year - 1, 0); countPerYearEndDivers.Add(ReportStartDate.Year - 2, 0); countPerYearEndNames.Add(ReportStartDate.Year, new List()); countPerYearEndNames.Add(ReportStartDate.Year - 1, new List()); countPerYearEndNames.Add(ReportStartDate.Year - 2, new List()); var customerProcessed = new Dictionary(); foreach (var customerOid in Cb2ScListPerCustomerOid.Keys) { var customer = CustomerByOid[customerOid]; var c2sList = Cb2ScListPerCustomerOid[customerOid]; for (int i = ReportStartDate.Year - 2; i <= ReportStartDate.Year; i++) { DateTime midYear = new DateTime(i, 6, 30); DateTime endYear = new DateTime(i, 12, 31); bool countedMid = false; bool countedEnd = false; bool isFirst = true; foreach (var c2s in c2sList) { var startDate = c2s.StartDate; if (isFirst && customer.AssistanceBegin.HasValue && customer.AssistanceBegin < startDate) { startDate = customer.AssistanceBegin; } isFirst = false; var endDate = c2s.EndDate; if (customer.TerminationDate.HasValue && customer.TerminationDate < endDate) { endDate = customer.TerminationDate; } if (!countedEnd && startDate <= endYear && endDate >= endYear) { countPerYearEndAll[i] += 1; countPerYearEndNames[i].Add(String.Format("{0}, {1}", customer.Person.LastName, customer.Person.FirstName)); if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Male) { countPerYearEndMale[i] += 1; } else if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Female) { countPerYearEndFemale[i] += 1; } else if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Divers) { countPerYearEndDivers[i] += 1; } countedEnd = true; } if (!countedMid && startDate <= midYear && endDate >= midYear) { countPerYearMidAll[i] += 1; countPerYearMidNames[i].Add(String.Format("{0}, {1}", customer.Person.LastName, customer.Person.FirstName)); if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Male) { countPerYearMidMale[i] += 1; } else if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Female) { countPerYearMidFemale[i] += 1; } else if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Divers) { countPerYearMidDivers[i] += 1; } countedMid = true; } } } } var report = new AnnualReportDC(); report.Name = "Anzahl der Betreuungen"; report.Data = new List(); DateTime startYear = new DateTime(2000, 1, 1); //reportStartDate.AddYears(-1); //Vorjahr int index = 1; while (startYear < ReportEndDate) { if (countPerYearMidAll.ContainsKey(startYear.Year)) { AnnualReportDataDC data = new AnnualReportDataDC(); report.Data.Add(data); data.CustomerNames = new List(); data.Index = index++; data.Name = String.Format("{0:dd/MM/yyyy}", new DateTime(startYear.Year, 6, 30)); data.Value = countPerYearMidAll[startYear.Year]; data.CustomerNames = countPerYearMidNames[startYear.Year]; if (countPerYearMidMale.ContainsKey(startYear.Year)) { data.Male = countPerYearMidMale[startYear.Year]; } if (countPerYearMidFemale.ContainsKey(startYear.Year)) { data.Female = countPerYearMidFemale[startYear.Year]; } if (countPerYearMidDivers.ContainsKey(startYear.Year)) { data.Divers = countPerYearMidDivers[startYear.Year]; } } if (countPerYearEndAll.ContainsKey(startYear.Year)) { AnnualReportDataDC data = new AnnualReportDataDC(); report.Data.Add(data); data.Index = index++; data.Name = String.Format("{0:dd/MM/yyyy}", new DateTime(startYear.Year, 12, 31)); data.Value = countPerYearEndAll[startYear.Year]; data.CustomerNames = countPerYearEndNames[startYear.Year]; if (countPerYearEndMale.ContainsKey(startYear.Year)) { data.Male = countPerYearEndMale[startYear.Year]; } if (countPerYearEndFemale.ContainsKey(startYear.Year)) { data.Female = countPerYearEndFemale[startYear.Year]; } if (countPerYearEndDivers.ContainsKey(startYear.Year)) { data.Divers = countPerYearEndDivers[startYear.Year]; } } startYear = startYear.AddYears(1); } var testsb = new StringBuilder(); foreach (var str in report.Data[report.Data.Count - 1].CustomerNames.OrderBy(s => s)) { testsb.AppendLine(str); } var teststr = testsb.ToString(); testsb = new StringBuilder(); foreach (var str in report.Data[report.Data.Count - 3].CustomerNames.OrderBy(s => s)) { testsb.AppendLine(str); } teststr = testsb.ToString(); return report; } public virtual AnnualReportDC CreateCountPerYearReportGesamtJahr() { var countPerYearAll = new Dictionary(); var countPerYearMale = new Dictionary(); var countPerYearFemale = new Dictionary(); var countPerYearDivers = new Dictionary(); countPerYearAll.Add(ReportStartDate.Year, 0); countPerYearAll.Add(ReportStartDate.Year - 1, 0); countPerYearAll.Add(ReportStartDate.Year - 2, 0); countPerYearMale.Add(ReportStartDate.Year, 0); countPerYearMale.Add(ReportStartDate.Year - 1, 0); countPerYearMale.Add(ReportStartDate.Year - 2, 0); countPerYearFemale.Add(ReportStartDate.Year, 0); countPerYearFemale.Add(ReportStartDate.Year - 1, 0); countPerYearFemale.Add(ReportStartDate.Year - 2, 0); countPerYearDivers.Add(ReportStartDate.Year, 0); countPerYearDivers.Add(ReportStartDate.Year - 1, 0); countPerYearDivers.Add(ReportStartDate.Year - 2, 0); foreach (var customerOid in Cb2ScListPerCustomerOid.Keys) { var customer = CustomerByOid[customerOid]; var c2sList = Cb2ScListPerCustomerOid[customerOid]; for (int i = ReportStartDate.Year - 2; i <= ReportStartDate.Year; i++) { DateTime start = new DateTime(i, 1, 1); DateTime end = new DateTime(i, 12, 31); bool counted = false; bool isFirst = true; foreach (var c2s in c2sList) { var startDate = c2s.StartDate; if (isFirst && customer.AssistanceBegin.HasValue && customer.AssistanceBegin < startDate) { startDate = customer.AssistanceBegin; } isFirst = false; var endDate = c2s.EndDate; if (customer.TerminationDate.HasValue && customer.TerminationDate < endDate) { endDate = customer.TerminationDate; } if (!counted && startDate <= end && endDate >= start) { countPerYearAll[i] += 1; if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Male) { countPerYearMale[i] += 1; } else if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Female) { countPerYearFemale[i] += 1; } else if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Divers) { countPerYearDivers[i] += 1; } counted = true; } } } } var report = new AnnualReportDC(); report.Name = "Anzahl der Betreuungen"; report.Data = new List(); DateTime startYear = new DateTime(2000, 1, 1); //reportStartDate.AddYears(-1); //Vorjahr int index = 1; while (startYear < ReportEndDate) { if (countPerYearAll.ContainsKey(startYear.Year)) { AnnualReportDataDC data = new AnnualReportDataDC(); report.Data.Add(data); data.Index = index++; data.Name = String.Format("{0:yyyy}", new DateTime(startYear.Year, 1, 1)); data.Value = countPerYearAll[startYear.Year]; if (countPerYearMale.ContainsKey(startYear.Year)) { data.Male = countPerYearMale[startYear.Year]; } if (countPerYearFemale.ContainsKey(startYear.Year)) { data.Female = countPerYearFemale[startYear.Year]; } if (countPerYearDivers.ContainsKey(startYear.Year)) { data.Divers = countPerYearDivers[startYear.Year]; } } startYear = startYear.AddYears(1); } return report; } //Auswertung nach Jahr, mindestens ein Tag irgendwann im Jahr reicht um gezählt zu werden public virtual AnnualReportDC CreateCountPerWholeYearReport() { var countPerYearAll = new Dictionary(); var countPerYearMale = new Dictionary(); var countPerYearFemale = new Dictionary(); var countPerYearDivers = new Dictionary(); var countPerYearNames = new Dictionary>(); countPerYearAll.Add(ReportStartDate.Year, 0); countPerYearAll.Add(ReportStartDate.Year - 1, 0); countPerYearAll.Add(ReportStartDate.Year - 2, 0); countPerYearMale.Add(ReportStartDate.Year, 0); countPerYearMale.Add(ReportStartDate.Year - 1, 0); countPerYearMale.Add(ReportStartDate.Year - 2, 0); countPerYearFemale.Add(ReportStartDate.Year, 0); countPerYearFemale.Add(ReportStartDate.Year - 1, 0); countPerYearFemale.Add(ReportStartDate.Year - 2, 0); countPerYearDivers.Add(ReportStartDate.Year, 0); countPerYearDivers.Add(ReportStartDate.Year - 1, 0); countPerYearDivers.Add(ReportStartDate.Year - 2, 0); countPerYearNames.Add(ReportStartDate.Year, new List()); countPerYearNames.Add(ReportStartDate.Year - 1, new List()); countPerYearNames.Add(ReportStartDate.Year - 2, new List()); foreach (var customerOid in Cb2ScListPerCustomerOid.Keys) { var customer = CustomerByOid[customerOid]; var c2sList = Cb2ScListPerCustomerOid[customerOid]; for (int i = ReportStartDate.Year - 2; i <= ReportStartDate.Year; i++) { DateTime start = new DateTime(i, 1, 1); DateTime end = new DateTime(i, 12, 31); bool counted = false; bool isFirst = true; foreach (var c2s in c2sList) { var startDate = c2s.StartDate; if (isFirst && customer.AssistanceBegin.HasValue && customer.AssistanceBegin < startDate) { startDate = customer.AssistanceBegin; } isFirst = false; var endDate = c2s.EndDate; if (customer.TerminationDate.HasValue && customer.TerminationDate < endDate) { endDate = customer.TerminationDate; } if (!counted && startDate <= end && endDate >= start) { countPerYearAll[i] += 1; countPerYearNames[i].Add(String.Format("{0}, {1}", customer.Person.LastName, customer.Person.FirstName)); if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Male) { countPerYearMale[i] += 1; } else if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Female) { countPerYearFemale[i] += 1; } else if (customer.Person.Sex.HasValue && customer.Person.Sex.Value == Sex.Divers) { countPerYearDivers[i] += 1; } counted = true; } } } } var report = new AnnualReportDC(); report.Name = "Anzahl der Betreuungen im Jahr"; report.Data = new List(); DateTime startYear = new DateTime(2000, 1, 1); //reportStartDate.AddYears(-1); //Vorjahr int index = 1; while (startYear < ReportEndDate) { if (countPerYearAll.ContainsKey(startYear.Year)) { AnnualReportDataDC data = new AnnualReportDataDC(); report.Data.Add(data); data.Index = index++; data.Name = String.Format("{0:yyyy}", new DateTime(startYear.Year, 1, 1)); data.Value = countPerYearAll[startYear.Year]; data.CustomerNames = countPerYearNames[startYear.Year]; if (countPerYearMale.ContainsKey(startYear.Year)) { data.Male = countPerYearMale[startYear.Year]; } if (countPerYearFemale.ContainsKey(startYear.Year)) { data.Female = countPerYearFemale[startYear.Year]; } if (countPerYearDivers.ContainsKey(startYear.Year)) { data.Divers = countPerYearDivers[startYear.Year]; } } startYear = startYear.AddYears(1); } return report; } public virtual void ProcessCustomer(Customer customer, List allCostBearer2SupportConcepts) { //Nur für abgeleitete Klassen } public virtual void ProcessSupportConcept(CostBearer2SupportConcept iCb2Sc, SupportConcept sc, Customer customer) { //Nur für abgeleitete Klassen } public virtual bool ShouldProcessSupportConcept(CostBearer2SupportConcept iCb2Sc, SupportConcept sc, Customer customer) { if (sc.IsActive != ActivationTypeId.Deleted && customer.IsActive != ActivationTypeId.Deleted) { if ((iCb2Sc.ApprovedStartDate.HasValue && iCb2Sc.ApprovedEndDate.HasValue)) { if (CustomerBelongsToTeam(customer, TeamOid) && IsCustomerOfCustomerCareType(customer, CustomerCareTypeValueListEntryOid)) { return true; } } } return false; } public virtual bool IsCustomerOfCustomerCareType(Customer customer, long? customerCareTypeValueListEntryOid) { bool val = true; if (customerCareTypeValueListEntryOid.HasValue) { val = false; foreach (var v in customer.ValueList) { if (v.Entry.Type == ValueListEntryType.CustomerCareType && v.Entry.Oid == customerCareTypeValueListEntryOid) return true; } } return val; } public virtual bool CustomerBelongsToTeam(Customer customer, long? teamOid) { bool val = true; if (teamOid.HasValue) { val = false; foreach (var t2c in customer.Team2CustomerList) { if (t2c.TeamOid == teamOid) return true; } } return val; } } }