using Elwig.Helpers; using Elwig.Helpers.Billing; using Elwig.Helpers.Export; using Elwig.Models.Dtos; using Microsoft.Win32; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; namespace Elwig.Windows { public partial class MainWindow : ContextWindow { public MainWindow() { InitializeComponent(); var v = Assembly.GetExecutingAssembly().GetName().Version; VersionField.Text = "Version: " + (v == null ? "?" : $"{v.Major}.{v.Minor}.{v.Build}") + $" – {App.BranchName}"; if (App.Client.Client == null) VersionField.Text += " (Unbekannt)"; Menu_Help_Update.IsEnabled = App.Config.UpdateUrl != null; Menu_Help_Smtp.IsEnabled = App.Config.Smtp != null; Menu_Database_Sync.IsEnabled = App.Config.SyncUrl != null; } private void Window_Loaded(object sender, RoutedEventArgs evt) { SeasonInput.Value = Utils.CurrentLastSeason; } private void Window_Closing(object sender, CancelEventArgs evt) { if (App.NumWindows > 1 && !App.ForceShutdown) { 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) { evt.Cancel = true; } else { Application.Current.Shutdown(); } } } private async void Menu_Help_Update_Click(object sender, RoutedEventArgs evt) { await App.CheckForUpdates(true); } private async void Menu_Help_Smtp_Click(object sender, RoutedEventArgs evt) { Mouse.OverrideCursor = Cursors.AppStarting; try { using var client = await Utils.GetSmtpClient(); await client!.DisconnectAsync(true); MessageBox.Show("E-Mail-Einstellungen erfolgreich überprüft!", "Erfolg", MessageBoxButton.OK, MessageBoxImage.Information); } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } Mouse.OverrideCursor = null; } private void Menu_Help_Config_Click(object sender, RoutedEventArgs evt) { Process.Start("explorer.exe", App.DataPath); } private void Menu_Database_Query_Click(object sender, RoutedEventArgs evt) { var w = new QueryWindow(); w.Show(); } private void Menu_Database_Open_Click(object sender, RoutedEventArgs evt) { if (Path.GetDirectoryName(App.Config.DatabaseFile) is string path) Process.Start("explorer.exe", path); } private void Menu_Database_Export_Click(object sender, RoutedEventArgs evt) { // TODO Menu_Database_Export_Click } private void Menu_Database_Import_Click(object sender, RoutedEventArgs evt) { // TODO Menu_Database_Import_Click } private async void Menu_Database_Sync_Click(object sender, RoutedEventArgs evt) { if (App.Config.SyncUrl == null) return; Mouse.OverrideCursor = Cursors.AppStarting; try { var data = await Utils.GetExportMetaData(App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword); var files = data .Select(f => new { Name = f!["name"]!.AsValue().GetValue(), Timestamp = f!["timestamp"] != null && DateTime.TryParseExact(f!["timestamp"]!.AsValue().GetValue(), "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt) ? dt : (DateTime?)null, ZwstId = f!["zwstid"]?.AsValue().GetValue(), DeliveryNum = f!["meta"]?["deliveries"]?["count"]!.AsValue().GetValue(), DeliveryPartNum = f!["meta"]?["deliveries"]?["parts"]!.AsValue().GetValue(), Filters = f!["meta"]?["deliveries"]?["filters"]!.AsArray().Select(i => i!.AsValue().GetValue()).ToArray(), Device = f!["meta"]?["device"]!.AsValue().GetValue(), Url = f!["url"]!.AsValue().GetValue(), Size = f!["size"]!.AsValue().GetValue(), }) .Where(f => f.DeliveryNum > 0 && f.Timestamp >= new DateTime(Utils.CurrentLastSeason, 7, 1)) .ToList(); var imported = await ElwigData.GetImportedFiles(); var import = files .Where(f => f.Filters != null && f.Filters.Length > 0 && f.Device != Environment.MachineName && !imported.Contains(f.Name)) .ToList(); var paths = new List(); using (var client = Utils.GetHttpClient(App.Config.SyncUsername, App.Config.SyncPassword)) { foreach (var f in import) { var filename = Path.Combine(App.TempPath, f.Name); using var stream = new FileStream(filename, FileMode.Create); await client.DownloadAsync(f.Url, stream); paths.Add(filename); } } await ElwigData.Import(paths, false); } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } Mouse.OverrideCursor = null; } private void MemberAdminButton_Click(object sender, RoutedEventArgs evt) { var w = new MemberAdminWindow(); w.Show(); } private void ReceiptButton_Click(object sender, RoutedEventArgs evt) { App.FocusReceipt(); } private void DeliveryAdminButton_Click(object sender, RoutedEventArgs evt) { var w = new DeliveryAdminWindow(); w.Show(); } private void BaseDataButton_Click(object sender, RoutedEventArgs evt) { App.FocusBaseData(); } private void MailButton_Click(object sender, RoutedEventArgs evt) { App.FocusMailWindow(); } protected override Task OnRenewContext(AppDbContext ctx) { SeasonInput_ValueChanged(null, null); return Task.CompletedTask; } private void SeasonFinish_Expanded(object sender, RoutedEventArgs evt) { Height = 530; } private void SeasonFinish_Collapsed(object sender, RoutedEventArgs evt) { Height = 390; } private async void SeasonInput_ValueChanged(object? sender, RoutedEventArgs? evt) { using var ctx = new AppDbContext(); var s0 = await ctx.Seasons.FindAsync(SeasonInput.Value); var valid = (s0 != null); DeliveryConfirmationButton.IsEnabled = valid; OverUnderDeliveryButton.IsEnabled = valid; AutoBusinessSharesButton.IsEnabled = valid && false; PaymentButton.IsEnabled = valid; } private void DeliveryConfirmationButton_Click(object sender, RoutedEventArgs evt) { if (SeasonInput.Value is not int year) return; var w = App.FocusMailWindow(year); w.AddDeliveryConfirmation(); } 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) return; Mouse.OverrideCursor = Cursors.AppStarting; try { var b = new Billing(year); await b.FinishSeason(); await b.CalculateBuckets(); await App.HintContextChange(); using var ctx = new AppDbContext(); var tbl1 = await OverUnderDeliveryData.ForSeason(ctx.OverUnderDeliveryRows, year); var tbl2 = await AreaComUnderDeliveryData.ForSeason(ctx.AreaComUnderDeliveryRows, year); var tbl3 = await MemberDeliveryPerVariantData.ForSeason(ctx.MemberDeliveryPerVariantRows, year); using var ods = new OdsFile(d.FileName); await ods.AddTable(tbl1); await ods.AddTable(tbl2); await ods.AddTable(tbl3); } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); } Mouse.OverrideCursor = null; } private async void AutoBusinessSharesButton_Click(object sender, RoutedEventArgs evt) { if (SeasonInput.Value is not int year) return; if (false && App.Client.IsMatzen) { AutoBusinessSharesButton.IsEnabled = false; Mouse.OverrideCursor = Cursors.AppStarting; var b = new Billing(year); await b.AutoAdjustBusinessShare(); Mouse.OverrideCursor = null; AutoBusinessSharesButton.IsEnabled = true; } else { MessageBox.Show( "Es ist kein automatisches Nachzeichnen der Geschäftsanteile\n" + "für diese Genossenschaft eingestellt!\n" + "Bitte wenden Sie sich an die Programmierer!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Information); } } private void PaymentButton_Click(object sender, RoutedEventArgs evt) { if (SeasonInput.Value is not int year) return; App.FocusPaymentVariants(year); } } }