[#3] Elwig: Add feature to sync deliveries
This commit is contained in:
@ -110,6 +110,17 @@
|
||||
<MenuItem Header="BKI">
|
||||
<MenuItem x:Name="Menu_Bki_SaveList" Header="Traubentransportscheinliste speichern..."/>
|
||||
</MenuItem>
|
||||
<MenuItem Header="Export">
|
||||
<MenuItem x:Name="Menu_Export_ExportFilters" Header="...aus Filtern speichern..."
|
||||
Click="Menu_Export_ExportFilters_Click"/>
|
||||
<MenuItem x:Name="Menu_Export_UploadFilters" Header="...aus Filtern hochladen"
|
||||
Click="Menu_Export_UploadFilters_Click"/>
|
||||
<Separator/>
|
||||
<MenuItem x:Name="Menu_Export_ExportToday" Header="...von heute speichern..."
|
||||
Click="Menu_Export_ExportToday_Click"/>
|
||||
<MenuItem x:Name="Menu_Export_UploadToday" Header="...von heute hochladen"
|
||||
Click="Menu_Export_UploadToday_Click" InputGestureText="Strg+H"/>
|
||||
</MenuItem>
|
||||
<MenuItem Header="Einstellungen">
|
||||
<MenuItem x:Name="Menu_Settings_EnableFreeEditing" Header="Freie Bearbeitung aktivieren"
|
||||
IsCheckable="True" Checked="Menu_Settings_EnableFreeEditing_Checked" Unchecked="Menu_Settings_EnableFreeEditing_Unchecked"/>
|
||||
|
@ -11,6 +11,7 @@ using Microsoft.Win32;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Threading.Tasks;
|
||||
@ -37,6 +38,7 @@ namespace Elwig.Windows {
|
||||
private readonly RoutedCommand CtrlO = new("CtrlO", typeof(DeliveryAdminWindow), [new KeyGesture(Key.O, ModifierKeys.Control)]);
|
||||
private readonly RoutedCommand CtrlJ = new("CtrlJ", typeof(DeliveryAdminWindow), [new KeyGesture(Key.J, ModifierKeys.Control)]);
|
||||
private readonly RoutedCommand CtrlQ = new("CtrlQ", typeof(DeliveryAdminWindow), [new KeyGesture(Key.Q, ModifierKeys.Control)]);
|
||||
private readonly RoutedCommand CtrlH = new("CtrlH", typeof(DeliveryAdminWindow), [new KeyGesture(Key.H, ModifierKeys.Control)]);
|
||||
private readonly RoutedCommand CtrlShiftP = new("CtrlShiftP", typeof(DeliveryAdminWindow), [new KeyGesture(Key.P, ModifierKeys.Control | ModifierKeys.Shift)]);
|
||||
private readonly RoutedCommand CtrlShiftO = new("CtrlShiftO", typeof(DeliveryAdminWindow), [new KeyGesture(Key.O, ModifierKeys.Control | ModifierKeys.Shift)]);
|
||||
|
||||
@ -54,6 +56,7 @@ namespace Elwig.Windows {
|
||||
CommandBindings.Add(new CommandBinding(CtrlO, Menu_DeliveryJournal_ShowFilters_Click));
|
||||
CommandBindings.Add(new CommandBinding(CtrlJ, Menu_DeliveryJournal_PrintToday_Click));
|
||||
CommandBindings.Add(new CommandBinding(CtrlQ, Menu_WineQualityStatistics_PrintToday_Click));
|
||||
CommandBindings.Add(new CommandBinding(CtrlH, Menu_Export_UploadToday_Click));
|
||||
CommandBindings.Add(new CommandBinding(CtrlShiftP, Menu_DeliveryNote_Print_Click));
|
||||
CommandBindings.Add(new CommandBinding(CtrlShiftO, Menu_DeliveryJournal_PrintFilters_Click));
|
||||
RequiredInputs = [
|
||||
@ -121,6 +124,9 @@ namespace Elwig.Windows {
|
||||
case 3: Menu_WineQualityStatistics_ModeKmw5.IsChecked = true; break;
|
||||
case 4: Menu_WineQualityStatistics_ModeKmw10.IsChecked = true; break;
|
||||
}
|
||||
|
||||
Menu_Export_UploadFilters.IsEnabled = App.Config.SyncUrl != null;
|
||||
Menu_Export_UploadToday.IsEnabled = App.Config.SyncUrl != null;
|
||||
}
|
||||
|
||||
public DeliveryAdminWindow(int mgnr) : this() {
|
||||
@ -222,6 +228,15 @@ namespace Elwig.Windows {
|
||||
await GenerateDeliveryJournal(1, ExportMode.Show);
|
||||
}
|
||||
|
||||
private async void Menu_Export_ExportToday_Click(object sender, RoutedEventArgs evt) {
|
||||
await GenerateDeliveryJournal(1, ExportMode.Export);
|
||||
}
|
||||
|
||||
private async void Menu_Export_UploadToday_Click(object sender, RoutedEventArgs evt) {
|
||||
if (App.Config.SyncUrl == null) return;
|
||||
await GenerateDeliveryJournal(1, ExportMode.Upload);
|
||||
}
|
||||
|
||||
private async void Menu_DeliveryJournal_PrintToday_Click(object sender, RoutedEventArgs evt) {
|
||||
await GenerateDeliveryJournal(1, ExportMode.Print);
|
||||
}
|
||||
@ -242,6 +257,15 @@ namespace Elwig.Windows {
|
||||
await GenerateDeliveryJournal(0, ExportMode.Print);
|
||||
}
|
||||
|
||||
private async void Menu_Export_ExportFilters_Click(object sender, RoutedEventArgs evt) {
|
||||
await GenerateDeliveryJournal(0, ExportMode.Export);
|
||||
}
|
||||
|
||||
private async void Menu_Export_UploadFilters_Click(object sender, RoutedEventArgs evt) {
|
||||
if (App.Config.SyncUrl == null) return;
|
||||
await GenerateDeliveryJournal(0, ExportMode.Upload);
|
||||
}
|
||||
|
||||
private async Task GenerateDeliveryJournal(int modeWho, ExportMode exportMode) {
|
||||
using var ctx = new AppDbContext();
|
||||
IQueryable<DeliveryPart> query;
|
||||
@ -256,6 +280,10 @@ namespace Elwig.Windows {
|
||||
.Where(p => p.Delivery.DateString == date);
|
||||
filterNames.Add($"{Utils.Today:dd.MM.yyyy}");
|
||||
}
|
||||
if (exportMode == ExportMode.Upload && !filterNames.Contains($"Zweigstelle {App.BranchName}")) {
|
||||
query = query.Where(p => p.Delivery.ZwstId == App.ZwstId);
|
||||
filterNames.Add($"Zweigstelle {App.BranchName}");
|
||||
}
|
||||
|
||||
query = query
|
||||
.OrderBy(p => p.Delivery.DateString)
|
||||
@ -281,6 +309,41 @@ namespace Elwig.Windows {
|
||||
}
|
||||
Mouse.OverrideCursor = null;
|
||||
}
|
||||
} else if (exportMode == ExportMode.Export) {
|
||||
var d = new SaveFileDialog() {
|
||||
FileName = $"Lieferungen.zip",
|
||||
DefaultExt = "zip",
|
||||
Filter = "ZIP-Datei (*.zip)|*.zip",
|
||||
Title = $"{DeliveryJournal.Name} speichern unter - Elwig"
|
||||
};
|
||||
if (d.ShowDialog() == true) {
|
||||
Mouse.OverrideCursor = Cursors.AppStarting;
|
||||
try {
|
||||
await ElwigData.ExportDeliveries(d.FileName, await query.Select(p => p.Delivery).Distinct().ToListAsync(), filterNames);
|
||||
} catch (Exception exc) {
|
||||
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
Mouse.OverrideCursor = null;
|
||||
}
|
||||
} else if (exportMode == ExportMode.Upload && App.Config.SyncUrl != null) {
|
||||
Mouse.OverrideCursor = Cursors.AppStarting;
|
||||
try {
|
||||
var filename = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.zip";
|
||||
var path = Path.Combine(App.TempPath, filename);
|
||||
var list = await query.Select(p => p.Delivery).Distinct().ToListAsync();
|
||||
if (list.Count == 0) {
|
||||
MessageBox.Show("Es wurden keine Lieferungen zum Hochladen ausgewählt!", "Fehler",
|
||||
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
} else {
|
||||
await ElwigData.ExportDeliveries(path, list, filterNames);
|
||||
await Utils.UploadExportData(path, App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword);
|
||||
MessageBox.Show($"Lieferungen erfolgreich hochgeladen!", "Lieferungen hochgeladen",
|
||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
}
|
||||
} catch (Exception exc) {
|
||||
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
Mouse.OverrideCursor = null;
|
||||
} else {
|
||||
Mouse.OverrideCursor = Cursors.AppStarting;
|
||||
try {
|
||||
|
@ -19,6 +19,10 @@
|
||||
<Grid>
|
||||
<Menu BorderThickness="0,0,0,1" VerticalAlignment="Top" Height="19" BorderBrush="LightGray" Background="White">
|
||||
<MenuItem Header="Datenbank">
|
||||
<MenuItem Header="Daten exportieren..." Click="Menu_Database_Export_Click"/>
|
||||
<MenuItem Header="Daten importieren..." Click="Menu_Database_Import_Click"/>
|
||||
<MenuItem x:Name="Menu_Database_Sync" Header="Daten synchronisieren" Click="Menu_Database_Sync_Click"/>
|
||||
<Separator/>
|
||||
<MenuItem Header="Abfragen stellen" Click="Menu_Database_Query_Click"/>
|
||||
<MenuItem Header="Speicherort öffnen..." Click="Menu_Database_Open_Click"/>
|
||||
</MenuItem>
|
||||
|
@ -4,9 +4,12 @@ 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;
|
||||
@ -20,8 +23,9 @@ namespace Elwig.Windows {
|
||||
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)";
|
||||
if (App.Config.UpdateUrl == null) Menu_Help_Update.IsEnabled = false;
|
||||
if (App.Config.Smtp == null) Menu_Help_Smtp.IsEnabled = false;
|
||||
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) {
|
||||
@ -70,6 +74,55 @@ namespace Elwig.Windows {
|
||||
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();
|
||||
|
Reference in New Issue
Block a user