From 64832e9a537f384b0dac6a2f47991a163da99427 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Mon, 7 Jul 2025 23:14:03 +0200 Subject: [PATCH] [#57] PaymentVariantsWindow: Use Task.Run() --- Elwig/Services/PaymentVariantService.cs | 152 +++++++++++++------- Elwig/Windows/PaymentVariantsWindow.xaml.cs | 53 +++---- 2 files changed, 124 insertions(+), 81 deletions(-) diff --git a/Elwig/Services/PaymentVariantService.cs b/Elwig/Services/PaymentVariantService.cs index d57829d..64fbcc0 100644 --- a/Elwig/Services/PaymentVariantService.cs +++ b/Elwig/Services/PaymentVariantService.cs @@ -189,16 +189,41 @@ namespace Elwig.Services { } public static async Task GenerateSummary(PaymentVar v, ExportMode mode) { - Mouse.OverrideCursor = Cursors.AppStarting; - try { - using var ctx = new AppDbContext(); - var data = await PaymentVariantSummaryData.ForPaymentVariant(v, ctx.PaymentVariantSummaryRows); - using var doc = new PaymentVariantSummary((await ctx.PaymentVariants.FindAsync(v.Year, v.AvNr))!, data); - await Utils.ExportDocument(doc, mode); - } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + if (mode == ExportMode.SaveList) { + var d = new SaveFileDialog() { + FileName = $"Variantendaten-{v.Name.Trim().Replace(' ', '-')}.ods", + DefaultExt = "ods", + Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods", + Title = $"Variantendaten {v.Name} speichern unter - Elwig" + }; + if (d.ShowDialog() == false) + return; + Mouse.OverrideCursor = Cursors.Wait; + await Task.Run(async () => { + try { + using var ctx = new AppDbContext(); + var data = await PaymentVariantSummaryData.ForPaymentVariant(v, ctx.PaymentVariantSummaryRows); + using var ods = new OdsFile(d.FileName); + await ods.AddTable(data); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } + }); + Mouse.OverrideCursor = null; + } else { + Mouse.OverrideCursor = Cursors.Wait; + await Task.Run(async () => { + try { + using var ctx = new AppDbContext(); + var data = await PaymentVariantSummaryData.ForPaymentVariant(v, ctx.PaymentVariantSummaryRows); + using var doc = new PaymentVariantSummary((await ctx.PaymentVariants.FindAsync(v.Year, v.AvNr))!, data); + await Utils.ExportDocument(doc, mode); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } + }); + Mouse.OverrideCursor = null; } - Mouse.OverrideCursor = null; } public static async Task GenerateEbics(int year, int avnr) { @@ -225,13 +250,15 @@ namespace Elwig.Services { Title = $"Überweisungsdaten speichern unter - Elwig", }; if (d.ShowDialog() == true) { - Mouse.OverrideCursor = Cursors.AppStarting; - try { - using var e = new Ebics(v, d.FileName, App.Client.ExportEbicsVersion, (Ebics.AddressMode)App.Client.ExportEbicsAddress); - await e.ExportAsync(Transaction.FromPaymentVariant(v)); - } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); - } + Mouse.OverrideCursor = Cursors.Wait; + await Task.Run(async () => { + try { + using var e = new Ebics(v, d.FileName, App.Client.ExportEbicsVersion, (Ebics.AddressMode)App.Client.ExportEbicsAddress); + await e.ExportAsync(Transaction.FromPaymentVariant(v)); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } + }); Mouse.OverrideCursor = null; } } @@ -244,23 +271,26 @@ namespace Elwig.Services { Title = $"Buchungsliste speichern unter - Elwig" }; if (d.ShowDialog() == true) { - Mouse.OverrideCursor = Cursors.AppStarting; - try { - using var ctx = new AppDbContext(); - var tbl = await CreditNoteData.ForPaymentVariant(ctx, year, avnr); - using var ods = new OdsFile(d.FileName); - await ods.AddTable(tbl); - } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); - } + Mouse.OverrideCursor = Cursors.Wait; + await Task.Run(async () => { + try { + using var ctx = new AppDbContext(); + var tbl = await CreditNoteData.ForPaymentVariant(ctx, year, avnr); + using var ods = new OdsFile(d.FileName); + await ods.AddTable(tbl); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } + }); Mouse.OverrideCursor = null; } } public static async Task CreatePaymentVariant(int year) { - PaymentVar? v; - using (var ctx = new AppDbContext()) { - v = new PaymentVar { + Mouse.OverrideCursor = Cursors.Wait; + var v = await Task.Run(async () => { + using var ctx = new AppDbContext(); + var v = new PaymentVar { Year = year, AvNr = await ctx.NextAvNr(year), Name = "Neue Auszahlungsvariante", @@ -270,15 +300,17 @@ namespace Elwig.Services { }; ctx.Add(v); await ctx.SaveChangesAsync(); - } + return v; + }); App.HintContextChange(); + Mouse.OverrideCursor = null; return v; } public static async Task Duplicate(this PaymentVar orig) { - PaymentVar? n; - using (var ctx = new AppDbContext()) { - n = new PaymentVar { + var n = await Task.Run(async () => { + using var ctx = new AppDbContext(); + var n = new PaymentVar { Year = orig.Year, AvNr = await ctx.NextAvNr(orig.Year), Name = $"{orig.Name} (Kopie)", @@ -286,10 +318,10 @@ namespace Elwig.Services { DateString = $"{DateTime.Today:yyyy-MM-dd}", Data = orig.Data, }; - ctx.Add(n); await ctx.SaveChangesAsync(); - } + return n; + }); App.HintContextChange(); return n; } @@ -297,18 +329,18 @@ namespace Elwig.Services { public static async Task<(int, int)> UpdatePaymentVariant(this PaymentVariantsViewModel vm, int? oldYear, int? oldAvNr) { var year = oldYear ?? Utils.CurrentYear; int avnr = 0; + await Task.Run(async () => { + var d = App.Config.Debug ? BillingData.FromJson(vm.Data ?? "{}") : vm.BillingData!; + d.ConsiderDelieryModifiers = vm.ConsiderModifiers; + d.ConsiderContractPenalties = vm.ConsiderPenalties; + d.ConsiderTotalPenalty = vm.ConsiderPenalty; + d.ConsiderAutoBusinessShares = vm.ConsiderAuto; + d.ConsiderCustomModifiers = vm.ConsiderCustom; + var modVal = vm.WeightModifier ?? 0; + d.NetWeightModifier = modVal > 0 ? modVal / 100.0 : 0; + d.GrossWeightModifier = modVal < 0 ? modVal / 100.0 : 0; - var d = App.Config.Debug ? BillingData.FromJson(vm.Data ?? "{}") : vm.BillingData!; - d.ConsiderDelieryModifiers = vm.ConsiderModifiers; - d.ConsiderContractPenalties = vm.ConsiderPenalties; - d.ConsiderTotalPenalty = vm.ConsiderPenalty; - d.ConsiderAutoBusinessShares = vm.ConsiderAuto; - d.ConsiderCustomModifiers = vm.ConsiderCustom; - var modVal = vm.WeightModifier ?? 0; - d.NetWeightModifier = modVal > 0 ? modVal / 100.0 : 0; - d.GrossWeightModifier = modVal < 0 ? modVal / 100.0 : 0; - - using (var ctx = new AppDbContext()) { + using var ctx = new AppDbContext(); var v = new PaymentVar { Year = year, AvNr = oldAvNr ?? await ctx.NextAvNr(year), @@ -323,24 +355,44 @@ namespace Elwig.Services { avnr = v.AvNr; ctx.Update(v); await ctx.SaveChangesAsync(); - } + }); vm.WeightModifierChanged = false; App.HintContextChange(); return (year, avnr); } public static async Task DeletePaymentVariant(int year, int avnr) { - using (var ctx = new AppDbContext()) { + await Task.Run(async () => { + using var ctx = new AppDbContext(); var v = (await ctx.PaymentVariants.FindAsync(year, avnr))!; ctx.Remove(v); await ctx.SaveChangesAsync(); - } + }); App.HintContextChange(); } public static async Task Calculate(int year, int avnr) { - var b = new BillingVariant(year, avnr); - await b.Calculate(); + await Task.Run(async () => { + var b = new BillingVariant(year, avnr); + await b.Calculate(); + }); + App.HintContextChange(); + } + + public static async Task Commit(int year, int avnr) { + await Task.Run(async () => { + var b = new BillingVariant(year, avnr); + await b.Commit(); + }); + App.HintContextChange(); + } + + public static async Task Revert(int year, int avnr) { + await Task.Run(async () => { + var b = new BillingVariant(year, avnr); + await b.Revert(); + }); + App.HintContextChange(); } } } diff --git a/Elwig/Windows/PaymentVariantsWindow.xaml.cs b/Elwig/Windows/PaymentVariantsWindow.xaml.cs index 0f73eea..fad63bd 100644 --- a/Elwig/Windows/PaymentVariantsWindow.xaml.cs +++ b/Elwig/Windows/PaymentVariantsWindow.xaml.cs @@ -98,7 +98,9 @@ namespace Elwig.Windows { } private async void CopyButton_Click(object sender, RoutedEventArgs evt) { - if (PaymentVariantList.SelectedItem is not PaymentVar orig) return; + if (PaymentVariantList.SelectedItem is not PaymentVar orig) + return; + Mouse.OverrideCursor = Cursors.Wait; try { PaymentVar n = await orig.Duplicate(); ControlUtils.SelectItem(PaymentVariantList, n); @@ -107,10 +109,13 @@ namespace Elwig.Windows { if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; MessageBox.Show(str, "Auszahlungsvariante kopieren", MessageBoxButton.OK, MessageBoxImage.Error); } + Mouse.OverrideCursor = null; } private async void DeleteButton_Click(object sender, RoutedEventArgs evt) { - if (PaymentVariantList.SelectedItem is not PaymentVar v || !v.TestVariant) return; + if (PaymentVariantList.SelectedItem is not PaymentVar v || !v.TestVariant) + return; + Mouse.OverrideCursor = Cursors.Wait; try { await PaymentVariantService.DeletePaymentVariant(v.Year, v.AvNr); } catch (Exception exc) { @@ -118,19 +123,19 @@ namespace Elwig.Windows { if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; MessageBox.Show(str, "Auszahlungsvariante löschen", MessageBoxButton.OK, MessageBoxImage.Error); } + Mouse.OverrideCursor = null; } private async void CalculateButton_Click(object sender, RoutedEventArgs evt) { if (PaymentVariantList.SelectedItem is not PaymentVar v) return; ViewModel.CalculateIsEnabled = false; - Mouse.OverrideCursor = Cursors.AppStarting; + Mouse.OverrideCursor = Cursors.Wait; try { await PaymentVariantService.Calculate(v.Year, v.AvNr); } catch (Exception exc) { MessageBox.Show(exc.Message, "Berechnungsfehler", MessageBoxButton.OK, MessageBoxImage.Error); } - App.HintContextChange(); Mouse.OverrideCursor = null; ViewModel.CalculateIsEnabled = true; } @@ -161,24 +166,7 @@ namespace Elwig.Windows { private async void Menu_SummaryExport_Click(object sender, RoutedEventArgs evt) { if (PaymentVariantList.SelectedItem is not PaymentVar v) return; - var d = new SaveFileDialog() { - FileName = $"Variantendaten-{v.Name.Trim().Replace(' ', '-')}.ods", - DefaultExt = "ods", - Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods", - Title = $"Variantendaten {v.Name} speichern unter - Elwig" - }; - if (d.ShowDialog() == false) - return; - Mouse.OverrideCursor = Cursors.AppStarting; - try { - using var ctx = new AppDbContext(); - var data = await PaymentVariantSummaryData.ForPaymentVariant(v, ctx.PaymentVariantSummaryRows); - using var ods = new OdsFile(d.FileName); - await ods.AddTable(data); - } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); - } - Mouse.OverrideCursor = null; + await PaymentVariantService.GenerateSummary(v, ExportMode.SaveList); } private async void Menu_SummaryShow_Click(object sender, RoutedEventArgs evt) { @@ -203,16 +191,14 @@ namespace Elwig.Windows { if (PaymentVariantList.SelectedItem is not PaymentVar v) return; ViewModel.CommitIsEnabled = false; - Mouse.OverrideCursor = Cursors.AppStarting; + Mouse.OverrideCursor = Cursors.Wait; try { - var b = new BillingVariant(v.Year, v.AvNr); - await b.Commit(); + await PaymentVariantService.Commit(v.Year, v.AvNr); } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } Mouse.OverrideCursor = null; ViewModel.RevertIsEnabled = true; - App.HintContextChange(); } private async void RevertButton_Click(object sender, RoutedEventArgs evt) { @@ -225,10 +211,12 @@ namespace Elwig.Windows { if (res != MessageBoxResult.Yes) return; ViewModel.RevertIsEnabled = false; - Mouse.OverrideCursor = Cursors.AppStarting; - var b = new BillingVariant(v.Year, v.AvNr); - await b.Revert(); - App.HintContextChange(); + Mouse.OverrideCursor = Cursors.Wait; + try { + await PaymentVariantService.Revert(v.Year, v.AvNr); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } Mouse.OverrideCursor = null; ViewModel.CommitIsEnabled = true; } @@ -250,7 +238,9 @@ namespace Elwig.Windows { } private async void SaveButton_Click(object sender, RoutedEventArgs evt) { - if (PaymentVariantList.SelectedItem is not PaymentVar v || ViewModel.BillingData == null) return; + if (PaymentVariantList.SelectedItem is not PaymentVar v || ViewModel.BillingData == null) + return; + Mouse.OverrideCursor = Cursors.Wait; try { await ViewModel.UpdatePaymentVariant(v.Year, v.AvNr); } catch (Exception exc) { @@ -259,6 +249,7 @@ namespace Elwig.Windows { if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; MessageBox.Show(str, "Auszahlungsvariante aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); } + Mouse.OverrideCursor = null; await HintContextChange(); CommentInput_TextChanged(null, null); DateInput_TextChanged(null, null);