[#31] MemberAdminWindow: Rework menu and add more features

This commit is contained in:
2024-03-23 21:50:29 +01:00
parent 7b48385992
commit e435e5da8d
2 changed files with 230 additions and 35 deletions

View File

@ -11,6 +11,7 @@ using System.Threading.Tasks;
using System.Collections.ObjectModel;
using Elwig.Documents;
using System.Diagnostics;
using Elwig.Models.Dtos;
namespace Elwig.Windows {
public partial class MemberAdminWindow : AdministrationWindow {
@ -23,16 +24,22 @@ namespace Elwig.Windows {
private readonly (Label Label, TextBox Address)[] EmailAddressInputs;
private readonly RoutedCommand CtrlF = new("CtrlF", typeof(MemberAdminWindow), [new KeyGesture(Key.F, ModifierKeys.Control)]);
private readonly RoutedCommand CtrlL = new("CtrlL", typeof(MemberAdminWindow), [new KeyGesture(Key.L, ModifierKeys.Control)]);
private readonly RoutedCommand CtrlP = new("CtrlP", typeof(MemberAdminWindow), [new KeyGesture(Key.P, ModifierKeys.Control)]);
private readonly RoutedCommand CtrlO = new("CtrlO", typeof(MemberAdminWindow), [new KeyGesture(Key.O, ModifierKeys.Control)]);
private readonly RoutedCommand CtrlShiftP = new("CtrlShiftP", typeof(MemberAdminWindow), [new KeyGesture(Key.P, ModifierKeys.Control | ModifierKeys.Shift)]);
private readonly RoutedCommand CtrlShiftO = new("CtrlShiftO", typeof(MemberAdminWindow), [new KeyGesture(Key.O, ModifierKeys.Control | ModifierKeys.Shift)]);
protected static ObservableCollection<KeyValuePair<string, string>> PhoneNrTypes { get; set; } = new(Utils.PhoneNrTypes);
public MemberAdminWindow() {
InitializeComponent();
CommandBindings.Add(new CommandBinding(CtrlF, FocusSearchInput));
CommandBindings.Add(new CommandBinding(CtrlP, Menu_Show_MemberDataSheet_Click));
CommandBindings.Add(new CommandBinding(CtrlShiftP, Menu_Print_MemberDataSheet_Click));
CommandBindings.Add(new CommandBinding(CtrlL, Menu_List_SaveActive_Click));
CommandBindings.Add(new CommandBinding(CtrlP, Menu_MemberDataSheet_Show_Click));
CommandBindings.Add(new CommandBinding(CtrlO, Menu_List_ShowActive_Click));
CommandBindings.Add(new CommandBinding(CtrlShiftP, Menu_MemberDataSheet_Print_Click));
CommandBindings.Add(new CommandBinding(CtrlShiftO, Menu_List_PrintActive_Click));
ExemptInputs = [
SearchInput, ActiveMemberInput, MemberList,
];
@ -67,6 +74,15 @@ namespace Elwig.Windows {
InitializeDelayTimer(SearchInput, SearchInput_TextChanged);
SearchInput.TextChanged -= SearchInput_TextChanged;
Menu_List_OrderMgNr.IsChecked = false;
Menu_List_OrderName.IsChecked = false;
Menu_List_OrderOrt.IsChecked = false;
switch (App.Client.OrderingMemberList) {
case 0: Menu_List_OrderMgNr.IsChecked = true; break;
case 1: Menu_List_OrderName.IsChecked = true; break;
case 2: Menu_List_OrderOrt.IsChecked = true; break;
}
}
private void Window_Loaded(object sender, RoutedEventArgs evt) {
@ -271,6 +287,22 @@ namespace Elwig.Windows {
await base.OnRenewContext(ctx);
ControlUtils.RenewItemsSource(BranchInput, await ctx.Branches.OrderBy(b => b.Name).ToListAsync());
ControlUtils.RenewItemsSource(DefaultKgInput, await ctx.WbKgs.Select(k => k.AtKg).OrderBy(k => k.Name).ToListAsync());
Menu_DeliveryConfirmation.Items.Clear();
foreach (var s in await ctx.Seasons.OrderByDescending(s => s.Year).ToListAsync()) {
var i = new MenuItem { Header = $"Saison {s.Year}...", IsEnabled = MemberList.SelectedItem != null };
var show = new MenuItem { Header = "...anzeigen" };
show.Click += Menu_DeliveryConfirmation_Show_Click;
i.Items.Add(show);
var print = new MenuItem { Header = "...drucken" };
print.Click += Menu_DeliveryConfirmation_Print_Click;
i.Items.Add(print);
Menu_DeliveryConfirmation.Items.Add(i);
var email = new MenuItem { Header = "...per E-Mail schicken" };
email.Click += Menu_DeliveryConfirmation_Email_Click;
i.Items.Add(email);
}
await RefreshMemberList();
StatusMembers.Text = $"Mitglieder: {await ctx.Members.CountAsync(m => m.IsActive):N0} ({await ctx.Members.CountAsync():N0})";
StatusBusinessShares.Text = $"Geschäftsanteile: {await ctx.Members.Where(m => m.IsActive).SumAsync(m => m.BusinessShares):N0} ({await ctx.Members.SumAsync(m => m.BusinessShares):N0})";
@ -443,17 +475,17 @@ namespace Elwig.Windows {
}
private async void SearchInput_TextChanged(object sender, RoutedEventArgs evt) {
TextFilter = SearchInput.Text.ToLower().Split(" ").ToList().FindAll(e => e.Length > 0);
TextFilter = SearchInput.Text.ToLower().Split(' ').ToList().FindAll(e => e.Length > 0);
await RefreshMemberListQuery(true);
}
private void Menu_Member_SendEmail_Click(object sender, RoutedEventArgs evt) {
private void Menu_Contact_Email_Click(object sender, RoutedEventArgs evt) {
if (MemberList.SelectedItem is not Member m)
return;
Utils.MailTo(m.EmailAddresses.Select(a => a.Address));
}
private async void Menu_Print_Letterhead_Click(object sender, RoutedEventArgs evt) {
private async void Menu_Contact_Letterhead_Click(object sender, RoutedEventArgs evt) {
if (MemberList.SelectedItem is not Member m)
return;
Mouse.OverrideCursor = Cursors.AppStarting;
@ -471,18 +503,39 @@ namespace Elwig.Windows {
Mouse.OverrideCursor = null;
}
private async void Menu_Print_MemberDataSheet_Click(object sender, RoutedEventArgs evt) {
private async void Menu_MemberDataSheet_Show_Click(object sender, RoutedEventArgs evt) {
if (MemberList.SelectedItem is not Member m)
return;
await GenerateMemberDataSheet(m, 0);
}
private async void Menu_MemberDataSheet_Print_Click(object sender, RoutedEventArgs evt) {
if (MemberList.SelectedItem is not Member m)
return;
await GenerateMemberDataSheet(m, 1);
}
private async void Menu_MemberDataSheet_Email_Click(object sender, RoutedEventArgs evt) {
if (MemberList.SelectedItem is not Member m)
return;
await GenerateMemberDataSheet(m, 2);
}
private static async Task GenerateMemberDataSheet(Member m, int mode) {
Mouse.OverrideCursor = Cursors.AppStarting;
try {
using var ctx = new AppDbContext();
using var doc = new MemberDataSheet(m, ctx);
await doc.Generate();
if (App.Config.Debug) {
doc.Show();
} else {
if (mode == 1 && !App.Config.Debug) {
await doc.Print();
} else if (mode == 2) {
var success = await Utils.SendEmail(m, MemberDataSheet.Name, "Im Anhang finden Sie das aktuelle Stammdatenblatt", [doc]);
if (success)
MessageBox.Show("Die E-Mail wurde erfolgreich verschickt!", "E-Mail verschickt",
MessageBoxButton.OK, MessageBoxImage.Information);
} else {
doc.Show();
}
} catch (Exception exc) {
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
@ -490,21 +543,118 @@ namespace Elwig.Windows {
Mouse.OverrideCursor = null;
}
private async void Menu_Show_MemberDataSheet_Click(object sender, RoutedEventArgs evt) {
if (MemberList.SelectedItem is not Member m)
private async void Menu_DeliveryConfirmation_Show_Click(object sender, RoutedEventArgs evt) {
var season = ((sender as MenuItem)?.Parent as MenuItem)?.Header?.ToString()?.Split(' ')[^1].Split('.')[0];
if (MemberList.SelectedItem is not Member m || season == null || !int.TryParse(season, out var s))
return;
await GenerateDeliveryConfirmation(m, s, 0);
}
private async void Menu_DeliveryConfirmation_Print_Click(object sender, RoutedEventArgs evt) {
var season = ((sender as MenuItem)?.Parent as MenuItem)?.Header?.ToString()?.Split(' ')[^1].Split('.')[0];
if (MemberList.SelectedItem is not Member m || season == null || !int.TryParse(season, out var s))
return;
await GenerateDeliveryConfirmation(m, s, 1);
}
private async void Menu_DeliveryConfirmation_Email_Click(object sender, RoutedEventArgs evt) {
var season = ((sender as MenuItem)?.Parent as MenuItem)?.Header?.ToString()?.Split(' ')[^1].Split('.')[0];
if (MemberList.SelectedItem is not Member m || season == null || !int.TryParse(season, out var s))
return;
await GenerateDeliveryConfirmation(m, s, 2);
}
private static async Task GenerateDeliveryConfirmation(Member m, int year, int mode) {
Mouse.OverrideCursor = Cursors.AppStarting;
try {
using var ctx = new AppDbContext();
using var doc = new MemberDataSheet(m, ctx);
var data = await DeliveryConfirmationDeliveryData.ForMember(ctx.DeliveryParts, year, m);
using var doc = new DeliveryConfirmation(ctx, year, m, data);
await doc.Generate();
doc.Show();
if (mode == 1 && !App.Config.Debug) {
await doc.Print();
} else if (mode == 2) {
var success = await Utils.SendEmail(m, $"{DeliveryConfirmation.Name} {year}", $"Im Anhang finden Sie die Anlieferungsbestätigung {year}", [doc]);
if (success)
MessageBox.Show("Die E-Mail wurde erfolgreich verschickt!", "E-Mail verschickt",
MessageBoxButton.OK, MessageBoxImage.Information);
} else {
doc.Show();
}
} catch (Exception exc) {
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
Mouse.OverrideCursor = null;
}
private async void Menu_List_SaveActive_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(0, 0); }
private async void Menu_List_ShowActive_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(0, 1); }
private async void Menu_List_PrintActive_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(0, 2); }
private async void Menu_List_SaveFilters_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(1, 0); }
private async void Menu_List_ShowFilters_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(1, 1); }
private async void Menu_List_PrintFilters_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(1, 2); }
private async void Menu_List_SaveAll_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(2, 0); }
private async void Menu_List_ShowAll_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(2, 1); }
private async void Menu_List_PrintAll_Click(object sender, RoutedEventArgs evt) { await GenerateMemberList(2, 2); }
private async void Menu_List_Order_Click(object sender, RoutedEventArgs evt) {
Menu_List.IsSubmenuOpen = true;
if (sender == Menu_List_OrderMgNr) {
App.Client.OrderingMemberList = 0;
Menu_List_OrderMgNr.IsChecked = true;
Menu_List_OrderName.IsChecked = false;
Menu_List_OrderOrt.IsChecked = false;
} else if (sender == Menu_List_OrderName) {
App.Client.OrderingMemberList = 1;
Menu_List_OrderMgNr.IsChecked = false;
Menu_List_OrderName.IsChecked = true;
Menu_List_OrderOrt.IsChecked = false;
} else if (sender == Menu_List_OrderOrt) {
App.Client.OrderingMemberList = 2;
Menu_List_OrderMgNr.IsChecked = false;
Menu_List_OrderName.IsChecked = false;
Menu_List_OrderOrt.IsChecked = true;
}
await App.Client.UpdateValues();
}
private async Task GenerateMemberList(int modeWho, int modeWhat) {
using var ctx = new AppDbContext();
IQueryable<Member> list;
if (modeWho == 0) {
list = ctx.Members.Where(m => m.IsActive);
} else if (modeWho == 1) {
list = ctx.Members; // TODO
} else {
list = ctx.Members;
}
if (Menu_List_OrderMgNr.IsChecked) {
list = list.OrderBy(m => m.MgNr);
} else if (Menu_List_OrderName.IsChecked) {
list = list
.OrderBy(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)
.ThenBy(m => m.FamilyName)
.ThenBy(m => m.GivenName)
.ThenBy(m => m.MgNr);
}
if (modeWhat == 0) {
} else if (modeWhat == 1) {
} else if (modeWhat == 2) {
}
// TODO
}
private void FocusSearchInput(object sender, RoutedEventArgs evt) {
if (!IsEditing && !IsCreating) {
SearchInput.Focus();
@ -807,19 +957,28 @@ namespace Elwig.Windows {
StatusAreaCommitment.Text = $"Gebundene Fläche: {m.ActiveAreaCommitments(ctx).Select(c => c.Area).Sum():N0} m²";
}
Menu_Member_SendEmail.IsEnabled = m.EmailAddresses.Count > 0;
Menu_Print_Letterhead.IsEnabled = true;
Menu_Show_MemberDataSheet.IsEnabled = true;
Menu_Print_MemberDataSheet.IsEnabled = true;
Menu_Contact_Email.IsEnabled = m.EmailAddresses.Count > 0;
Menu_Contact_Letterhead.IsEnabled = true;
Menu_MemberDataSheet_Print.IsEnabled = true;
Menu_MemberDataSheet_Email.IsEnabled = App.Config.Smtp != null && m.EmailAddresses.Count > 0;
Menu_MemberDataSheet_Show.IsEnabled = true;
foreach (var i in Menu_DeliveryConfirmation.Items.Cast<MenuItem>()) {
i.IsEnabled = true;
(i.Items[2] as MenuItem)!.IsEnabled = App.Config.Smtp != null && m.EmailAddresses.Count > 0;
}
FinishInputFilling();
}
new protected void ClearInputs(bool validate = false) {
Menu_Member_SendEmail.IsEnabled = false;
Menu_Print_Letterhead.IsEnabled = false;
Menu_Show_MemberDataSheet.IsEnabled = false;
Menu_Print_MemberDataSheet.IsEnabled = false;
Menu_Contact_Email.IsEnabled = false;
Menu_Contact_Letterhead.IsEnabled = false;
Menu_MemberDataSheet_Print.IsEnabled = false;
Menu_MemberDataSheet_Email.IsEnabled = false;
Menu_MemberDataSheet_Show.IsEnabled = false;
foreach (var i in Menu_DeliveryConfirmation.Items.Cast<MenuItem>()) {
i.IsEnabled = false;
}
MemberReferenceButton.IsEnabled = false;
StatusDeliveriesLastSeason.Text = $"Lieferungen ({Utils.CurrentLastSeason - 1}): -";
StatusDeliveriesThisSeason.Text = $"Lieferungen ({Utils.CurrentLastSeason}): -";