using System; using System.Collections.Generic; using System.Linq; using System.Text; using AkggMid; using BeWo.Data.Access; using BeWo.Data.Entities; using BeWo.Report; using BeWo.Report.ReportObjects; using BeWo.Service.DCEntityMapper; using BeWo.Service.Plugins; using BS.Shared; using BS.Shared.DataContracts; using BS.Shared.Extensions; using DevExpress.XtraReports.Design; using DevExpress.XtraReports.UI; namespace AkggMid { public class CustomReportCreator : DefaultReportCreator { public override XtraReport CreateServiceOverviewAllCustomersReport(int month, int year, long orgaOid, long empOid, long? serviceCategoryOid, int startDay, int endDay, bool nurFehlende) { List lROs = ServicesOverviewRO.Create(month, year, orgaOid, empOid, startDay, endDay, serviceCategoryOid, true, nurFehlende); if (lROs.Count > 0) { var lServiceOverviewAllCustomersReport = ErstelleReport(lROs[0]); lServiceOverviewAllCustomersReport.SetReportDataSource(lROs[0]); (lServiceOverviewAllCustomersReport as XtraReport).CreateDocument(); var Report = lServiceOverviewAllCustomersReport as XtraReport; for (int i = 1; i < lROs.Count; i++) { var lNext = ErstelleReport(lROs[i]); lNext.SetReportDataSource(lROs[i]); (lNext as XtraReport).CreateDocument(); Report.Pages.AddRange((lNext as XtraReport).Pages); } return lServiceOverviewAllCustomersReport as XtraReport; } return new XtraReport(); } public override XtraReport CreateServiceOverviewSingleCustomerReport(long customerOid, int month, int year, long orgaOid, long empOid, long? serviceCategoryOid, int startDay, int endDay) { if (customerOid == 0) { return CreateSbdLeistungsnachweisForSingleCustomerReport(customerOid, month, year, orgaOid, empOid, serviceCategoryOid ?? 0, startDay, endDay, false, "hessen"); } var ro = ServicesOverviewRO.Create(customerOid, month, year, false, orgaOid, empOid, startDay, endDay, serviceCategoryOid); var lServiceOverviewSingleCustomerReport = ErstelleReport(ro); lServiceOverviewSingleCustomerReport.SetReportDataSource(ro); return lServiceOverviewSingleCustomerReport as XtraReport; } public override XtraReport CreateServiceOverviewReportForCustomers(IList customerOids, int month, int year, long? orgaOid, long? empOid, long? serviceCategoryOid, int startDay, int endDay, bool nurFehlende) { var roList = new List(); foreach (var coid in customerOids) { var ro = ServicesOverviewRO.Create(coid, month, year, true, orgaOid ?? 0, empOid ?? 0, startDay, endDay, serviceCategoryOid); if (ro != null) { roList.Add(ro); } } var sortedList = roList.OrderBy(r => r.CustomerLastName + ", " + r.CustomerFirstName).ToList(); if (sortedList.Count > 0) { var rootReport = CreateReportForServicesOverviewRo(sortedList[0], ""); if (rootReport.Pages.Count == 0) { rootReport.CreateDocument(); } for (int i = 1; i < sortedList.Count; i++) { var lNext = CreateReportForServicesOverviewRo(sortedList[i], ""); if (lNext.Pages.Count == 0) { lNext.CreateDocument(); } rootReport.Pages.AddRange(lNext.Pages); } return rootReport; } return new XtraReport(); } public override XtraReport CreateReportForServicesOverviewRo(ServicesOverviewRO ro, String reportId) { IBeWoReport report = ErstelleReport(ro); report.SetReportDataSource(ro); return report as XtraReport; } private IBeWoReport ErstelleReport(ServicesOverviewRO ro) { if (ro.Costbearer == null) { if (ro.CustomerOid > 0) { var c = DAOFactory.GenericDAO.LoadByID(ro.CustomerOid); foreach (var sc in c.SupportConcepts) { foreach (var c2s in sc.CostBearer2SupportConceptList) { if (c2s.StartDate <= ro.EndDate && c2s.EndDate >= ro.StartDate) { ro.Costbearer = c2s.CostBearer.Organisation.Name; } } } } } //if (ro.Costbearer == "SEK -Jugend und Familie-") // nach Aussage vom 18.09.2023 nicht mehr relevant - mal löschen irgendwann if (!String.IsNullOrEmpty(ro.Costbearer) && ro.Costbearer.StartsWith("SEK -Jugend und Familie-") && ro.StartDate < new DateTime(2023, 9, 1)) { return new LeistungsnachweisJugendamt(); } bool hatBlutzuckerMessung = false; bool hatBlutzuckerPumpe = false; foreach (var item in ro.Services) { if (!String.IsNullOrEmpty(item.Notice3)) { hatBlutzuckerMessung = true; } if (!String.IsNullOrEmpty(item.Notice4)) { hatBlutzuckerPumpe = true; } } if (hatBlutzuckerPumpe) { return new LeistungsnachweisSozialamtMitBlutzuckerPumpe(); } if (hatBlutzuckerMessung) { return new LeistungsnachweisSozialamtMitBlutzucker(); } return new LeistungsnachweisSozialamt(); } public override XtraReport CreateSbdLeistungsnachweisForAllCustomers(int month, int year, long orgaOid, long empOid, long serviceCategoryOid, int startDay, int endDay, bool checkServiceRecords, string bundesland) { return CreateReportForStundenaufstellungROs(SbdStundenaufstellungRO.Create(month, year, orgaOid, empOid, serviceCategoryOid, startDay, endDay, true, "hessen")); } public override XtraReport CreateSbdLeistungsnachweisForSingleCustomerReport(long customerOid, int month, int year, long orgaOid, long empOid, long serviceCategoryOid, int startDay, int endDay, bool checkServiceRecords, string bundesland) { return CreateReportForStundenaufstellungROs(SbdStundenaufstellungRO.Create(customerOid, month, year, orgaOid, empOid, serviceCategoryOid, startDay, endDay, true, "hessen", false)); } public override XtraReport CreateEmployeeKilometerauswertung(long employeeOid, List serviceDescriptionOids, DateTime start, DateTime end) { var report = FindReportImp(); if (TemplateOid.HasValue) { if (TemplateOid.Value == 1) { report = new EmployeeKilometerauswertungsReport(); } else { report = new EmployeeKilometerauswertungsReportOhneKlient(); } } var qbs = ServicesOverviewRO.Create(start.Month, start.Year, 0, employeeOid, start.Day, end.Day, null, true, false); List serviceDetails = new List(); foreach (var so in qbs) { foreach (var s in so.Services) { ServicesOverviewRO.CreateGoalList(s); if (!s.GoalList.IsNullOrEmpty()) s.GoalList += "GOAL"; if (!s.GefahreneKilometer.IsNullOrEmpty()) serviceDetails.Add(s); } } var kilometerRO = EmployeeKilometerauswertungsRO.Create(MapperFactory.CompactEmployeeDC_Employee.MapToNewDC(DAOFactory.GenericDAO.LoadByID(employeeOid)), serviceDescriptionOids, start, end); kilometerRO.CreateDistanceList(); //ro-Liste erweitern um alle mit 0km und bestimmten Kategorien var span = new BS.Shared.Core.DateTimeSpan(); span.StartDateTime = start; span.EndDateTime = end.Date.AddDays(1).AddTicks(-1); var serviceRecordsWithoutDistance = DAOFactory.SearchDAO.FindEmployeeServiceRecords(employeeOid, span, null, null).Where(sr => sr.DistanceInMeter == 0 || sr.DistanceInMeter == null).ToList(); List kilometerEintraege = new List(); foreach (var item in serviceRecordsWithoutDistance) { var cat = item.ServiceDescription.ServiceCategory.Name.ToLower(); var des = item.ServiceDescription.Name.ToLower(); if (cat == "schulassistenz abrechenbare fahrtkosten" || cat == "fahrten ohne hilfeplan" || (cat == "regiezeiten" && des == "fahrzeit fallbezogen")) kilometerEintraege.Add(item); } foreach (var serviceRecord in kilometerEintraege) { var e = new EmployeeKilometerauswertungsEntry(serviceRecord.Start, serviceRecord.End, 0, serviceRecord.Customer?.Person?.LastNameFirstName ?? string.Empty, serviceRecord.Notice, serviceRecord); e.Notice = serviceRecord.Notice; e.Notice2 = serviceRecord.Notice2; e.Notice3 = serviceRecord.Notice3; e.Notice4 = serviceRecord.Notice4; e.Notice5 = serviceRecord.Notice5; kilometerRO.Entries.Add(e); } foreach (var item in kilometerRO.Entries) { foreach (var sd in serviceDetails) { if (item.ServiceRecord.Oid == sd.ServiceRecordOid) { item.Dokumentation = sd.GoalList; } } } foreach (var item in kilometerRO.Entries) { if (!String.IsNullOrEmpty(item.Dokumentation) && item.Dokumentation.Contains("GOAL")) item.Dokumentation = item.Dokumentation.Remove(item.Dokumentation.Length - 4, 4); } report.SetReportDataSource(kilometerRO); return report as XtraReport; } public override XtraReport CreateKilometerauswertungForAllEmployees(List employeeOids, List serviceDescriptionOids, DateTime start, DateTime end) { var report = FindReportImp(); if (TemplateOid.HasValue) { if (TemplateOid.Value == 1) { report = new EmployeeKilometerauswertungsListReport(); } else { report = new EmployeeKilometerauswertungsListReportOhneKlient(); } } var auswertungRO = EmployeeKilometerauswertungsListRO.Create(MapperFactory.CompactEmployeeDC_Employee.MapToNewDCs(DAOFactory.GenericDAO.LoadByIDs(employeeOids)), serviceDescriptionOids, start, end); foreach (var e2e in auswertungRO.Employees2Entries) { //ro-Liste erweitern um alle mit 0km und bestimmten Kategorien var serviceRecordsWithoutDistance = DAOFactory.SearchDAO.FindEmployeeServiceRecords(e2e.Employee.EmployeeOid, new BS.Shared.Core.DateTimeSpan(start, end), null, null).Where(sr => sr.DistanceInMeter == 0 || sr.DistanceInMeter == null).ToList(); List kilometerEintraege = new List(); foreach (var item in serviceRecordsWithoutDistance) { var cat = item.ServiceDescription.ServiceCategory.Name.ToLower(); var des = item.ServiceDescription.Name.ToLower(); if (cat == "schulassistenz abrechenbare fahrtkosten" || cat == "fahrten ohne hilfeplan" || cat == "regiezeiten" && des == "fahrzeit fallbezogen") kilometerEintraege.Add(item); } foreach (var serviceRecord in kilometerEintraege) { var e = new EmployeeKilometerauswertungsEntry(serviceRecord.Start, serviceRecord.End, 0, serviceRecord.Customer?.Person?.LastNameFirstName ?? string.Empty, serviceRecord.Notice, serviceRecord); e.Notice = serviceRecord.Notice; e.Notice2 = serviceRecord.Notice2; e.Notice3 = serviceRecord.Notice3; e.Notice4 = serviceRecord.Notice4; e.Notice5 = serviceRecord.Notice5; e2e.Entries.Add(e); } var qbs = ServicesOverviewRO.Create(start.Month, start.Year, 0, e2e.Employee.EmployeeOid, start.Day, end.Day, null, true, false); List serviceDetails = new List(); foreach (var so in qbs) { foreach (var s in so.Services) { ServicesOverviewRO.CreateGoalList(s); if (!s.GoalList.IsNullOrEmpty()) s.GoalList += "GOAL"; if (!s.GefahreneKilometer.IsNullOrEmpty()) serviceDetails.Add(s); } } //var kilometerRO = EmployeeKilometerauswertungsRO.Create(MapperFactory.CompactEmployeeDC_Employee.MapToNewDC(DAOFactory.GenericDAO.LoadByID(e2e.Employee.EmployeeOid)), serviceDescriptionOids, start, end); //kilometerRO.CreateDistanceList(); foreach (var item in e2e.Entries) { foreach (var sd in serviceDetails) { if (item.ServiceRecord.Oid == sd.ServiceRecordOid) { item.Dokumentation = sd.GoalList; } } } foreach (var item in e2e.Entries) { if (!String.IsNullOrEmpty(item.Dokumentation) && item.Dokumentation.Contains("GOAL")) item.Dokumentation = item.Dokumentation.Remove(item.Dokumentation.Length - 4, 4); } } report.SetReportDataSource(auswertungRO); return report as XtraReport; } public override XtraReport CreateServiceInvoiceReport(string dcIds, long? invoiceBaseOid) { if (String.IsNullOrEmpty(dcIds) && invoiceBaseOid.HasValue) { var serviceInvoice = DAOFactory.SearchDAO.GetServiceInvoiceByInvoiceBaseOid(invoiceBaseOid.Value); dcIds = String.Format("{0}", serviceInvoice.Oid); } if (!string.IsNullOrEmpty(dcIds)) { var dcList = new List(); var dcidStrs = dcIds.Split(';'); foreach (var oidStr in dcidStrs) { var oid = long.Parse(oidStr); var invoice = DAOFactory.GenericDAO.LoadByID(oid); var dc = MapperFactory.ServiceInvoiceDC_ServiceInvoice.MapToNewDC(invoice); dcList.Add(dc); } return CreateInvoiceReport(dcList); } return new XtraReport(); } private XtraReport CreateInvoiceReport(List invoices) { XtraReport allReports = null; foreach (var iDC in invoices) { XtraReport invoiceReport = null; if (iDC.InvoiceBase.InvoiceTypeText != null && iDC.InvoiceBase.InvoiceTypeText == "Abrechnung Schulbegleitender Dienst" && iDC.ServiceInvoicePeriods.Count > 0 && iDC.ServiceInvoicePeriods[0].SupportConceptApprovalPeriod.ServiceCategory != null) { XtraReport masterReport = new XtraReport(); masterReport.CreateDocument(); var seite1 = new ServiceInvoiceReport(); var ro = ServiceInvoiceRO.Create(iDC); seite1.SetReportDataSource(ro); seite1.CreateDocument(); int month = iDC.InvoiceBase.AccountingPeriodStart.Value.Month; int year = iDC.InvoiceBase.AccountingPeriodStart.Value.Year; long cOid = iDC.InvoiceBase.SupportConceptCostBearerRelDc.SupportConcept.Customer.CustomerOid; long oOid = iDC.InvoiceBase.RecipientOrganisationOid ?? 0; var qb = CreateServiceOverviewSingleCustomerReport(cOid, month, year, oOid, 0, null, 1, DateTime.DaysInMonth(year, month)); qb.CreateDocument(); masterReport.Pages.AddRange(seite1.Pages); masterReport.Pages.AddRange(qb.Pages); invoiceReport = masterReport; } else { IBeWoReport singleReport = FindReportImp(iDC.InvoiceBase.InvoiceId); var ro = ServiceInvoiceRO.Create(iDC); singleReport.SetReportDataSource(ro); ((XtraReport)singleReport).CreateDocument(); invoiceReport = singleReport as XtraReport; } if (allReports == null) allReports = invoiceReport; else ((XtraReport)allReports).Pages.AddRange(invoiceReport.Pages); } return allReports as XtraReport; } } }