From 7af934ea19050b3a4c2f626cd4b77164a91ad8ea Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 9 Mar 2026 21:27:06 +0100 Subject: [PATCH] Integrate DevExpress Reporting for envelope history Added DevExpress.Reporting.Core package reference. Refactored rptEnvelopeHistory to inherit from XtraReport and build its layout programmatically using DevExpress bands, tables, and styling. The report now uses A4 paper size, custom margins, and DevExpress UI components for rendering. --- .../EnvelopeGenerator.ServiceHost.csproj | 1 + .../FinalizeDocument/rptEnvelopeHistory.cs | 87 ++++++++++++++++++- 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.ServiceHost/EnvelopeGenerator.ServiceHost.csproj b/EnvelopeGenerator.ServiceHost/EnvelopeGenerator.ServiceHost.csproj index c330ae92..d3c5425a 100644 --- a/EnvelopeGenerator.ServiceHost/EnvelopeGenerator.ServiceHost.csproj +++ b/EnvelopeGenerator.ServiceHost/EnvelopeGenerator.ServiceHost.csproj @@ -17,6 +17,7 @@ + diff --git a/EnvelopeGenerator.ServiceHost/Jobs/FinalizeDocument/rptEnvelopeHistory.cs b/EnvelopeGenerator.ServiceHost/Jobs/FinalizeDocument/rptEnvelopeHistory.cs index 2a57be60..9387cfde 100644 --- a/EnvelopeGenerator.ServiceHost/Jobs/FinalizeDocument/rptEnvelopeHistory.cs +++ b/EnvelopeGenerator.ServiceHost/Jobs/FinalizeDocument/rptEnvelopeHistory.cs @@ -1,9 +1,94 @@ +using DevExpress.XtraReports.UI; +using DevExpress.Drawing; +using System.Drawing; using System.IO; namespace EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument; -public class rptEnvelopeHistory +public class rptEnvelopeHistory : XtraReport { + public rptEnvelopeHistory() + { + BuildLayout(); + } + + private void BuildLayout() + { + Bands.AddRange( + [ + new TopMarginBand(), + new BottomMarginBand(), + new ReportHeaderBand { HeightF = 40 }, + new PageHeaderBand { HeightF = 24 }, + new DetailBand { HeightF = 22 } + ]); + + var reportHeader = (ReportHeaderBand)Bands[nameof(ReportHeaderBand)]!; + var pageHeader = (PageHeaderBand)Bands[nameof(PageHeaderBand)]!; + var detail = (DetailBand)Bands[nameof(DetailBand)]!; + + var title = new XRLabel + { + BoundsF = new RectangleF(0, 0, 750, 28), + Font = new DXFont("Segoe UI", 14, DXFontStyle.Bold), + Text = "Envelope History" + }; + reportHeader.Controls.Add(title); + + var headerTable = CreateTable(isHeader: true); + pageHeader.Controls.Add(headerTable); + + var detailTable = CreateTable(isHeader: false); + detail.Controls.Add(detailTable); + + Margins = new DXMargins(40, 40, 40, 40); + PaperKind = (DevExpress.Drawing.Printing.DXPaperKind)System.Drawing.Printing.PaperKind.A4; + } + + private static XRTable CreateTable(bool isHeader) + { + var table = new XRTable + { + BoundsF = new RectangleF(0, 0, 750, 22), + Borders = DevExpress.XtraPrinting.BorderSide.All + }; + + var row = new XRTableRow(); + + if (isHeader) + { + row.Font = new DXFont("Segoe UI", 9, DXFontStyle.Bold); + row.BackColor = Color.Gainsboro; + row.Cells.Add(CreateCell("Date")); + row.Cells.Add(CreateCell("Status")); + row.Cells.Add(CreateCell("User")); + row.Cells.Add(CreateCell("Title")); + row.Cells.Add(CreateCell("Subject")); + } + else + { + row.Font = new DXFont("Segoe UI", 9, DXFontStyle.Regular); + row.Cells.Add(CreateCell("[ItemDate]")); + row.Cells.Add(CreateCell("[ItemStatusTranslated]")); + row.Cells.Add(CreateCell("[ItemUserReference]")); + row.Cells.Add(CreateCell("[EnvelopeTitle]")); + row.Cells.Add(CreateCell("[EnvelopeSubject]")); + } + + table.Rows.Add(row); + return table; + } + + private static XRTableCell CreateCell(string textOrExpression) + { + return new XRTableCell + { + Text = textOrExpression, + Padding = new DevExpress.XtraPrinting.PaddingInfo(4, 4, 2, 2), + CanGrow = false + }; + } + public object? DataSource { get; set; } public string? DataMember { get; set; }