[#36] MemberAdminWindow: Add MemberList

This commit is contained in:
2024-03-26 12:53:31 +01:00
parent 5795c5e8ba
commit f4ef75ac40
10 changed files with 341 additions and 31 deletions

View File

@ -12,6 +12,8 @@ using System.Collections.ObjectModel;
using Elwig.Documents;
using System.Diagnostics;
using Elwig.Models.Dtos;
using Elwig.Helpers.Export;
using Microsoft.Win32;
namespace Elwig.Windows {
public partial class MemberAdminWindow : AdministrationWindow {
@ -117,10 +119,13 @@ namespace Elwig.Windows {
await RefreshMemberListQuery();
}
private async Task RefreshMemberListQuery(bool updateSort = false) {
using var ctx = new AppDbContext();
private async Task<(List<string>, IQueryable<Member>, List<string>)> GetFilters(AppDbContext ctx) {
List<string> filterNames = [];
IQueryable<Member> memberQuery = ctx.Members;
if (ActiveMemberInput.IsChecked == true) memberQuery = memberQuery.Where(m => m.IsActive);
if (ActiveMemberInput.IsChecked == true) {
memberQuery = memberQuery.Where(m => m.IsActive);
filterNames.Add("aktive Mitglieder");
}
var filterMgNr = new List<int>();
var filterZwst = new List<string>();
@ -142,56 +147,74 @@ namespace Elwig.Windows {
if (e.Length >= 5 && e.Length <= 10 && "funktionär".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => m.IsFunktionär);
filter.RemoveAt(i--);
filterNames.Add("Funktionäre");
} else if (e.Length >= 6 && e.Length <= 11 && e[0] == '!' && "funktionär".StartsWith(e[1..], StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => !m.IsFunktionär);
filter.RemoveAt(i--);
filterNames.Add("Nicht-Funktionäre");
} else if (e.Equals("bio", StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => m.IsOrganic);
filter.RemoveAt(i--);
filterNames.Add("Bio-Betriebe");
} else if (e.Equals("!bio", StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => !m.IsOrganic);
filter.RemoveAt(i--);
filterNames.Add("Nicht-Bio-Betriebe");
} else if (e.Length >= 4 && e.Length <= 13 && "volllieferant".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => m.IsVollLieferant);
filter.RemoveAt(i--);
filterNames.Add("Volllieferanten");
} else if (e.Length >= 5 && e.Length <= 14 && e[0] == '!' && "volllieferant".StartsWith(e[1..], StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => !m.IsVollLieferant);
filter.RemoveAt(i--);
filterNames.Add("Nicht-Vollieferanten");
} else if (e.Length >= 5 && e.Length <= 11 && "buchführend".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => m.IsBuchführend);
filter.RemoveAt(i--);
filterNames.Add("buchführend");
} else if (e.Length >= 6 && e.Length <= 12 && e[0] == '!' && "buchführend".StartsWith(e[1..], StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => !m.IsBuchführend);
filter.RemoveAt(i--);
filterNames.Add("pauschaliert");
} else if (e.Length >= 8 && e.Length <= 12 && "pauschaliert".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => !m.IsBuchführend);
filter.RemoveAt(i--);
filterNames.Add("pauschaliert");
} else if (e.Length >= 9 && e.Length <= 13 && e[0] == '!' && "pauschaliert".StartsWith(e[1..], StringComparison.CurrentCultureIgnoreCase)) {
memberQuery = memberQuery.Where(m => m.IsBuchführend);
filter.RemoveAt(i--);
filterNames.Add("buchführend");
} else if (e.All(char.IsAsciiDigit) && mgnr.ContainsKey(e)) {
filterMgNr.Add(int.Parse(e));
filter.RemoveAt(i--);
filterNames.Add($"MgNr. {e}");
} else if (kgs.TryGetValue(e, out var kg)) {
filterKgNr.Add(kg.KgNr);
filter.RemoveAt(i--);
filterNames.Add($"Stammgemeinde {kg.Name}");
} else if (e.StartsWith("zwst:")) {
try {
filterZwst.Add(branches.Where(b => b.Name.StartsWith(e[5..], StringComparison.CurrentCultureIgnoreCase)).Single().ZwstId);
var branch = branches.Where(b => b.Name.StartsWith(e[5..], StringComparison.CurrentCultureIgnoreCase)).Single();
filterZwst.Add(branch.ZwstId);
filter.RemoveAt(i--);
filterNames.Add($"Zweigstelle {branch.Name}");
} catch (InvalidOperationException) { }
} else if (e.StartsWith('+') && e[1..].All(char.IsAsciiDigit)) {
memberQuery = memberQuery.Where(m => m.TelephoneNumbers.Any(t => t.Number.Replace(" ", "").StartsWith(e)));
filter.RemoveAt(i--);
filterNames.Add($"Tel.-Nr. {e}");
} else if (areaComs.ContainsKey(e.ToUpper())) {
filterAreaCom.Add(e.ToUpper());
filter.RemoveAt(i--);
filterNames.Add($"Flächenbindung {e.ToUpper()}");
} else if (Validator.CheckLfbisNr(e)) {
filterLfbisNr.Add(e);
filter.RemoveAt(i--);
filterNames.Add($"Betriebsnummer {e}");
} else if (Validator.CheckUstIdNr(e.ToUpper())) {
filterUstIdNr.Add(e.ToUpper());
filter.RemoveAt(i--);
filterNames.Add($"UID {e.ToUpper()}");
} else if (e.Length > 2 && e.StartsWith('"') && e.EndsWith('"')) {
filter[i] = e[1..^1];
} else if (e.Length < 2) {
@ -202,12 +225,18 @@ namespace Elwig.Windows {
if (filterMgNr.Count > 0) memberQuery = memberQuery.Where(m => filterMgNr.Contains(m.MgNr));
if (filterKgNr.Count > 0) memberQuery = memberQuery.Where(m => m.DefaultKgNr != null && filterKgNr.Contains((int)m.DefaultKgNr));
if (filterZwst.Count > 0) memberQuery = memberQuery.Where(m => m.ZwstId != null && filterZwst.Contains(m.ZwstId));
if (filterAreaCom.Count > 0) memberQuery = memberQuery.Where(m => m.AreaCommitments.Where(c => c.YearFrom <= Utils.CurrentYear && (c.YearTo ?? int.MaxValue) >= Utils.CurrentYear).Any(c => filterAreaCom.Contains(c.VtrgId)));
if (filterAreaCom.Count > 0) memberQuery = memberQuery.Where(m => m.AreaCommitments.AsQueryable().Where(Utils.ActiveAreaCommitments()).Any(c => filterAreaCom.Contains(c.VtrgId)));
if (filterLfbisNr.Count > 0) memberQuery = memberQuery.Where(m => m.LfbisNr != null && filterLfbisNr.Contains(m.LfbisNr));
if (filterUstIdNr.Count > 0) memberQuery = memberQuery.Where(m => m.UstIdNr != null && filterUstIdNr.Contains(m.UstIdNr));
}
memberQuery = memberQuery
return (filterNames, memberQuery, filter);
}
private async Task RefreshMemberListQuery(bool updateSort = false) {
using var ctx = new AppDbContext();
var (_, memberQuery, filter) = await GetFilters(ctx);
var members = await memberQuery
.Include(m => m.Branch)
.Include(m => m.DefaultWbKg!.AtKg)
.Include(m => m.EmailAddresses)
@ -215,8 +244,8 @@ namespace Elwig.Windows {
.Include(m => m.PostalDest.AtPlz!.Ort)
.Include(m => m.PostalDest.AtPlz!.Country)
.Include(m => m.BillingAddress!.PostalDest.AtPlz!.Ort)
.Include(m => m.BillingAddress!.PostalDest.AtPlz!.Country);
List<Member> members = await memberQuery.ToListAsync();
.Include(m => m.BillingAddress!.PostalDest.AtPlz!.Country)
.ToListAsync();
if (filter.Count > 0 && members.Count > 0) {
var dict = members.AsParallel()
@ -650,39 +679,72 @@ namespace Elwig.Windows {
private async Task GenerateMemberList(int modeWho, int modeWhat) {
using var ctx = new AppDbContext();
IQueryable<Member> list;
IQueryable<Member> query;
List<string> filterNames = [];
if (modeWho == 0) {
list = ctx.Members.Where(m => m.IsActive);
query = ctx.Members.Where(m => m.IsActive);
filterNames.Add("aktive Mitglieder");
} else if (modeWho == 1) {
list = ctx.Members; // TODO
var (f, q, _) = await GetFilters(ctx);
query = q;
filterNames.AddRange(f);
} else {
list = ctx.Members;
query = ctx.Members;
}
if (Menu_List_OrderMgNr.IsChecked) {
list = list.OrderBy(m => m.MgNr);
query = query
.OrderBy(m => m.Branch!.Name)
.ThenBy(m => m.MgNr);
} else if (Menu_List_OrderName.IsChecked) {
list = list
.OrderBy(m => m.FamilyName)
query = query
.OrderBy(m => m.Branch!.Name)
.ThenBy(m => m.FamilyName)
.ThenBy(m => m.GivenName)
.ThenBy(m => m.MgNr);
} else if (Menu_List_OrderOrt.IsChecked) {
list = list
.OrderBy(m => m.DefaultWbKg!.AtKg.Name)
query = query
.OrderBy(m => m.Branch!.Name)
.ThenBy(m => m.DefaultWbKg!.AtKg.Name)
.ThenBy(m => m.FamilyName)
.ThenBy(m => m.GivenName)
.ThenBy(m => m.MgNr);
}
if (modeWhat == 0) {
} else if (modeWhat == 1) {
} else if (modeWhat == 2) {
var d = new SaveFileDialog() {
FileName = $"{Documents.MemberList.Name}.ods",
DefaultExt = "ods",
Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods",
Title = $"{Documents.MemberList.Name} speichern unter - Elwig"
};
if (d.ShowDialog() == true) {
Mouse.OverrideCursor = Cursors.AppStarting;
try {
var data = await MemberListData.FromQuery(query, filterNames);
using var ods = new OdsFile(d.FileName);
await ods.AddTable(data);
} catch (Exception exc) {
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
Mouse.OverrideCursor = null;
}
} else {
Mouse.OverrideCursor = Cursors.AppStarting;
try {
var data = await MemberListData.FromQuery(query, filterNames);
using var doc = new MemberList(string.Join(" / ", filterNames), data);
await doc.Generate();
if (modeWhat == 1 || App.Config.Debug) {
doc.Show();
} else if (modeWhat == 2) {
await doc.Print();
}
} catch (Exception exc) {
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
Mouse.OverrideCursor = null;
}
// TODO
}
private void FocusSearchInput(object sender, RoutedEventArgs evt) {