using System; using System.Collections.Generic; using System.Data; using System.IO; using System.Linq; using BeWo.Data.Access; using BeWo.Data.Entities; using BeWo.Report; using BeWo.Report.DefaultReports; using BeWo.Report.ReportObjects; using BeWo.Service.DCEntityMapper; using BeWo.Service.Invoicing; using BeWo.Service.Plugins; using BS.Shared.Core; using BS.Shared.DataContracts; using BS.Shared.DataContracts.Compact; using DevExpress.XtraReports.UI; namespace PerspektivenEV { public class CustomReportCreator : DefaultReportCreator { public override XtraReport CreateQueryReport(long queryOid, string queryReportId) { if (queryOid == 207) { return CreateTestRechnungslauf(queryOid, queryReportId); } return base.CreateQueryReport(queryOid, queryReportId); } private XtraReport CreateTestRechnungslauf(long queryOid, string queryReportId) { var query = DAOFactory.GenericDAO.LoadByID(queryOid); if (query == null) return new XtraReport(); // ggf. noch nach Kostenträger differenzieren var path = Path.Combine(TempPath, queryReportId + ".xml"); var table = Utils.XMLDeserialize(path); var qro = QueryRO.Create(query, table); if (qro.Rows.Count > 0) { DateTime start = DateTime.Parse(qro.Rows[0].Field1.ToString()); DateTime end = start.AddMonths(1).AddDays(-1); DateTimeSpan span = new DateTimeSpan(); span.StartDate = start.Date; span.EndDate = end.Date; //.AddDays(1).AddTicks(-1); var costBearers = DAOFactory.GenericDAO.GetAllActive(); var cBBthg = costBearers.Where(c => c.Organisation.Function != null && c.Organisation.Function.Value.ToString().ToLower().Contains("bthg") && c.Organisation.Name != "SELBSTZAHLER").ToList(); var anhang = new FinanzauswertungTabBthgIntern(); List firstInv = new List(); foreach (var cb in cBBthg) { var invs = GenerateInitialServiceInvoices(cb.Oid.Value, span); if (invs != null) { if (firstInv.Count == 0) { var count = 0; foreach (var i in invs) { count += 1; if (count > 1 && i.ServiceInvoicePeriods != null && i.ServiceInvoicePeriods.Count > 0) { foreach (var sip in i.ServiceInvoicePeriods) { invs[0].ServiceInvoicePeriods.Add(sip); } } } ServiceInvoiceRO roSingle = ServiceInvoiceRO.Create(invs[0]); if (roSingle.GrossClaim != "0,00 €") { firstInv.Add(invs[0]); } } else { foreach (var i in invs) { if (i.ServiceInvoicePeriods != null && i.ServiceInvoicePeriods.Count > 0) { foreach (var sip in i.ServiceInvoicePeriods) { firstInv[0].ServiceInvoicePeriods.Add(sip); } } } } } } ServiceInvoiceRO ro = ServiceInvoiceRO.Create(firstInv[0]); anhang.SetReportDataSource(ro); anhang.CreateDocument(); if (queryOid == 207) // die wollen die Rechnungsvorschau nur in Excel sprich Trennung von Sammelrechnung Spitzabrechnungsreports { return (XtraReport)anhang; } else { var anhang2 = new LwvKASpitzabrechnung(); return (XtraReport)anhang2; } } return new XtraReport(); } public List GenerateInitialServiceInvoices(long costBearerOid, DateTimeSpan invoicePeriod) { var cs = PluginLoader.FindClass(); IEnumerable supportConcepts; // GetAllActiveSupportConceptCostbearer returns a "Flat" SupportConcept List, one for each CostBearer2SupportConcept! supportConcepts = cs.GetAllActiveSupportConceptCostbearer(false, true, 0) .Where(i => i.CostBearerOids2CostBearerRelOids.ContainsKey(costBearerOid)); supportConcepts = supportConcepts.Where(sc => sc.StartDate < invoicePeriod.EndDateTime && sc.EndDate >= invoicePeriod.StartDate); var supportConcepts2ServiceRecords = supportConcepts.ToDictionary( i => i, i => MapperFactory.ServiceRecordDC_ServiceRecord.MapToNewDCs( DAOFactory.SearchDAO.FindServiceRecordsInSpan(i.CostBearerRelOids[0], invoicePeriod))); var cb = DAOFactory.GenericDAO.LoadByID(costBearerOid); String tenant = PluginLoader.Tenant; var factory = PluginLoader.FindClass(cb.ID); if (factory == null) { factory = InvoiceFactory.GetInstance(cb.ID, tenant); } var creator = factory.CreateInvoiceCreator(cb.ID, tenant, supportConcepts2ServiceRecords); var newInvoices = creator.GenerateServiceInvoices(costBearerOid, invoicePeriod, supportConcepts2ServiceRecords); return newInvoices; } 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; IBeWoReport singleReport = FindReportImp(iDC.InvoiceBase.InvoiceId); if (iDC.InvoiceBase != null && iDC.InvoiceBase.InvoiceId != null && iDC.InvoiceBase.InvoiceId == "Sammelrechnung"|| (iDC.InvoiceBase.InvoiceId == "SammelrechnungBthg")) { var ro = ServiceInvoiceRO.Create(iDC); singleReport.SetReportDataSource(ro); ((XtraReport)singleReport).CreateDocument(); invoiceReport = singleReport as XtraReport; if (iDC.InvoiceBase.InvoiceId == "Sammelrechnung") { var anhang = new SammelrechnungTab(); anhang.SetReportDataSource(ro); anhang.CreateDocument(); ((XtraReport)singleReport).Pages.AddRange(((XtraReport)anhang).Pages); invoiceReport = singleReport as XtraReport; } if (iDC.InvoiceBase.InvoiceId == "SammelrechnungBthg") { var anhang = new SammelrechnungTabBthg(); anhang.SetReportDataSource(ro); anhang.CreateDocument(); ((XtraReport)singleReport).Pages.AddRange(((XtraReport)anhang).Pages); if (ro.ServiceInvoicePeriods != null && ro.ServiceInvoicePeriods.Count > 0) { foreach (var sip in ro.ServiceInvoicePeriods) { if (sip.ServiceInvoiceItems != null && sip.ServiceInvoiceItems.Count > 1 && sip.SupportConceptApprovalPeriod.ServiceCategory.Abbreviation.Substring(sip.SupportConceptApprovalPeriod.ServiceCategory.Abbreviation.Length - 2) == "KA" && iDC.InvoiceBase.AccountingPeriodStart.HasValue && iDC.InvoiceBase.AccountingPeriodStart.Value < new DateTime(2026, 7, 1)) // KA-Spitzabrechnung entfaellt ab 01.07.2026 { var anhang2 = new LwvKASpitzabrechnung(); var kaRo = LwvKASpitzabrechnungRO.Create(sip.CostBearer2SupportConcept.Oid.Value, ro.AccountingPeriodEnd, sip.SupportConceptApprovalPeriod.Oid.Value, null); anhang2.SetReportDataSource(kaRo); anhang2.CreateDocument(); ((XtraReport)singleReport).Pages.AddRange(((XtraReport)anhang2).Pages); } } } invoiceReport = singleReport as XtraReport; } } else if (iDC.InvoiceBase.RecipientOrganisation != "Landeswohlfahrtsverband Hessen" && iDC.InvoiceBase.Type.ToString() == "Service" && iDC.ServiceInvoicePeriods.Count > 0 && iDC.ServiceInvoicePeriods[0].SupportConceptApprovalPeriod != null && iDC.ServiceInvoicePeriods[0].SupportConceptApprovalPeriod.ServiceCategory != null && (iDC.ServiceInvoicePeriods[0].SupportConceptApprovalPeriod.ServiceCategory.Name.Contains("BW") || iDC.ServiceInvoicePeriods[0].SupportConceptApprovalPeriod.ServiceCategory.Name.Contains("TS"))) { //XtraReport masterReport = new XtraReport(); //masterReport.CreateDocument(); var seite1 = new ServiceInvoiceReport(); var ro = ServiceInvoiceRO.Create(iDC); seite1.SetReportDataSource(ro); seite1.CreateDocument(); //masterReport.Pages.AddRange(seite1.Pages); //foreach (DevExpress.XtraPrinting.Page item in masterReport.Pages) //{ // item.AssignWatermark(seite1.Watermark); //} 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(); seite1.Pages.AddRange(qb.Pages); invoiceReport = seite1; } else { var ro = ServiceInvoiceRO.Create(iDC); singleReport.SetReportDataSource(ro); ((XtraReport)singleReport).CreateDocument(); invoiceReport = singleReport as XtraReport; if (iDC.InvoiceBase.InvoiceId == "Sammelrechnung") { var anhang = new SammelrechnungTab(); anhang.SetReportDataSource(ro); anhang.CreateDocument(); ((XtraReport)singleReport).Pages.AddRange(((XtraReport)anhang).Pages); invoiceReport = singleReport as XtraReport; } if (iDC.InvoiceBase.InvoiceId == "SammelrechnungBthg") { var anhang = new SammelrechnungTabBthg(); anhang.SetReportDataSource(ro); anhang.CreateDocument(); ((XtraReport)singleReport).Pages.AddRange(((XtraReport)anhang).Pages); invoiceReport = singleReport as XtraReport; } if (iDC.InvoiceBase.SupportConceptCostBearerRelDc != null) { var customerDC = MapperFactory.CustomerDC_Customer.MapToNewDC(DAOFactory.GenericDAO.GetByID(iDC.InvoiceBase.SupportConceptCostBearerRelDc.SupportConcept.Customer.CustomerOid)); if (customerDC.RelatedTeams.Any(t => t.Team.Name.ToLower().Contains("pfk"))) { 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(); invoiceReport.Pages.AddRange(qb.Pages); } } } if (allReports == null) allReports = invoiceReport; else ((XtraReport)allReports).Pages.AddRange(invoiceReport.Pages); } return allReports as XtraReport; } public override XtraReport CreateUserListReport(List oids) { var queryReport = FindReportImp(null, "Benutzergruppen"); var lUser = DAOFactory.GenericDAO.LoadByIDs(oids); var teams = DAOFactory.GenericDAO.GetAllActive(); string[] lHeaderCaption = { "Mitarbeiter", // 0 "Login", // 1 "zugeordnete Benutzergruppen", // 2 "Teams", // 3 }; string[][] lContent = new string[lUser.Count][]; for (int iRowCount = 0; iRowCount < lUser.Count; iRowCount++) { lContent[iRowCount] = new string[lHeaderCaption.Count()]; if (lUser[iRowCount].Employee != null) lContent[iRowCount][0] = lUser[iRowCount].Employee.Person.FirstNameLastName; else lContent[iRowCount][0] = string.Empty; if (lUser[iRowCount].LoginName != null) lContent[iRowCount][1] = lUser[iRowCount].LoginName; else lContent[iRowCount][1] = string.Empty; if (lUser[iRowCount].UserGroups != null && lUser[iRowCount].UserGroups.Count > 0) lContent[iRowCount][2] = string.Join(", ", lUser[iRowCount].UserGroups.Select( r => r.Name).OrderBy(s => s).ToArray()); else lContent[iRowCount][2] = string.Empty; // ZUSÄTZLICHE SPALTE FÜR TEAMS string teamsString = ""; foreach (var team in teams) { if (team.MemberList.Any(m => m.Oid == lUser[iRowCount].Employee.Oid)) teamsString += team.Name + ", "; } if (teamsString != "") { teamsString = teamsString.Remove(teamsString.Length - 2, 2); lContent[iRowCount][3] = teamsString; } else lContent[iRowCount][3] = string.Empty; } // Zweidimensionales Array zu DataTable konvertieren DataTable table = new DataTable(); int columnNumber = 4; for (int i = 0; i < columnNumber; i++) table.Columns.Add(lHeaderCaption[i], typeof(string)); int rowNumber = lContent.GetLength(0); for (int i = 0; i < rowNumber; i++) { DataRow row = table.NewRow(); for (int j = 0; j < columnNumber; j++) { row[j] = lContent[i][j]; } table.Rows.Add(row); } var queryReportObject = QueryRO.Create(new Query() { Title = "Benutzer inkl. Teams" }, table); queryReportObject.Name = "Benutzer inkl. Teams"; queryReport.SetReportDataSource(queryReportObject); return queryReport as XtraReport; } public override XtraReport CreateServiceRecordListReport(long employeeOid, long customerOid, long supportConceptOid, long costbearer2SupportConceptOid, bool isLimitedToAdditionalServices, DateTimeSpan limitingTimeSpan) { IBeWoReport lServiceRecordListReport = new Leistungen(); if (customerOid > 0) { var customer = MapperFactory.CustomerDC_Customer.MapToNewDC(DAOFactory.GenericDAO.GetByID(customerOid)); if (customer.RelatedTeams.Any(t => t.Team.Name.ToLower().Contains("pfk"))) lServiceRecordListReport = new LeistungenPFK(); } var ro = ServiceRecordListRO.Create(employeeOid, customerOid, supportConceptOid, costbearer2SupportConceptOid, isLimitedToAdditionalServices, limitingTimeSpan); lServiceRecordListReport.SetReportDataSource(ro); return lServiceRecordListReport as XtraReport; } public override XtraReport CreateServiceOverviewAllCustomersReport(int month, int year, long orgaOid, long empOid, long? serviceCategoryOid, int startDay, int endDay) { List lROs = ServicesOverviewRO.Create(month, year, orgaOid, empOid, startDay, endDay); if (lROs.Count > 0) { var rootReport = CreateServicesOverviewReportForRo(lROs[0], serviceCategoryOid); rootReport.CreateDocument(); for (int i = 1; i < lROs.Count; i++) { var lNext = CreateServicesOverviewReportForRo(lROs[i], serviceCategoryOid); lNext.CreateDocument(); rootReport.Pages.AddRange(lNext.Pages); } return rootReport; } return new XtraReport(); } public override XtraReport CreateServiceOverviewSingleCustomerReport(long customerOid, int month, int year, long orgaOid, long empOid, long? serviceCategoryOid, int startDay, int endDay) { var ro = ServicesOverviewRO.Create(customerOid, month, year, false, orgaOid, empOid, startDay, endDay, serviceCategoryOid); return CreateServicesOverviewReportForRo(ro, serviceCategoryOid); } private XtraReport CreateServicesOverviewReportForRo(ServicesOverviewRO ro, long? serviceCategoryOid) { IBeWoReport report = null; var customer = MapperFactory.CustomerDC_Customer.MapToNewDC(DAOFactory.GenericDAO.GetByID(ro.CustomerOid)); if (customer.RelatedTeams.Any(t => t.Team.Name.ToLower().Contains("pfk"))) { report = new QuittierungsbelegPfk(); } if (report == null) report = new Quittierungsbeleg(); report.SetReportDataSource(ro); return report as XtraReport; } } }