diff --git a/Elwig/Helpers/AppDbContext.cs b/Elwig/Helpers/AppDbContext.cs index 8573aa1..41771c2 100644 --- a/Elwig/Helpers/AppDbContext.cs +++ b/Elwig/Helpers/AppDbContext.cs @@ -46,6 +46,7 @@ namespace Elwig.Helpers { public DbSet Members { get; private set; } public DbSet BillingAddresses { get; private set; } public DbSet MemberTelephoneNrs { get; private set; } + public DbSet MemberEmailAddrs { get; private set; } public DbSet MemberHistory { get; private set; } public DbSet AreaCommitments { get; private set; } public DbSet Seasons { get; private set; } diff --git a/Elwig/Windows/MemberAdminWindow.xaml.cs b/Elwig/Windows/MemberAdminWindow.xaml.cs index 19d568e..f486392 100644 --- a/Elwig/Windows/MemberAdminWindow.xaml.cs +++ b/Elwig/Windows/MemberAdminWindow.xaml.cs @@ -191,13 +191,13 @@ namespace Elwig.Windows { memberQuery = memberQuery .Include(m => m.Branch) - .Include(m => m.DefaultWbKg.AtKg) + .Include(m => m.DefaultWbKg!.AtKg) .Include(m => m.EmailAddresses) .Include(m => m.TelephoneNumbers) - .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); + .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 members = await memberQuery.ToListAsync(); if (filter.Count > 0 && members.Count > 0) { @@ -379,7 +379,14 @@ namespace Elwig.Windows { } private async void SaveButton_Click(object sender, RoutedEventArgs evt) { - var mgnr = await UpdateMember((MemberList.SelectedItem as Member)?.MgNr); + int? mgnr = null; + try { + mgnr = await UpdateMember((MemberList.SelectedItem as Member)?.MgNr); + } catch (Exception exc) { + 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 aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); + } IsEditing = false; IsCreating = false; MemberList.IsEnabled = true; @@ -392,7 +399,8 @@ namespace Elwig.Windows { await RefreshMemberList(); RefreshInputs(); SearchInput.Text = ""; - FocusMember(mgnr); + if (mgnr is int m) + FocusMember(m); } private void ResetButton_Click(object sender, RoutedEventArgs evt) { @@ -563,114 +571,93 @@ namespace Elwig.Windows { } } - private async Task UpdateMember(int? mgnr) { + private async Task UpdateMember(int? oldMgNr) { using var ctx = new AppDbContext(); - var m = ctx.CreateProxy(); - if (mgnr != null) - m.MgNr = (int)mgnr; + var newMgNr = int.Parse(MgNrInput.Text); + var m = new Member { + MgNr = oldMgNr ?? newMgNr, + PredecessorMgNr = (PredecessorMgNrInput.Text == "") ? null : int.Parse(PredecessorMgNrInput.Text), + Prefix = (PrefixInput.Text == "") ? null : PrefixInput.Text, + GivenName = GivenNameInput.Text, + FamilyName = FamilyNameInput.Text, + Suffix = (SuffixInput.Text == "") ? null : SuffixInput.Text, + Birthday = (BirthdayInput.Text == "") ? null : string.Join("-", BirthdayInput.Text.Split(".").Reverse()), + IsDeceased = DeceasedInput.IsChecked ?? false, + CountryNum = 40, // Austria AT AUT + PostalDestId = ((AT_PlzDest)OrtInput.SelectedItem).Id, + Address = AddressInput.Text, - int newMgNr = int.Parse(MgNrInput.Text); - m.PredecessorMgNr = (PredecessorMgNrInput.Text == "") ? null : int.Parse(PredecessorMgNrInput.Text); - m.Prefix = (PrefixInput.Text == "") ? null : PrefixInput.Text; - m.GivenName = GivenNameInput.Text; - m.FamilyName = FamilyNameInput.Text; - m.Suffix = (SuffixInput.Text == "") ? null : SuffixInput.Text; - m.Birthday = (BirthdayInput.Text == "") ? null : string.Join("-", BirthdayInput.Text.Split(".").Reverse()); - m.IsDeceased = DeceasedInput.IsChecked ?? false; - m.CountryNum = 40; // Austria AT AUT - m.PostalDestId = ((AT_PlzDest)OrtInput.SelectedItem).Id; - m.Address = AddressInput.Text; + Iban = (IbanInput.Text == "") ? null : IbanInput.Text.Replace(" ", ""), + Bic = (BicInput.Text == "") ? null : BicInput.Text, - m.Iban = (IbanInput.Text == "") ? null : IbanInput.Text.Replace(" ", ""); - m.Bic = (BicInput.Text == "") ? null : BicInput.Text; + UstIdNr = (UstIdNrInput.Text == "") ? null : UstIdNrInput.Text, + LfbisNr = (LfbisNrInput.Text == "") ? null : LfbisNrInput.Text, + IsBuchführend = BuchführendInput.IsChecked ?? false, + IsOrganic = OrganicInput.IsChecked ?? false, - m.UstIdNr = (UstIdNrInput.Text == "") ? null : UstIdNrInput.Text; - m.LfbisNr = (LfbisNrInput.Text == "") ? null : LfbisNrInput.Text; - m.IsBuchführend = BuchführendInput.IsChecked ?? false; - m.IsOrganic = OrganicInput.IsChecked ?? false; + EntryDateString = (EntryDateInput.Text == "") ? null : string.Join("-", EntryDateInput.Text.Split(".").Reverse()), + ExitDateString = (ExitDateInput.Text == "") ? null : string.Join("-", ExitDateInput.Text.Split(".").Reverse()), + BusinessShares = (BusinessSharesInput.Text == "") ? 0 : int.Parse(BusinessSharesInput.Text), + AccountingNr = (AccountingNrInput.Text == "") ? null : AccountingNrInput.Text, + IsActive = ActiveInput.IsChecked ?? false, + IsVollLieferant = VollLieferantInput.IsChecked ?? false, + IsFunktionär = FunkionärInput.IsChecked ?? false, + ZwstId = ((Branch)BranchInput.SelectedItem).ZwstId, + DefaultKgNr = ((AT_Kg)DefaultKgInput.SelectedItem).KgNr, + Comment = (CommentInput.Text == "") ? null : CommentInput.Text, + ContactViaPost = ContactPostalInput.IsChecked ?? false, + ContactViaEmail = ContactEmailInput.IsChecked ?? false, + }; - m.EntryDateString = (EntryDateInput.Text == "") ? null : string.Join("-", EntryDateInput.Text.Split(".").Reverse()); - m.ExitDateString = (ExitDateInput.Text == "") ? null : string.Join("-", ExitDateInput.Text.Split(".").Reverse()); - m.BusinessShares = (BusinessSharesInput.Text == "") ? 0 : int.Parse(BusinessSharesInput.Text); - m.AccountingNr = (AccountingNrInput.Text == "") ? null : AccountingNrInput.Text; - m.IsActive = ActiveInput.IsChecked ?? false; - m.IsVollLieferant = VollLieferantInput.IsChecked ?? false; - m.IsFunktionär = FunkionärInput.IsChecked ?? false; - m.ZwstId = ((Branch)BranchInput.SelectedItem).ZwstId; - m.DefaultKgNr = ((AT_Kg)DefaultKgInput.SelectedItem).KgNr; - m.Comment = (CommentInput.Text == "") ? null : CommentInput.Text; - m.ContactViaPost = ContactPostalInput.IsChecked ?? false; - m.ContactViaEmail = ContactEmailInput.IsChecked ?? false; - - try { - if (IsEditing) { - ctx.Update(m); - } else if (IsCreating) { - m.MgNr = newMgNr; - await ctx.AddAsync(m); - } else { - throw new Exception(); - } - - if (BillingOrtInput.SelectedItem == null) { - if (m.BillingAddress != null) { - ctx.Remove(m.BillingAddress); - } - } else { - BillingAddr b = m.BillingAddress ?? ctx.CreateProxy(); - b.Name = BillingNameInput.Text; - b.Address = BillingAddressInput.Text; - var p = (AT_PlzDest)BillingOrtInput.SelectedItem; - b.CountryNum = p.CountryNum; - b.PostalDestId = p.Id; - if (m.BillingAddress == null) { - b.MgNr = newMgNr; - await ctx.AddAsync(b); - } else { - ctx.Update(b); - } - } - - ctx.RemoveRange(m.TelephoneNumbers); - for (int i = 0, j = 0; i < PhoneNrInputs.Length; i++) { - var input = GetPhoneNrInput(i); - if (input != null) { - var pInput = input.Value; - MemberTelNr p = ctx.CreateProxy(); - p.MgNr = newMgNr; - p.Nr = ++j; - p.Type = pInput.Type; - p.Number = pInput.Number; - p.Comment = pInput.Comment; - await ctx.AddAsync(p); - } - } - - ctx.RemoveRange(m.EmailAddresses); - for (int i = 0, j = 0; i < EmailAddressInputs.Length; i++) { - var input = GetEmailAddressInput(i); - if (input != null && input != "") { - MemberEmailAddr a = ctx.CreateProxy(); - a.MgNr = newMgNr; - a.Nr = ++j; - a.Address = input; - a.Comment = null; - await ctx.AddAsync(a); - } - } - - await ctx.SaveChangesAsync(); - - if (newMgNr != m.MgNr) { - await ctx.Database.ExecuteSqlAsync($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {m.MgNr}"); - } - } catch (Exception exc) { - 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 aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); + if (oldMgNr != null) { + ctx.Update(m); + } else { + ctx.Add(m); } - return m.MgNr; + ctx.RemoveRange(ctx.BillingAddresses.Where(a => a.MgNr == oldMgNr)); + if (BillingOrtInput.SelectedItem != null) { + var p = (AT_PlzDest)BillingOrtInput.SelectedItem; + ctx.Add(new BillingAddr { + MgNr = m.MgNr, + Name = BillingNameInput.Text, + Address = BillingAddressInput.Text, + CountryNum = p.CountryNum, + PostalDestId = p.Id, + }); + } + + ctx.RemoveRange(ctx.MemberTelephoneNrs.Where(t => t.MgNr == oldMgNr)); + ctx.AddRange(Enumerable.Range(0, PhoneNrInputs.Length) + .Select(GetPhoneNrInput) + .Where(input => input != null) + .Select(input => input!.Value) + .Select((input, i) => new MemberTelNr { + MgNr = m.MgNr, + Nr = i + 1, + Type = input.Type, + Number = input.Number, + Comment = input.Comment, + })); + + ctx.RemoveRange(ctx.MemberEmailAddrs.Where(e => e.MgNr == oldMgNr)); + ctx.AddRange(Enumerable.Range(0, EmailAddressInputs.Length) + .Select(GetEmailAddressInput) + .Where(input => input != null && input != "") + .Select((input, i) => new MemberEmailAddr { + MgNr = m.MgNr, + Nr = i + 1, + Address = input!, + Comment = null, + })); + + await ctx.SaveChangesAsync(); + + if (newMgNr != m.MgNr) { + await ctx.Database.ExecuteSqlAsync($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {oldMgNr}"); + } + + return newMgNr; } private void FillInputs(Member m) {