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.LogDebug("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.LogDebug("Creating report with [{0}] items..", items.Count); var buffer = DoCreateReport(items); Logger.LogDebug("Report created!"); return buffer; } catch (Exception ex) { Logger.Error(ex); throw new CreateReportException("Could not prepare report data!", ex); } } private List GetReportSource(DataTable dataTable) { Logger.LogDebug("Preparing report data"); return dataTable.Rows .Cast() .Select(ToReportItem) .OrderByDescending(r => r.ItemDate) .ToList(); } private byte[] DoCreateReport(List reportItems) { var items = reportItems.Select(MergeEnvelope).ToList(); var source = new ReportSource { Items = items }; var report = new rptEnvelopeHistory { DataSource = source, DataMember = "Items" }; Logger.LogDebug("Creating report in memory.."); report.CreateDocument(); Logger.LogDebug("Exporting report to stream.."); using var stream = new MemoryStream(); report.ExportToPdf(stream); Logger.LogDebug("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); } } }