[#3] Elwig: Add user-friendly sync method
This commit is contained in:
Elwig
@ -129,10 +129,10 @@
|
||||
<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 x:Name="Menu_Export_ExportSeason" Header="...von Saison/Zweigstelle speichern..."
|
||||
Click="Menu_Export_ExportSeason_Click"/>
|
||||
<MenuItem x:Name="Menu_Export_UploadSeason" Header="...von Saison/Zweigstelle hochladen"
|
||||
Click="Menu_Export_UploadSeason_Click"/>
|
||||
</MenuItem>
|
||||
<MenuItem Header="Einstellungen">
|
||||
<MenuItem x:Name="Menu_Settings_EnableFreeEditing" Header="Freie Bearbeitung aktivieren"
|
||||
|
@ -29,7 +29,6 @@ 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)]);
|
||||
|
||||
@ -43,7 +42,6 @@ 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 = [
|
||||
@ -113,7 +111,7 @@ namespace Elwig.Windows {
|
||||
}
|
||||
|
||||
Menu_Export_UploadFilters.IsEnabled = App.Config.SyncUrl != null;
|
||||
Menu_Export_UploadToday.IsEnabled = App.Config.SyncUrl != null;
|
||||
Menu_Export_UploadSeason.IsEnabled = App.Config.SyncUrl != null;
|
||||
}
|
||||
|
||||
public DeliveryAdminWindow(int mgnr) : this() {
|
||||
@ -180,7 +178,7 @@ namespace Elwig.Windows {
|
||||
private async void Menu_DeliveryJournal_SaveToday_Click(object sender, RoutedEventArgs evt) { await ViewModel.GenerateDeliveryJournal(1, ExportMode.SaveList); }
|
||||
private async void Menu_DeliveryJournal_SavePdfToday_Click(object sender, RoutedEventArgs evt) { await ViewModel.GenerateDeliveryJournal(1, ExportMode.SavePdf); }
|
||||
private async void Menu_DeliveryJournal_ShowToday_Click(object sender, RoutedEventArgs evt) { await ViewModel.GenerateDeliveryJournal(1, ExportMode.Show); }
|
||||
private async void Menu_Export_ExportToday_Click(object sender, RoutedEventArgs evt) { await ViewModel.GenerateDeliveryJournal(1, ExportMode.Export); }
|
||||
private async void Menu_Export_ExportSeason_Click(object sender, RoutedEventArgs evt) { await ViewModel.GenerateDeliveryJournal(2, ExportMode.Export); }
|
||||
private async void Menu_DeliveryJournal_PrintToday_Click(object sender, RoutedEventArgs evt) { await ViewModel.GenerateDeliveryJournal(1, ExportMode.Print); }
|
||||
private async void Menu_DeliveryJournal_SaveFilters_Click(object sender, RoutedEventArgs evt) { await ViewModel.GenerateDeliveryJournal(0, ExportMode.SaveList); }
|
||||
private async void Menu_DeliveryJournal_SavePdfFilters_Click(object sender, RoutedEventArgs evt) { await ViewModel.GenerateDeliveryJournal(0, ExportMode.SavePdf); }
|
||||
@ -188,9 +186,9 @@ namespace Elwig.Windows {
|
||||
private async void Menu_DeliveryJournal_PrintFilters_Click(object sender, RoutedEventArgs evt) { await ViewModel.GenerateDeliveryJournal(0, ExportMode.Print); }
|
||||
private async void Menu_Export_ExportFilters_Click(object sender, RoutedEventArgs evt) { await ViewModel.GenerateDeliveryJournal(0, ExportMode.Export); }
|
||||
|
||||
private async void Menu_Export_UploadToday_Click(object sender, RoutedEventArgs evt) {
|
||||
private async void Menu_Export_UploadSeason_Click(object sender, RoutedEventArgs evt) {
|
||||
if (App.Config.SyncUrl == null) return;
|
||||
await ViewModel.GenerateDeliveryJournal(1, ExportMode.Upload);
|
||||
await ViewModel.GenerateDeliveryJournal(2, ExportMode.Upload);
|
||||
}
|
||||
|
||||
private async void Menu_Export_UploadFilters_Click(object sender, RoutedEventArgs evt) {
|
||||
|
@ -21,7 +21,6 @@
|
||||
<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"/>
|
||||
@ -30,7 +29,9 @@
|
||||
<MenuItem Header="Über"/>
|
||||
<MenuItem x:Name="Menu_Help_Update" Header="Nach Updates suchen" Click="Menu_Help_Update_Click"/>
|
||||
<MenuItem x:Name="Menu_Help_Smtp" Header="E-Mail-Einstellungen testen" Click="Menu_Help_Smtp_Click"/>
|
||||
<MenuItem x:Name="Menu_Help_Config" Header="Konfigurationsspeicherort öffnen..." Click="Menu_Help_Config_Click"/>
|
||||
<Separator/>
|
||||
<MenuItem x:Name="Menu_Help_Config" Header="Konfigurationsdatei öffnen..." Click="Menu_Help_Config_Click"/>
|
||||
<MenuItem x:Name="Menu_Help_Directory" Header="Konfigurationsspeicherort öffnen..." Click="Menu_Help_Directory_Click"/>
|
||||
</MenuItem>
|
||||
</Menu>
|
||||
|
||||
@ -66,6 +67,15 @@
|
||||
<Button x:Name="RegistrationButton" Content="Anmeldungen" IsEnabled="False"
|
||||
Margin="205,250,0,0"/>
|
||||
|
||||
<Button x:Name="DownloadButton" Click="DownloadButton_Click"
|
||||
Margin="310,135,0,0" Padding="1.5,0,0,0" Height="30" Width="30"
|
||||
Content="" FontFamily="Segoe MDL2 Assets" FontSize="16"
|
||||
ToolTip="Lieferungen und Mitgliederdaten anderer Zweigstellen herunterladen"/>
|
||||
<Button x:Name="UploadButton" Click="UploadButton_Click"
|
||||
Margin="375,135,0,0" Padding="1.5,0,0,0" Height="30" Width="30"
|
||||
Content="" FontFamily="Segoe MDL2 Assets" FontSize="16"
|
||||
ToolTip="Lieferungen dieser Zweigstelle hochladen"/>
|
||||
|
||||
<Expander x:Name="SeasonFinish" Header="Leseabschluss" SnapsToDevicePixels="True"
|
||||
Expanded="SeasonFinish_Expanded" Collapsed="SeasonFinish_Collapsed"
|
||||
HorizontalAlignment="Center" Width="407" Margin="0,290,0,0" VerticalAlignment="Top">
|
||||
|
@ -11,6 +11,7 @@ using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows;
|
||||
@ -27,7 +28,8 @@ namespace Elwig.Windows {
|
||||
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;
|
||||
DownloadButton.Visibility = App.Config.SyncUrl != null ? Visibility.Visible : Visibility.Hidden;
|
||||
UploadButton.Visibility = App.Config.SyncUrl != null ? Visibility.Visible : Visibility.Hidden;
|
||||
}
|
||||
|
||||
private void Window_Loaded(object sender, RoutedEventArgs evt) {
|
||||
@ -62,8 +64,21 @@ namespace Elwig.Windows {
|
||||
Mouse.OverrideCursor = null;
|
||||
}
|
||||
|
||||
private void Menu_Help_Directory_Click(object sender, RoutedEventArgs evt) {
|
||||
try {
|
||||
Process.Start("explorer.exe", App.DataPath);
|
||||
} catch { }
|
||||
}
|
||||
|
||||
private void Menu_Help_Config_Click(object sender, RoutedEventArgs evt) {
|
||||
Process.Start("explorer.exe", App.DataPath);
|
||||
try {
|
||||
Process.Start(new ProcessStartInfo {
|
||||
FileName = "notepad.exe",
|
||||
Arguments = App.ConfigPath,
|
||||
Verb = "runas",
|
||||
UseShellExecute = true,
|
||||
});
|
||||
} catch { }
|
||||
}
|
||||
|
||||
private void Menu_Database_Query_Click(object sender, RoutedEventArgs evt) {
|
||||
@ -84,7 +99,7 @@ namespace Elwig.Windows {
|
||||
// TODO Menu_Database_Import_Click
|
||||
}
|
||||
|
||||
private async void Menu_Database_Sync_Click(object sender, RoutedEventArgs evt) {
|
||||
private async void DownloadButton_Click(object sender, RoutedEventArgs evt) {
|
||||
if (App.Config.SyncUrl == null)
|
||||
return;
|
||||
Mouse.OverrideCursor = Cursors.AppStarting;
|
||||
@ -94,20 +109,17 @@ namespace Elwig.Windows {
|
||||
.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(),
|
||||
ZwstId = f!["meta"]?["zwstid"]?.AsValue().GetValue<string>() ?? f!["zwstid"]?.AsValue().GetValue<string>(),
|
||||
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))
|
||||
.Where(f => 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))
|
||||
.Where(f => 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)) {
|
||||
@ -118,13 +130,48 @@ namespace Elwig.Windows {
|
||||
paths.Add(filename);
|
||||
}
|
||||
}
|
||||
await ElwigData.Import(paths, false);
|
||||
await ElwigData.Import(paths, ElwigData.ImportMode.FromBranches);
|
||||
} catch (HttpRequestException exc) {
|
||||
MessageBox.Show(exc.Message + "\n\nEventuell Internetverbindung prüfen!", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
} catch (Exception exc) {
|
||||
MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
}
|
||||
Mouse.OverrideCursor = null;
|
||||
}
|
||||
|
||||
private async void UploadButton_Click(object sender, RoutedEventArgs evt) {
|
||||
if (App.Config.SyncUrl == null)
|
||||
return;
|
||||
Mouse.OverrideCursor = Cursors.AppStarting;
|
||||
try {
|
||||
var path = Path.Combine(App.TempPath, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.zip");
|
||||
using var ctx = new AppDbContext();
|
||||
var deliveries = await ctx.Deliveries
|
||||
.Where(d => d.Year == Utils.CurrentLastSeason && d.ZwstId == App.ZwstId)
|
||||
.Include(d => d.Parts)
|
||||
.ThenInclude(p => p.PartModifiers)
|
||||
.OrderBy(d => d.DateString)
|
||||
.ThenBy(d => d.TimeString)
|
||||
.ThenBy(d => d.LsNr)
|
||||
.AsSplitQuery()
|
||||
.ToListAsync();
|
||||
if (deliveries.Count == 0) {
|
||||
MessageBox.Show("Es gibt keine Lieferungen, die hochgeladen werden können!", "Lieferungen hochladen",
|
||||
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
} else {
|
||||
await ElwigData.Export(path, deliveries, [$"{Utils.CurrentLastSeason}", $"Zweigstelle {App.BranchName}"]);
|
||||
await Utils.UploadExportData(path, App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword);
|
||||
MessageBox.Show($"Hochladen von {deliveries.Count} Lieferungen erfolgreich!", "Lieferungen hochladen",
|
||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||
}
|
||||
} catch (HttpRequestException exc) {
|
||||
MessageBox.Show(exc.Message + "\n\nEventuell Internetverbindung prüfen!", "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||
} catch (Exception exc) {
|
||||
MessageBox.Show(exc.Message, "Lieferungen hochladen", 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