From fcd0555e4d11d42849b7e7bc2d75f8a06fb6fedf Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Mon, 29 Jun 2026 02:27:05 +0200 Subject: [PATCH] Elwig: Add InteractionService to centrally manage MessageBox and SaveFileDialogs --- Elwig/App.xaml.cs | 39 +++--- Elwig/Dialogs/UpdateDialog.xaml.cs | 3 +- Elwig/Helpers/AppDbContext.cs | 9 +- Elwig/Helpers/Export/ElwigData.cs | 28 ++-- Elwig/Helpers/Printing/Pdf.cs | 6 +- Elwig/Helpers/Utils.cs | 33 ++--- Elwig/Helpers/Weighing/AveryEventScale.cs | 7 +- Elwig/Helpers/Weighing/Scale.cs | 7 +- Elwig/Services/DeliveryAncmtService.cs | 16 +-- Elwig/Services/DeliveryService.cs | 101 +++++--------- Elwig/Services/InteractionService.cs | 118 ++++++++++++++++ Elwig/Services/MemberService.cs | 52 +++---- Elwig/Services/PaymentVariantService.cs | 66 ++++----- Elwig/Services/SyncService.cs | 55 ++++---- Elwig/Windows/AdministrationWindow.cs | 7 +- Elwig/Windows/AreaComAdminWindow.xaml.cs | 8 +- Elwig/Windows/BaseDataWindow.xaml.Season.cs | 14 +- Elwig/Windows/BaseDataWindow.xaml.cs | 5 +- Elwig/Windows/ChartWindow.xaml.cs | 44 +++--- Elwig/Windows/DeliveryAdminWindow.xaml.cs | 61 +++------ .../Windows/DeliveryAncmtAdminWindow.xaml.cs | 13 +- .../DeliveryScheduleAdminWindow.xaml.cs | 13 +- Elwig/Windows/MailWindow.xaml.cs | 25 ++-- Elwig/Windows/MainWindow.xaml.cs | 127 +++++++----------- Elwig/Windows/MemberAdminWindow.xaml.cs | 22 +-- Elwig/Windows/OriginHierarchyWindow.xaml.cs | 15 +-- Elwig/Windows/PaymentAdjustmentWindow.xaml.cs | 13 +- Elwig/Windows/PaymentVariantsWindow.xaml.cs | 35 ++--- Elwig/Windows/QueryWindow.xaml.cs | 19 +-- 29 files changed, 419 insertions(+), 542 deletions(-) create mode 100644 Elwig/Services/InteractionService.cs diff --git a/Elwig/App.xaml.cs b/Elwig/App.xaml.cs index 8ea13b8..74e60a8 100644 --- a/Elwig/App.xaml.cs +++ b/Elwig/App.xaml.cs @@ -5,6 +5,7 @@ using Elwig.Helpers.Export; using Elwig.Helpers.Printing; using Elwig.Helpers.Weighing; using Elwig.Models.Entities; +using Elwig.Services; using Elwig.Windows; using Microsoft.EntityFrameworkCore; using System; @@ -91,11 +92,11 @@ namespace Elwig { try { await AppDbUpdater.CheckDb(); - } catch (Exception e) { + } catch (Exception exc) { if (Config.UpdateUrl != null && Utils.HasInternetConnectivity()) { await CheckForUpdates(); } - MessageBox.Show($"Invalid Database:\n\n{e.Message}", "Invalid Database", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Fehlerhafte Datenbank", "Fehlerhafte Datenbank", exc); Shutdown(); return; } @@ -110,8 +111,8 @@ namespace Elwig { .GetAwaiter().GetResult(); try { Client = new(ctx); - } catch (Exception e) { - MessageBox.Show($"Fehler beim Laden der Mandantendaten:\n\n{e.Message}", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (Exception exc) { + InteractionService.ShowException("Fehler", "Fehler beim Laden der Mandantendaten", exc); Shutdown(); return; } @@ -145,18 +146,17 @@ namespace Elwig { foreach (var s in Config.Scales) { try { list.Add(Scale.FromConfig(s)); - } catch (Exception e) { + } catch (Exception exc) { list.Add(new InvalidScale(s.Id)); if (s.Required) - MessageBox.Show($"Verbindung zu Waage {s.Id} konnte nicht hergestellt werden:\n\n{e.Message}", "Waagenfehler", - MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Waagenfehler", $"Verbindung zu Waage {s.Id} konnte nicht hergestellt werden", exc); } } Scales = list; if (Config.Branch != null) { if (!branches.ContainsKey(Config.Branch.ToLower())) { - MessageBox.Show("Ungültige Zweigstelle in Konfigurationsdatei!", "Ungültige Zweigstelle", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowError("Ungültige Zweigstelle", "Ungültige Zweigstelle in Konfigurationsdatei!"); Shutdown(); } else { SetBranch(branches[Config.Branch.ToLower()]); @@ -164,7 +164,7 @@ namespace Elwig { } else if (branches.Count == 1) { SetBranch(branches.First().Value); } else { - MessageBox.Show("Erkennen der lokalen Zweigstelle nicht möglich!", "Ungültige Zweigstelle", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowError("Ungültige Zweigstelle", "Erkennen der lokalen Zweigstelle nicht möglich!"); Shutdown(); } @@ -254,14 +254,13 @@ namespace Elwig { if (Scales[i] is InvalidScale) { try { Scales[i] = Scale.FromConfig(s); - MessageBox.Show($"Verbindung zu Waage {s.Id} wieder hergestellt!", $"Waage {s.Id}", MessageBoxButton.OK, MessageBoxImage.Information); - } catch (Exception e) { + InteractionService.ShowInformation($"Waage {s.Id}", $"Verbindung zu Waage {s.Id} wieder hergestellt!"); + } catch (Exception exc) { Scales[i] = new InvalidScale(s.Id); - MessageBox.Show($"Verbindung zu Waage {s.Id} konnte nicht hergestellt werden:\n\n{e.Message}", "Waagenfehler", - MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Waagenfehler", $"Verbindung zu Waage {s.Id} konnte nicht hergestellt werden", exc); } } else if (Scales[i] is IEventScale) { - MessageBox.Show($"Verbindung zu Waage {s.Id} wieder hergestellt!", $"Waage {s.Id}", MessageBoxButton.OK, MessageBoxImage.Information); + InteractionService.ShowInformation($"Waage {s.Id}", $"Verbindung zu Waage {s.Id} wieder hergestellt!"); } } } @@ -272,7 +271,7 @@ namespace Elwig { for (var i = 0; i < Config.Scales.Count; i++) { var s = Config.Scales[i]; if ((s.Connection?.StartsWith($"serial://{name}:") ?? false) && Scales[i] is not InvalidScale) { - MessageBox.Show($"Verbindung zu Waage {s.Id} unterbrochen!", $"Waagen {s.Id}", MessageBoxButton.OK, MessageBoxImage.Warning); + InteractionService.ShowWarning($"Waagen {s.Id}", $"Verbindung zu Waage {s.Id} unterbrochen!"); if (Scales[i] is ICommandScale) { try { Scales[i].Dispose(); @@ -307,11 +306,9 @@ namespace Elwig { }); } else if (showAlert) { if (latest == null) { - MessageBox.Show("Informationen konnten nicht abgerufen werden!", "Nach Updates suchen", - MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowError("Nach Updates suchen", "Informationen konnten nicht abgerufen werden!"); } else { - MessageBox.Show($"Elwig ist auf dem aktuellsten Stand! (Version: {latest.Value.Version})", "Nach Updates suchen", - MessageBoxButton.OK, MessageBoxImage.Information); + InteractionService.ShowInformation("Nach Updates suchen", $"Elwig ist auf dem aktuellsten Stand! (Version: {latest.Value.Version})"); } } } @@ -321,11 +318,11 @@ namespace Elwig { await Task.Run(async () => { await Database.Import(filename); }); - MessageBox.Show("Das Ersetzen war erfolgreich!\n\nBitte starten Sie Elwig neu!", "Datenbank ersetzen", MessageBoxButton.OK, MessageBoxImage.Information); + InteractionService.ShowInformation("Datenbank ersetzen", "Das Ersetzen war erfolgreich!\n\nBitte starten Sie Elwig neu!"); ForceShutdown = true; Current.Shutdown(); } catch (Exception exc) { - MessageBox.Show("Fehler beim Ersetzen:\n\n" + exc.Message, "Datenbank ersetzen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Datenbank ersetzen", "Fehler beim Ersetzen", exc); } } diff --git a/Elwig/Dialogs/UpdateDialog.xaml.cs b/Elwig/Dialogs/UpdateDialog.xaml.cs index 43b32a5..e603e7c 100644 --- a/Elwig/Dialogs/UpdateDialog.xaml.cs +++ b/Elwig/Dialogs/UpdateDialog.xaml.cs @@ -1,4 +1,5 @@ using Elwig.Helpers; +using Elwig.Services; using System; using System.Diagnostics; using System.IO; @@ -51,7 +52,7 @@ namespace Elwig.Dialogs { File.Delete(fileName); return; } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } Process.Start(fileName); DialogResult = true; diff --git a/Elwig/Helpers/AppDbContext.cs b/Elwig/Helpers/AppDbContext.cs index d32a163..37ecca5 100644 --- a/Elwig/Helpers/AppDbContext.cs +++ b/Elwig/Helpers/AppDbContext.cs @@ -1,10 +1,9 @@ using Elwig.Models.Dtos; using Elwig.Models.Entities; +using Elwig.Services; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; -using ScottPlot.TickGenerators.Financial; -using ScottPlot.TickGenerators.TimeUnits; using System; using System.Collections.Generic; using System.Data; @@ -12,8 +11,6 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; using System.Threading.Tasks; -using System.Windows; -using System.Windows.Media.Converters; namespace Elwig.Helpers { @@ -162,8 +159,8 @@ namespace Elwig.Helpers { LogFile = new(file) { AutoFlush = true }; - } catch (Exception e) { - MessageBox.Show($"Unable to open database log file:\n\n{e.Message}", "Database Log", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (Exception exc) { + InteractionService.ShowException("Database Log", $"Unable to open database log file", exc); } } SavedLastWriteTime = LastWriteTime; diff --git a/Elwig/Helpers/Export/ElwigData.cs b/Elwig/Helpers/Export/ElwigData.cs index cb81e68..e3fc10f 100644 --- a/Elwig/Helpers/Export/ElwigData.cs +++ b/Elwig/Helpers/Export/ElwigData.cs @@ -1,4 +1,5 @@ using Elwig.Models.Entities; +using Elwig.Services; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; @@ -8,7 +9,6 @@ using System.IO.Compression; using System.Linq; using System.Text.Json.Nodes; using System.Threading.Tasks; -using System.Windows; namespace Elwig.Helpers.Export { public static class ElwigData { @@ -208,16 +208,11 @@ namespace Elwig.Helpers.Export { exc is FileNotFoundException || exc is IOException) { data.RemoveAt(data.Count - 1); - var str = $"Die Elwig-Export-Datei '{Path.GetFileName(filename)}' konnte nicht verarbeitet werden und wird übersprungen.\n\n" + exc.Message; - if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; - MessageBox.Show(str, "Fehler beim Importieren", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Fehler beim Importieren", $"Die Elwig-Export-Datei '{Path.GetFileName(filename)}' konnte nicht verarbeitet werden und wird übersprungen", exc); await AddImportedFiles(Path.GetFileName(filename)); } catch (Exception exc) { data.RemoveAt(data.Count - 1); - var str = $"Die Elwig-Export-Datei '{Path.GetFileName(filename)}' konnte nicht verarbeitet werden. Soll sie in Zukunft übersprungen werden?\n\n" + exc.Message; - if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; - var r = MessageBox.Show(str, "Fehler beim Importieren", MessageBoxButton.YesNo, MessageBoxImage.Error, MessageBoxResult.No); - if (r == MessageBoxResult.Yes) { + if (InteractionService.AskException("Fehler beim Importieren", $"Die Elwig-Export-Datei '{Path.GetFileName(filename)}' konnte nicht verarbeitet werden. Soll sie in Zukunft übersprungen werden?", exc)) { await AddImportedFiles(Path.GetFileName(filename)); } } @@ -411,7 +406,7 @@ namespace Elwig.Helpers.Export { } App.HintContextChange(); - MessageBox.Show( + InteractionService.ShowInformation("Importieren erfolgreich", $"Das importieren der Daten war erfolgreich!\n" + $"Folgendes wurde importiert:\n" + string.Join("\n", [ @@ -433,25 +428,18 @@ namespace Elwig.Helpers.Export { $" ({d.New} neu, {d.Overwritten} überschr., {d.NotImported} nicht importiert)\n" + $" Zwst.: {branches[d.ZwstId].Name} (Gerät {d.Device})\n" + $" Filter: {d.Filters}") - ]), - "Importieren erfolgreich", - MessageBoxButton.OK, MessageBoxImage.Information); + ])); } catch (Exception exc) { - var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\nEvtl. muss die Datenbank manuell auf dieses Gerät kopieren werden.\n\n" + exc.Message; - if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; - MessageBox.Show(str, "Fehler beim Importieren", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Fehler beim Importieren", "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\nEvtl. muss die Datenbank manuell auf dieses Gerät kopieren werden", exc); } GC.Collect(); GC.WaitForPendingFinalizers(); } private static bool ImportQuestion(string branch, string device, string subject, bool duplicate, int number) { - return MessageBox.Show( + return InteractionService.AskQuestion($"{subject} importieren", $"Sollen {number} {(duplicate ? "" : "neue ")}{subject} durch die Zweigstelle\n" + - $"{branch} (Gerät {device}) {(duplicate ? "überschrieben" : "importiert")} werden?", - $"{subject} importieren", - MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.Yes - ) == MessageBoxResult.Yes; + $"{branch} (Gerät {device}) {(duplicate ? "überschrieben" : "importiert")} werden?", true); } public static Task Export(string filename, IEnumerable members, IEnumerable wbKgs, IEnumerable filters) { diff --git a/Elwig/Helpers/Printing/Pdf.cs b/Elwig/Helpers/Printing/Pdf.cs index 203ecaa..b282af3 100644 --- a/Elwig/Helpers/Printing/Pdf.cs +++ b/Elwig/Helpers/Printing/Pdf.cs @@ -1,8 +1,8 @@ +using Elwig.Services; using Elwig.Windows; using System; using System.Drawing.Printing; using System.Threading.Tasks; -using System.Windows; namespace Elwig.Helpers.Printing { public static class Pdf { @@ -46,8 +46,8 @@ namespace Elwig.Helpers.Printing { PrinterSettings = settings, }; printDoc.Print(); - } catch (Exception e) { - MessageBox.Show("Beim Drucken ist ein Fehler aufgetreten:\n\n" + e.Message, "Fehler beim Drucken", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (Exception exc) { + InteractionService.ShowException("Fehler beim Drucken", "Beim Drucken ist ein Fehler aufgetreten", exc); } return Task.CompletedTask; } diff --git a/Elwig/Helpers/Utils.cs b/Elwig/Helpers/Utils.cs index 53e29e2..b29c49f 100644 --- a/Elwig/Helpers/Utils.cs +++ b/Elwig/Helpers/Utils.cs @@ -3,12 +3,12 @@ using Elwig.Documents; using Elwig.Helpers.Billing; using Elwig.Models; using Elwig.Models.Entities; +using Elwig.Services; using iText.Layout.Element; using LinqKit; using MailKit.Net.Smtp; using MailKit.Security; using Microsoft.EntityFrameworkCore; -using Microsoft.Win32; using MimeKit; using System; using System.Collections; @@ -213,8 +213,8 @@ namespace Elwig.Helpers { Task.Run(async () => { try { await a(); - } catch (Exception e) { - MessageBox.Show(e.ToString(), title, MessageBoxButton.OK, MessageBoxImage.Error); + } catch (Exception exc) { + InteractionService.ShowException(title, exc); } }); } @@ -537,7 +537,7 @@ namespace Elwig.Helpers { subject, docs.Select(d => d.Title).ToArray() )]); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); return false; } finally { if (client != null) @@ -551,8 +551,7 @@ namespace Elwig.Helpers { public static async Task ExportDocument(Document doc, ExportMode mode, string? filename = null, (Member Member, string Subject, string Text)? emailData = null) { if (mode == ExportMode.Print && !App.Config.Debug) { if (doc.IsPreview) { - MessageBox.Show("Dieses Dokument ist als vorläufig markiert und kann daher nicht ausgedruckt werden!", - "Vorläufiges Dokument", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowError("Vorläufiges Dokument", "Dieses Dokument ist als vorläufig markiert und kann daher nicht ausgedruckt werden!"); return; } using (var ctx = new AppDbContext()) { @@ -561,8 +560,7 @@ namespace Elwig.Helpers { await doc.Print(); } else if (mode == ExportMode.Email && emailData is (Member, string, string) e) { if (doc.IsPreview) { - MessageBox.Show("Dieses Dokument ist als vorläufig markiert und kann daher nicht verschickt werden!", - "Vorläufiges Dokument", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowError("Vorläufiges Dokument", "Dieses Dokument ist als vorläufig markiert und kann daher nicht verschickt werden!"); return; } using (var ctx = new AppDbContext()) { @@ -570,25 +568,18 @@ namespace Elwig.Helpers { } var success = await SendEmail(e.Member, e.Subject, e.Text, [doc]); if (success) - MessageBox.Show("Die E-Mail wurde erfolgreich verschickt!\n\nEs kann einige Minuten dauern, bis die E-Mail im Posteingang des Empfängers aufscheint.", "E-Mail verschickt", - MessageBoxButton.OK, MessageBoxImage.Information); + InteractionService.ShowInformation("E-Mail verschickt", "Die E-Mail wurde erfolgreich verschickt!\n\nEs kann einige Minuten dauern, bis die E-Mail im Posteingang des Empfängers aufscheint."); } else if (mode == ExportMode.SavePdf) { if (doc.IsPreview) { - MessageBox.Show("Dieses Dokument ist als vorläufig markiert und sollte daher nicht langfristig gespeichert werden!", - "Vorläufiges Dokument", MessageBoxButton.OK, MessageBoxImage.Warning); + InteractionService.ShowWarning("Vorläufiges Dokument", "Dieses Dokument ist als vorläufig markiert und sollte daher nicht langfristig gespeichert werden!"); } - var d = new SaveFileDialog() { - FileName = $"{NormalizeFileName(filename ?? doc.Title)}.pdf", - DefaultExt = "pdf", - Filter = "PDF-Datei (*.pdf)|*.pdf", - Title = $"{doc.Title} speichern unter - Elwig" - }; - if (d.ShowDialog() == true) { + filename = InteractionService.SaveFile(doc.Title, NormalizeFileName(filename ?? doc.Title), "pdf"); + if (filename != null) { using (var ctx = new AppDbContext()) { await doc.Generate(ctx); } - doc.SaveTo(d.FileName); - Process.Start("explorer.exe", d.FileName); + doc.SaveTo(filename); + Process.Start("explorer.exe", filename); } } else { using (var ctx = new AppDbContext()) { diff --git a/Elwig/Helpers/Weighing/AveryEventScale.cs b/Elwig/Helpers/Weighing/AveryEventScale.cs index 80fe167..3458079 100644 --- a/Elwig/Helpers/Weighing/AveryEventScale.cs +++ b/Elwig/Helpers/Weighing/AveryEventScale.cs @@ -1,9 +1,9 @@ +using Elwig.Services; using System; using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using System.Windows; namespace Elwig.Helpers.Weighing { public class AveryEventScale : Scale, IEventScale, IDisposable { @@ -60,9 +60,8 @@ namespace Elwig.Helpers.Weighing { } catch (TimeoutException) { await Task.Delay(500); await Reconnect(); - } catch (Exception ex) { - MessageBox.Show($"Beim Wiegen ist ein Fehler Aufgetreten:\n\n{ex.Message} ({ex.GetType().Name})", "Waagenfehler", - MessageBoxButton.OK, MessageBoxImage.Error); + } catch (Exception exc) { + InteractionService.ShowException("Waagenfehler", "Beim Wiegen ist ein Fehler Aufgetreten", exc, showExcType: true); } } } diff --git a/Elwig/Helpers/Weighing/Scale.cs b/Elwig/Helpers/Weighing/Scale.cs index e472613..68b8dae 100644 --- a/Elwig/Helpers/Weighing/Scale.cs +++ b/Elwig/Helpers/Weighing/Scale.cs @@ -1,9 +1,9 @@ +using Elwig.Services; using System; using System.IO; using System.IO.Ports; using System.Net.Sockets; using System.Text; -using System.Windows; namespace Elwig.Helpers.Weighing { public abstract class Scale : IDisposable { @@ -42,11 +42,10 @@ namespace Elwig.Helpers.Weighing { if (cnx.StartsWith("serial:")) { try { Serial = Utils.OpenSerialConnection(cnx); - } catch (Exception e) { + } catch (Exception exc) { if (!softFail) throw; if (!failSilent) - MessageBox.Show($"Verbindung zu Waage konnte nicht hergestellt werden:\n\n{e.Message}", "Waagenfehler", - MessageBoxButton.OK, MessageBoxImage.Warning); + InteractionService.ShowException("Waagenfehler", "Verbindung zu Waage konnte nicht hergestellt werden", exc, isError: false); } Stream = Serial?.BaseStream ?? Stream.Null; } else if (cnx.StartsWith("tcp:")) { diff --git a/Elwig/Services/DeliveryAncmtService.cs b/Elwig/Services/DeliveryAncmtService.cs index 067cb26..9640340 100644 --- a/Elwig/Services/DeliveryAncmtService.cs +++ b/Elwig/Services/DeliveryAncmtService.cs @@ -8,7 +8,6 @@ using Microsoft.EntityFrameworkCore; using Elwig.Documents; using Elwig.Helpers.Export; using Elwig.Models.Dtos; -using Microsoft.Win32; using System.Windows.Input; using System.Windows; using System; @@ -261,21 +260,16 @@ namespace Elwig.Services { .ThenBy(a => a.Member.MgNr); if (mode == ExportMode.SaveList) { - var d = new SaveFileDialog() { - FileName = $"{DeliveryAncmtList.Name}.ods", - DefaultExt = "ods", - Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods", - Title = $"{DeliveryAncmtList.Name} speichern unter - Elwig" - }; - if (d.ShowDialog() == true) { + var filename = InteractionService.SaveFile(DeliveryAncmtList.Name, DeliveryAncmtList.Name, "ods"); + if (filename != null) { Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { try { var data = await DeliveryAncmtListData.FromQuery(query, filterNames); - using var ods = new OdsFile(d.FileName); + using var ods = new OdsFile(filename); await ods.AddTable(data); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -288,7 +282,7 @@ namespace Elwig.Services { using var doc = new DeliveryAncmtList(string.Join(" / ", filterNames), data); await Utils.ExportDocument(doc, mode); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; diff --git a/Elwig/Services/DeliveryService.cs b/Elwig/Services/DeliveryService.cs index 27b161e..f6a0e69 100644 --- a/Elwig/Services/DeliveryService.cs +++ b/Elwig/Services/DeliveryService.cs @@ -3,7 +3,6 @@ using Elwig.Helpers.Export; using Elwig.Helpers; using Elwig.Models.Dtos; using Elwig.Models.Entities; -using Microsoft.Win32; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -733,7 +732,7 @@ namespace Elwig.Services { using var doc = await DeliveryNote.Initialize(year, did); await Utils.ExportDocument(doc, mode, doc.Delivery.LsNr, (doc.Member, $"{DeliveryNote.Name} Nr. {doc.Delivery.LsNr}", $"Im Anhang finden Sie den {DeliveryNote.Name} Nr. {doc.Delivery.LsNr}")); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -773,35 +772,24 @@ namespace Elwig.Services { .ThenBy(p => p.DPNr); if (mode == ExportMode.SaveList) { - var d = new SaveFileDialog() { - FileName = $"{DeliveryJournal.Name}.ods", - DefaultExt = "ods", - Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods", - Title = $"{DeliveryJournal.Name} speichern unter - Elwig" - }; - if (d.ShowDialog() == true) { + var filename = InteractionService.SaveFile(DeliveryJournal.Name, DeliveryJournal.Name, "ods"); + if (filename != null) { Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { try { var data = await DeliveryJournalData.FromQuery(query, filterNames); - using var ods = new OdsFile(d.FileName); + using var ods = new OdsFile(filename); await ods.AddTable(data); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; } } else if (mode == ExportMode.Export) { - var d = new SaveFileDialog() { - FileName = subject == ExportSubject.Selected ? $"Lieferung_{vm.SelectedDelivery?.LsNr}.elwig.zip" : $"Lieferungen_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip", - DefaultExt = "elwig.zip", - Filter = "Elwig-Export-Datei (*.elwig.zip)|*.elwig.zip", - Title = $"{DeliveryJournal.Name} speichern unter - Elwig", - AddExtension = false, - }; - if (d.ShowDialog() == true) { - if (!d.FileName.EndsWith(".elwig.zip")) d.FileName += ".elwig.zip"; + var filename = InteractionService.SaveFile(DeliveryJournal.Name, subject == ExportSubject.Selected ? $"Lieferung_{vm.SelectedDelivery?.LsNr}" : $"Lieferungen_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}", "elwig.zip"); + if (filename != null) { + if (!filename.EndsWith(".elwig.zip")) filename += ".elwig.zip"; Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { try { @@ -817,9 +805,9 @@ namespace Elwig.Services { .DistinctBy(k => k.KgNr) .OrderBy(k => k.KgNr) .ToList(); - await ElwigData.Export(d.FileName, list, wbKgs, filterNames); + await ElwigData.Export(filename, list, wbKgs, filterNames); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -838,7 +826,7 @@ namespace Elwig.Services { using var doc = new DeliveryJournal(string.Join(" / ", filterNames), data); await Utils.ExportDocument(doc, mode); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -869,7 +857,7 @@ namespace Elwig.Services { using var doc = new WineQualityStatistics(string.Join(" / ", filterNames), data); await Utils.ExportDocument(doc, mode); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -888,21 +876,16 @@ namespace Elwig.Services { throw new ArgumentException("Invalid value for ExportSubject"); } - var d = new SaveFileDialog() { - FileName = $"Lieferstatistik-{vm.FilterSeason ?? Utils.CurrentLastSeason}.ods", - DefaultExt = "ods", - Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods", - Title = $"Lieferstatistik pro Ort speichern unter - Elwig" - }; - if (d.ShowDialog() == true) { + var filename = InteractionService.SaveFile("Lieferstatistik pro Ort", $"Lieferstatistik-{vm.FilterSeason ?? Utils.CurrentLastSeason}", "ods"); + if (filename != null) { Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { try { - using var ods = new OdsFile(d.FileName); + using var ods = new OdsFile(filename); var tbl = await WineLocalityStatisticsData.FromQuery(query, filterNames); await ods.AddTable(tbl); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -936,17 +919,12 @@ namespace Elwig.Services { filterNames.Remove("abgewertet"); if (mode == ExportMode.SaveList) { - var d = new SaveFileDialog() { - FileName = $"{DeliveryDepreciationList.Name}-{vm.FilterSeason ?? Utils.CurrentLastSeason}.ods", - DefaultExt = "ods", - Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods", - Title = $"{DeliveryDepreciationList.Name} speichern unter - Elwig" - }; - if (d.ShowDialog() == true) { + var filename = InteractionService.SaveFile(DeliveryDepreciationList.Name, $"{DeliveryDepreciationList.Name}-{vm.FilterSeason ?? Utils.CurrentLastSeason}", "ods"); + if (filename != null) { Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { try { - using var ods = new OdsFile(d.FileName); + using var ods = new OdsFile(filename); var tblTotal = await DeliveryJournalData.FromQuery(query, filterNames); tblTotal.FullName = DeliveryDepreciationList.Name; tblTotal.Name = "Gesamt"; @@ -958,7 +936,7 @@ namespace Elwig.Services { await ods.AddTable(tbl); } } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -971,7 +949,7 @@ namespace Elwig.Services { using var doc = new DeliveryDepreciationList(string.Join(" / ", filterNames), data); await Utils.ExportDocument(doc, mode); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -1001,23 +979,18 @@ namespace Elwig.Services { .ThenBy(p => p.AttrId) .ThenBy(p => p.CultId); - var d = new SaveFileDialog() { - FileName = $"Liefermengen.ods", - DefaultExt = "ods", - Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods", - Title = $"Liefermengen speichern unter - Elwig" - }; - if (d.ShowDialog() == true) { + var filename = InteractionService.SaveFile("Liefermengen", "Liefermengen", "ods"); + if (filename != null) { Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { try { - using var ods = new OdsFile(d.FileName); + using var ods = new OdsFile(filename); var tblTotal = await MemberDeliveryData.FromQuery(query, filterNames); var tbl = await MemberDeliveryPerVarietyData.FromQuery(query, filterNames); await ods.AddTable(tblTotal); await ods.AddTable(tbl); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -1219,9 +1192,9 @@ namespace Elwig.Services { attrid = $"'{attr.AttrId}'"; } var dids = await vm.GetDidsFromFilters(); - var res = MessageBox.Show($"Soll wirklich für {dids.Length:N0} Teillieferung(en) das Attribut\n'{attributeName}' gesetz werden?", - "Massenaktion: Attribut setzen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (res != MessageBoxResult.OK) return; + if (!InteractionService.AskContinue("Massenaktion: Attribut setzen", + $"Soll wirklich für {dids.Length:N0} Teillieferung(en) das Attribut\n'{attributeName}' gesetz werden?")) + return; Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { @@ -1234,7 +1207,7 @@ namespace Elwig.Services { App.HintContextChange(); }); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } finally { Mouse.OverrideCursor = null; } @@ -1249,9 +1222,9 @@ namespace Elwig.Services { } var dids = await vm.GetDidsFromFilters(); - var res = MessageBox.Show($"Soll wirklich für {dids.Length:N0} Teillieferung(en) der Zu-/Abschlag\n'{modifierName}' hinzugefügt werden?", - "Massenaktion: Zu-/Abschlag hinzufügen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (res != MessageBoxResult.OK) return; + if (!InteractionService.AskContinue("Massenaktion: Zu-/Abschlag hinzufügen", + $"Soll wirklich für {dids.Length:N0} Teillieferung(en) der Zu-/Abschlag\n'{modifierName}' hinzugefügt werden?")) + return; Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { @@ -1265,7 +1238,7 @@ namespace Elwig.Services { App.HintContextChange(); }); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } finally { Mouse.OverrideCursor = null; } @@ -1280,9 +1253,9 @@ namespace Elwig.Services { } var dids = await vm.GetDidsFromFilters(); - var res = MessageBox.Show($"Soll wirklich für {dids.Length:N0} Teillieferung(en) der Zu-/Abschlag\n'{modifierName}' entfernt werden?", - "Massenaktion: Zu-/Abschlag entfernen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (res != MessageBoxResult.OK) return; + if (!InteractionService.AskContinue("Massenaktion: Zu-/Abschlag entfernen", + $"Soll wirklich für {dids.Length:N0} Teillieferung(en) der Zu-/Abschlag\n'{modifierName}' entfernt werden?")) + return; Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { @@ -1295,7 +1268,7 @@ namespace Elwig.Services { App.HintContextChange(); }); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } finally { Mouse.OverrideCursor = null; } diff --git a/Elwig/Services/InteractionService.cs b/Elwig/Services/InteractionService.cs new file mode 100644 index 0000000..cbba1aa --- /dev/null +++ b/Elwig/Services/InteractionService.cs @@ -0,0 +1,118 @@ +using Microsoft.Win32; +using System; +using System.Collections.Generic; +using System.Windows; + +namespace Elwig.Services { + public static class InteractionService { + + public static Func? Override; + + public static readonly Dictionary ExtensionFilters = new() { + ["pdf"] = "PDF-Datei (*.pdf)|*.pdf", + ["ods"] = "OpenDocument Format Spreadsheet (*.ods)|*.ods", + ["vcf"] = "vCard-Datei (*.vcf)|*.vcf", + ["xml"] = "EBICS-Datei (*.xml)|*.xml", + ["csv"] = "CSV-Datei (*.csv)|*.csv", + ["sql.zip"] = "Komprimierte SQL-Datei (*.sql.zip)|*.sql.zip", + ["elwig.zip"] = "Elwig-Export-Datei (*.elwig.zip)|*.elwig.zip", + }; + + public static void ShowInformation(string title, string text) { + if (Override != null) { + Override("information", title, text); + } else { + MessageBox.Show(text, title, MessageBoxButton.OK, MessageBoxImage.Information); + } + } + + public static bool AskContinue(string title, string text) { + if (Override != null) { + return Override("continue", title, text) != null; + } else { + return MessageBox.Show(text, title, MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel) == MessageBoxResult.OK; + } + } + + public static bool AskConfirmation(string title, string text) { + if (Override != null) { + return Override("confirm", title, text) != null; + } else { + return MessageBox.Show(text, title, MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No) == MessageBoxResult.Yes; + } + } + + public static bool AskQuestion(string title, string text, bool defaultResult) { + if (Override != null) { + return Override("question", title, text) != null; + } else { + return MessageBox.Show(text, title, MessageBoxButton.YesNo, MessageBoxImage.Question, defaultResult ? MessageBoxResult.Yes : MessageBoxResult.No) == MessageBoxResult.Yes; + } + } + + public static void ShowWarning(string title, string text) { + if (Override != null) { + Override("warning", title, text); + } else { + MessageBox.Show(text, title, MessageBoxButton.OK, MessageBoxImage.Warning); + } + } + + public static void ShowError(string title, string text) { + if (Override != null) { + Override("error", title, text); + } else { + MessageBox.Show(text, title, MessageBoxButton.OK, MessageBoxImage.Error); + } + } + + public static void ShowException(Exception exc, bool showExcType = false, bool isError = true) { + ShowException("Fehler", exc, showExcType, isError); + } + + public static void ShowException(string title, Exception exc, bool showExcType = false, bool isError = true) { + ShowException(title, exc, showExcType, isError); + } + + public static void ShowException(string title, string? text, Exception exc, bool showExcType = false, bool isError = true) { + text = text == null ? "" : text + (text.EndsWith('.') || text.EndsWith('!') || text.EndsWith('?') ? "" : ":") + "\n\n"; + text += exc.Message + (showExcType ? $" ({exc.GetType().Name})" : ""); + if (exc.InnerException != null) text += "\n\n" + exc.InnerException.Message; + if (isError) { + ShowError(title, text); + } else { + ShowWarning(title, text); + } + } + + public static void ShowDbException(string title, Exception exc) { + ShowException(title, "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!", exc); + } + + public static bool AskException(string title, string? text, Exception exc) { + text = text == null ? "" : text + (text.EndsWith('.') || text.EndsWith('!') || text.EndsWith('?') ? "" : ":") + "\n\n"; + text += exc.Message; + if (exc.InnerException != null) text += "\n\n" + exc.InnerException.Message; + if (Override != null) { + return Override("error", title, text) != null; + } else { + return MessageBox.Show(text, title, MessageBoxButton.YesNo, MessageBoxImage.Error, MessageBoxResult.No) == MessageBoxResult.Yes; + } + } + + public static string? SaveFile(string title, string defaultFileName, string extension) { + if (Override != null) { + return Override("save", title, $"{defaultFileName}.{extension}"); + } else { + var d = new SaveFileDialog() { + FileName = $"{defaultFileName}.{extension}", + DefaultExt = extension, + Filter = ExtensionFilters.GetValueOrDefault(extension, ""), + Title = $"{title} speichern unter - Elwig", + AddExtension = !extension.Contains('.'), + }; + return d.ShowDialog() == true ? d.FileName : null; + } + } + } +} diff --git a/Elwig/Services/MemberService.cs b/Elwig/Services/MemberService.cs index 56d61c4..71d7d75 100644 --- a/Elwig/Services/MemberService.cs +++ b/Elwig/Services/MemberService.cs @@ -6,12 +6,10 @@ using Elwig.Models.Dtos; using Elwig.Models.Entities; using Elwig.ViewModels; using Microsoft.EntityFrameworkCore; -using Microsoft.Win32; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using System.Windows; using System.Windows.Input; namespace Elwig.Services { @@ -398,7 +396,7 @@ namespace Elwig.Services { using var doc = new MemberDataSheet(m); await Utils.ExportDocument(doc, mode, emailData: (m, MemberDataSheet.Name, "Im Anhang finden Sie das aktuelle Stammdatenblatt")); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -416,7 +414,7 @@ namespace Elwig.Services { using var doc = new DeliveryConfirmation(year, m, null); await Utils.ExportDocument(doc, mode, emailData: (m, $"{DeliveryConfirmation.Name} {year}", $"Im Anhang finden Sie die Anlieferungsbestätigung {year}")); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -429,7 +427,7 @@ namespace Elwig.Services { using var doc = await CreditNote.Initialize(year, avnr, m.MgNr, null); await Utils.ExportDocument(doc, mode, emailData: (m, $"{CreditNote.Name} {doc.Payment.Variant.Name}", $"Im Anhang finden Sie die Traubengutschrift {doc.Payment.Variant.Name}")); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -477,33 +475,23 @@ namespace Elwig.Services { } if (mode == ExportMode.SaveList) { - var d = new SaveFileDialog() { - FileName = $"{MemberList.Name}.ods", - DefaultExt = "ods", - Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods", - Title = $"{MemberList.Name} speichern unter - Elwig" - }; - if (d.ShowDialog() == true) { + var filename = InteractionService.SaveFile(MemberList.Name, MemberList.Name, "ods"); + if (filename != null) { Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { try { var data = await MemberListData.FromQuery(query, filterNames, filterNames.Where(f => f.StartsWith("Flächenbindung")).Select(f => f.Split(' ')[^1])); - using var ods = new OdsFile(d.FileName); + using var ods = new OdsFile(filename); await ods.AddTable(data); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; } } else if (mode == ExportMode.Vcf) { - var d = new SaveFileDialog() { - FileName = "Mitglieder.vcf", - DefaultExt = "vcf", - Filter = "vCard-Datei (*.vcf)|*.vcf", - Title = "Kontakte speichern unter - Elwig" - }; - if (d.ShowDialog() == true) { + var filename = InteractionService.SaveFile("Kontakte", "Mitglieder", "vcf"); + if (filename != null) { Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { try { @@ -512,24 +500,18 @@ namespace Elwig.Services { .Include(m => m.TelephoneNumbers) .Include(m => m.EmailAddresses) .ToListAsync(); - using var exporter = new VCard(d.FileName); + using var exporter = new VCard(filename); await exporter.ExportAsync(members); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; } } else if (mode == ExportMode.Export) { - var d = new SaveFileDialog() { - FileName = subject == ExportSubject.Selected ? $"Mitglied_{vm.SelectedMember?.MgNr}.elwig.zip" : $"Mitglieder_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip", - DefaultExt = "elwig.zip", - Filter = "Elwig-Export-Datei (*.elwig.zip)|*.elwig.zip", - Title = $"{MemberList.Name} speichern unter - Elwig", - AddExtension = false, - }; - if (d.ShowDialog() == true) { - if (!d.FileName.EndsWith(".elwig.zip")) d.FileName += ".elwig.zip"; + var filename = InteractionService.SaveFile(MemberList.Name, subject == ExportSubject.Selected ? $"Mitglied_{vm.SelectedMember?.MgNr}" : $"Mitglieder_{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}", "elwig.zip"); + if (filename != null) { + if (!filename.EndsWith(".elwig.zip")) filename += ".elwig.zip"; Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { try { @@ -550,9 +532,9 @@ namespace Elwig.Services { .Distinct() .OrderBy(k => k.KgNr) .ToList(); - await ElwigData.Export(d.FileName, members, areaComs, wbKgs, filterNames); + await ElwigData.Export(filename, members, areaComs, wbKgs, filterNames); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -571,7 +553,7 @@ namespace Elwig.Services { using var doc = new MemberList(string.Join(" / ", filterNames), data); await Utils.ExportDocument(doc, mode); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; diff --git a/Elwig/Services/PaymentVariantService.cs b/Elwig/Services/PaymentVariantService.cs index 583e519..7911936 100644 --- a/Elwig/Services/PaymentVariantService.cs +++ b/Elwig/Services/PaymentVariantService.cs @@ -6,7 +6,6 @@ using Elwig.Models.Dtos; using Elwig.Models.Entities; using Elwig.ViewModels; using Microsoft.EntityFrameworkCore; -using Microsoft.Win32; using System; using System.Collections.Generic; using System.Linq; @@ -190,23 +189,18 @@ namespace Elwig.Services { public static async Task GenerateSummary(PaymentVar v, ExportMode mode) { 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) + var filename = InteractionService.SaveFile($"Variantendaten {v.Name}", $"Variantendaten-{v.Name.Trim().Replace(' ', '-')}", "ods"); + if (filename == null) 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); + using var ods = new OdsFile(filename); await ods.AddTable(data); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -217,7 +211,7 @@ namespace Elwig.Services { using var doc = await PaymentVariantSummary.Initialize(v.Year, v.AvNr); await Utils.ExportDocument(doc, mode); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -230,31 +224,26 @@ namespace Elwig.Services { var withoutIban = v.Credits.Count(c => c.Member.Iban == null); if (withoutIban > 0) { - var r = MessageBox.Show($"Achtung: Für {withoutIban:N0} Mitglieder ist kein IBAN hinterlegt.\n\nDiese werden NICHT exportiert.", - "Mitglieder ohne IBAN", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (r != MessageBoxResult.OK) return; + if (!InteractionService.AskContinue("Mitglieder ohne IBAN", + $"Achtung: Für {withoutIban:N0} Mitglieder ist kein IBAN hinterlegt.\n\nDiese werden NICHT exportiert.")) + return; } var withNegAmount = v.Credits.Count(c => c.Amount <= 0); if (withNegAmount > 0) { - var r = MessageBox.Show($"Achtung: Es gibt {withNegAmount:N0} Traubengutschriften mit negativem Betrag.\n\nDiese werden NICHT exportiert.", - "Traubengutschriften mit negativem Betrag", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.OK); - if (r != MessageBoxResult.OK) return; + if (!InteractionService.AskContinue("Traubengutschriften mit negativem Betrag", + $"Achtung: Es gibt {withNegAmount:N0} Traubengutschriften mit negativem Betrag.\n\nDiese werden NICHT exportiert.")) + return; } - var d = new SaveFileDialog() { - FileName = $"{App.Client.NameToken}-Überweisungsdaten-{v.Year}-{v.Name.Trim().Replace(' ', '-')}.{Ebics.FileExtension}", - DefaultExt = Ebics.FileExtension, - Filter = "EBICS-Datei (*.xml)|*.xml", - Title = $"Überweisungsdaten speichern unter - Elwig", - }; - if (d.ShowDialog() == true) { + var filename = InteractionService.SaveFile("Überweisungsdaten", $"{App.Client.NameToken}-Überweisungsdaten-{v.Year}-{v.Name.Trim().Replace(' ', '-')}", Ebics.FileExtension); + if (filename != null) { 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); + using var e = new Ebics(v, 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); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -262,22 +251,17 @@ namespace Elwig.Services { } public static async Task GenerateAccountingList(int year, int avnr, string name) { - var d = new SaveFileDialog() { - FileName = $"{App.Client.NameToken}-Buchungsliste-{year}-{name.Trim().Replace(' ', '-')}.ods", - DefaultExt = "ods", - Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods", - Title = $"Buchungsliste speichern unter - Elwig" - }; - if (d.ShowDialog() == true) { + var filename = InteractionService.SaveFile("Buchungsliste", $"{App.Client.NameToken}-Buchungsliste-{year}-{name.Trim().Replace(' ', '-')}", "ods"); + if (filename != null) { 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); + using var ods = new OdsFile(filename); await ods.AddTable(tbl); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -383,11 +367,10 @@ namespace Elwig.Services { } } if (membersLess.Count > 0) { - var res = MessageBox.Show($"Achtung: Bei {membersLess.Count:N0} Mitglied(ern) ist der Soll-Betrag der Auszahlung (\"Gesamtbetrag\") kleiner als bei der letzten Auszahlung. Das sollte nicht vorkommen!\n\n" + + if (!InteractionService.AskContinue("Kleinerer Gesamtbetrag", + $"Achtung: Bei {membersLess.Count:N0} Mitglied(ern) ist der Soll-Betrag der Auszahlung (\"Gesamtbetrag\") kleiner als bei der letzten Auszahlung. Das sollte nicht vorkommen!\n\n" + $"{string.Join(", ", membersLess.Select(m => $"{m.AdministrativeName} ({m.MgNr})"))}\n\n" + - "Soll trotzdem forgefahren werden?", - "Kleinerer Gesamtbetrag", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (res != MessageBoxResult.OK) + "Soll trotzdem forgefahren werden?")) return; } @@ -401,9 +384,8 @@ namespace Elwig.Services { membersNeg = await ctx.Credits.Where(c => c.Year == year && c.AvNr == avnr && c.AmountValue < 0).Select(c => c.Member).ToListAsync(); } if (membersNeg.Count > 0) { - var res = MessageBox.Show($"Achtung: Bei {membersNeg.Count:N0} Mitglied(ern) ist der Auszahlungsbetrag negativ!\n\n" + - $"{string.Join(", ", membersNeg.Select(m => $"{m.AdministrativeName} ({m.MgNr})"))}", - "Negativer Auszahlungsbetrag", MessageBoxButton.OK, MessageBoxImage.Warning); + InteractionService.ShowWarning("Negativer Auszahlungsbetrag", $"Achtung: Bei {membersNeg.Count:N0} Mitglied(ern) ist der Auszahlungsbetrag negativ!\n\n" + + $"{string.Join(", ", membersNeg.Select(m => $"{m.AdministrativeName} ({m.MgNr})"))}"); } } diff --git a/Elwig/Services/SyncService.cs b/Elwig/Services/SyncService.cs index 4bd2854..978e913 100644 --- a/Elwig/Services/SyncService.cs +++ b/Elwig/Services/SyncService.cs @@ -10,7 +10,6 @@ using System.Linq; using System.Linq.Expressions; using System.Net.Http; using System.Threading.Tasks; -using System.Windows; namespace Elwig.Services { public static class SyncService { @@ -42,22 +41,20 @@ namespace Elwig.Services { .OrderBy(k => k.KgNr) .ToList(); if (members.Count == 0) { - MessageBox.Show("Es wurden keine Mitglieder zum Hochladen ausgewählt!", "Mitglieder hochladen", - MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowError("Mitglieder hochladen", "Es wurden keine Mitglieder zum Hochladen ausgewählt!"); } else { var exportedAt = DateTime.Now; await ElwigData.Export(path, members, areaComs, wbKgs, filterNames); await Utils.UploadExportData(path, url, username, password); await UpdateExportedAt(members, areaComs, [], exportedAt); - MessageBox.Show($"Hochladen von {members.Count:N0} Mitgliedern erfolgreich!", "Mitglieder hochgeladen", - MessageBoxButton.OK, MessageBoxImage.Information); + InteractionService.ShowInformation("Mitglieder hochgeladen", $"Hochladen von {members.Count:N0} Mitgliedern erfolgreich!"); } } catch (HttpRequestException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Mitglieder hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Mitglieder hochladen", "Eventuell Internetverbindung prüfen!", exc); } catch (TaskCanceledException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Mitglieder hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Mitglieder hochladen", "Eventuell Internetverbindung prüfen!", exc); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Mitglieder hochladen", exc); } } @@ -78,22 +75,20 @@ namespace Elwig.Services { .OrderBy(k => k.KgNr) .ToList(); if (list.Count == 0) { - MessageBox.Show("Es wurden keine Lieferungen zum Hochladen ausgewählt!", "Lieferungen hochladen", - MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowError("Lieferungen hochladen", "Es wurden keine Lieferungen zum Hochladen ausgewählt!"); } else { var exportedAt = DateTime.Now; await ElwigData.Export(path, list, wbKgs, filterNames); await Utils.UploadExportData(path, url, username, password); await UpdateExportedAt([], [], list, exportedAt); - MessageBox.Show($"Hochladen von {list.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochgeladen", - MessageBoxButton.OK, MessageBoxImage.Information); + InteractionService.ShowInformation("Lieferungen hochgeladen", $"Hochladen von {list.Count:N0} Lieferungen erfolgreich!"); } } catch (HttpRequestException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Lieferungen hochladen", "Eventuell Internetverbindung prüfen!", exc); } catch (TaskCanceledException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Lieferungen hochladen", "Eventuell Internetverbindung prüfen!", exc); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Lieferungen hochladen", exc); } } @@ -132,8 +127,7 @@ namespace Elwig.Services { .OrderBy(k => k.KgNr) .ToList(); if (members.Count == 0 && deliveries.Count == 0) { - MessageBox.Show("Es gibt keine geänderten Mitglieder oder Lieferungen, die hochgeladen werden könnten!", "Mitglieder und Lieferungen hochladen", - MessageBoxButton.OK, MessageBoxImage.Information); + InteractionService.ShowInformation("Mitglieder und Lieferungen hochladen", "Es gibt keine geänderten Mitglieder oder Lieferungen, die hochgeladen werden könnten!"); } else { var exportedAt = DateTime.Now; await (new ElwigData.ElwigExport { @@ -144,15 +138,14 @@ namespace Elwig.Services { }).Export(path); await Utils.UploadExportData(path, url, username, password); await UpdateExportedAt(members, areaComs, deliveries, exportedAt); - MessageBox.Show($"Hochladen von {members.Count:N0} Mitgliedern, {areaComs.Count:N0} Flächenbindungsverträgen, und {deliveries.Count:N0} Lieferungen erfolgreich!", "Mitglieder und Lieferungen hochladen", - MessageBoxButton.OK, MessageBoxImage.Information); + InteractionService.ShowInformation("Mitglieder und Lieferungen hochladen", $"Hochladen von {members.Count:N0} Mitgliedern, {areaComs.Count:N0} Flächenbindungsverträgen, und {deliveries.Count:N0} Lieferungen erfolgreich!"); } } catch (HttpRequestException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Mitglieder und Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Mitglieder und Lieferungen hochladen", "Eventuell Internetverbindung prüfen!", exc); } catch (TaskCanceledException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Mitglieder und Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Mitglieder und Lieferungen hochladen", "Eventuell Internetverbindung prüfen!", exc); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Mitglieder und Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Mitglieder und Lieferungen hochladen", exc); } } @@ -173,22 +166,20 @@ namespace Elwig.Services { .DistinctBy(k => k.KgNr) .ToList(); if (deliveries.Count == 0) { - MessageBox.Show("Es gibt keine Lieferungen, die hochgeladen werden können!", "Lieferungen hochladen", - MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowError("Lieferungen hochladen", "Es gibt keine Lieferungen, die hochgeladen werden können!"); } else { var exportedAt = DateTime.Now; await ElwigData.Export(path, deliveries, wbKgs, [$"{year}", $"Zweigstelle {App.BranchName}"]); await Utils.UploadExportData(path, url, username, password); await UpdateExportedAt([], [], deliveries, exportedAt); - MessageBox.Show($"Hochladen von {deliveries.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochladen", - MessageBoxButton.OK, MessageBoxImage.Information); + InteractionService.ShowInformation("Lieferungen hochladen", $"Hochladen von {deliveries.Count:N0} Lieferungen erfolgreich!"); } } catch (HttpRequestException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Lieferungen hochladen", "Eventuell Internetverbindung prüfen!", exc); } catch (TaskCanceledException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Lieferungen hochladen", "Eventuell Internetverbindung prüfen!", exc); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Lieferungen hochladen", exc); } } @@ -227,11 +218,11 @@ namespace Elwig.Services { } await ElwigData.Import(paths, ElwigData.ImportMode.FromBranches); } catch (HttpRequestException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Daten herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Daten herunterladen", "Eventuell Internetverbindung prüfen!", exc); } catch (TaskCanceledException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Daten herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Daten herunterladen", "Eventuell Internetverbindung prüfen!", exc); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Daten herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Daten herunterladen", exc); } } diff --git a/Elwig/Windows/AdministrationWindow.cs b/Elwig/Windows/AdministrationWindow.cs index e79789d..3f0e8aa 100644 --- a/Elwig/Windows/AdministrationWindow.cs +++ b/Elwig/Windows/AdministrationWindow.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; +using Elwig.Services; namespace Elwig.Windows { public abstract class AdministrationWindow : ContextWindow { @@ -109,9 +110,7 @@ namespace Elwig.Windows { private void OnClosing(object? sender, CancelEventArgs evt) { if ((IsCreating || IsEditing) && HasChanged) { - var r = MessageBox.Show("Soll das Fenster wirklich geschlossen werden?", "Schließen bestätigen", - MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); - if (r != MessageBoxResult.Yes) { + if (!InteractionService.AskConfirmation("Schließen bestätigen", "Soll das Fenster wirklich geschlossen werden?")) { evt.Cancel = true; return; } @@ -390,7 +389,7 @@ namespace Elwig.Windows { protected bool InputLostFocus(TextBox input, ValidationResult res, string? msg = null) { if (DoShowWarningWindows && !res.IsValid && !IsClosing && (IsEditing || IsCreating)) - MessageBox.Show(res.ErrorContent?.ToString(), msg ?? res.ErrorContent?.ToString(), MessageBoxButton.OK, MessageBoxImage.Warning); + InteractionService.ShowWarning(msg ?? res.ErrorContent?.ToString() ?? "", res.ErrorContent?.ToString() ?? ""); return res.IsValid; } diff --git a/Elwig/Windows/AreaComAdminWindow.xaml.cs b/Elwig/Windows/AreaComAdminWindow.xaml.cs index 8f4dd2c..d0ab549 100644 --- a/Elwig/Windows/AreaComAdminWindow.xaml.cs +++ b/Elwig/Windows/AreaComAdminWindow.xaml.cs @@ -246,9 +246,7 @@ namespace Elwig.Windows { } App.HintContextChange(); } 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, "Flächenbindung löschen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Flächenbindung löschen", exc); } Mouse.OverrideCursor = null; } @@ -298,9 +296,7 @@ namespace Elwig.Windows { } App.HintContextChange(); } 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, "Flächenbindung aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Flächenbindung aktualisieren", exc); SaveButton.IsEnabled = true; Mouse.OverrideCursor = null; return; diff --git a/Elwig/Windows/BaseDataWindow.xaml.Season.cs b/Elwig/Windows/BaseDataWindow.xaml.Season.cs index f326fe8..459ecf6 100644 --- a/Elwig/Windows/BaseDataWindow.xaml.Season.cs +++ b/Elwig/Windows/BaseDataWindow.xaml.Season.cs @@ -1,6 +1,7 @@ using Elwig.Dialogs; using Elwig.Helpers; using Elwig.Models.Entities; +using Elwig.Services; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; @@ -184,9 +185,7 @@ namespace Elwig.Windows { } await ctx.SaveChangesAsync(); } 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, "Saison anlegen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Saison anlegen", exc); } App.HintContextChange(); Mouse.OverrideCursor = null; @@ -197,19 +196,14 @@ namespace Elwig.Windows { private async void SeasonRemoveButton_Click(object sender, RoutedEventArgs evt) { if (SeasonList.SelectedItem is not Season s) return; - var r = MessageBox.Show( - $"Soll die Saison {s.Year} wirklich unwiderruflich gelöscht werden?", - "Saison löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (r == MessageBoxResult.OK) { + if (InteractionService.AskContinue("Saison löschen", $"Soll die Saison {s.Year} wirklich unwiderruflich gelöscht werden?")) { Mouse.OverrideCursor = Cursors.Wait; try { using var ctx = new AppDbContext(); ctx.Remove(s); await ctx.SaveChangesAsync(); } 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, "Saison löschen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Saison löschen", exc); } App.HintContextChange(); Mouse.OverrideCursor = null; diff --git a/Elwig/Windows/BaseDataWindow.xaml.cs b/Elwig/Windows/BaseDataWindow.xaml.cs index fa79cbe..85372ec 100644 --- a/Elwig/Windows/BaseDataWindow.xaml.cs +++ b/Elwig/Windows/BaseDataWindow.xaml.cs @@ -1,5 +1,6 @@ using Elwig.Helpers; using Elwig.Models.Entities; +using Elwig.Services; using Microsoft.EntityFrameworkCore; using System; using System.Linq; @@ -300,9 +301,7 @@ namespace Elwig.Windows { try { await Save(); } 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, "Stammdaten aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Stammdaten aktualisieren", exc); SaveButton.IsEnabled = true; Mouse.OverrideCursor = null; return; diff --git a/Elwig/Windows/ChartWindow.xaml.cs b/Elwig/Windows/ChartWindow.xaml.cs index 98b852a..202805c 100644 --- a/Elwig/Windows/ChartWindow.xaml.cs +++ b/Elwig/Windows/ChartWindow.xaml.cs @@ -10,6 +10,7 @@ using Elwig.Helpers.Billing; using Elwig.Models.Entities; using ScottPlot.Plottables; using ScottPlot; +using Elwig.Services; namespace Elwig.Windows { public partial class ChartWindow : ContextWindow { @@ -82,9 +83,7 @@ namespace Elwig.Windows { private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { if (HasChanged) { - var r = MessageBox.Show("Soll das Fenster wirklich geschlossen werden? Nicht gespeicherte Änderungen werden NICHT übernommen!", "Schließen bestätigen", - MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); - if (r != MessageBoxResult.Yes) { + if (!InteractionService.AskConfirmation("Schließen bestätigen", "Soll das Fenster wirklich geschlossen werden? Nicht gespeicherte Änderungen werden NICHT übernommen!")) { e.Cancel = true; return; } @@ -110,18 +109,17 @@ namespace Elwig.Windows { ..paymentEntries, ..await data.GetQualityGraphEntries(ctx, Season, paymentEntries.Any() ? paymentEntries.Max(e => e.Id) : 0) ]; - } catch (KeyNotFoundException ex) { - var key = ex.Message.Split('\'')[1].Split('\'')[0]; - MessageBox.Show($"Fehler beim Laden der Auszahlungsvariante:\n\n" + - $"Mit unbekanntem Attribut '{key}' kann nicht umgegangen werden.", "Fehler", - MessageBoxButton.OK, MessageBoxImage.Error); + } catch (KeyNotFoundException exc) { + var key = exc.Message.Split('\'')[1].Split('\'')[0]; + InteractionService.ShowError("Fehler", + $"Fehler beim Laden der Auszahlungsvariante:\n\n" + + $"Mit unbekanntem Attribut '{key}' kann nicht umgegangen werden."); } catch (ArgumentException) { - MessageBox.Show($"Fehler beim Laden der Auszahlungsvariante:\n\n" + - $"Die Daten der Auszahlungsvariante entsprechen nicht dem benötigtem Format.", "Fehler", - MessageBoxButton.OK, MessageBoxImage.Error); - } catch (Exception ex) { - MessageBox.Show("Fehler beim Laden der Auszahlungsvariante:\n\n" + ex.Message, "Fehler", - MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowError("Fehler", + $"Fehler beim Laden der Auszahlungsvariante:\n\n" + + $"Die Daten der Auszahlungsvariante entsprechen nicht dem benötigtem Format."); + } catch (Exception exc) { + InteractionService.ShowException("Fehler", "Fehler beim Laden der Auszahlungsvariante", exc); } Vaributes = await Utils.GetVaributeList(ctx, Year); GraphEntries.ForEach(e => { @@ -622,11 +620,7 @@ namespace Elwig.Windows { private void DeleteButton_Click(object sender, RoutedEventArgs e) { if (SelectedGraphEntry == null) return; - var r = MessageBox.Show( - $"Soll die Kurve {SelectedGraphEntry.Id} (verwendet in folgenden Verträgen: {SelectedGraphEntry.VaributeStringSimple}) wirklich gelöscht werden?", - "Kurve löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); - - if (r == MessageBoxResult.Yes) { + if (InteractionService.AskConfirmation("Kurve löschen", $"Soll die Kurve {SelectedGraphEntry.Id} (verwendet in folgenden Verträgen: {SelectedGraphEntry.VaributeStringSimple}) wirklich gelöscht werden?")) { GraphEntries.Remove(SelectedGraphEntry); SetHasChanged(); GraphList.Items.Refresh(); @@ -651,9 +645,7 @@ namespace Elwig.Windows { }); } catch (Exception exc) { Mouse.OverrideCursor = null; - var str = "Der Eintrag konnte nicht in der Datenbank gespeichert werden!\n\n" + exc.Message; - if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; - MessageBox.Show(str, "Auszahlungsvariante speichern", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Auszahlungsvariante speichern", exc); SaveButton.IsEnabled = true; return; } @@ -664,9 +656,9 @@ namespace Elwig.Windows { await b.Calculate(false); }); } catch (KeyNotFoundException exc) { - MessageBox.Show(exc.Message, "Noch nicht alle Preise festgelegt", MessageBoxButton.OK, MessageBoxImage.Information); + InteractionService.ShowInformation("Noch nicht alle Preise festgelegt", exc.Message); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Berechnungsfehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Berechnungsfehler", exc); } LockContext = false; @@ -773,9 +765,7 @@ namespace Elwig.Windows { if (ge != SelectedGraphEntry && ge.Abgewertet == SelectedGraphEntry?.Abgewertet) { var toRemove = ge.Vaributes.Where(c => c.Listing.Equals(varibute)).ToList(); if (toRemove.Count == 0) continue; - var r = MessageBox.Show($"Achtung: {string.Join(", ", toRemove)} ist bereits in Kurve {ge.Id} in Verwendung!\nSoll die Zuweisung dort entfernt werden?", "Entfernen bestätigen", - MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); - if (r != MessageBoxResult.Yes) { + if (!InteractionService.AskConfirmation("Entfernen bestätigen", $"Achtung: {string.Join(", ", toRemove)} ist bereits in Kurve {ge.Id} in Verwendung!\nSoll die Zuweisung dort entfernt werden?")) { return false; } ge.Vaributes.RemoveAll(c => c.Listing.Equals(varibute)); diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs index 9e467e4..92f4194 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs @@ -6,7 +6,6 @@ using Elwig.Models.Entities; using Elwig.Services; using Elwig.ViewModels; using Microsoft.EntityFrameworkCore; -using Microsoft.Win32; using System; using System.Collections.Generic; using System.Linq; @@ -137,8 +136,9 @@ namespace Elwig.Windows { if (ViewModel.IsReceipt) { NewDeliveryButton_Click(null, null); if (await ctx.FetchSeasons(Utils.CurrentYear).SingleOrDefaultAsync() == null) { - MessageBox.Show("Die Saison für das aktuelle Jahr wurde noch nicht erstellt. Neue Lieferungen können nicht abgespeichert werden.\n\n(Stammdaten -> Saisons -> Neu anlegen...)", - "Saison noch nicht erstellt", MessageBoxButton.OK, MessageBoxImage.Warning); + InteractionService.ShowWarning("Saison noch nicht erstellt", + "Die Saison für das aktuelle Jahr wurde noch nicht erstellt. Neue Lieferungen können nicht abgespeichert werden.\n\n" + + "(Stammdaten -> Saisons -> Neu anlegen...)"); } } } @@ -164,9 +164,7 @@ namespace Elwig.Windows { private async void Menu_DeliveryNote_Email_Click(object sender, RoutedEventArgs evt) { if (DeliveryList.SelectedItem is not Delivery d) return; - var res = MessageBox.Show("Soll eine E-Mail verschickt werden?", "Lieferschein verschicken", - MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.Yes); - if (res != MessageBoxResult.Yes) + if (!InteractionService.AskQuestion("Lieferschein verschicken", "Soll eine E-Mail verschickt werden?", true)) return; await DeliveryService.GenerateDeliveryNote(d.Year, d.DId, ExportMode.Email); } @@ -174,16 +172,11 @@ namespace Elwig.Windows { private async void Menu_Bki_SaveList_Click(object sender, RoutedEventArgs evt) { if (sender is not MenuItem m) return; var year = int.Parse(m.Header.ToString()?.Split(" ")[^1] ?? Utils.CurrentLastSeason.ToString()); - var d = new SaveFileDialog() { - FileName = $"{App.Client.NameToken}-Traubentransportscheinliste-{year}.{Bki.FileExtension}", - DefaultExt = Bki.FileExtension, - Filter = "CSV-Datei (*.csv)|*.csv", - Title = $"Traubentransportscheinliste (BKI) speichern unter - Elwig" - }; - if (d.ShowDialog() == true) { + var filename = InteractionService.SaveFile("Traubentransportscheinliste (BKI)", $"{App.Client.NameToken}-Traubentransportscheinliste-{year}", Bki.FileExtension); + if (filename != null) { Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { - using var file = new Bki(d.FileName); + using var file = new Bki(filename); await file.ExportAsync(year); }); Mouse.OverrideCursor = null; @@ -641,11 +634,10 @@ namespace Elwig.Windows { try { var res = await s.Weigh(); OnWeighingResult(s, res); - } catch (Exception ex) { - ViewModel.LastScaleError = ex.Message.Split(": ")[^1]; + } catch (Exception exc) { + ViewModel.LastScaleError = exc.Message.Split(": ")[^1]; OnWeighingResult(s, new()); - MessageBox.Show($"Beim Wiegen ist ein Fehler aufgetreten:\n\n{ex.Message}", "Waagenfehler", - MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Waagenfehler", "Beim Wiegen ist ein Fehler aufgetreten", exc); } ViewModel.ManualWeighingReason = null; ManualWeighingInput.IsChecked = false; @@ -801,9 +793,7 @@ namespace Elwig.Windows { ); App.HintContextChange(); } 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, "Lieferung aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Lieferung aktualisieren", exc); FinishButton.IsEnabled = true; SaveButton.IsEnabled = true; Mouse.OverrideCursor = null; @@ -839,9 +829,7 @@ namespace Elwig.Windows { ); App.HintContextChange(); } 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, "Lieferung aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Lieferung aktualisieren", exc); FinishButton.IsEnabled = true; SaveButton.IsEnabled = true; Mouse.OverrideCursor = null; @@ -871,9 +859,8 @@ namespace Elwig.Windows { private async void CancelCreatingButton_Click(object sender, RoutedEventArgs evt) { if (IsCreating && HasChanged) { - var r = MessageBox.Show("Soll der Vorgang wirklich abgebrochen werden?", "Abbrechen bestätigen", - MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); - if (r != MessageBoxResult.Yes) return; + if (!InteractionService.AskConfirmation("Abbrechen bestätigen", "Soll der Vorgang wirklich abgebrochen werden?")) + return; } using var ctx = new AppDbContext(); @@ -954,9 +941,7 @@ namespace Elwig.Windows { } App.HintContextChange(); } 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, "Lieferung aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Lieferung aktualisieren", exc); } Mouse.OverrideCursor = null; } @@ -1003,18 +988,13 @@ namespace Elwig.Windows { if (DeliveryList.SelectedItem is not Delivery d) return; - var r = MessageBox.Show( - $"Soll die Lieferung {d.LsNr} ({d.Member.AdministrativeName}, MgNr. {d.Member.MgNr}) wirklich unwiderruflich gelöscht werden?", - "Lieferung löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (r == MessageBoxResult.OK) { + if (InteractionService.AskContinue("Lieferung löschen", $"Soll die Lieferung {d.LsNr} ({d.Member.AdministrativeName}, MgNr. {d.Member.MgNr}) wirklich unwiderruflich gelöscht werden?")) { Mouse.OverrideCursor = Cursors.Wait; try { await DeliveryService.DeleteDelivery(d.LsNr); App.HintContextChange(); } 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, "Lieferung löschen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Lieferung löschen", exc); } Mouse.OverrideCursor = null; } @@ -1042,9 +1022,7 @@ namespace Elwig.Windows { ); App.HintContextChange(); } 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, "Lieferung aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Lieferung aktualisieren", exc); SaveButton.IsEnabled = true; Mouse.OverrideCursor = null; return; @@ -1281,8 +1259,7 @@ namespace Elwig.Windows { UpdateWineQualityLevels(); if (!ViewModel.WineVar?.IsQuw ?? false) { App.MainDispatcher.BeginInvoke(() => { - MessageBox.Show("Die eingegebene Sorte darf nicht als Qualitätswein\nübernommen werden!", "Kein Qualitätswein", - MessageBoxButton.OK, MessageBoxImage.Warning); + InteractionService.ShowWarning("Kein Qualitätswein", "Die eingegebene Sorte darf nicht als Qualitätswein\nübernommen werden!"); }); } } diff --git a/Elwig/Windows/DeliveryAncmtAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAncmtAdminWindow.xaml.cs index c2d8b06..5ead419 100644 --- a/Elwig/Windows/DeliveryAncmtAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAncmtAdminWindow.xaml.cs @@ -309,10 +309,7 @@ namespace Elwig.Windows { private async void DeleteDeliveryAncmtButton_Click(object? sender, RoutedEventArgs? evt) { if (ViewModel.SelectedDeliveryAncmt is not DeliveryAncmt a) return; - var r = MessageBox.Show( - $"Soll die Anmeldung wirklich unwiderruflich gelöscht werden?", - "Anmeldung löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (r == MessageBoxResult.OK) { + if (InteractionService.AskContinue("Anmeldung löschen", "Soll die Anmeldung wirklich unwiderruflich gelöscht werden?")) { Mouse.OverrideCursor = Cursors.Wait; try { await Task.Run(async () => { @@ -322,9 +319,7 @@ namespace Elwig.Windows { }); App.HintContextChange(); } 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, "Anmeldung löschen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Anmeldung löschen", exc); } Mouse.OverrideCursor = null; } @@ -347,9 +342,7 @@ namespace Elwig.Windows { (year, dsnr, mgnr, sortid) = await ViewModel.UpdateDeliveryAncmt(s?.Year, s?.DsNr, s?.MgNr, s?.SortId, s?.Type); App.HintContextChange(); } 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, "Anmeldung aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Anmeldung aktualisieren", exc); SaveButton.IsEnabled = true; return; } finally { diff --git a/Elwig/Windows/DeliveryScheduleAdminWindow.xaml.cs b/Elwig/Windows/DeliveryScheduleAdminWindow.xaml.cs index b7eed50..347e1e9 100644 --- a/Elwig/Windows/DeliveryScheduleAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryScheduleAdminWindow.xaml.cs @@ -177,10 +177,7 @@ namespace Elwig.Windows { private async void DeleteDeliveryScheduleButton_Click(object? sender, RoutedEventArgs? evt) { if (ViewModel.SelectedDeliverySchedule is not DeliverySchedule s) return; - var r = MessageBox.Show( - $"Soll der Leseplan \"{s.Description}\" vom {s.Date:dd.MM.yyyy} wirklich unwiderruflich gelöscht werden?", - "Leseplan löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (r == MessageBoxResult.OK) { + if (InteractionService.AskContinue("Leseplan löschen", $"Soll der Leseplan \"{s.Description}\" vom {s.Date:dd.MM.yyyy} wirklich unwiderruflich gelöscht werden?")) { Mouse.OverrideCursor = Cursors.Wait; try { await Task.Run(async () => { @@ -190,9 +187,7 @@ namespace Elwig.Windows { }); App.HintContextChange(); } 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, "Leseplan löschen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Leseplan löschen", exc); } Mouse.OverrideCursor = null; } @@ -212,9 +207,7 @@ namespace Elwig.Windows { await ViewModel.UpdateDeliverySchedule(ViewModel.SelectedDeliverySchedule?.Year, ViewModel.SelectedDeliverySchedule?.DsNr); App.HintContextChange(); } 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, "Leseplan aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Leseplan aktualisieren", exc); SaveButton.IsEnabled = true; return; } finally { diff --git a/Elwig/Windows/MailWindow.xaml.cs b/Elwig/Windows/MailWindow.xaml.cs index aa838c4..99eed84 100644 --- a/Elwig/Windows/MailWindow.xaml.cs +++ b/Elwig/Windows/MailWindow.xaml.cs @@ -3,6 +3,7 @@ using Elwig.Helpers; using Elwig.Helpers.Billing; using Elwig.Models.Dtos; using Elwig.Models.Entities; +using Elwig.Services; using MailKit.Net.Smtp; using Microsoft.EntityFrameworkCore; using Microsoft.Win32; @@ -690,7 +691,7 @@ namespace Elwig.Windows { PrintButton.IsEnabled = PrintDocument != null && !hasPreviewDocs; EmailButton.IsEnabled = EmailDocuments != null && !hasPreviewDocs && App.Config.Smtp != null; } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } finally { UnlockInputs(); GenerateButton.IsEnabled = true; @@ -774,7 +775,7 @@ namespace Elwig.Windows { throw new NotImplementedException("Invalid DocType"); } } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); return []; } finally { App.MainDispatcher.Invoke(() => { @@ -787,9 +788,9 @@ namespace Elwig.Windows { var hasPreviewDocs = memberDocs.Any(m => m.Docs.Any(d => d.Doc.IsPreview)); if (hasPreviewDocs) { - var res = MessageBox.Show("Einige der ausgewählten Dokumente sind nur als vorläufig zu betrachten und können daher nicht verschickt/ausgedruckt werden!\n\nDies könnte an einer noch nicht festgesetzen Auszahlungsvariante liegen oder daran, dass nicht alle Adressaten/Empfänger eine Traubengutschrift erhalten\n(\"Empfänger von Gutschriften\").\n\nSoll mit dem Generieren fortgefahren werden?", - "Vorläufige Dokumente", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (res != MessageBoxResult.OK) { + if (!InteractionService.AskContinue("Vorläufige Dokumente", + "Einige der ausgewählten Dokumente sind nur als vorläufig zu betrachten und können daher nicht verschickt/ausgedruckt werden!\n\n" + + "Dies könnte an einer noch nicht festgesetzen Auszahlungsvariante liegen oder daran, dass nicht alle Adressaten/Empfänger eine Traubengutschrift erhalten\n(\"Empfänger von Gutschriften\").\n\nSoll mit dem Generieren fortgefahren werden?")) { throw new OperationCanceledException("Dokumentenerzeugung abgebrochen!"); } } @@ -892,9 +893,7 @@ namespace Elwig.Windows { GenerateButton.IsEnabled = false; LockInputs(); - var res = MessageBox.Show($"Sollen {PrintDocument.Pages} Blätter ({PrintDocument.TotalPages} Seiten) gedruckt werden?", - "Rundschreiben drucken", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No); - if (res == MessageBoxResult.Yes) { + if (InteractionService.AskQuestion("Rundschreiben drucken", $"Sollen {PrintDocument.Pages} Blätter ({PrintDocument.TotalPages} Seiten) gedruckt werden?", false)) { Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { if (App.Config.Debug) { @@ -932,11 +931,8 @@ namespace Elwig.Windows { client = await Task.Run(Utils.GetSmtpClient); Mouse.OverrideCursor = null; - var res = MessageBox.Show($"Sollen {EmailDocuments.Count:N0} E-Mails verschickt werden?", - "Rundschreiben verschicken", MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.No); - if (res != MessageBoxResult.Yes) { + if (!InteractionService.AskQuestion("Rundschreiben verschicken", $"Sollen {EmailDocuments.Count:N0} E-Mails verschickt werden?", false)) return; - } Mouse.OverrideCursor = Cursors.Wait; var subject = EmailSubjectInput.Text; @@ -965,10 +961,9 @@ namespace Elwig.Windows { } }); - MessageBox.Show("Erfolgreich alle E-Mails verschickt!\n\nEs kann einige Minuten dauern, bis die E-Mails in den Posteingängen der Empfänger aufscheinen.", "Rundschreiben verschicken", - MessageBoxButton.OK, MessageBoxImage.Information); + InteractionService.ShowInformation("Rundschreiben verschicken", "Erfolgreich alle E-Mails verschickt!\n\nEs kann einige Minuten dauern, bis die E-Mails in den Posteingängen der Empfänger aufscheinen."); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } finally { if (client != null) await client.DisconnectAsync(true); diff --git a/Elwig/Windows/MainWindow.xaml.cs b/Elwig/Windows/MainWindow.xaml.cs index fb20c90..b87633b 100644 --- a/Elwig/Windows/MainWindow.xaml.cs +++ b/Elwig/Windows/MainWindow.xaml.cs @@ -59,9 +59,7 @@ namespace Elwig.Windows { } Thread.Sleep(100); if (App.NumWindows > 1 && !App.Current.Windows.Cast().Any(w => ((w as AdministrationWindow)?.IsEditing ?? false) || ((w as AdministrationWindow)?.IsCreating ?? false))) { - var res = MessageBox.Show("Es sind noch weitere Fenster geöffnet.\nSollen alle Fenster geschlossen werden?", - "Elwig beenden", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); - if (res != MessageBoxResult.Yes) { + if (!InteractionService.AskConfirmation("Elwig beenden", "Es sind noch weitere Fenster geöffnet.\nSollen alle Fenster geschlossen werden?")) { evt.Cancel = true; } else { Application.Current.Shutdown(); @@ -84,9 +82,9 @@ namespace Elwig.Windows { try { using var client = await Utils.GetSmtpClient(); await client!.DisconnectAsync(true); - MessageBox.Show("E-Mail-Einstellungen erfolgreich überprüft!", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information); + InteractionService.ShowInformation("Erfolg", "E -Mail-Einstellungen erfolgreich überprüft!"); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } Mouse.OverrideCursor = null; } @@ -115,17 +113,17 @@ namespace Elwig.Windows { private async void Menu_Scale_SetDateTime_Click(object sender, RoutedEventArgs evt) { if (App.CommandScales.Count == 0) { - MessageBox.Show("Es sind keine geeigneten Waagen verfügbar!", "Datum und Uhrzeit setzen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowError("Datum und Uhrzeit setzen", "Es sind keine geeigneten Waagen verfügbar!"); return; } foreach (var s in App.CommandScales) { try { await s.SetDateAndTime(DateTime.Now); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } } - MessageBox.Show("Datum und Uhrzeit auf entsprechenden Waagen gesetzt!", "Datum und Uhrzeit setzen", MessageBoxButton.OK, MessageBoxImage.Information); + InteractionService.ShowInformation("Datum und Uhrzeit setzen", "Datum und Uhrzeit auf entsprechenden Waagen gesetzt!"); } private void Menu_Database_Query_Click(object sender, RoutedEventArgs evt) { @@ -157,29 +155,23 @@ namespace Elwig.Windows { }); } } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } Mouse.OverrideCursor = null; } private async void Menu_Database_Backup_Click(object sender, RoutedEventArgs evt) { try { - var d = new SaveFileDialog() { - Title = "Datenbank sichern - Elwig", - FileName = $"database_{Utils.Today:yyyy-MM-dd}.sql.zip", - DefaultExt = "sql.zip", - Filter = "Komprimierte SQL-Datei (*.sql.zip)|*.sql.zip", - AddExtension = false, - }; - if (d.ShowDialog() == true) { - if (!d.FileName.EndsWith(".sql.zip")) d.FileName += ".sql.zip"; + var filename = InteractionService.SaveFile("Datenbank-Sicherung", $"database_{Utils.Today:yyyy-MM-dd}", "sql.zip"); + if (filename != null) { + if (!filename.EndsWith(".sql.zip")) filename += ".sql.zip"; Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { - await Database.ExportSql(d.FileName, true); + await Database.ExportSql(filename, true); }); } } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } Mouse.OverrideCursor = null; } @@ -192,16 +184,13 @@ namespace Elwig.Windows { Filter = "SQLite-Datenbank (*.sqlite3, *.sqlite3.zip, *.sql, *.sql.zip)|*.sqlite3;*.sqlite3.zip;*.sql;*.sql.zip", }; if (d.ShowDialog() == true) { - var res = MessageBox.Show("Soll die Datenbank wirklich unwiederruflich durch die wiederhergestellte Version ersetzt werden?", "Datenbank wiederherstellen", - MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (res != MessageBoxResult.OK) + if (!InteractionService.AskContinue("Datenbank wiederherstellen", "Soll die Datenbank wirklich unwiederruflich durch die wiederhergestellte Version ersetzt werden?")) return; - Mouse.OverrideCursor = Cursors.Wait; await App.ReplaceDatabase(d.FileName); } } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } Mouse.OverrideCursor = null; } @@ -266,15 +255,15 @@ namespace Elwig.Windows { .ToList(); if (files.Count == 0) { - MessageBox.Show("Die Datenbank wurde noch nicht vom Hauptgerät hochgeladen!", "Datenbank herunterladen", - MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowError("Datenbank herunterladen", "Die Datenbank wurde noch nicht vom Hauptgerät hochgeladen!"); return; } var file = files[0]; - var res = MessageBox.Show($"Es wurde eine komprimierte Datenbank (ca. {file.Size / 1024 / 1024} MB) vom {file.Timestamp:dd.MM.yyyy, HH:mm} gefunden.\n\nWollen Sie wirklich die aktuelle Datenbank unwiederruflich\nlöschen und durch die gefundene ersetzen?\n\nDas kann zu Datenverlust führen!", "Datenbank herunterladen", - MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (res != MessageBoxResult.OK) + if (!InteractionService.AskContinue("Datenbank herunterladen", + $"Es wurde eine komprimierte Datenbank (ca. {file.Size / 1024 / 1024} MB) vom {file.Timestamp:dd.MM.yyyy, HH:mm} gefunden.\n\n" + + $"Wollen Sie wirklich die aktuelle Datenbank unwiederruflich\nlöschen und durch die gefundene ersetzen?\n\n" + + $"Das kann zu Datenverlust führen!")) return; var filename = Path.Combine(App.TempPath, file.Name); @@ -283,20 +272,21 @@ namespace Elwig.Windows { await client.DownloadAsync(file.Url, stream); } - res = MessageBox.Show("Die Datenbank wurde erfolgreich heruntergeladen!\n\nSoll die Datenbank wirklich unwiederruflich ersetzt werden?\n\nWenn Sie unsicher sind sprechen Sie sich mit dem Benutzer des Hauptgerätes ab!", "Datenbank herunterladen", - MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (res != MessageBoxResult.OK) + if (!InteractionService.AskContinue("Datenbank herunterladen", + "Die Datenbank wurde erfolgreich heruntergeladen!\n\n" + + "Soll die Datenbank wirklich unwiederruflich ersetzt werden?\n\n" + + "Wenn Sie unsicher sind sprechen Sie sich mit dem Benutzer des Hauptgerätes ab!")) return; await App.MainDispatcher.BeginInvoke(async () => { await App.ReplaceDatabase(filename); }); } catch (HttpRequestException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Datenbank herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Datenbank herunterladen", "Eventuell Internetverbindung prüfen!", exc); } catch (TaskCanceledException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Datenbank herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Datenbank herunterladen", "Eventuell Internetverbindung prüfen!", exc); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Datenbank herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Datenbank herunterladen", exc); } }); Mouse.OverrideCursor = null; @@ -306,9 +296,7 @@ namespace Elwig.Windows { if (App.Config.SyncUrl == null) return; - var res = MessageBox.Show("Sind Sie wirklich sicher, dass Sie die Datenbank dieses\nGerätes hochladen möchten? Das sollte nur vom Hauptgerät aus passieren!", "Datenbank hochladen", - MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (res != MessageBoxResult.OK) + if (!InteractionService.AskContinue("Datenbank hochladen", "Sind Sie wirklich sicher, dass Sie die Datenbank dieses\nGerätes hochladen möchten? Das sollte nur vom Hauptgerät aus passieren!")) return; Mouse.OverrideCursor = Cursors.Wait; @@ -317,14 +305,13 @@ namespace Elwig.Windows { var path = Path.Combine(App.TempPath, "database.sql.zip"); await Database.ExportSql(path, true); await Utils.UploadExportData(path, App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword); - MessageBox.Show($"Hochladen der gesamten Datenbank erfolgreich!", "Datenbank hochladen", - MessageBoxButton.OK, MessageBoxImage.Information); + InteractionService.ShowInformation("Datenbank hochladen", $"Hochladen der gesamten Datenbank erfolgreich!"); } catch (HttpRequestException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Datenbank hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Datenbank hochladen", "Eventuell Internetverbindung prüfen!", exc); } catch (TaskCanceledException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Datenbank hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Datenbank hochladen", "Eventuell Internetverbindung prüfen!", exc); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Datenbank hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Datenbank hochladen", exc); } }); Mouse.OverrideCursor = null; @@ -457,13 +444,8 @@ namespace Elwig.Windows { private async void OverUnderDeliveryButton_Click(object sender, RoutedEventArgs evt) { if (SeasonInput.Value is not int year) return; - var d = new SaveFileDialog() { - FileName = $"Über-Unterlieferungen-{year}.ods", - DefaultExt = "ods", - Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods", - Title = $"Über-/Unterlieferungen {year} speichern unter - Elwig" - }; - if (d.ShowDialog() == false) + var filename = InteractionService.SaveFile($"Über-/Unterlieferungen {year}", $"Über-Unterlieferungen-{year}", "ods"); + if (filename == null) return; Mouse.OverrideCursor = Cursors.Wait; @@ -477,11 +459,11 @@ namespace Elwig.Windows { using var ctx = new AppDbContext(); var tbl1 = await OverUnderDeliveryData.ForSeason(ctx.OverUnderDeliveryRows, year); var tbl2 = await AreaComUnderDeliveryData.ForSeason(ctx.AreaComUnderDeliveryRows, year); - using var ods = new OdsFile(d.FileName); + using var ods = new OdsFile(filename); await ods.AddTable(tbl1); await ods.AddTable(tbl2); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -490,13 +472,8 @@ namespace Elwig.Windows { private async void BreakdownButton_Click(object sender, RoutedEventArgs evt) { if (SeasonInput.Value is not int year) return; - var d = new SaveFileDialog() { - FileName = $"Aufschlüsselung-{year}.ods", - DefaultExt = "ods", - Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods", - Title = $"Sorten-/Qualitätsaufschlüsselung {year} speichern unter - Elwig" - }; - if (d.ShowDialog() == false) + var filename = InteractionService.SaveFile($"Sorten-/Qualitätsaufschlüsselung {year}", $"Aufschlüsselung-{year}", "ods"); + if (filename == null) return; Mouse.OverrideCursor = Cursors.Wait; @@ -508,7 +485,7 @@ namespace Elwig.Windows { App.HintContextChange(); using var ctx = new AppDbContext(); - using var ods = new OdsFile(d.FileName); + using var ods = new OdsFile(filename); var tblTotal = await WeightBreakdownData.ForSeason(ctx.WeightBreakDownRows, year); await ods.AddTable(tblTotal); foreach (var branch in await ctx.FetchBranches().ToListAsync()) { @@ -516,7 +493,7 @@ namespace Elwig.Windows { await ods.AddTable(tbl); } } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -525,13 +502,8 @@ namespace Elwig.Windows { private async void AreaCommitmentsButton_Click(object sender, RoutedEventArgs evt) { if (SeasonInput.Value is not int year) return; - var d = new SaveFileDialog() { - FileName = $"Flächenbindungen-{year}.ods", - DefaultExt = "ods", - Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods", - Title = $"Flächenbindungen {year} speichern unter - Elwig" - }; - if (d.ShowDialog() == false) + var filename = InteractionService.SaveFile($"Flächenbindungen {year}", $"Flächenbindungen-{year}", "ods"); + if (filename == null) return; Mouse.OverrideCursor = Cursors.Wait; @@ -544,10 +516,10 @@ namespace Elwig.Windows { using var ctx = new AppDbContext(); var tbl = await MemberAreaComsData.ForSeason(ctx.MemberAreaComsRows, year); - using var ods = new OdsFile(d.FileName); + using var ods = new OdsFile(filename); await ods.AddTable(tbl); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; @@ -556,13 +528,8 @@ namespace Elwig.Windows { private async void BreakdownMemberVarietyButton_Click(object sender, RoutedEventArgs evt) { if (SeasonInput.Value is not int year) return; - var d = new SaveFileDialog() { - FileName = $"Liefermengen-Ertrag-{year}.ods", - DefaultExt = "ods", - Filter = "OpenDocument Format Spreadsheet (*.ods)|*.ods", - Title = $"Liefermengen/Ertrag {year} speichern unter - Elwig" - }; - if (d.ShowDialog() == false) + var filename = InteractionService.SaveFile($"Liefermengen/Ertrag {year}", $"Liefermengen-Ertrag-{year}", "ods"); + if (filename == null) return; Mouse.OverrideCursor = Cursors.Wait; @@ -575,10 +542,10 @@ namespace Elwig.Windows { using var ctx = new AppDbContext(); var tbl = await MemberDeliveryYieldsPerVarietyData.ForSeason(ctx.MemberDeliveryPerVariantRows, year); - using var ods = new OdsFile(d.FileName); + using var ods = new OdsFile(filename); await ods.AddTable(tbl); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } }); Mouse.OverrideCursor = null; diff --git a/Elwig/Windows/MemberAdminWindow.xaml.cs b/Elwig/Windows/MemberAdminWindow.xaml.cs index b1d158f..627baf5 100644 --- a/Elwig/Windows/MemberAdminWindow.xaml.cs +++ b/Elwig/Windows/MemberAdminWindow.xaml.cs @@ -399,9 +399,7 @@ namespace Elwig.Windows { await MemberService.DeleteMember(m.MgNr, d.DeletePaymentData, d.DeleteDeliveries, d.DeleteAreaComs); App.HintContextChange(); } 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 löschen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Mitglied löschen", exc); } Mouse.OverrideCursor = null; } @@ -422,9 +420,7 @@ namespace Elwig.Windows { mgnr = await ViewModel.UpdateMember(ViewModel.SelectedMember?.MgNr); App.HintContextChange(); } 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); + InteractionService.ShowDbException("Mitglied aktualisieren", exc); SaveButton.IsEnabled = true; Mouse.OverrideCursor = null; return; @@ -512,7 +508,7 @@ namespace Elwig.Windows { } }); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } Mouse.OverrideCursor = null; } @@ -534,9 +530,7 @@ namespace Elwig.Windows { private async void Menu_MemberDataSheet_Email_Click(object sender, RoutedEventArgs evt) { if (ViewModel.SelectedMember is not Member m) return; - var res = MessageBox.Show("Soll eine E-Mail verschickt werden?", "Stammdatenblatt verschicken", - MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.Yes); - if (res != MessageBoxResult.Yes) + if (!InteractionService.AskQuestion("Stammdatenblatt verschicken", "Soll eine E-Mail verschickt werden?", true)) return; await MemberService.GenerateMemberDataSheet(m, ExportMode.Email); } @@ -566,9 +560,7 @@ namespace Elwig.Windows { var year = (int?)((sender as MenuItem)?.Parent as MenuItem)?.Tag; if (ViewModel.SelectedMember is not Member m || year == null) return; - var res = MessageBox.Show("Soll eine E-Mail verschickt werden?", "Anlieferungsbestätigung verschicken", - MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.Yes); - if (res != MessageBoxResult.Yes) + if (!InteractionService.AskQuestion("Anlieferungsbestätigung verschicken", "Soll eine E-Mail verschickt werden?", true)) return; await MemberService.GenerateDeliveryConfirmation(m, (int)year, ExportMode.Email); } @@ -602,9 +594,7 @@ namespace Elwig.Windows { var avnr = (int?)((sender as MenuItem)?.Parent as MenuItem)?.Tag; if (ViewModel.SelectedMember is not Member m || year == null || avnr == null) return; - var res = MessageBox.Show("Soll eine E-Mail verschickt werden?", "Traubengutschrift verschicken", - MessageBoxButton.YesNo, MessageBoxImage.Question, MessageBoxResult.Yes); - if (res != MessageBoxResult.Yes) + if (!InteractionService.AskQuestion("Traubengutschrift verschicken", "Soll eine E-Mail verschickt werden?", true)) return; await MemberService.GenerateCreditNote(m, (int)year, (int)avnr, ExportMode.Email); } diff --git a/Elwig/Windows/OriginHierarchyWindow.xaml.cs b/Elwig/Windows/OriginHierarchyWindow.xaml.cs index 24a17cc..ba61083 100644 --- a/Elwig/Windows/OriginHierarchyWindow.xaml.cs +++ b/Elwig/Windows/OriginHierarchyWindow.xaml.cs @@ -1,5 +1,6 @@ using Elwig.Helpers; using Elwig.Models.Entities; +using Elwig.Services; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; @@ -192,18 +193,14 @@ namespace Elwig.Windows { App.HintContextChange(); ControlUtils.SelectItemWithPk(WbGlKgs, k.KgNr); } 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, "Katastralgemeinde aktivieren", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Katastralgemeinde aktivieren", exc); } } private async void DeactivateKgButton_Click(object sender, RoutedEventArgs e) { if (WbGlKgs.SelectedItem is not AT_Kg k || k.WbKg == null) return; - var r = MessageBox.Show( - $"Sollen alle Riede und Stammgemeinden-Einträge von der KG {k.Name} wirklich unwiderruflich gelöscht werden?", - "Katastralgemeinde deaktivieren", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); - if (r != MessageBoxResult.Yes) return; + if (!InteractionService.AskConfirmation("Katastralgemeinde deaktivieren", $"Sollen alle Riede und Stammgemeinden-Einträge von der KG {k.Name} wirklich unwiderruflich gelöscht werden?")) + return; try { using (var ctx = new AppDbContext()) { ctx.Remove(k.WbKg); @@ -213,9 +210,7 @@ namespace Elwig.Windows { ControlUtils.SelectItemWithPk(WbKgs, k.KgNr); } catch (Exception exc) { await ForceContextReload(); - var str = "Der Eintrag konnte nicht aus der Datenbank gelöscht werden!\n\n" + exc.Message; - if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message; - MessageBox.Show(str, "Katastralgemeinde deaktivieren", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Katastralgemeinde deaktivieren", exc); } } diff --git a/Elwig/Windows/PaymentAdjustmentWindow.xaml.cs b/Elwig/Windows/PaymentAdjustmentWindow.xaml.cs index dd00ef1..f064ea8 100644 --- a/Elwig/Windows/PaymentAdjustmentWindow.xaml.cs +++ b/Elwig/Windows/PaymentAdjustmentWindow.xaml.cs @@ -2,6 +2,7 @@ using Elwig.Helpers; using Elwig.Helpers.Billing; using Elwig.Models.Dtos; using Elwig.Models.Entities; +using Elwig.Services; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; @@ -168,9 +169,7 @@ namespace Elwig.Windows { }); App.HintContextChange(); } 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, "GA Nachzeichnen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("GA Nachzeichnen", exc); } Mouse.OverrideCursor = null; } @@ -184,9 +183,7 @@ namespace Elwig.Windows { }); App.HintContextChange(); } 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, "GA Nachzeichnen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("GA Nachzeichnen", exc); } Mouse.OverrideCursor = null; } @@ -303,9 +300,7 @@ namespace Elwig.Windows { }); App.HintContextChange(); } 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, "Benutzerdefinierten Zu-/Abschlag speichern", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Benutzerdefinierten Zu-/Abschlag speichern", exc); } Mouse.OverrideCursor = null; } diff --git a/Elwig/Windows/PaymentVariantsWindow.xaml.cs b/Elwig/Windows/PaymentVariantsWindow.xaml.cs index 56991d5..f37d87d 100644 --- a/Elwig/Windows/PaymentVariantsWindow.xaml.cs +++ b/Elwig/Windows/PaymentVariantsWindow.xaml.cs @@ -90,9 +90,7 @@ namespace Elwig.Windows { App.HintContextChange(); ControlUtils.SelectItem(PaymentVariantList, v); } 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, "Auszahlungsvariante erstellen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Auszahlungsvariante erstellen", exc); } Mouse.OverrideCursor = null; } @@ -106,9 +104,7 @@ namespace Elwig.Windows { App.HintContextChange(); ControlUtils.SelectItem(PaymentVariantList, n); } 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, "Auszahlungsvariante kopieren", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Auszahlungsvariante kopieren", exc); } Mouse.OverrideCursor = null; } @@ -116,19 +112,14 @@ namespace Elwig.Windows { private async void DeleteButton_Click(object sender, RoutedEventArgs evt) { if (PaymentVariantList.SelectedItem is not PaymentVar v || !v.TestVariant) return; - var res = MessageBox.Show( - $"Soll die Auszahlungsvariante \"{v.Name}\" wirklich unwiderruflich gelöscht werden?", - "Auszahlungsvariante löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel); - if (res != MessageBoxResult.OK) + if (!InteractionService.AskContinue("Auszahlungsvariante löschen", $"Soll die Auszahlungsvariante \"{v.Name}\" wirklich unwiderruflich gelöscht werden?")) return; Mouse.OverrideCursor = Cursors.Wait; try { await PaymentVariantService.DeletePaymentVariant(v.Year, v.AvNr); App.HintContextChange(); } 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, "Auszahlungsvariante löschen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Auszahlungsvariante löschen", exc); } Mouse.OverrideCursor = null; } @@ -142,7 +133,7 @@ namespace Elwig.Windows { await PaymentVariantService.Calculate(v.Year, v.AvNr); App.HintContextChange(); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Berechnungsfehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Berechnungsfehler", exc); } Mouse.OverrideCursor = null; ViewModel.CalculateIsEnabled = true; @@ -204,7 +195,7 @@ namespace Elwig.Windows { await PaymentVariantService.Commit(v.Year, v.AvNr); App.HintContextChange(); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } Mouse.OverrideCursor = null; ViewModel.RevertIsEnabled = true; @@ -213,11 +204,9 @@ namespace Elwig.Windows { private async void RevertButton_Click(object sender, RoutedEventArgs evt) { if (PaymentVariantList.SelectedItem is not PaymentVar v) return; - var res = MessageBox.Show( + if (!InteractionService.AskConfirmation("Traubengutschriften löschen", "Sollen wirklich alle festgesetzten Traubengutschriften der ausgewählten Auszahlungsvariante unwiderruflich gelöscht werden?\n\n" + - "Dies ist im Allgemeinen nie empfohlen. Handelt es sich um die aktuellste Auszahlungsvariante könnte das eine Ausnahme sein.", - "Traubengutschriften löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); - if (res != MessageBoxResult.Yes) + "Dies ist im Allgemeinen nie empfohlen. Handelt es sich um die aktuellste Auszahlungsvariante könnte das eine Ausnahme sein.")) return; ViewModel.RevertIsEnabled = false; Mouse.OverrideCursor = Cursors.Wait; @@ -225,7 +214,7 @@ namespace Elwig.Windows { await PaymentVariantService.Revert(v.Year, v.AvNr); App.HintContextChange(); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException(exc); } Mouse.OverrideCursor = null; ViewModel.CommitIsEnabled = true; @@ -235,7 +224,7 @@ namespace Elwig.Windows { if (PaymentVariantList.SelectedItem is not PaymentVar v) { return; } else if (v.TransferDate == null) { - MessageBox.Show("Überweisungsdatum muss gesetzt sein!", "Exportieren nicht möglich", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowError("Exportieren nicht möglich", "Überweisungsdatum muss gesetzt sein!"); return; } await PaymentVariantService.GenerateEbics(v.Year, v.AvNr); @@ -256,9 +245,7 @@ namespace Elwig.Windows { App.HintContextChange(); } catch (Exception exc) { await ForceContextReload(); - 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, "Auszahlungsvariante aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowDbException("Auszahlungsvariante aktualisieren", exc); } Mouse.OverrideCursor = null; await EnsureContextRenewed(); diff --git a/Elwig/Windows/QueryWindow.xaml.cs b/Elwig/Windows/QueryWindow.xaml.cs index 54f0ec9..dd3323d 100644 --- a/Elwig/Windows/QueryWindow.xaml.cs +++ b/Elwig/Windows/QueryWindow.xaml.cs @@ -1,6 +1,6 @@ using Elwig.Helpers; using Elwig.Helpers.Export; -using Microsoft.Win32; +using Elwig.Services; using System; using System.Collections.Generic; using System.Data.Common; @@ -42,9 +42,9 @@ namespace Elwig.Windows { Mouse.OverrideCursor = Cursors.Wait; await DisplayQuery(QueryInput.Text); Mouse.OverrideCursor = null; - } catch (Exception e) { + } catch (Exception exc) { Mouse.OverrideCursor = null; - MessageBox.Show(e.Message, "Fehler beim Ausführen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Fehler beim Ausführen", exc); } } @@ -85,21 +85,16 @@ namespace Elwig.Windows { } private static async Task SaveQuery(string sqlQuery) { - var d = new SaveFileDialog() { - FileName = $"Abfrage.csv", - DefaultExt = "csv", - Filter = "CSV-Datei (*.csv)|*.csv", - Title = $"Datenbank Abfrage speichern unter - Elwig" - }; - if (d.ShowDialog() == true) { + var filename = InteractionService.SaveFile("Datenbank Abfrage", "Abfrage", "csv"); + if (filename != null) { Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { try { var (header, rows) = await ExecuteQuery(sqlQuery); - using var csv = new CsvSimple(d.FileName, ';', Utils.UTF8BOM); + using var csv = new CsvSimple(filename, ';', Utils.UTF8BOM); await csv.ExportAsync(rows.Prepend([.. header.Select(h => h.ColumnName)])); } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler beim Ausführen", MessageBoxButton.OK, MessageBoxImage.Error); + InteractionService.ShowException("Fehler beim Ausführen", exc); } }); Mouse.OverrideCursor = null;