using DevExpress.Xpo; using DigitalData.Core.Abstraction.Application.Repository; using EnvelopeGenerator.Domain.Constants; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.ServiceHost.Exceptions; using EnvelopeGenerator.ServiceHost.Extensions; namespace EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument; public class ReportCreator(ILogger Logger, IRepository reportRepo) { public async Task CreateReportAsync(Envelope envelope, CancellationToken cancel = default) { try { Logger.LogDebug("Loading report data.."); var reports = await reportRepo.Where(r => r.EnvelopeId == envelope.Id).ToListAsync(cancel); if (reports.Count == 0) { throw new CreateReportException("No report data found!"); } var items = reports .Select(r => ToReportItem(r, envelope)) .OrderByDescending(r => r.ItemDate) .ToList(); var buffer = DoCreateReport(items); Logger.LogDebug("Report created!"); return buffer; } catch (Exception ex) when (ex is not CreateReportException) { Logger.LogError(ex); throw new CreateReportException("Could not prepare report data!", ex); } } private byte[] DoCreateReport(List reportItems) { var source = new ReportSource { Items = reportItems }; 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 static ReportItem ToReportItem(EnvelopeReport report, Envelope envelope) { return new ReportItem { CreatorFullName = envelope.User is not null ? $"{envelope.User.Prename} {envelope.User.Name}".Trim() : string.Empty, CreatorEmailAddress = envelope.User?.Email ?? string.Empty, EnvelopeTitle = report.HeadTitle ?? string.Empty, EnvelopeUuid = report.HeadUuid ?? string.Empty, EnvelopeCertificationType = envelope.CertificationType is int certType ? ((CertificationType)certType).ToString() : "null", ItemStatus = (EnvelopeStatus)report.PosStatus, ItemUserReference = report.PosWho ?? string.Empty, ItemDate = report.PosWhen ?? DateTime.MinValue }; } }