Files
EnvelopeGenerator/EnvelopeGenerator.ServiceHost/Jobs/FinalizeDocument/ReportCreator.cs
TekH c93c32307a feat(FinalizeDocument): aus CommonJobs kopiert, mit einfachen Fehlerbehebungen unter Verwendung von Copilot
- Programmiersprache von VSC zu C# geändert
 - Framework von .NET Framework zu .NET geändert
2026-02-23 17:12:25 +01:00

108 lines
3.1 KiB
C#

using System.Data;
using System.IO;
using DigitalData.Modules.Base;
using DigitalData.Modules.Logging;
using EnvelopeGenerator.Domain.Constants;
using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.ServiceHost.Exceptions;
using EnvelopeGenerator.ServiceHost.Jobs;
namespace EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument;
public class ReportCreator : BaseClass
{
private Envelope? _envelope;
private readonly ReportModel _reportModel;
public ReportCreator(LogConfig logConfig, State state) : base(logConfig)
{
_reportModel = new ReportModel(state);
}
public byte[] CreateReport(Envelope envelope)
{
try
{
Logger.Debug("Loading report data..");
var table = _reportModel.List(envelope.Id);
var items = GetReportSource(table);
_envelope = envelope;
if (items.Count == 0)
{
throw new CreateReportException("No report data found!");
}
Logger.Debug("Creating report with [{0}] items..", items.Count);
var buffer = DoCreateReport(items);
Logger.Debug("Report created!");
return buffer;
}
catch (Exception ex)
{
Logger.Error(ex);
throw new CreateReportException("Could not prepare report data!", ex);
}
}
private List<ReportItem> GetReportSource(DataTable dataTable)
{
Logger.Debug("Preparing report data");
return dataTable.Rows
.Cast<DataRow>()
.Select(ToReportItem)
.OrderByDescending(r => r.ItemDate)
.ToList();
}
private byte[] DoCreateReport(List<ReportItem> reportItems)
{
var items = reportItems.Select(MergeEnvelope).ToList();
var source = new ReportSource { Items = items };
var report = new rptEnvelopeHistory { DataSource = source, DataMember = "Items" };
Logger.Debug("Creating report in memory..");
report.CreateDocument();
Logger.Debug("Exporting report to stream..");
using var stream = new MemoryStream();
report.ExportToPdf(stream);
Logger.Debug("Writing report to buffer..");
return stream.ToArray();
}
private ReportItem MergeEnvelope(ReportItem item)
{
if (item.Envelope is null)
{
item.Envelope = _envelope;
}
return item;
}
private ReportItem ToReportItem(DataRow row)
{
try
{
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.Error(ex);
throw new CreateReportException("Could not read data from database!", ex);
}
}
}