using System; using System.Threading.Tasks; using System.IO; using Elwig.Helpers; namespace Elwig.Documents { public abstract class Document : IDisposable { private TempFile? PdfFile = null; public bool ShowFoldMarks = App.Config.Debug; public string DataPath; public int CurrentNextSeason; public string? DocumentId; public string Title; public string Author; public string Header; public string Footer; public DateTime Date; public Document(string title) { var c = App.Client; DataPath = App.DataPath; CurrentNextSeason = Utils.CurrentNextSeason; Title = title; Author = App.Client.NameFull; Header = $"

{c.Name}

"; Footer = Utils.GenerateFooter("
", " \u00b7 ") .Item(c.NameFull).NextLine() .Item(c.Address).Item($"{c.Plz} {c.Ort}").Item("Österreich").Item("Tel.", c.PhoneNr).Item("Fax", c.FaxNr).NextLine() .Item(c.EmailAddress).Item(c.Website).Item("Betriebs-Nr.", c.LfbisNr).Item("UID", c.UstIdNr).NextLine() .Item("BIC", c.Bic).Item("IBAN", c.Iban) .ToString(); Date = DateTime.Today; } ~Document() { Dispose(); } public void Dispose() { PdfFile?.Dispose(); PdfFile = null; GC.SuppressFinalize(this); } private Task Render() { string name; if (this is BusinessLetter) { name = "BusinessLetter"; } else if (this is DeliveryNote) { name = "DeliveryNote"; } else if (this is CreditNote) { name = "CreditNote"; } else { throw new InvalidOperationException("Invalid document object"); } return Render(name); } private Task Render(string name) { return Html.CompileRenderAsync(name, this); } public async Task Generate() { var pdf = new TempFile("pdf"); using (var tmpHtml = new TempFile("html")) { await File.WriteAllTextAsync(tmpHtml.FilePath, await Render(), Utils.UTF8); await Pdf.Convert(tmpHtml.FilePath, pdf.FilePath); } PdfFile = pdf; } public void SaveTo(string pdfPath) { if (PdfFile == null) throw new InvalidOperationException("Pdf file has not been generated yet"); File.Copy(PdfFile.FilePath, pdfPath); } public async Task Print(int copies = 1) { if (PdfFile == null) throw new InvalidOperationException("Pdf file has not been generated yet"); await Pdf.Print(PdfFile.FilePath, copies); } public void Show() { if (PdfFile == null) throw new InvalidOperationException("Pdf file has not been generated yet"); Pdf.Show(PdfFile.NewReference(), Title); } } }