From a8e3eb6c1cc016d27977cf3a509b9d41a19b70a5 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Mon, 11 Mar 2024 11:09:53 +0100 Subject: [PATCH] [#43] MailWindow: Do not use Context from ContextWindow any more --- Elwig/Helpers/ControlUtils.cs | 4 +- Elwig/Windows/MailWindow.xaml.cs | 102 ++++++++++++++++++++----------- 2 files changed, 71 insertions(+), 35 deletions(-) diff --git a/Elwig/Helpers/ControlUtils.cs b/Elwig/Helpers/ControlUtils.cs index 47c1a3d..1327fe8 100644 --- a/Elwig/Helpers/ControlUtils.cs +++ b/Elwig/Helpers/ControlUtils.cs @@ -102,16 +102,18 @@ namespace Elwig.Helpers { selector.SelectedItem = selItem; } - public static void RenewItemsSource(Xceed.Wpf.Toolkit.Primitives.Selector selector, IEnumerable? source, Func getId) { + public static void RenewItemsSource(Xceed.Wpf.Toolkit.Primitives.Selector selector, IEnumerable? source, Func getId, Xceed.Wpf.Toolkit.Primitives.ItemSelectionChangedEventHandler? handler = null) { if (selector.ItemsSource == source) return; var selectedIds = selector.SelectedItems.Cast().Select(i => getId(i)).ToList(); + if (handler != null && selectedIds != null) selector.ItemSelectionChanged -= handler; selector.ItemsSource = source; if (source != null) { selector.SelectedItems.Clear(); foreach (var i in source.Cast().Where(i => selectedIds.Contains(getId(i)))) selector.SelectedItems.Add(i); } + if (handler != null && selectedIds != null) selector.ItemSelectionChanged += handler; } public static void RenewItemsSource(DataGrid dataGrid, IEnumerable? source, Func getId, SelectionChangedEventHandler? handler = null, RenewSourceDefault def = RenewSourceDefault.None, bool keepSort = true) { diff --git a/Elwig/Windows/MailWindow.xaml.cs b/Elwig/Windows/MailWindow.xaml.cs index 655b511..ad48364 100644 --- a/Elwig/Windows/MailWindow.xaml.cs +++ b/Elwig/Windows/MailWindow.xaml.cs @@ -102,8 +102,10 @@ namespace Elwig.Windows { // powershell -Command "$(Get-WmiObject -Class Win32_Printer | Where-Object {$_.Default -eq $True}).Name" public MailWindow(int? year = null) { InitializeComponent(); - Year = year ?? Context.Seasons.OrderBy(s => s.Year).LastOrDefault()?.Year; - Title = $"Rundschreiben - Lese {Year} - Elwig"; + using (var ctx = new AppDbContext()) { + Year = year ?? ctx.Seasons.OrderBy(s => s.Year).LastOrDefault()?.Year; + Title = $"Rundschreiben - Lese {Year} - Elwig"; + } AvaiableDocumentsList.ItemsSource = AvaiableDocuments; SelectedDocumentsList.ItemsSource = SelectedDocs; @@ -126,7 +128,8 @@ namespace Elwig.Windows { } protected override async Task OnRenewContext() { - var season = await Context.Seasons.FindAsync(Year); + using var ctx = new AppDbContext(); + var season = await ctx.Seasons.FindAsync(Year); var l = new List { MemberDataSheet.Name }; @@ -136,28 +139,44 @@ namespace Elwig.Windows { } AvaiableDocumentsList.ItemsSource = l; - ControlUtils.RenewItemsSource(MemberBranchInput, await Context.Branches + ControlUtils.RenewItemsSource(MemberBranchInput, await ctx.Branches .Where(b => b.Members.Any()) .OrderBy(b => b.Name) - .ToListAsync(), b => (b as Branch)?.ZwstId); - if (MemberBranchInput.SelectedItems.Count == 0) MemberBranchInput.SelectAll(); - ControlUtils.RenewItemsSource(MemberKgInput, await Context.Katastralgemeinden - .Where(k => k.WbKg.Members.Any()) + .ToListAsync(), b => (b as Branch)?.ZwstId, MemberInput_SelectionChanged); + if (MemberBranchInput.SelectedItems.Count == 0) { + MemberBranchInput.ItemSelectionChanged -= MemberInput_SelectionChanged; + MemberBranchInput.SelectAll(); + MemberBranchInput.ItemSelectionChanged += MemberInput_SelectionChanged; + } + ControlUtils.RenewItemsSource(MemberKgInput, await ctx.Katastralgemeinden + .Where(k => k.WbKg!.Members.Any()) .OrderBy(k => k.Name) - .ToListAsync(), k => (k as AT_Kg)?.KgNr); - if (MemberKgInput.SelectedItems.Count == 0) MemberKgInput.SelectAll(); - ControlUtils.RenewItemsSource(MemberAreaComInput, await Context.AreaCommitmentTypes + .ToListAsync(), k => (k as AT_Kg)?.KgNr, MemberInput_SelectionChanged); + if (MemberKgInput.SelectedItems.Count == 0) { + MemberKgInput.ItemSelectionChanged -= MemberInput_SelectionChanged; + MemberKgInput.SelectAll(); + MemberKgInput.ItemSelectionChanged += MemberInput_SelectionChanged; + } + ControlUtils.RenewItemsSource(MemberAreaComInput, await ctx.AreaCommitmentTypes .OrderBy(a => a.VtrgId) - .ToListAsync(), a => (a as AreaComType)?.VtrgId); - if (MemberAreaComInput.SelectedItems.Count == 0) MemberAreaComInput.SelectAll(); - ControlUtils.RenewItemsSource(MemberCustomInput, await Context.Members + .ToListAsync(), a => (a as AreaComType)?.VtrgId, MemberInput_SelectionChanged); + if (MemberAreaComInput.SelectedItems.Count == 0) { + MemberAreaComInput.ItemSelectionChanged -= MemberInput_SelectionChanged; + MemberAreaComInput.SelectAll(); + MemberAreaComInput.ItemSelectionChanged += MemberInput_SelectionChanged; + } + ControlUtils.RenewItemsSource(MemberCustomInput, await ctx.Members .Where(m => m.IsActive) .OrderBy(m => m.FamilyName) .ThenBy(m => m.GivenName) - .ToListAsync(), m => (m as Member)?.MgNr); - if (MemberCustomInput.SelectedItems.Count == 0) MemberCustomInput.SelectAll(); + .ToListAsync(), m => (m as Member)?.MgNr, MemberInput_SelectionChanged); + if (MemberCustomInput.SelectedItems.Count == 0) { + MemberCustomInput.ItemSelectionChanged -= MemberInput_SelectionChanged; + MemberCustomInput.SelectAll(); + MemberCustomInput.ItemSelectionChanged += MemberInput_SelectionChanged; + } - await UpdateRecipients(); + await UpdateRecipients(ctx); } private void ContinueButton_Click(object sender, RoutedEventArgs evt) { @@ -229,8 +248,9 @@ namespace Elwig.Windows { } else if (idx == 1) { SelectedDocs.Add(new(DocType.DeliveryConfirmation, s, ((int)Year!, DocumentNonDeliverersInput.IsChecked == true))); } else if (idx >= 2) { + using var ctx = new AppDbContext(); var name = s.Split(" – ")[^1]; - var pv = Context.PaymentVariants.Single(v => v.Year == Year && v.Name == name)!; + var pv = ctx.PaymentVariants.Single(v => v.Year == Year && v.Name == name)!; SelectedDocs.Add(new(DocType.CreditNote, s, (pv.Year, pv.AvNr))); } SelectedDocumentsList.SelectedIndex = SelectedDocs.Count - 1; @@ -265,20 +285,22 @@ namespace Elwig.Windows { MemberAreaComInput.Visibility = RecipientsAreaComMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden; MemberAreaComLabel.Visibility = RecipientsAreaComMembersInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden; MemberCustomInput.Visibility = RecipientsCustomInput.IsChecked == true ? Visibility.Visible : Visibility.Hidden; - await UpdateRecipients(); + using var ctx = new AppDbContext(); + await UpdateRecipients(ctx); } private async void MemberInput_SelectionChanged(object sender, RoutedEventArgs evt) { - await UpdateRecipients(); + using var ctx = new AppDbContext(); + await UpdateRecipients(ctx); } - private async Task UpdateRecipients() { + private async Task UpdateRecipients(AppDbContext ctx) { if (RecipientsCustomInput.IsChecked == true) { Recipients = MemberCustomInput.SelectedItems.Cast().ToList(); } else { - var year = (!await Context.Deliveries.AnyAsync()) ? 0 : await Context.Deliveries.Select(d => d.Year).MaxAsync(); + var year = (!await ctx.Deliveries.AnyAsync()) ? 0 : await ctx.Deliveries.MaxAsync(d => d.Year); - IQueryable query = Context.Members.Where(m => m.IsActive); + IQueryable query = ctx.Members.Where(m => m.IsActive); if (MemberBranchInput.SelectedItems.Count != MemberBranchInput.Items.Count) { var zwst = MemberBranchInput.SelectedItems.Cast().Select(b => b.ZwstId).ToList(); query = query.Where(m => zwst.Contains(m.ZwstId)); @@ -296,7 +318,16 @@ namespace Elwig.Windows { } else if (year > 0 && RecipientsNonDeliveryMembersInput.IsChecked == true) { query = query.Where(m => !m.Deliveries.Any(d => d.Year == year)); } - Recipients = await query.ToListAsync(); + Recipients = await query + .Include(m => m.Branch) + .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) + .ToListAsync(); } UpdatePostalEmailRecipients(); } @@ -376,6 +407,8 @@ namespace Elwig.Windows { DisposeDocs(); await UpdateTextParameters(); + using var ctx = new AppDbContext(); + var doublePaged = DoublePagedInput.IsChecked == true; var location = PostalLocation.Text.Trim(); var docs = SelectedDocs.OrderByDescending(d => d.Type).ToList(); @@ -417,16 +450,16 @@ namespace Elwig.Windows { if (doc.Type == DocType.DeliveryConfirmation) { var details = ((int, bool))doc.Details!; var year = details.Item1; - dcData[year] = await DeliveryConfirmationDeliveryData.ForSeason(Context.DeliveryParts, year); + dcData[year] = await DeliveryConfirmationDeliveryData.ForSeason(ctx.DeliveryParts, year); } else if (doc.Type == DocType.CreditNote) { var details = ((int, int))doc.Details!; var year = details.Item1; var avnr = details.Item2; try { cnData[(year, avnr)] = ( - await CreditNoteDeliveryData.ForPaymentVariant(Context.CreditNoteDeliveryRows, Context.Seasons, year, avnr), - await Context.MemberPayments.Where(p => p.Year == year && p.AvNr == avnr).ToDictionaryAsync(c => c.MgNr), - BillingData.FromJson((await Context.PaymentVariants.FindAsync(year, avnr))!.Data) + await CreditNoteDeliveryData.ForPaymentVariant(ctx.CreditNoteDeliveryRows, ctx.Seasons, year, avnr), + await ctx.MemberPayments.Where(p => p.Year == year && p.AvNr == avnr).ToDictionaryAsync(c => c.MgNr), + BillingData.FromJson((await ctx.PaymentVariants.FindAsync(year, avnr))!.Data) ); } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); @@ -434,7 +467,7 @@ namespace Elwig.Windows { Mouse.OverrideCursor = null; return; } - await Context.GetMemberAreaCommitmentBuckets(year, 0); + await ctx.GetMemberAreaCommitmentBuckets(year, 0); } } @@ -445,7 +478,7 @@ namespace Elwig.Windows { if (doc.Type == DocType.Custom) { return [new GeneratedDoc((string)doc.Details!)]; } else if (doc.Type == DocType.MemberDataSheet) { - return [new GeneratedDoc(new MemberDataSheet(m, Context))]; + return [new GeneratedDoc(new MemberDataSheet(m, ctx))]; } else if (doc.Type == DocType.DeliveryConfirmation) { var details = ((int, bool))doc.Details!; var year = details.Item1; @@ -458,7 +491,7 @@ namespace Elwig.Windows { } else { return []; } - return [new GeneratedDoc(new DeliveryConfirmation(Context, year, m, data))]; + return [new GeneratedDoc(new DeliveryConfirmation(ctx, year, m, data))]; } else if (doc.Type == DocType.CreditNote) { var details = ((int, int))doc.Details!; var year = details.Item1; @@ -466,11 +499,11 @@ namespace Elwig.Windows { var data = cnData[(year, avnr)]; try { return [new GeneratedDoc(new CreditNote( - Context, data.Item2[m.MgNr], data.Item1[m.MgNr], + ctx, data.Item2[m.MgNr], data.Item1[m.MgNr], data.Item3.ConsiderContractPenalties, data.Item3.ConsiderTotalPenalty, data.Item3.ConsiderAutoBusinessShares, - Context.GetMemberUnderDelivery(year, m.MgNr).GetAwaiter().GetResult() + ctx.GetMemberUnderDelivery(year, m.MgNr).GetAwaiter().GetResult() ))]; } catch (Exception) { return []; @@ -671,7 +704,8 @@ namespace Elwig.Windows { if (AvaiableDocumentsList.SelectedItem is not string s || SelectedDocs.Any(d => d.Type == DocType.CreditNote)) return; var name = s.Split(" – ")[^1]; - var pv = Context.PaymentVariants.Single(v => v.Year == Year && v.Name == name)!; + using var ctx = new AppDbContext(); + var pv = ctx.PaymentVariants.Single(v => v.Year == Year && v.Name == name)!; SelectedDocs.Add(new(DocType.CreditNote, s, (pv.Year, pv.AvNr))); SelectedDocumentsList.SelectedIndex = SelectedDocs.Count - 1; }