[#36] MemberAdminWindow: Add MemberList
This commit is contained in:
@ -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) {
|
||||
|
Reference in New Issue
Block a user