diff --git a/Elwig/Windows/MemberAdminWindow.xaml b/Elwig/Windows/MemberAdminWindow.xaml
index 6f88854..a014a71 100644
--- a/Elwig/Windows/MemberAdminWindow.xaml
+++ b/Elwig/Windows/MemberAdminWindow.xaml
@@ -45,20 +45,56 @@
@@ -256,8 +292,8 @@
-
-
+
diff --git a/Elwig/Windows/MemberAdminWindow.xaml.cs b/Elwig/Windows/MemberAdminWindow.xaml.cs
index 84db95d..2562e1b 100644
--- a/Elwig/Windows/MemberAdminWindow.xaml.cs
+++ b/Elwig/Windows/MemberAdminWindow.xaml.cs
@@ -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> 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 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