diff --git a/Elwig/Documents/MemberList.cs b/Elwig/Documents/MemberList.cs index 2226a3d..942d077 100644 --- a/Elwig/Documents/MemberList.cs +++ b/Elwig/Documents/MemberList.cs @@ -1,5 +1,6 @@ using Elwig.Models.Dtos; using System.Collections.Generic; +using System.Linq; namespace Elwig.Documents { public class MemberList : Document { @@ -9,9 +10,17 @@ namespace Elwig.Documents { public string Filter; public IEnumerable 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) : diff --git a/Elwig/Documents/MemberList.cshtml b/Elwig/Documents/MemberList.cshtml index 90e3b2d..2782089 100644 --- a/Elwig/Documents/MemberList.cshtml +++ b/Elwig/Documents/MemberList.cshtml @@ -8,30 +8,61 @@

@Model.Filter

- - - - + @if (Model.AreaComFilters.Length > 1) { + + } else { + + } + @if (Model.AreaComFilters.Length > 1) { + + } else { + + } + + @if (Model.AreaComFilters.Length > 1) { + + } else { + + } - - + + @if (Model.AreaComFilters.Length > 1) { + + } else { + + } + @if (Model.AreaComFilters.Length > 1) { + + } - - - - - - - - - + @{ + var headerSpan = Model.FilterAreaComs ? 3 : 2; + } + + + + + + + + + + @if (Model.FilterAreaComs) { + + @foreach (var vtrgId in Model.AreaComFilters) { + + } + + } - + @for (int i = 0; i < Math.Max(Model.AreaComFilters.Length, 1); i++) { + + } @@ -40,22 +71,28 @@ } @foreach (var m in Model.Members) { if (lastBranch != null && m.Branch != lastBranch) { - + - + lastBranch = m.Branch; } - + - + @if (Model.AreaComFilters.Length > 0) { + foreach (var v in Model.AreaComFilters) { + + } + } else { + + } if (m.BillingName != null) { diff --git a/Elwig/Models/Dtos/MemberListData.cs b/Elwig/Models/Dtos/MemberListData.cs index 0dcfeb9..e276e67 100644 --- a/Elwig/Models/Dtos/MemberListData.cs +++ b/Elwig/Models/Dtos/MemberListData.cs @@ -31,6 +31,7 @@ namespace Elwig.Models.Dtos { ("EntryDate", "Eintritt", null, 20), ("ExitDate", "Austritt", null, 20), ("AreaCommitment", "geb. Fläche", "m²", 20), + ("AreaCommitmentsFiltered", "geb. Fläche", "Vtrg.|m²", 30), ("UstIdNr", "UID", null, 25), ("Iban", "IBAN", null, 45), ("Bic", "BIC", null, 30), @@ -45,8 +46,8 @@ namespace Elwig.Models.Dtos { base(MemberList.Name, MemberList.Name, string.Join(" / ", filterNames), rows, FieldNames) { } - public static async Task FromQuery(IQueryable query, List filterNames) { - var areaCom = await query.ToDictionaryAsync(m => m.MgNr, m => Utils.ActiveAreaCommitments(m.AreaCommitments).Sum(c => c.Area)); + public static async Task FromQuery(IQueryable query, List filterNames, IEnumerable filterAreaCom) { + var areaComs = await query.ToDictionaryAsync(m => m.MgNr, m => Utils.ActiveAreaCommitments(m.AreaCommitments)); return new((await query .Include(m => m.DefaultWbKg!.AtKg) .Include(m => m.Branch) @@ -55,13 +56,17 @@ namespace Elwig.Models.Dtos { .Include(m => m.TelephoneNumbers) .Include(m => m.EmailAddresses) .AsSplitQuery() - .ToListAsync()).Select(m => new MemberListRow(m, areaCom[m.MgNr])), filterNames); + .ToListAsync()).Select(m => new MemberListRow(m, + areaComs[m.MgNr].Sum(c => c.Area), + areaComs[m.MgNr].Where(c => filterAreaCom.Contains(c.VtrgId)).GroupBy(c => c.VtrgId).ToDictionary(g => g.Key, g => g.Sum(c => c.Area)))), + filterNames); } } public class MemberListRow { public int MgNr; public string? Name1; + public string? AdminName1; public string? Name2; public string? DefaultKg; public string? Branch; @@ -78,6 +83,7 @@ namespace Elwig.Models.Dtos { public string? Iban; public string? Bic; public int? AreaCommitment; + public (string VtrgId, int Area)[] AreaCommitmentsFiltered; public bool IsBuchführend; public bool IsOrganic; public bool IsActive; @@ -89,9 +95,10 @@ namespace Elwig.Models.Dtos { public string? AdditionalContact; public string? Comment; - public MemberListRow(Member m, int? areaCom = null) { + public MemberListRow(Member m, int? areaCom = null, Dictionary? filtered = null) { MgNr = m.MgNr; Name1 = m.Name; + AdminName1 = m.AdministrativeName1; Name2 = m.AdministrativeName2; DefaultKg = m.DefaultKg?.Name; Branch = m.Branch?.Name; @@ -125,6 +132,7 @@ namespace Elwig.Models.Dtos { .Concat(m.EmailAddresses.OrderBy(a => a.Nr).Select(a => a.Address).Except([EmailAddress]))); Comment = m.Comment; AreaCommitment = areaCom == 0 ? null : areaCom; + AreaCommitmentsFiltered = filtered != null ? filtered.OrderBy(f => f.Key).Select(f => (f.Key, f.Value)).ToArray() : []; } } } diff --git a/Elwig/Services/MemberService.cs b/Elwig/Services/MemberService.cs index 263f58e..c6991e1 100644 --- a/Elwig/Services/MemberService.cs +++ b/Elwig/Services/MemberService.cs @@ -420,7 +420,7 @@ namespace Elwig.Services { if (d.ShowDialog() == true) { Mouse.OverrideCursor = Cursors.AppStarting; try { - var data = await MemberListData.FromQuery(query, filterNames); + var data = await MemberListData.FromQuery(query, filterNames, filterNames.Where(f => f.StartsWith("Flächenbindung")).Select(f => f.Split(' ')[^1])); using var ods = new OdsFile(d.FileName); await ods.AddTable(data); } catch (Exception exc) { @@ -487,7 +487,7 @@ namespace Elwig.Services { } else { Mouse.OverrideCursor = Cursors.AppStarting; try { - var data = await MemberListData.FromQuery(query, filterNames); + var data = await MemberListData.FromQuery(query, filterNames, filterNames.Where(f => f.StartsWith("Flächenbindung")).Select(f => f.Split(' ')[^1])); using var doc = new MemberList(string.Join(" / ", filterNames), data); await Utils.ExportDocument(doc, mode); } catch (Exception exc) { diff --git a/Tests/DocumentTests/MemberListTest.cs b/Tests/DocumentTests/MemberListTest.cs index 354db5e..1401154 100644 --- a/Tests/DocumentTests/MemberListTest.cs +++ b/Tests/DocumentTests/MemberListTest.cs @@ -9,7 +9,7 @@ namespace Tests.DocumentTests { [Test] public async Task Test_01_TwoMembers() { using var ctx = new AppDbContext(); - var data = await MemberListData.FromQuery(ctx.Members, []); + var data = await MemberListData.FromQuery(ctx.Members, [], []); using var doc = new MemberList("Alle Mitglieder", data); var text = await Utils.GeneratePdfText(doc, true); var table = Utils.ExtractTable(text);
Nr.NameAdressePLZOrtBetr.-Nr.GAStamm-KGGeb. Fl.Nr.NameAdressePLZOrtBetr.-Nr.GAStamm-KGGeb. Fl.
@vtrgId
[m²][m²]
@m.Branch@m.Branch
@m.MgNr@m.Name1.Replace('ß', 'ẞ').ToUpper() @m.Name2@m.AdminName1 @m.Name2 @m.Address @m.Plz @m.Locality @m.LfbisNr @m.BusinessShares @m.DefaultKg@($"{m.AreaCommitment:N0}")@($"{m.AreaCommitmentsFiltered.FirstOrDefault(c => c.VtrgId == v).Area:N0}")@($"{m.AreaCommitment:N0}")