diff --git a/Elwig/Dialogs/DeleteMemberDialog.xaml b/Elwig/Dialogs/DeleteMemberDialog.xaml
new file mode 100644
index 0000000..0aa5c92
--- /dev/null
+++ b/Elwig/Dialogs/DeleteMemberDialog.xaml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+ Bei Bestätigung wird das Mitglied samt zugehöriger Daten
+ unwiderruflich gelöscht! Wenn möglich sollte stattdessen
+ der Status des Mitglieds auf Inaktiv gesetzt werden!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Elwig/Dialogs/DeleteMemberDialog.xaml.cs b/Elwig/Dialogs/DeleteMemberDialog.xaml.cs
new file mode 100644
index 0000000..cdfb7ca
--- /dev/null
+++ b/Elwig/Dialogs/DeleteMemberDialog.xaml.cs
@@ -0,0 +1,48 @@
+using System.Linq;
+using System.Windows;
+using System.Windows.Controls;
+
+namespace Elwig.Dialogs {
+ public partial class DeleteMemberDialog : Window {
+
+ protected string[] NameParts;
+
+ public bool DeleteAreaComs { get; set; }
+ public bool DeleteDeliveries { get; set; }
+ public bool DeletePaymentData { get; set; }
+
+ public DeleteMemberDialog(int mgnr, string name, int numAreaComs, int numDeliveries, int numCredits) {
+ NameParts = name.ToLower().Split(' ').Where(p => p.Length > 0).Append($"{mgnr}").ToArray();
+ InitializeComponent();
+ Title += " - " + name;
+ AreaComInput.IsEnabled = numAreaComs != 0;
+ AreaComInput.Content += $" ({numAreaComs:N0})";
+ DeliveryInput.IsEnabled = numDeliveries != 0;
+ DeliveryInput.Content += $" ({numDeliveries:N0})";
+ PaymentInput.IsEnabled = numCredits != 0;
+ PaymentInput.Content += $" ({numCredits:N0})";
+ }
+
+ private void NameInput_TextChanged(object sender, TextChangedEventArgs evt) {
+ Update();
+ }
+
+ private void CheckBox_Changed(object sender, RoutedEventArgs evt) {
+ Update();
+ }
+
+ private void Update() {
+ var t = NameInput.Text.ToLower();
+ ConfirmButton.IsEnabled =
+ (!AreaComInput.IsEnabled || DeleteAreaComs) &&
+ (!DeliveryInput.IsEnabled || DeleteDeliveries) &&
+ (!PaymentInput.IsEnabled || DeletePaymentData) &&
+ NameParts.All(t.Contains);
+ }
+
+ private void ConfirmButton_Click(object sender, RoutedEventArgs evt) {
+ DialogResult = true;
+ Close();
+ }
+ }
+}
diff --git a/Elwig/Models/Entities/Member.cs b/Elwig/Models/Entities/Member.cs
index 52b82f8..a5612fd 100644
--- a/Elwig/Models/Entities/Member.cs
+++ b/Elwig/Models/Entities/Member.cs
@@ -166,6 +166,9 @@ namespace Elwig.Models.Entities {
[InverseProperty(nameof(Delivery.Member))]
public virtual ICollection Deliveries { get; private set; } = null!;
+ [InverseProperty(nameof(Credit.Member))]
+ public virtual ICollection Credits { get; private set; } = null!;
+
[InverseProperty(nameof(MemberTelNr.Member))]
public virtual ICollection TelephoneNumbers { get; private set; } = null!;
diff --git a/Elwig/Windows/MemberAdminWindow.xaml.cs b/Elwig/Windows/MemberAdminWindow.xaml.cs
index 4155443..e1485e4 100644
--- a/Elwig/Windows/MemberAdminWindow.xaml.cs
+++ b/Elwig/Windows/MemberAdminWindow.xaml.cs
@@ -15,6 +15,7 @@ using Elwig.Models.Dtos;
using Elwig.Helpers.Export;
using Microsoft.Win32;
using Elwig.Helpers.Billing;
+using Elwig.Dialogs;
namespace Elwig.Windows {
public partial class MemberAdminWindow : AdministrationWindow {
@@ -454,20 +455,38 @@ namespace Elwig.Windows {
if (MemberList.SelectedItem is not Member m)
return;
- var r = MessageBox.Show(
- $"Soll das Mitglied \"{m.AdministrativeName}\" (MgNr. {m.MgNr}) wirklich unwiderruflich gelöscht werden?\n" +
- $"Sämtliche Lieferungen und Flächenbindungen dieses Mitglieds werden auch gelöscht!",
- "Mitglied löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel);
- if (r == MessageBoxResult.OK) {
+ int areaComs = 0, deliveries = 0, credits = 0;
+ using (var ctx = new AppDbContext()) {
+ var l = (await ctx.Members.FindAsync(m.MgNr))!;
+ areaComs = l.AreaCommitments.Count;
+ deliveries = l.Deliveries.Count;
+ credits = l.Credits.Count;
+ }
+ var d = new DeleteMemberDialog(m.MgNr, m.AdministrativeName, areaComs, deliveries, credits);
+ if (d.ShowDialog() == true) {
+ Mouse.OverrideCursor = Cursors.AppStarting;
try {
using (var ctx = new AppDbContext()) {
- ctx.Remove(m);
+ var l = (await ctx.Members.FindAsync(m.MgNr))!;
+ if (d.DeletePaymentData) {
+ ctx.RemoveRange(l.Credits);
+ }
+ if (d.DeleteDeliveries) {
+ ctx.RemoveRange(l.Deliveries);
+ }
+ if (d.DeleteAreaComs) {
+ ctx.RemoveRange(l.AreaCommitments);
+ }
+ ctx.Remove(l);
await ctx.SaveChangesAsync();
}
await App.HintContextChange();
} catch (Exception exc) {
- MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+ var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message;
+ if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
+ MessageBox.Show(str, "Mitglied löschen", MessageBoxButton.OK, MessageBoxImage.Error);
}
+ Mouse.OverrideCursor = null;
}
}