239 lines
10 KiB
C#
239 lines
10 KiB
C#
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<string>(),
|
||
Timestamp = f!["timestamp"] != null && DateTime.TryParseExact(f!["timestamp"]!.AsValue().GetValue<string>(), "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None, out var dt) ? dt : (DateTime?)null,
|
||
ZwstId = f!["zwstid"]?.AsValue().GetValue<string>(),
|
||
DeliveryNum = f!["meta"]?["deliveries"]?["count"]!.AsValue().GetValue<int>(),
|
||
DeliveryPartNum = f!["meta"]?["deliveries"]?["parts"]!.AsValue().GetValue<int>(),
|
||
Filters = f!["meta"]?["deliveries"]?["filters"]!.AsArray().Select(i => i!.AsValue().GetValue<string>()).ToArray(),
|
||
Device = f!["meta"]?["device"]!.AsValue().GetValue<string>(),
|
||
Url = f!["url"]!.AsValue().GetValue<string>(),
|
||
Size = f!["size"]!.AsValue().GetValue<long>(),
|
||
})
|
||
.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<string>();
|
||
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);
|
||
}
|
||
}
|
||
}
|