using Elwig.Models.Dtos; using iText.Kernel.Colors; using iText.Kernel.Pdf; using iText.Layout.Borders; using iText.Layout.Element; using iText.Layout.Properties; using System; using System.Collections.Generic; using System.Linq; namespace Elwig.Documents { public class MemberList : Document { public new static string Name => "Mitgliederliste"; public string Filter; public List Members; public string[] AreaComFilters; public bool FilterAreaComs => AreaComFilters.Length > 0; public MemberList(string filter, IEnumerable members) : base(Name) { Filter = filter; Members = [.. members]; AreaComFilters = [..members .SelectMany(m => m.AreaCommitmentsFiltered) .Select(c => c.VtrgId) .Distinct() .Order()]; } public MemberList(string filter, MemberListData data) : this(filter, data.Rows) { } protected override void RenderBody(iText.Layout.Document doc, PdfDocument pdf) { base.RenderBody(doc, pdf); doc.Add(new KernedParagraph(Name, 24) .SetTextAlignment(TextAlignment.CENTER).SetFont(BF) .SetMarginsMM(0, 0, 2, 0)); doc.Add(new KernedParagraph(Filter, 14) .SetTextAlignment(TextAlignment.CENTER).SetFont(BF) .SetMarginsMM(0, 0, 2, 0)); doc.Add(NewMemberTable(Members)); } protected Table NewMemberTable(List members) { var tbl = new Table(AreaComFilters.Length > 1 ? ColsMM(8, 38, 36, 8, 18, 12, 5, 16, 12, 12) : ColsMM(8, 42, 40, 8, 20, 12, 5, 18, 12), true) .SetWidth(UnitValue.CreatePercentValue(100)).SetFixedLayout() .SetBorderCollapse(BorderCollapsePropertyValue.COLLAPSE); var headerSpan = FilterAreaComs ? 3 : 2; tbl.AddHeaderCell(NewTh("Nr.", rowspan: headerSpan)) .AddHeaderCell(NewTh("Name", rowspan: headerSpan, left: true)) .AddHeaderCell(NewTh("Adresse", rowspan: headerSpan, left: true)) .AddHeaderCell(NewTh("PLZ", rowspan: headerSpan)) .AddHeaderCell(NewTh("Ort", rowspan: headerSpan, left: true)) .AddHeaderCell(NewTh("Betr.-Nr.", rowspan: headerSpan)) .AddHeaderCell(NewTh("GA", rowspan: headerSpan).SetPaddingLeft(0).SetPaddingRight(0)) .AddHeaderCell(NewTh("Stamm-KG", rowspan: headerSpan, left: true)) .AddHeaderCell(NewTh("Geb. Fl.", colspan: FilterAreaComs ? AreaComFilters.Length : 1)); if (FilterAreaComs) { foreach (var vtrgId in AreaComFilters) { tbl.AddHeaderCell(NewTh(vtrgId)); } } for (int i = 0; i < (FilterAreaComs ? AreaComFilters.Length : 1); i++) { tbl.AddHeaderCell(NewTh("[m²]")); } string? lastBranch = members.Select(m => m.Branch).Distinct().Count() == 1 ? null : ""; foreach (var m in members) { if (lastBranch != null && m.Branch != lastBranch) { tbl.AddCell(NewCell(colspan: 8 + Math.Max(AreaComFilters.Length, 1)).SetHeightMM(5).SetKeepWithNext(true)); tbl.AddCell(NewCell(new KernedParagraph(m.Branch ?? "", 16).SetFont(BF), colspan: 8 + Math.Max(AreaComFilters.Length, 1)) .SetPaddingsMM(1, 2, 1, 2) .SetBorder(new SolidBorder(BorderThickness)) .SetBackgroundColor(new DeviceRgb(0xe0, 0xe0, 0xe0))); lastBranch = m.Branch; } tbl.AddCell(NewTd($"{m.MgNr}", 8, rowspan: m.BillingName != null ? 2 : 1, right: true).SetVerticalAlignment(VerticalAlignment.TOP)) .AddCell(NewTd($"{m.AdminName1} {m.Name2}", 8)) .AddCell(NewTd(m.Address, 8)) .AddCell(NewTd($"{m.Plz}", 8)) .AddCell(NewTd(m.Locality, 6)) .AddCell(NewTd(m.LfbisNr ?? "", 8)) .AddCell(NewTd($"{m.BusinessShares:N0}", 8, right: true).SetPaddingLeft(0).SetPaddingRight(0)) .AddCell(NewTd(m.DefaultKg ?? "", 6)); if (AreaComFilters.Length > 0) { foreach (var v in AreaComFilters) { tbl.AddCell(NewTd($"{m.AreaCommitmentsFiltered.FirstOrDefault(c => c.VtrgId == v).Area:N0}", 8, right: true)); } } else { tbl.AddCell(NewTd($"{m.AreaCommitment:N0}", 8, right: true)); } if (m.BillingName != null) { tbl.AddCell(NewTd(m.BillingName, 8)) .AddCell(NewTd(m.BillingAddress ?? "", 8)) .AddCell(NewTd($"{m.BillingPlz}", 8)) .AddCell(NewTd(m.BillingLocality ?? "", 6)) .AddCell(NewTd(colspan: 3 + Math.Max(AreaComFilters.Length, 1))); } } return tbl; } } }