Refactor report generation to use async repository access

Replaces obsolete DataTable-based logic in ReportCreator with async repository queries for EnvelopeReport entities. Refactors ReportItem to use explicit header and detail fields, removing legacy Envelope references. Updates report designer bindings to match new ReportItem properties. Improves exception handling and overall type safety.
This commit is contained in:
2026-04-01 10:42:44 +02:00
parent c2ab18e184
commit 53a9a3e3eb
3 changed files with 36 additions and 66 deletions

View File

@@ -1,4 +1,4 @@
using System.Data; using DevExpress.Xpo;
using DigitalData.Core.Abstraction.Application.Repository; using DigitalData.Core.Abstraction.Application.Repository;
using EnvelopeGenerator.Domain.Constants; using EnvelopeGenerator.Domain.Constants;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
@@ -7,55 +7,40 @@ using EnvelopeGenerator.ServiceHost.Extensions;
namespace EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument; namespace EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument;
[Obsolete("Instead of ReportModel create and use EnvelopeReport mediator queries")] public class ReportCreator(ILogger<ReportCreator> Logger, IRepository<EnvelopeReport> reportRepo)
public class ReportCreator(ReportModel ReportModel, ILogger<ReportCreator> Logger, IRepository<EnvelopeReport> reportRepo)
{ {
[Obsolete("Solve the spaghetti...")] public async Task<byte[]> CreateReportAsync(Envelope envelope, CancellationToken cancel = default)
private Envelope? _envelope;
[Obsolete("Instead of ReportModel create and use EnvelopeReport mediator queries and solve this spaghetti...")]
public byte[] CreateReport(Envelope envelope)
{ {
try try
{ {
Logger.LogDebug("Loading report data.."); Logger.LogDebug("Loading report data..");
var table = ReportModel.List(envelope.Id); var reports = await reportRepo.Where(r => r.EnvelopeId == envelope.Id).ToListAsync(cancel);
var items = GetReportSource(table);
_envelope = envelope; if (reports.Count == 0)
if (items.Count == 0)
{ {
throw new CreateReportException("No report data found!"); throw new CreateReportException("No report data found!");
} }
Logger.LogDebug("Creating report with [{count}] items..", items.Count); var items = reports
.Select(r => ToReportItem(r, envelope))
.OrderByDescending(r => r.ItemDate)
.ToList();
var buffer = DoCreateReport(items); var buffer = DoCreateReport(items);
Logger.LogDebug("Report created!"); Logger.LogDebug("Report created!");
return buffer; return buffer;
} }
catch (Exception ex) catch (Exception ex) when (ex is not CreateReportException)
{ {
Logger.LogError(ex); Logger.LogError(ex);
throw new CreateReportException("Could not prepare report data!", ex); throw new CreateReportException("Could not prepare report data!", ex);
} }
} }
private List<ReportItem> GetReportSource(DataTable dataTable)
{
Logger.LogDebug("Preparing report data");
return dataTable.Rows
.Cast<DataRow>()
.Select(ToReportItem)
.OrderByDescending(r => r.ItemDate)
.ToList();
}
private byte[] DoCreateReport(List<ReportItem> reportItems) private byte[] DoCreateReport(List<ReportItem> reportItems)
{ {
var items = reportItems.Select(MergeEnvelope).ToList(); var source = new ReportSource { Items = reportItems };
var source = new ReportSource { Items = items };
var report = new rptEnvelopeHistory { DataSource = source, DataMember = "Items" }; var report = new rptEnvelopeHistory { DataSource = source, DataMember = "Items" };
Logger.LogDebug("Creating report in memory.."); Logger.LogDebug("Creating report in memory..");
@@ -69,35 +54,20 @@ public class ReportCreator(ReportModel ReportModel, ILogger<ReportCreator> Logge
return stream.ToArray(); return stream.ToArray();
} }
[Obsolete("Solve this spaghetti...")] private static ReportItem ToReportItem(EnvelopeReport report, Envelope envelope)
private ReportItem MergeEnvelope(ReportItem item)
{ {
if (item.Envelope is null) return new ReportItem
{ {
item.Envelope = _envelope; CreatorFullName = envelope.User is not null
} ? $"{envelope.User.Prename} {envelope.User.Name}".Trim()
: string.Empty,
return item; CreatorEmailAddress = envelope.User?.Email ?? string.Empty,
} EnvelopeTitle = report.HeadTitle ?? string.Empty,
EnvelopeUuid = report.HeadUuid ?? string.Empty,
private ReportItem ToReportItem(DataRow row) EnvelopeCertificationType = envelope.CertificationType is int certType ? ((CertificationType)certType).ToString() : "null",
{ ItemStatus = (EnvelopeStatus)report.PosStatus,
try ItemUserReference = report.PosWho ?? string.Empty,
{ ItemDate = report.PosWhen ?? DateTime.MinValue
return new ReportItem };
{
EnvelopeId = row.ItemEx("ENVELOPE_ID", 0),
EnvelopeTitle = row.ItemEx("HEAD_TITLE", string.Empty),
EnvelopeSubject = row.ItemEx("HEAD_SUBJECT", string.Empty),
ItemDate = row.ItemEx("POS_WHEN", DateTime.MinValue),
ItemStatus = (EnvelopeStatus)row.ItemEx("POS_STATUS", 0),
ItemUserReference = row.ItemEx("POS_WHO", string.Empty)
};
}
catch (Exception ex)
{
Logger.LogError(ex);
throw new CreateReportException("Could not read data from database!", ex);
}
} }
} }

View File

@@ -1,19 +1,19 @@
using EnvelopeGenerator.Domain.Constants; using EnvelopeGenerator.Domain.Constants;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument; namespace EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument;
public class ReportItem public class ReportItem
{ {
public Envelope? Envelope { get; set; } // Header fields (from Envelope)
public int EnvelopeId { get; set; } public string CreatorFullName { get; set; } = string.Empty;
public string CreatorEmailAddress { get; set; } = string.Empty;
public string EnvelopeTitle { get; set; } = string.Empty; public string EnvelopeTitle { get; set; } = string.Empty;
public string EnvelopeSubject { get; set; } = string.Empty; public string EnvelopeUuid { get; set; } = string.Empty;
public string EnvelopeCertificationType { get; set; } = string.Empty;
// Detail fields (from EnvelopeReport)
public EnvelopeStatus ItemStatus { get; set; } public EnvelopeStatus ItemStatus { get; set; }
public string ItemStatusTranslated => ItemStatus.ToString(); public string ItemStatusTranslated => ItemStatus.ToString();
public string ItemUserReference { get; set; } = string.Empty; public string ItemUserReference { get; set; } = string.Empty;
public DateTime ItemDate { get; set; } public DateTime ItemDate { get; set; }
} }

View File

@@ -257,7 +257,7 @@ public partial class rptEnvelopeHistory : XtraReport
this.XrTableCell17.BorderColor = Color.Empty; this.XrTableCell17.BorderColor = Color.Empty;
this.XrTableCell17.Borders = BorderSide.None; this.XrTableCell17.Borders = BorderSide.None;
this.XrTableCell17.Dpi = 254F; this.XrTableCell17.Dpi = 254F;
this.XrTableCell17.ExpressionBindings.AddRange(new ExpressionBinding[] { new ExpressionBinding("BeforePrint", "Text", "[Envelope].[User].[FullName]") }); this.XrTableCell17.ExpressionBindings.AddRange(new ExpressionBinding[] { new ExpressionBinding("BeforePrint", "Text", "[CreatorFullName]") });
this.XrTableCell17.Font = new Font("Arial", 8.25F, FontStyle.Regular, GraphicsUnit.Point, 0); this.XrTableCell17.Font = new Font("Arial", 8.25F, FontStyle.Regular, GraphicsUnit.Point, 0);
this.XrTableCell17.ForeColor = Color.Black; this.XrTableCell17.ForeColor = Color.Black;
this.XrTableCell17.Multiline = true; this.XrTableCell17.Multiline = true;
@@ -296,7 +296,7 @@ public partial class rptEnvelopeHistory : XtraReport
this.XrTableCell18.BorderColor = Color.Empty; this.XrTableCell18.BorderColor = Color.Empty;
this.XrTableCell18.Borders = BorderSide.None; this.XrTableCell18.Borders = BorderSide.None;
this.XrTableCell18.Dpi = 254F; this.XrTableCell18.Dpi = 254F;
this.XrTableCell18.ExpressionBindings.AddRange(new ExpressionBinding[] { new ExpressionBinding("BeforePrint", "Text", "[Envelope].[Title]") }); this.XrTableCell18.ExpressionBindings.AddRange(new ExpressionBinding[] { new ExpressionBinding("BeforePrint", "Text", "[EnvelopeTitle]") });
this.XrTableCell18.Font = new Font("Arial", 8.25F, FontStyle.Regular, GraphicsUnit.Point, 0); this.XrTableCell18.Font = new Font("Arial", 8.25F, FontStyle.Regular, GraphicsUnit.Point, 0);
this.XrTableCell18.ForeColor = Color.Black; this.XrTableCell18.ForeColor = Color.Black;
this.XrTableCell18.Multiline = true; this.XrTableCell18.Multiline = true;
@@ -342,7 +342,7 @@ public partial class rptEnvelopeHistory : XtraReport
this.XrTableCell20.BorderColor = Color.Empty; this.XrTableCell20.BorderColor = Color.Empty;
this.XrTableCell20.Borders = BorderSide.None; this.XrTableCell20.Borders = BorderSide.None;
this.XrTableCell20.Dpi = 254F; this.XrTableCell20.Dpi = 254F;
this.XrTableCell20.ExpressionBindings.AddRange(new ExpressionBinding[] { new ExpressionBinding("BeforePrint", "Text", "[Envelope].[User].[EmailAddress]") }); this.XrTableCell20.ExpressionBindings.AddRange(new ExpressionBinding[] { new ExpressionBinding("BeforePrint", "Text", "[CreatorEmailAddress]") });
this.XrTableCell20.Font = new Font("Arial", 8.25F, FontStyle.Regular, GraphicsUnit.Point, 0); this.XrTableCell20.Font = new Font("Arial", 8.25F, FontStyle.Regular, GraphicsUnit.Point, 0);
this.XrTableCell20.ForeColor = Color.Black; this.XrTableCell20.ForeColor = Color.Black;
this.XrTableCell20.Multiline = true; this.XrTableCell20.Multiline = true;
@@ -381,7 +381,7 @@ public partial class rptEnvelopeHistory : XtraReport
this.XrTableCell22.BorderColor = Color.Empty; this.XrTableCell22.BorderColor = Color.Empty;
this.XrTableCell22.Borders = BorderSide.None; this.XrTableCell22.Borders = BorderSide.None;
this.XrTableCell22.Dpi = 254F; this.XrTableCell22.Dpi = 254F;
this.XrTableCell22.ExpressionBindings.AddRange(new ExpressionBinding[] { new ExpressionBinding("BeforePrint", "Text", "[Envelope].[Uuid]") }); this.XrTableCell22.ExpressionBindings.AddRange(new ExpressionBinding[] { new ExpressionBinding("BeforePrint", "Text", "[EnvelopeUuid]") });
this.XrTableCell22.Font = new Font("Arial", 8.25F, FontStyle.Regular, GraphicsUnit.Point, 0); this.XrTableCell22.Font = new Font("Arial", 8.25F, FontStyle.Regular, GraphicsUnit.Point, 0);
this.XrTableCell22.ForeColor = Color.Black; this.XrTableCell22.ForeColor = Color.Black;
this.XrTableCell22.Multiline = true; this.XrTableCell22.Multiline = true;
@@ -463,7 +463,7 @@ public partial class rptEnvelopeHistory : XtraReport
this.XrTableCell26.BorderColor = Color.Empty; this.XrTableCell26.BorderColor = Color.Empty;
this.XrTableCell26.Borders = BorderSide.None; this.XrTableCell26.Borders = BorderSide.None;
this.XrTableCell26.Dpi = 254F; this.XrTableCell26.Dpi = 254F;
this.XrTableCell26.ExpressionBindings.AddRange(new ExpressionBinding[] { new ExpressionBinding("BeforePrint", "Text", "[Envelope].[CertificationType]") }); this.XrTableCell26.ExpressionBindings.AddRange(new ExpressionBinding[] { new ExpressionBinding("BeforePrint", "Text", "[EnvelopeCertificationType]") });
this.XrTableCell26.Font = new Font("Arial", 8.25F, FontStyle.Regular, GraphicsUnit.Point, 0); this.XrTableCell26.Font = new Font("Arial", 8.25F, FontStyle.Regular, GraphicsUnit.Point, 0);
this.XrTableCell26.ForeColor = Color.Black; this.XrTableCell26.ForeColor = Color.Black;
this.XrTableCell26.Multiline = true; this.XrTableCell26.Multiline = true;