From 7f40fb9887dec1e91596f37c9d1f924540b2081a Mon Sep 17 00:00:00 2001 From: Alexandra Date: Fri, 10 Jul 2026 08:34:31 +0200 Subject: [PATCH 1/6] CaritasverbandDuerenJuelichEV - im Sammeldruck RE immer mit QB, Einzeldruck Rechnungsname angepasst SupportOID=167605 --- .../CaritasverbandDuerenJuelichEV.csproj | 1 + .../CustomReportCreator.cs | 81 +++++++++++++++++++ .../ServiceInvoiceReport.Designer.cs | 50 ++++++------ .../ServiceInvoiceReport.cs | 6 ++ .../ServiceInvoiceReport.resx | 2 +- 5 files changed, 116 insertions(+), 24 deletions(-) create mode 100644 ReportImp/CaritasverbandDuerenJuelichEV/CustomReportCreator.cs diff --git a/ReportImp/CaritasverbandDuerenJuelichEV/CaritasverbandDuerenJuelichEV.csproj b/ReportImp/CaritasverbandDuerenJuelichEV/CaritasverbandDuerenJuelichEV.csproj index 613dd7ee8..7d27577b3 100644 --- a/ReportImp/CaritasverbandDuerenJuelichEV/CaritasverbandDuerenJuelichEV.csproj +++ b/ReportImp/CaritasverbandDuerenJuelichEV/CaritasverbandDuerenJuelichEV.csproj @@ -58,6 +58,7 @@ + Component diff --git a/ReportImp/CaritasverbandDuerenJuelichEV/CustomReportCreator.cs b/ReportImp/CaritasverbandDuerenJuelichEV/CustomReportCreator.cs new file mode 100644 index 000000000..ca3d759eb --- /dev/null +++ b/ReportImp/CaritasverbandDuerenJuelichEV/CustomReportCreator.cs @@ -0,0 +1,81 @@ +using System.Collections.Generic; +using BeWo.Data.Access; +using BeWo.Data.Entities; +using BeWo.Report; +using BS.Shared; +using DevExpress.XtraReports.UI; + +namespace CaritasverbandDuerenJuelichEV +{ + public class CustomReportCreator : DefaultReportCreator + { + /// Sammeldruck aus der Rechnungsuebersicht ("Ausgewaehlte drucken"): + /// An jede Rechnung wird automatisch der Quittierungsbeleg angehaengt - wie beim Einzeldruck "mit Quittierungsbeleg". + public override XtraReport CreateInvoiceListReport(List oids) + { + XtraReport master = null; + var ibList = DAOFactory.GenericDAO.LoadByIDs(oids); + + foreach (var ib in ibList) + { + XtraReport report = null; + if (ib.Type == InvoiceType.Service) + { + report = CreateServiceInvoiceReport(null, ib.Oid); + } + else if (ib.Type == InvoiceType.Settlement) + { + report = CreateSettlementReport(null, ib.Oid); + } + else + { + report = CreateCustomerInvoiceReport(ib.Oid.Value); + } + + if (report != null) + { + report.Watermark.PageRange = "1"; + if (report.Pages.Count == 0) + { + report.CreateDocument(); + } + + var qb = CreateBelegeForInvoice(ib); + AddReportPagesToMaster(report, qb); + if (master == null) + { + master = report; + } + else + { + XRWatermark wm = new XRWatermark(); + wm.CopyFrom(report.Watermark); + + bool firstpage = true; + foreach (var item in report.Pages) + { + var page2add = item as DevExpress.XtraPrinting.Page; + if (page2add != null) + { + master.Pages.Add(page2add); + if (firstpage) + { + var newpage = master.Pages[master.Pages.Count - 1]; + newpage.AssignWatermark(wm); + } + } + firstpage = false; + } + } + } + } + if (master == null) + { + master = new XtraReport(); + } + master.PrintingSystem.Document.Name = "Sammeldruck"; + + return master; + } + } +} diff --git a/ReportImp/CaritasverbandDuerenJuelichEV/ServiceInvoiceReport.Designer.cs b/ReportImp/CaritasverbandDuerenJuelichEV/ServiceInvoiceReport.Designer.cs index abd997a21..358a881a5 100644 --- a/ReportImp/CaritasverbandDuerenJuelichEV/ServiceInvoiceReport.Designer.cs +++ b/ReportImp/CaritasverbandDuerenJuelichEV/ServiceInvoiceReport.Designer.cs @@ -33,7 +33,7 @@ namespace CaritasverbandDuerenJuelichEV DevExpress.XtraReports.UI.XRWatermark xrWatermark1 = new DevExpress.XtraReports.UI.XRWatermark(); this.Detail = new DevExpress.XtraReports.UI.DetailBand(); this.ReportHeader = new DevExpress.XtraReports.UI.ReportHeaderBand(); - this.xrLabel2 = new DevExpress.XtraReports.UI.XRLabel(); + this.lblRechnungsnamen = new DevExpress.XtraReports.UI.XRLabel(); this.ruleRateFactorNull = new DevExpress.XtraReports.UI.FormattingRule(); this.topMarginBand1 = new DevExpress.XtraReports.UI.TopMarginBand(); this.bottomMarginBand1 = new DevExpress.XtraReports.UI.BottomMarginBand(); @@ -113,10 +113,10 @@ namespace CaritasverbandDuerenJuelichEV this.GroupFooter1 = new DevExpress.XtraReports.UI.GroupFooterBand(); this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components); this.ReportFooter = new DevExpress.XtraReports.UI.ReportFooterBand(); + this.xrPictureBox1 = new DevExpress.XtraReports.UI.XRPictureBox(); this.xrLabel15 = new DevExpress.XtraReports.UI.XRLabel(); this.xrLabel1 = new DevExpress.XtraReports.UI.XRLabel(); this.xrLabel5 = new DevExpress.XtraReports.UI.XRLabel(); - this.xrPictureBox1 = new DevExpress.XtraReports.UI.XRPictureBox(); ((System.ComponentModel.ISupportInitialize)(this.xrTable5)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.xrTable2)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.xrTable6)).BeginInit(); @@ -135,25 +135,28 @@ namespace CaritasverbandDuerenJuelichEV // ReportHeader // this.ReportHeader.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] { - this.xrLabel2}); + this.lblRechnungsnamen}); this.ReportHeader.Dpi = 254F; this.ReportHeader.Font = new DevExpress.Drawing.DXFont("Verdana", 10F); this.ReportHeader.HeightF = 381.5291F; this.ReportHeader.Name = "ReportHeader"; this.ReportHeader.StylePriority.UseFont = false; // - // xrLabel2 + // lblRechnungsnamen // - this.xrLabel2.Borders = DevExpress.XtraPrinting.BorderSide.None; - this.xrLabel2.Dpi = 254F; - this.xrLabel2.Font = new DevExpress.Drawing.DXFont("Arial", 9.75F, DevExpress.Drawing.DXFontStyle.Regular, DevExpress.Drawing.DXGraphicsUnit.Point, new DevExpress.Drawing.DXFontAdditionalProperty[] { + this.lblRechnungsnamen.Borders = DevExpress.XtraPrinting.BorderSide.None; + this.lblRechnungsnamen.CanGrow = false; + this.lblRechnungsnamen.Dpi = 254F; + this.lblRechnungsnamen.Font = new DevExpress.Drawing.DXFont("Arial", 9.75F, DevExpress.Drawing.DXFontStyle.Regular, DevExpress.Drawing.DXGraphicsUnit.Point, new DevExpress.Drawing.DXFontAdditionalProperty[] { new DevExpress.Drawing.DXFontAdditionalProperty("GdiCharSet", ((byte)(0)))}); - this.xrLabel2.LocationFloat = new DevExpress.Utils.PointFloat(733.4296F, 193.9921F); - this.xrLabel2.Name = "xrLabel2"; - this.xrLabel2.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 254F); - this.xrLabel2.SizeF = new System.Drawing.SizeF(153.4583F, 58.42004F); - this.xrLabel2.StylePriority.UseBorders = false; - this.xrLabel2.StylePriority.UseFont = false; + this.lblRechnungsnamen.ForeColor = System.Drawing.Color.Transparent; + this.lblRechnungsnamen.LocationFloat = new DevExpress.Utils.PointFloat(847.2004F, 193.9921F); + this.lblRechnungsnamen.Name = "lblRechnungsnamen"; + this.lblRechnungsnamen.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 254F); + this.lblRechnungsnamen.SizeF = new System.Drawing.SizeF(39.6875F, 58.42004F); + this.lblRechnungsnamen.StylePriority.UseBorders = false; + this.lblRechnungsnamen.StylePriority.UseFont = false; + this.lblRechnungsnamen.StylePriority.UseForeColor = false; // // ruleRateFactorNull // @@ -1453,6 +1456,15 @@ namespace CaritasverbandDuerenJuelichEV this.ReportFooter.HeightF = 506.1849F; this.ReportFooter.Name = "ReportFooter"; // + // xrPictureBox1 + // + this.xrPictureBox1.Dpi = 254F; + this.xrPictureBox1.ImageSource = new DevExpress.XtraPrinting.Drawing.ImageSource("img", resources.GetString("xrPictureBox1.ImageSource")); + this.xrPictureBox1.LocationFloat = new DevExpress.Utils.PointFloat(65.36116F, 350.0807F); + this.xrPictureBox1.Name = "xrPictureBox1"; + this.xrPictureBox1.SizeF = new System.Drawing.SizeF(441.7936F, 156.1042F); + this.xrPictureBox1.Sizing = DevExpress.XtraPrinting.ImageSizeMode.ZoomImage; + // // xrLabel15 // this.xrLabel15.Dpi = 254F; @@ -1492,15 +1504,6 @@ namespace CaritasverbandDuerenJuelichEV this.xrLabel5.StylePriority.UseFont = false; this.xrLabel5.Text = "Mit freundlichen Grüßen"; // - // xrPictureBox1 - // - this.xrPictureBox1.Dpi = 254F; - this.xrPictureBox1.ImageSource = new DevExpress.XtraPrinting.Drawing.ImageSource("img", resources.GetString("xrPictureBox1.ImageSource")); - this.xrPictureBox1.LocationFloat = new DevExpress.Utils.PointFloat(65.36116F, 350.0807F); - this.xrPictureBox1.Name = "xrPictureBox1"; - this.xrPictureBox1.SizeF = new System.Drawing.SizeF(441.7936F, 156.1042F); - this.xrPictureBox1.Sizing = DevExpress.XtraPrinting.ImageSizeMode.ZoomImage; - // // ServiceInvoiceReport // this.Bands.AddRange(new DevExpress.XtraReports.UI.Band[] { @@ -1526,6 +1529,7 @@ namespace CaritasverbandDuerenJuelichEV this.Version = "23.2"; xrWatermark1.Id = "Watermark1"; this.Watermarks.Add(xrWatermark1); + this.AfterPrint += new System.EventHandler(this.ChangeName); ((System.ComponentModel.ISupportInitialize)(this.xrTable5)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.xrTable2)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.xrTable6)).EndInit(); @@ -1564,7 +1568,7 @@ namespace CaritasverbandDuerenJuelichEV private DevExpress.XtraReports.UI.XRTableCell xrTableCell7; private DevExpress.XtraReports.UI.XRLabel xrLabel9; private DevExpress.XtraReports.UI.XRLabel xrLabel13; - private DevExpress.XtraReports.UI.XRLabel xrLabel2; + private DevExpress.XtraReports.UI.XRLabel lblRechnungsnamen; private DevExpress.XtraReports.UI.XRTable xrTable2; private DevExpress.XtraReports.UI.XRTableRow xrTableRow2; private DevExpress.XtraReports.UI.XRTableCell xrTableCell1; diff --git a/ReportImp/CaritasverbandDuerenJuelichEV/ServiceInvoiceReport.cs b/ReportImp/CaritasverbandDuerenJuelichEV/ServiceInvoiceReport.cs index b13cc00e7..bdeba7d3e 100644 --- a/ReportImp/CaritasverbandDuerenJuelichEV/ServiceInvoiceReport.cs +++ b/ReportImp/CaritasverbandDuerenJuelichEV/ServiceInvoiceReport.cs @@ -20,6 +20,7 @@ namespace CaritasverbandDuerenJuelichEV public void SetReportDataSource(ServiceInvoiceRO pRO) { lblRechnungsnummer.Text = pRO.InvoiceNumber; + lblRechnungsnamen.Text = pRO.CustomerLastName + ", " + pRO.CustomerFirstName + " - RE" + pRO.InvoiceNumber; lblBewZeitraum.Text = String.Format("{0:dd.MM.yyyy} bis {1:dd.MM.yyyy}", pRO.InvoiceBase.SupportConceptCostBearerRelDc.StartDate, pRO.InvoiceBase.SupportConceptCostBearerRelDc.EndDate); SetBetreuung(pRO); @@ -95,5 +96,10 @@ namespace CaritasverbandDuerenJuelichEV } } } + + private void ChangeName(object sender, EventArgs e) + { + PrintingSystem.Document.Name = lblRechnungsnamen.Text; + } } } \ No newline at end of file diff --git a/ReportImp/CaritasverbandDuerenJuelichEV/ServiceInvoiceReport.resx b/ReportImp/CaritasverbandDuerenJuelichEV/ServiceInvoiceReport.resx index 5f9a8e89d..b7db841ca 100644 --- a/ReportImp/CaritasverbandDuerenJuelichEV/ServiceInvoiceReport.resx +++ b/ReportImp/CaritasverbandDuerenJuelichEV/ServiceInvoiceReport.resx @@ -118,6 +118,6 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 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 \ No newline at end of file From 005bb631eb54bb15d42e9b67b48251f7751e191a Mon Sep 17 00:00:00 2001 From: Alexandra Date: Fri, 10 Jul 2026 11:49:08 +0200 Subject: [PATCH 2/6] =?UTF-8?q?CaritasVerbandDuerenJuelichEvBeWo/Export/Di?= =?UTF-8?q?amantExporter=20-=20PDF=20auch=20mit=20=C3=9Cbersicht=20exporti?= =?UTF-8?q?erte=20Rgen=20und=20Gesamtsumme=20SupportOID=3D167443?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Export/DiamantExporter.cs | 158 +++++++++++++----- 1 file changed, 114 insertions(+), 44 deletions(-) diff --git a/ReportImp/CaritasVerbandDuerenJuelichEvBeWo/Export/DiamantExporter.cs b/ReportImp/CaritasVerbandDuerenJuelichEvBeWo/Export/DiamantExporter.cs index 3fabd1dcb..5164176c8 100644 --- a/ReportImp/CaritasVerbandDuerenJuelichEvBeWo/Export/DiamantExporter.cs +++ b/ReportImp/CaritasVerbandDuerenJuelichEvBeWo/Export/DiamantExporter.cs @@ -49,10 +49,12 @@ namespace CaritasverbandDuerenJuelichEV.Export else { query.FileName = String.Format("005F{0:yyyyMM}.er2", dt); + var dtMonatlich = ExecuteQuery(GetMonatlicheAbrechnungSql(), dt); + var dtSpitz = ExecuteQuery(GetSpitzabrechnungSql(), dt); var dtAbgrenzungen = ExecuteQuery(GetAbgrenzungsLvrLwlSql(), dt); Dictionary oid2InvoiceNumbers; - query.QueryResult = GetAbrechnungenString(dt, customerOid, dtAbgrenzungen, out oid2InvoiceNumbers); - query.Attachments = CreateAttachmentFile(dt, dtAbgrenzungen, oid2InvoiceNumbers); + query.QueryResult = GetAbrechnungenString(dt, customerOid, dtMonatlich, dtSpitz, dtAbgrenzungen, out oid2InvoiceNumbers); + query.Attachments = CreateAttachmentFile(dt, dtMonatlich, dtSpitz, dtAbgrenzungen, oid2InvoiceNumbers); } } @@ -158,22 +160,22 @@ namespace CaritasverbandDuerenJuelichEV.Export public static String GetAbrechnungenString(DateTime date, long? customerOid, DataTable dtAbgrenzungen = null) { Dictionary _; - return GetAbrechnungenString(date, customerOid, dtAbgrenzungen, out _); + return GetAbrechnungenString(date, customerOid, null, null, dtAbgrenzungen, out _); } - public static String GetAbrechnungenString(DateTime date, long? customerOid, DataTable dtAbgrenzungen, out Dictionary oid2InvoiceNumbers) + public static String GetAbrechnungenString(DateTime date, long? customerOid, DataTable dtMonatlich, DataTable dtSpitz, DataTable dtAbgrenzungen, out Dictionary oid2InvoiceNumbers) { StringBuilder sb = new StringBuilder(); // 1. Monatliche Abrechnungen - var s = GetMonatlicheAbrechnungString(date, customerOid); + var s = GetMonatlicheAbrechnungString(date, customerOid, dtMonatlich); if (!String.IsNullOrWhiteSpace(s)) { sb.Append(s); } // 2. Spitzabrechnungen - s = GetSpitzabrechnungString(date, customerOid); + s = GetSpitzabrechnungString(date, customerOid, dtSpitz); if (!String.IsNullOrWhiteSpace(s)) { if (sb.Length > 0) @@ -182,7 +184,7 @@ namespace CaritasverbandDuerenJuelichEV.Export } // 3. Abgrenzungsbuchungen LVR/LWL - // DataTable wird von außen übergeben (aus CreateQuery), um doppelte SQL-Ausführung zu vermeiden. + // DataTables werden von außen übergeben (aus CreateQuery), um doppelte SQL-Ausführung zu vermeiden. // Falls nicht übergeben (z.B. aus CreateExportString), wird die SQL hier ausgeführt. var abgrenzungenTable = dtAbgrenzungen ?? ExecuteQuery(GetAbgrenzungsLvrLwlSql(), date); s = GetAbgrenzungsString(abgrenzungenTable, out oid2InvoiceNumbers); @@ -199,19 +201,19 @@ namespace CaritasverbandDuerenJuelichEV.Export return sb.ToString(); } - public static String GetMonatlicheAbrechnungString(DateTime date, long? customerOid) + public static String GetMonatlicheAbrechnungString(DateTime date, long? customerOid, DataTable dtMonatlich = null) { // Export enthält Rechnungsangaben Zeilen (Zeile F) und Kostenstellen/Rechnungspositionsangaben (Zeile K) in zwei Zeilen // Kommen aus Export in einer Zeile und werden hier getrennt, aber nur falls die Rechnung mehrere Positionen hat // Systemrechnungsnummern (ib.InvoiceNumber) werden direkt verwendet, kein Generator - var dt = ExecuteQuery(GetMonatlicheAbrechnungSql(), date); + var dt = dtMonatlich ?? ExecuteQuery(GetMonatlicheAbrechnungSql(), date); return BuildDiamantLines(dt, null); } - public static String GetSpitzabrechnungString(DateTime date, long? customerOid) + public static String GetSpitzabrechnungString(DateTime date, long? customerOid, DataTable dtSpitz = null) { // Systemrechnungsnummern (ib.InvoiceNumber) werden direkt verwendet, kein Generator - var dt = ExecuteQuery(GetSpitzabrechnungSql(), date); + var dt = dtSpitz ?? ExecuteQuery(GetSpitzabrechnungSql(), date); return BuildDiamantLines(dt, null); } @@ -559,49 +561,36 @@ ORDER BY stunden.LastName, stunden.FirstName return sql; } - private static List CreateAttachmentFile(DateTime date, DataTable dtAbgrenzungen, Dictionary oid2GeneratedNumber) + private static List CreateAttachmentFile(DateTime date, DataTable dtMonatlich, DataTable dtSpitz, DataTable dtAbgrenzungen, Dictionary oid2GeneratedNumber) { try { - // Spalten aus der bereits ausgeführten Abgrenzungs-DataTable verwenden: - // 0 = OID, 11 = DebitorNumber, 12 = 'Abgrenzung OrgName', 15 = Betrag, 16 = 'Abgr. Nachname, Vorname' - DataTable table = new DataTable(); - string[] spalten = { "Rechnungsnr.", "Empfänger", "Debitornr.", "Erlöskonto", "Kostenstelle", "Verwendung", "Betrag" }; - foreach (var spalte in spalten) - table.Columns.Add(spalte, typeof(string)); + // Block 1: Rechnungen (monatliche Abrechnungen + Spitzabrechnungen) mit Zwischensumme + decimal summeRechnungen = 0; + DataTable tableRechnungen = CreateBelegTable(); + summeRechnungen += AddBelegRows(tableRechnungen, dtMonatlich, null, null, "Re. "); + summeRechnungen += AddBelegRows(tableRechnungen, dtSpitz, null, null, "Re. "); + AddSummenRow(tableRechnungen, "Summe Rechnungen", summeRechnungen); - foreach (DataRow booking in dtAbgrenzungen.Rows) - { - string oid = booking[0].ToString(); - string invoiceNumber = String.Empty; - if (oid2GeneratedNumber != null && oid2GeneratedNumber.ContainsKey(oid)) - invoiceNumber = oid2GeneratedNumber[oid]; + // Block 2 (nach Seitenumbruch): Abgrenzungsbuchungen mit Zwischensumme und Gesamtsumme + decimal summeAbgrenzungen = 0; + DataTable tableAbgrenzungen = CreateBelegTable(); + summeAbgrenzungen += AddBelegRows(tableAbgrenzungen, dtAbgrenzungen, oid2GeneratedNumber, "Abgrenzung ", "Abgr. "); + AddSummenRow(tableAbgrenzungen, "Summe Abgrenzungen", summeAbgrenzungen); + AddSummenRow(tableAbgrenzungen, "Gesamtsumme", summeRechnungen + summeAbgrenzungen); - string erloeskonto = SetKonto(booking[12]); + var reportRechnungen = CreateBelegReport(String.Format("Buchungsbeleg {0:MMMM yyyy} - Rechnungen", date), tableRechnungen); + var reportAbgrenzungen = CreateBelegReport(String.Format("Buchungsbeleg {0:MMMM yyyy} - Abgrenzungsbuchungen", date), tableAbgrenzungen); - DataRow row = table.NewRow(); - row[0] = invoiceNumber; - row[1] = booking[12].ToString().Replace("Abgrenzung ", ""); - row[2] = booking[11]; - row[3] = erloeskonto; - row[4] = booking[36]; // c.CostCenter - row[5] = booking[16].ToString().Replace("Abgr. ", ""); - row[6] = String.Format("{0:0.00}", booking[15]); - table.Rows.Add(row); - } - - var queryReportObject = QueryRO.Create(new Query() { Title = "Export" }, table); - queryReportObject.Name = String.Format("Abgrenzungsbuchungen {0:MMMM yyyy}", date); - - var queryReport = new Bericht(); - queryReport.SetReportDataSource(queryReportObject); - queryReport.CreateDocument(); + // Beide Berichte zu einem PDF zusammenführen → Abgrenzungen beginnen auf neuer Seite + reportRechnungen.Pages.AddRange(reportAbgrenzungen.Pages); + reportRechnungen.PrintingSystem.ContinuousPageNumbering = true; var pdf = new FileAttachmentDC(); - pdf.FileName = String.Format("Abgrenzungsbuchungen{0:MMyyyy}.pdf", date); + pdf.FileName = String.Format("Buchungsbeleg{0:MMyyyy}.pdf", date); using (var ms = new MemoryStream()) { - queryReport.ExportToPdf(ms); + reportRechnungen.ExportToPdf(ms); pdf.BinaryData = ms.ToArray(); } @@ -613,6 +602,87 @@ ORDER BY stunden.LastName, stunden.FirstName } } + private static DataTable CreateBelegTable() + { + DataTable table = new DataTable(); + string[] spalten = { "Rechnungsnr.", "Empfänger", "Debitornr.", "Erlöskonto", "Kostenstelle", "Verwendung", "Betrag" }; + foreach (var spalte in spalten) + { + table.Columns.Add(spalte, typeof(string)); + } + return table; + } + + // Spaltenpositionen sind in allen drei Buchungs-DataTables identisch: + // 0 = OID, 10 = InvoiceNumber, 11 = DebitorNumber, 12 = Buchungstext, 15 = Betrag, 16 = Verwendung, 36 = c.CostCenter + // Dedupliziert wie BuildDiamantLines über die OID (Spalte 0), damit Rechnungen mit mehreren Positionen nur einmal (F-Zeilen-Betrag) erscheinen. + // Rückgabe: Summe der Beträge der ausgegebenen Zeilen. + private static decimal AddBelegRows(DataTable table, DataTable dtBookings, Dictionary oid2GeneratedNumber, string empfaengerPrefix, string verwendungPrefix) + { + decimal summe = 0; + HashSet seenOids = new HashSet(); + + foreach (DataRow booking in dtBookings.Rows) + { + string oid = booking[0].ToString(); + if (!seenOids.Add(oid)) + { + continue; + } + + string invoiceNumber = booking[10].ToString(); + if (oid2GeneratedNumber != null && oid2GeneratedNumber.ContainsKey(oid)) + { + invoiceNumber = oid2GeneratedNumber[oid]; + } + + string empfaenger = booking[12].ToString(); + if (!String.IsNullOrEmpty(empfaengerPrefix)) + { + empfaenger = empfaenger.Replace(empfaengerPrefix, ""); + } + + string verwendung = booking[16].ToString(); + if (!String.IsNullOrEmpty(verwendungPrefix)) + { + verwendung = verwendung.Replace(verwendungPrefix, ""); + } + + DataRow row = table.NewRow(); + row[0] = invoiceNumber; + row[1] = empfaenger; + row[2] = booking[11]; + row[3] = SetKonto(booking[12]); + row[4] = booking[36]; + row[5] = verwendung; + row[6] = String.Format("{0:0.00}", booking[15]); + table.Rows.Add(row); + + summe += Convert.ToDecimal(booking[15]); + } + + return summe; + } + + private static void AddSummenRow(DataTable table, string label, decimal summe) + { + DataRow row = table.NewRow(); + row[5] = label; + row[6] = String.Format("{0:0.00}", summe); + table.Rows.Add(row); + } + + private static Bericht CreateBelegReport(string name, DataTable table) + { + var queryReportObject = QueryRO.Create(new Query() { Title = "Export" }, table); + queryReportObject.Name = name; + + var queryReport = new Bericht(); + queryReport.SetReportDataSource(queryReportObject); + queryReport.CreateDocument(); + return queryReport; + } + public static DataTable ExecuteQuery(String sql, DateTime dt) { var newsql = sql; From 2987e9cc5f2ba1e86c44d3cc1dc5df80f498217f Mon Sep 17 00:00:00 2001 From: Alexandra Date: Fri, 10 Jul 2026 12:00:55 +0200 Subject: [PATCH 3/6] SBBMainzReports/Invoicing/CustomInvoiceCreationQA - NPE gefixt, wenn keine ServiceCategory vergeben SupportOID=167690 --- .../Invoicing/CustomInvoiceCreationQA.cs | 111 +++++++++--------- 1 file changed, 57 insertions(+), 54 deletions(-) diff --git a/ReportImp/SBBMainzReports/Invoicing/CustomInvoiceCreationQA.cs b/ReportImp/SBBMainzReports/Invoicing/CustomInvoiceCreationQA.cs index 0ca490ca9..43b0d46bd 100644 --- a/ReportImp/SBBMainzReports/Invoicing/CustomInvoiceCreationQA.cs +++ b/ReportImp/SBBMainzReports/Invoicing/CustomInvoiceCreationQA.cs @@ -110,69 +110,72 @@ namespace SBBMainzReports.Invoicing { var calc = PluginLoader.FindClass(_SpecificID) ?? Calculations.GetInstance(_SpecificID); var scap = supportConceptApprovalPeriod; + if (scap.ServiceCategory != null) + { var crList = scap.ServiceCategory.CostRatePeriods; var cr = crList.GetCostRatePeriodForDate(BS.Shared.CostRatePeriodType.AmountOfMoney, serviceInvoicePeriod.Start.Value); - if (cr != null && cr.CostRateValue.HasValue) - { - decimal? hourlyRate = cr.CostRateValue.Value; - decimal weeklyFactor = 4.33m; - // Anteilige Berechnung nur in dem Monat, in dem der HP tatsächlich beginnt bzw. endet - - // in allen anderen (vollen) Monaten wird der volle Monatsfaktor berechnet - if (scap.StartDate.HasValue && scap.StartDate.Value.Day > 7 && serviceInvoicePeriod.Start.HasValue - && scap.StartDate.Value.Year == serviceInvoicePeriod.Start.Value.Year && scap.StartDate.Value.Month == serviceInvoicePeriod.Start.Value.Month) + if (cr != null && cr.CostRateValue.HasValue) { - int startDay = scap.StartDate.Value.Day; - if (startDay <= 14) + decimal? hourlyRate = cr.CostRateValue.Value; + decimal weeklyFactor = 4.33m; + // Anteilige Berechnung nur in dem Monat, in dem der HP tatsächlich beginnt bzw. endet - + // in allen anderen (vollen) Monaten wird der volle Monatsfaktor berechnet + if (scap.StartDate.HasValue && scap.StartDate.Value.Day > 7 && serviceInvoicePeriod.Start.HasValue + && scap.StartDate.Value.Year == serviceInvoicePeriod.Start.Value.Year && scap.StartDate.Value.Month == serviceInvoicePeriod.Start.Value.Month) { - weeklyFactor = Math.Min(weeklyFactor, 3m); + int startDay = scap.StartDate.Value.Day; + if (startDay <= 14) + { + weeklyFactor = Math.Min(weeklyFactor, 3m); + } + else if (startDay <= 21) + { + weeklyFactor = Math.Min(weeklyFactor, 2m); + } + else + { + weeklyFactor = Math.Min(weeklyFactor, 1m); + } } - else if (startDay <= 21) + if (scap.EndDate.HasValue && scap.EndDate.Value.Day < 22 && serviceInvoicePeriod.End.HasValue + && scap.EndDate.Value.Year == serviceInvoicePeriod.End.Value.Year && scap.EndDate.Value.Month == serviceInvoicePeriod.End.Value.Month) { - weeklyFactor = Math.Min(weeklyFactor, 2m); + int endDay = scap.EndDate.Value.Day; + if (endDay >= 15) + { + weeklyFactor = Math.Min(weeklyFactor, 3m); + } + else if (endDay >= 8) + { + weeklyFactor = Math.Min(weeklyFactor, 2m); + } + else + { + weeklyFactor = Math.Min(weeklyFactor, 1m); + } } - else - { - weeklyFactor = Math.Min(weeklyFactor, 1m); - } - } - if (scap.EndDate.HasValue && scap.EndDate.Value.Day < 22 && serviceInvoicePeriod.End.HasValue - && scap.EndDate.Value.Year == serviceInvoicePeriod.End.Value.Year && scap.EndDate.Value.Month == serviceInvoicePeriod.End.Value.Month) - { - int endDay = scap.EndDate.Value.Day; - if (endDay >= 15) - { - weeklyFactor = Math.Min(weeklyFactor, 3m); - } - else if (endDay >= 8) - { - weeklyFactor = Math.Min(weeklyFactor, 2m); - } - else - { - weeklyFactor = Math.Min(weeklyFactor, 1m); - } - } - decimal approvedHours = 0; - decimal approvedHoursMonth = 0; - if (scap.ApprovedBEInterval.HasValue && scap.ApprovedBEInterval.Value == SupportConceptApprovalInterval.Weekly && scap.ApprovedBEPerInterval.HasValue) - { - approvedHours = scap.ApprovedBEPerInterval.Value; - approvedHoursMonth = weeklyFactor * scap.ApprovedBEPerInterval.Value; + decimal approvedHours = 0; + decimal approvedHoursMonth = 0; + if (scap.ApprovedBEInterval.HasValue && scap.ApprovedBEInterval.Value == SupportConceptApprovalInterval.Weekly && scap.ApprovedBEPerInterval.HasValue) + { + approvedHours = scap.ApprovedBEPerInterval.Value; + approvedHoursMonth = weeklyFactor * scap.ApprovedBEPerInterval.Value; + } + decimal amount = approvedHoursMonth * hourlyRate.Value; + serviceInvoicePeriod.InvoiceItemList.Add(new InvoiceItem + { + AmountTotal = amount, + GrossAmountTotal = amount, + ItemPeriodStart = serviceInvoicePeriod.Start, + ItemPeriodEnd = serviceInvoicePeriod.End, + AmountPerUnit = hourlyRate.Value, + ItemDescription = "Fachleistungseinheiten/Woche", + UnitDescription = "QA/Woche", + UnitCount = approvedHours, + Notice = approvedHoursMonth.ToString("n2") + }); } - decimal amount = approvedHoursMonth * hourlyRate.Value; - serviceInvoicePeriod.InvoiceItemList.Add(new InvoiceItem - { - AmountTotal = amount, - GrossAmountTotal = amount, - ItemPeriodStart = serviceInvoicePeriod.Start, - ItemPeriodEnd = serviceInvoicePeriod.End, - AmountPerUnit = hourlyRate.Value, - ItemDescription = "Fachleistungseinheiten/Woche", - UnitDescription = "QA/Woche", - UnitCount = approvedHours, - Notice = approvedHoursMonth.ToString("n2") - }); } } From 012462d7446c4381a0851aaeb5399fece0c64541 Mon Sep 17 00:00:00 2001 From: Alexandra Date: Fri, 10 Jul 2026 13:07:59 +0200 Subject: [PATCH 4/6] SBBMainzReports/ServiceInvoiceReport - Dateiname falsch, wenn Sonderzeichen im Namen, gefixt SupportOID=167726 --- .../SBBMainzReports/ServiceInvoiceReport.cs | 29 +++++++++++++++++++ Shared/Core/SecurityUtils.cs | 18 ++++++++++++ 2 files changed, 47 insertions(+) diff --git a/ReportImp/SBBMainzReports/ServiceInvoiceReport.cs b/ReportImp/SBBMainzReports/ServiceInvoiceReport.cs index 8e92027cc..e53933ade 100644 --- a/ReportImp/SBBMainzReports/ServiceInvoiceReport.cs +++ b/ReportImp/SBBMainzReports/ServiceInvoiceReport.cs @@ -5,7 +5,9 @@ using BeWo.Report.ReportObjects; using BS.Shared.Extensions; using DevExpress.XtraReports.UI; using System; +using System.IO; using System.Linq; +using System.Security.Cryptography; using System.Text; namespace SBBMainzReports @@ -31,6 +33,8 @@ namespace SBBMainzReports { lblReName.Text = lblReName.Text.Replace("/", "-"); } + //SanitizeFilename auch in BS.Shard.Core aufgenommen, brauchte es aber hier sofort + lblReName.Text = SanitizeFilename(lblReName.Text); if (start.Month == end.Month && start.Year == end.Year) { lblAbrechnungszeitraum.Text = String.Format("{0:MMMM yyyy}", start); @@ -143,5 +147,30 @@ namespace SBBMainzReports { PrintingSystem.Document.Name = String.Format("{0}", lblReName.Text); } + + private static readonly char[] InvalidFilenameChars = Path.GetInvalidFileNameChars(); + + public static bool ContainsInvalidFilenameChars(string fileName) + { + return fileName.IndexOfAny(InvalidFilenameChars) >= 0; + } + + public static string SanitizeFilename(string fileName) + { + if (String.IsNullOrEmpty(fileName) || !ContainsInvalidFilenameChars(fileName)) + { + return fileName; + } + + var sb = new StringBuilder(fileName.Length); + foreach (char c in fileName) + { + if (!InvalidFilenameChars.Contains(c)) + { + sb.Append(c); + } + } + return sb.ToString(); + } } } \ No newline at end of file diff --git a/Shared/Core/SecurityUtils.cs b/Shared/Core/SecurityUtils.cs index ccc3ede27..961b38f4c 100644 --- a/Shared/Core/SecurityUtils.cs +++ b/Shared/Core/SecurityUtils.cs @@ -17,6 +17,24 @@ namespace BS.Shared.Core return fileName.IndexOfAny(InvalidFilenameChars) >= 0; } + public static string SanitizeFilename(string fileName) + { + if (String.IsNullOrEmpty(fileName) || !ContainsInvalidFilenameChars(fileName)) + { + return fileName; + } + + var sb = new StringBuilder(fileName.Length); + foreach (char c in fileName) + { + if (!InvalidFilenameChars.Contains(c)) + { + sb.Append(c); + } + } + return sb.ToString(); + } + public static string GetChecksum(string filePath) { using (FileStream stream = File.OpenRead(filePath)) From a522be2b1777c58ef13ba6dac8dc199fb178054a Mon Sep 17 00:00:00 2001 From: Alexandra Date: Mon, 13 Jul 2026 08:48:43 +0200 Subject: [PATCH 5/6] LebenshilfeBadKreuznach/Validation/ServiceRecordValidator.cs - entfernt, da Gesamtbew jetzt relevant ist SupportOID=167711 --- .../LebenshilfeBadKreuznach.csproj | 1 - .../Validation/ServiceRecordValidator.cs | 64 ------------------- 2 files changed, 65 deletions(-) delete mode 100644 ReportImp/LebenshilfeBadKreuznach/Validation/ServiceRecordValidator.cs diff --git a/ReportImp/LebenshilfeBadKreuznach/LebenshilfeBadKreuznach.csproj b/ReportImp/LebenshilfeBadKreuznach/LebenshilfeBadKreuznach.csproj index cd423bffa..8deb5eb3e 100644 --- a/ReportImp/LebenshilfeBadKreuznach/LebenshilfeBadKreuznach.csproj +++ b/ReportImp/LebenshilfeBadKreuznach/LebenshilfeBadKreuznach.csproj @@ -89,7 +89,6 @@ ServiceInvoiceReport.cs - diff --git a/ReportImp/LebenshilfeBadKreuznach/Validation/ServiceRecordValidator.cs b/ReportImp/LebenshilfeBadKreuznach/Validation/ServiceRecordValidator.cs deleted file mode 100644 index e0ba842c2..000000000 --- a/ReportImp/LebenshilfeBadKreuznach/Validation/ServiceRecordValidator.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; -using System.Collections.Generic; -using BeWo.Data.Access; -using BeWo.Data.Entities; -using BeWo.Service.Plugins; -using BS.Shared; -using BS.Shared.DataContracts; - -namespace LebenshilfeBadKreuznach.Validation -{ - public class CustomServiceRecordValidator : ServiceRecordValidator - { - - public override List ValidateServiceRecord(ServiceRecordDC newServiceRecord, SupportConceptStatisticsDC statistics, - int maxDaysEditServiceRecordsAllowed, IList employeeOids, IList cb2scOids) - { - var list = base.ValidateServiceRecord(newServiceRecord, statistics, maxDaysEditServiceRecordsAllowed, employeeOids, cb2scOids); - var newResult = new List(); - - foreach (var item in list) - { - if (item.ResultType != ServiceRecordValidationResult.ApprovedFLSOverspending && (String.IsNullOrEmpty(item.Message) || !item.Message.Contains("liegt außerhalb des Hilfeplanzeitraums"))) - { - newResult.Add(item); - } - } - if (statistics != null && statistics.PeriodStatistics != null) - { - foreach (var stat in statistics.PeriodStatistics) - { - if (stat.SupportConceptApprovalPeriod != null && stat.SupportConceptApprovalPeriod.ServiceCategory != null) - { - if (stat.SupportConceptApprovalPeriod.ServiceCategory.ServiceCategoryOid == newServiceRecord.ServiceDescription.Category.ServiceCategoryOid) - { - decimal newMinutes = newServiceRecord.RoundedDuration; - - if (newMinutes + stat.MinutesProvidedThisMonth > stat.MinutesApprovedPerMonth) - { - var klient = "diesen Hilfeplan"; - if (newServiceRecord.Customer != null) - { - klient = BS.Shared.Translation.Translator.Translate("Klient/in") + " " + newServiceRecord.Customer.LastNameFirstName; - } - - var msg = string.Format("Die für {2} genehmigten FLS ({0:N}) werden mit diesem Eintrag ({1:N}) überschritten.", stat.MinutesApprovedPerMonth / 60, newMinutes / 60, klient); - - var dc = new ServiceRecordValidationResultDC - { - ResultType = ServiceRecordValidationResult.Custom, - Message = msg, - Allow = false - }; - - newResult.Add(dc); - } - } - } - } - } - - return newResult; - } - } -} \ No newline at end of file From fe9adb7ba3b06134bc2418d6c27b018a13a48768 Mon Sep 17 00:00:00 2001 From: Alexandra Date: Mon, 13 Jul 2026 08:51:18 +0200 Subject: [PATCH 6/6] =?UTF-8?q?ZukunftLeben/Export/DatevExporter.cs=20-=20?= =?UTF-8?q?auch=20archivierte=20HPs=20in=20Erl=C3=B6sen=20SupportOID=3D167?= =?UTF-8?q?738?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReportImp/ZukunftLeben/Export/DatevExporter.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReportImp/ZukunftLeben/Export/DatevExporter.cs b/ReportImp/ZukunftLeben/Export/DatevExporter.cs index ac9fccfff..71887a807 100644 --- a/ReportImp/ZukunftLeben/Export/DatevExporter.cs +++ b/ReportImp/ZukunftLeben/Export/DatevExporter.cs @@ -228,7 +228,7 @@ SELECT INNER JOIN `servicecategory` sc ON sd.`ServiceCategoryOid` = sc.`Oid` WHERE sr2.`StartDate` >= ':Monat_Start' AND sr2.`StartDate` < ':Monat_End' AND sc.`Billable` = 1 and sd.Name <> 'Fehlkontakt' GROUP BY sr2.`CostBearer2SupportConceptOid`) AS sr ON sr.`CostBearer2SupportConceptOid` = cb2sc.`Oid` - WHERE c.`IsActive` = 1 AND sc.`IsActive` = 1 and (org.Name = 'LVR' OR org.Name = 'LWL') + WHERE c.`IsActive` = 1 AND sc.`IsActive` <> 0 and (org.Name = 'LVR' OR org.Name = 'LWL') and (sr.`GeleisteteFLM` is not null) UNION (SELECT @@ -251,7 +251,7 @@ SELECT INNER JOIN `servicecategory` sc ON sd.`ServiceCategoryOid` = sc.`Oid` WHERE sr2.`StartDate` >= ':Monat_Start' AND sr2.`StartDate` < ':Monat_End' AND sc.`Billable` = 1 and sd.Name = 'Fehlkontakt' GROUP BY sr2.`CostBearer2SupportConceptOid`) AS sr ON sr.`CostBearer2SupportConceptOid` = cb2sc.`Oid` - WHERE c.`IsActive` = 1 AND sc.`IsActive` = 1 and (org.Name = 'LVR' OR org.Name = 'LWL') + WHERE c.`IsActive` = 1 AND sc.`IsActive` <> 0 and (org.Name = 'LVR' OR org.Name = 'LWL') and (sr.`GeleisteteFLM` is not null))) )qry GROUP BY qry.OID