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; }