MainWindow: Merge both sync buttons into a single one
All checks were successful
Test / Run tests (push) Successful in 2m32s
All checks were successful
Test / Run tests (push) Successful in 2m32s
This commit is contained in:
@@ -7,6 +7,7 @@ using System.Collections.Generic;
|
|||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Linq.Expressions;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
@@ -14,6 +15,9 @@ using System.Windows;
|
|||||||
namespace Elwig.Services {
|
namespace Elwig.Services {
|
||||||
public static class SyncService {
|
public static class SyncService {
|
||||||
|
|
||||||
|
public static readonly Expression<Func<Member, bool>> ChangedMembers = (m) => ((m.XTime == null && m.MTime > 1751328000) || m.MTime > m.XTime) && (m.ITime == null || m.MTime > m.ITime);
|
||||||
|
public static readonly Expression<Func<Delivery, bool>> ChangedDeliveries = (d) => ((d.XTime == null && d.MTime > 1751328000) || d.MTime > d.XTime) && (d.ITime == null || d.MTime > d.ITime);
|
||||||
|
|
||||||
public static async Task Upload(string url, string username, string password, IQueryable<Member> query, IEnumerable<string> filterNames) {
|
public static async Task Upload(string url, string username, string password, IQueryable<Member> query, IEnumerable<string> filterNames) {
|
||||||
try {
|
try {
|
||||||
var filename = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip";
|
var filename = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip";
|
||||||
@@ -43,8 +47,10 @@ namespace Elwig.Services {
|
|||||||
MessageBox.Show("Es wurden keine Mitglieder zum Hochladen ausgewählt!", "Mitglieder hochladen",
|
MessageBox.Show("Es wurden keine Mitglieder zum Hochladen ausgewählt!", "Mitglieder hochladen",
|
||||||
MessageBoxButton.OK, MessageBoxImage.Error);
|
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
} else {
|
} else {
|
||||||
|
var exportedAt = DateTime.Now;
|
||||||
await ElwigData.Export(path, members, areaComs, wbKgs, filterNames);
|
await ElwigData.Export(path, members, areaComs, wbKgs, filterNames);
|
||||||
await Utils.UploadExportData(path, url, username, password);
|
await Utils.UploadExportData(path, url, username, password);
|
||||||
|
await UpdateExportedAt(members, [], exportedAt);
|
||||||
MessageBox.Show($"Hochladen von {members.Count:N0} Mitgliedern erfolgreich!", "Mitglieder hochgeladen",
|
MessageBox.Show($"Hochladen von {members.Count:N0} Mitgliedern erfolgreich!", "Mitglieder hochgeladen",
|
||||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
}
|
}
|
||||||
@@ -64,7 +70,7 @@ namespace Elwig.Services {
|
|||||||
var list = await query
|
var list = await query
|
||||||
.Select(p => p.Delivery)
|
.Select(p => p.Delivery)
|
||||||
.Distinct()
|
.Distinct()
|
||||||
.Include(d => d.Parts).ThenInclude(p => p.PartModifiers)
|
.Include(d => d.Parts).ThenInclude(p => p.PartModifiers).ThenInclude(m => m.Modifier)
|
||||||
.Include(d => d.Parts).ThenInclude(p => p.Rd)
|
.Include(d => d.Parts).ThenInclude(p => p.Rd)
|
||||||
.Include(d => d.Parts).ThenInclude(p => p.Kg!.Gl)
|
.Include(d => d.Parts).ThenInclude(p => p.Kg!.Gl)
|
||||||
.AsSplitQuery()
|
.AsSplitQuery()
|
||||||
@@ -80,8 +86,10 @@ namespace Elwig.Services {
|
|||||||
MessageBox.Show("Es wurden keine Lieferungen zum Hochladen ausgewählt!", "Lieferungen hochladen",
|
MessageBox.Show("Es wurden keine Lieferungen zum Hochladen ausgewählt!", "Lieferungen hochladen",
|
||||||
MessageBoxButton.OK, MessageBoxImage.Error);
|
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
} else {
|
} else {
|
||||||
|
var exportedAt = DateTime.Now;
|
||||||
await ElwigData.Export(path, list, wbKgs, filterNames);
|
await ElwigData.Export(path, list, wbKgs, filterNames);
|
||||||
await Utils.UploadExportData(path, url, username, password);
|
await Utils.UploadExportData(path, url, username, password);
|
||||||
|
await UpdateExportedAt([], list, exportedAt);
|
||||||
MessageBox.Show($"Hochladen von {list.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochgeladen",
|
MessageBox.Show($"Hochladen von {list.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochgeladen",
|
||||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
}
|
}
|
||||||
@@ -94,6 +102,73 @@ namespace Elwig.Services {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async Task UploadModified(string url, string username, string password) {
|
||||||
|
try {
|
||||||
|
var path = Path.Combine(App.TempPath, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip");
|
||||||
|
List<Member> members;
|
||||||
|
List<AreaCom> areaComs;
|
||||||
|
List<Delivery> deliveries;
|
||||||
|
using (var ctx = new AppDbContext()) {
|
||||||
|
members = await ctx.Members
|
||||||
|
.Where(ChangedMembers)
|
||||||
|
.Include(m => m.BillingAddress)
|
||||||
|
.Include(m => m.TelephoneNumbers)
|
||||||
|
.Include(m => m.EmailAddresses)
|
||||||
|
.Include(m => m.DefaultWbKg!.Gl)
|
||||||
|
.OrderBy(m => m.MgNr)
|
||||||
|
.AsSplitQuery()
|
||||||
|
.ToListAsync();
|
||||||
|
areaComs = await ctx.Members
|
||||||
|
.Where(ChangedMembers)
|
||||||
|
.SelectMany(m => m.AreaCommitments)
|
||||||
|
.Include(c => c.Rd)
|
||||||
|
.Include(c => c.Kg.Gl)
|
||||||
|
.OrderBy(c => c.MgNr).ThenBy(c => c.FbNr)
|
||||||
|
.ToListAsync();
|
||||||
|
deliveries = await ctx.Deliveries
|
||||||
|
.Where(ChangedDeliveries)
|
||||||
|
.Include(d => d.Parts).ThenInclude(p => p.PartModifiers).ThenInclude(m => m.Modifier)
|
||||||
|
.Include(d => d.Parts).ThenInclude(p => p.Rd)
|
||||||
|
.Include(d => d.Parts).ThenInclude(p => p.Kg).ThenInclude(k => k!.Gl)
|
||||||
|
.OrderBy(d => d.DateString).ThenBy(d => d.TimeString).ThenBy(d => d.LsNr)
|
||||||
|
.AsSplitQuery()
|
||||||
|
.ToListAsync();
|
||||||
|
}
|
||||||
|
var wbKgs = members
|
||||||
|
.Where(m => m.DefaultWbKg != null)
|
||||||
|
.Select(m => m.DefaultWbKg!)
|
||||||
|
.Union(areaComs.Select(c => c.Kg))
|
||||||
|
.Union(deliveries.SelectMany(d => d.Parts)
|
||||||
|
.Where(p => p.Kg != null)
|
||||||
|
.Select(p => p.Kg!))
|
||||||
|
.DistinctBy(k => k.KgNr)
|
||||||
|
.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);
|
||||||
|
} else {
|
||||||
|
var exportedAt = DateTime.Now;
|
||||||
|
await (new ElwigData.ElwigExport {
|
||||||
|
Members = (members, ["geändert seit letztem Export"]),
|
||||||
|
AreaComs = (areaComs, ["von exportierten Mitgliedern"]),
|
||||||
|
Deliveries = (deliveries, ["geändert seit letzem Export"]),
|
||||||
|
WbKgs = (wbKgs, ["von exportierten Mitgliedern, Flächenbindungen und Lieferungen"]),
|
||||||
|
}).Export(path);
|
||||||
|
await Utils.UploadExportData(path, url, username, password);
|
||||||
|
await UpdateExportedAt(members, deliveries, exportedAt);
|
||||||
|
MessageBox.Show($"Hochladen von {members.Count:N0} Mitgliedern und {deliveries.Count:N0} Lieferungen erfolgreich!", "Mitglieder und Lieferungen hochladen",
|
||||||
|
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
|
}
|
||||||
|
} catch (HttpRequestException exc) {
|
||||||
|
MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Mitglieder und Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
} catch (TaskCanceledException exc) {
|
||||||
|
MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Mitglieder und Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
} catch (Exception exc) {
|
||||||
|
MessageBox.Show(exc.Message, "Mitglieder und Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static async Task UploadBranchDeliveries(string url, string username, string password, int? year = null) {
|
public static async Task UploadBranchDeliveries(string url, string username, string password, int? year = null) {
|
||||||
try {
|
try {
|
||||||
year ??= Utils.CurrentLastSeason;
|
year ??= Utils.CurrentLastSeason;
|
||||||
@@ -101,7 +176,8 @@ namespace Elwig.Services {
|
|||||||
using var ctx = new AppDbContext();
|
using var ctx = new AppDbContext();
|
||||||
var deliveries = await ctx.Deliveries
|
var deliveries = await ctx.Deliveries
|
||||||
.Where(d => d.Year == year && d.ZwstId == App.ZwstId)
|
.Where(d => d.Year == year && d.ZwstId == App.ZwstId)
|
||||||
.Include(d => d.Parts).ThenInclude(p => p.PartModifiers)
|
.Include(d => d.Parts).ThenInclude(p => p.PartModifiers).ThenInclude(m => m.Modifier)
|
||||||
|
.Include(d => d.Parts).ThenInclude(p => p.Rd)
|
||||||
.Include(d => d.Parts).ThenInclude(p => p.Kg).ThenInclude(k => k!.Gl)
|
.Include(d => d.Parts).ThenInclude(p => p.Kg).ThenInclude(k => k!.Gl)
|
||||||
.OrderBy(d => d.DateString).ThenBy(d => d.TimeString).ThenBy(d => d.LsNr)
|
.OrderBy(d => d.DateString).ThenBy(d => d.TimeString).ThenBy(d => d.LsNr)
|
||||||
.AsSplitQuery()
|
.AsSplitQuery()
|
||||||
@@ -116,8 +192,10 @@ namespace Elwig.Services {
|
|||||||
MessageBox.Show("Es gibt keine Lieferungen, die hochgeladen werden können!", "Lieferungen hochladen",
|
MessageBox.Show("Es gibt keine Lieferungen, die hochgeladen werden können!", "Lieferungen hochladen",
|
||||||
MessageBoxButton.OK, MessageBoxImage.Error);
|
MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
} else {
|
} else {
|
||||||
|
var exportedAt = DateTime.Now;
|
||||||
await ElwigData.Export(path, deliveries, wbKgs, [$"{year}", $"Zweigstelle {App.BranchName}"]);
|
await ElwigData.Export(path, deliveries, wbKgs, [$"{year}", $"Zweigstelle {App.BranchName}"]);
|
||||||
await Utils.UploadExportData(path, url, username, password);
|
await Utils.UploadExportData(path, url, username, password);
|
||||||
|
await UpdateExportedAt([], deliveries, exportedAt);
|
||||||
MessageBox.Show($"Hochladen von {deliveries.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochladen",
|
MessageBox.Show($"Hochladen von {deliveries.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochladen",
|
||||||
MessageBoxButton.OK, MessageBoxImage.Information);
|
MessageBoxButton.OK, MessageBoxImage.Information);
|
||||||
}
|
}
|
||||||
@@ -130,25 +208,30 @@ namespace Elwig.Services {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static async Task<List<(string Name, string Url)>> GetFilesToImport(string url, string username, string password) {
|
||||||
|
var data = await Utils.GetExportMetaData(url, username, password);
|
||||||
|
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!["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.Timestamp >= new DateTime(Utils.CurrentLastSeason, 7, 1))
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
var imported = await ElwigData.GetImportedFiles();
|
||||||
|
return [.. files
|
||||||
|
.Where(f => f.Device != Environment.MachineName && !imported.Contains(f.Name))
|
||||||
|
.Select(f => (f.Name, f.Url))
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
public static async Task Download(string url, string username, string password) {
|
public static async Task Download(string url, string username, string password) {
|
||||||
try {
|
try {
|
||||||
var data = await Utils.GetExportMetaData(url, username, password);
|
var import = await GetFilesToImport(url, username, password);
|
||||||
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!["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.Timestamp >= new DateTime(Utils.CurrentLastSeason, 7, 1))
|
|
||||||
.ToList();
|
|
||||||
|
|
||||||
var imported = await ElwigData.GetImportedFiles();
|
|
||||||
var import = files
|
|
||||||
.Where(f => f.Device != Environment.MachineName && !imported.Contains(f.Name))
|
|
||||||
.ToList();
|
|
||||||
var paths = new List<string>();
|
var paths = new List<string>();
|
||||||
using (var client = Utils.GetHttpClient(username, password)) {
|
using (var client = Utils.GetHttpClient(username, password)) {
|
||||||
foreach (var f in import) {
|
foreach (var f in import) {
|
||||||
@@ -167,5 +250,28 @@ namespace Elwig.Services {
|
|||||||
MessageBox.Show(exc.Message, "Daten herunterladen", MessageBoxButton.OK, MessageBoxImage.Error);
|
MessageBox.Show(exc.Message, "Daten herunterladen", MessageBoxButton.OK, MessageBoxImage.Error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static async Task UpdateExportedAt(IEnumerable<Member> member, IEnumerable<Delivery> deliveries, DateTime dateTime) {
|
||||||
|
var timestamp = ((DateTimeOffset)dateTime.ToUniversalTime()).ToUnixTimeSeconds();
|
||||||
|
var mgnrs = string.Join(",", member.Select(m => $"{m.MgNr}").Append("0"));
|
||||||
|
var dids = string.Join(",", deliveries.Select(d => $"({d.Year},{d.DId})").Append("(0,0)"));
|
||||||
|
using (var cnx = await AppDbContext.ConnectAsync()) {
|
||||||
|
await cnx.ExecuteBatch($"""
|
||||||
|
BEGIN;
|
||||||
|
UPDATE client_parameter SET value = '0' WHERE param = 'ENABLE_TIME_TRIGGERS';
|
||||||
|
UPDATE member SET xtime = {timestamp} WHERE mgnr IN ({mgnrs});
|
||||||
|
UPDATE area_commitment SET xtime = {timestamp} WHERE mgnr IN ({mgnrs});
|
||||||
|
UPDATE delivery SET xtime = {timestamp} WHERE (year, did) IN ({dids});
|
||||||
|
UPDATE delivery_part SET xtime = {timestamp} WHERE (year, did) IN ({dids});
|
||||||
|
UPDATE client_parameter SET value = '1' WHERE param = 'ENABLE_TIME_TRIGGERS';
|
||||||
|
COMMIT;
|
||||||
|
""");
|
||||||
|
}
|
||||||
|
App.HintContextChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static async Task<bool> ChangesAvailable(AppDbContext ctx, string url, string username, string password) {
|
||||||
|
return await ctx.Members.AnyAsync(ChangedMembers) || await ctx.Deliveries.AnyAsync(ChangedDeliveries) || (Utils.HasInternetConnectivity() && (await GetFilesToImport(url, username, password)).Count > 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,6 +64,23 @@
|
|||||||
</MenuItem.Icon>
|
</MenuItem.Icon>
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
|
<MenuItem Header="Synchronisieren" x:Name="Menu_Sync" IsEnabled="false">
|
||||||
|
<MenuItem x:Name="Menu_Sync_Download" Header="Mitgliederdaten und Lieferungen herunterladen" Click="Menu_Sync_Download_Click">
|
||||||
|
<MenuItem.Icon>
|
||||||
|
<TextBlock FontFamily="Segoe MDL2 Assets" FontSize="16" Text=""/>
|
||||||
|
</MenuItem.Icon>
|
||||||
|
</MenuItem>
|
||||||
|
<MenuItem x:Name="Menu_Sync_UploadBranchDeliveries" Header="Lieferungen dieser Saison/Zweigstelle hochladen" Click="Menu_Sync_UploadBranchDeliveries_Click">
|
||||||
|
<MenuItem.Icon>
|
||||||
|
<TextBlock FontFamily="Segoe MDL2 Assets" FontSize="16" Text=""/>
|
||||||
|
</MenuItem.Icon>
|
||||||
|
</MenuItem>
|
||||||
|
<MenuItem x:Name="Menu_Sync_UploadModified" Header="Geänderte Mitglieder und Lieferungen hochladen" Click="Menu_Sync_UploadModified_Click">
|
||||||
|
<MenuItem.Icon>
|
||||||
|
<TextBlock FontFamily="Segoe MDL2 Assets" FontSize="16" Text=""/>
|
||||||
|
</MenuItem.Icon>
|
||||||
|
</MenuItem>
|
||||||
|
</MenuItem>
|
||||||
<MenuItem Header="Waage">
|
<MenuItem Header="Waage">
|
||||||
<MenuItem Header="Datum und Uhrzeit setzen" Click="Menu_Scale_SetDateTime_Click">
|
<MenuItem Header="Datum und Uhrzeit setzen" Click="Menu_Scale_SetDateTime_Click">
|
||||||
<MenuItem.Icon>
|
<MenuItem.Icon>
|
||||||
@@ -174,16 +191,18 @@
|
|||||||
</Grid>
|
</Grid>
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<Button x:Name="DownloadButton" Click="DownloadButton_Click"
|
<Button x:Name="SyncButton" Click="SyncButton_Click"
|
||||||
Margin="310,135,0,0" Padding="0.375,0.5,0,0" Height="30" Width="30"
|
|
||||||
Content="" FontFamily="Segoe MDL2 Assets" FontSize="16"
|
|
||||||
HorizontalContentAlignment="Center"
|
|
||||||
ToolTip="Lieferungen und Mitgliederdaten anderer Zweigstellen herunterladen"/>
|
|
||||||
<Button x:Name="UploadButton" Click="UploadButton_Click"
|
|
||||||
Margin="375,135,0,0" Padding="1.0,0.5,0,0" Height="30" Width="30"
|
Margin="375,135,0,0" Padding="1.0,0.5,0,0" Height="30" Width="30"
|
||||||
Content="" FontFamily="Segoe MDL2 Assets" FontSize="16"
|
FontFamily="Segoe MDL2 Assets" FontSize="16"
|
||||||
HorizontalContentAlignment="Center"
|
HorizontalContentAlignment="Center"
|
||||||
ToolTip="Lieferungen dieser Zweigstelle hochladen"/>
|
ToolTip="Geänderte Mitgliederdaten und Lieferungen synchronisieren">
|
||||||
|
<Button.Content>
|
||||||
|
<Grid TextElement.FontFamily="Segoe MDL2 Assets">
|
||||||
|
<TextBlock x:Name="SyncButton_1" Text=""/>
|
||||||
|
<TextBlock x:Name="SyncButton_2" Text="" Foreground="DarkOrange"/>
|
||||||
|
</Grid>
|
||||||
|
</Button.Content>
|
||||||
|
</Button>
|
||||||
|
|
||||||
<Expander x:Name="SeasonFinish" Header="Leseabschluss" SnapsToDevicePixels="True"
|
<Expander x:Name="SeasonFinish" Header="Leseabschluss" SnapsToDevicePixels="True"
|
||||||
Expanded="SeasonFinish_Expanded" Collapsed="SeasonFinish_Collapsed"
|
Expanded="SeasonFinish_Expanded" Collapsed="SeasonFinish_Collapsed"
|
||||||
|
|||||||
@@ -12,16 +12,20 @@ using System.Globalization;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
|
using System.Net.NetworkInformation;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
|
using System.Windows.Threading;
|
||||||
|
|
||||||
namespace Elwig.Windows {
|
namespace Elwig.Windows {
|
||||||
public partial class MainWindow : ContextWindow {
|
public partial class MainWindow : ContextWindow {
|
||||||
|
|
||||||
|
private readonly DispatcherTimer _syncTimer = new() { Interval = TimeSpan.FromHours(1) };
|
||||||
|
|
||||||
public MainWindow() {
|
public MainWindow() {
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
var v = Assembly.GetExecutingAssembly().GetName().Version;
|
var v = Assembly.GetExecutingAssembly().GetName().Version;
|
||||||
@@ -29,14 +33,21 @@ namespace Elwig.Windows {
|
|||||||
if (App.Client.Client == null) VersionField.Text += " (Unbekannt)";
|
if (App.Client.Client == null) VersionField.Text += " (Unbekannt)";
|
||||||
Menu_Help_Update.IsEnabled = App.Config.UpdateUrl != null;
|
Menu_Help_Update.IsEnabled = App.Config.UpdateUrl != null;
|
||||||
Menu_Help_Smtp.IsEnabled = App.Config.Smtp != null;
|
Menu_Help_Smtp.IsEnabled = App.Config.Smtp != null;
|
||||||
DownloadButton.Visibility = App.Config.SyncUrl != null ? Visibility.Visible : Visibility.Hidden;
|
Menu_Sync.IsEnabled = App.Config.SyncUrl != null;
|
||||||
UploadButton.Visibility = App.Config.SyncUrl != null ? Visibility.Visible : Visibility.Hidden;
|
SyncButton.Visibility = App.Config.SyncUrl != null ? Visibility.Visible : Visibility.Hidden;
|
||||||
Menu_Database_Upload.IsEnabled = App.Config.SyncUrl != null;
|
Menu_Database_Upload.IsEnabled = App.Config.SyncUrl != null;
|
||||||
Menu_Database_Download.IsEnabled = App.Config.SyncUrl != null;
|
Menu_Database_Download.IsEnabled = App.Config.SyncUrl != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Window_Loaded(object sender, RoutedEventArgs evt) {
|
private void Window_Loaded(object sender, RoutedEventArgs evt) {
|
||||||
SeasonInput.Value = Utils.CurrentLastSeason;
|
SeasonInput.Value = Utils.CurrentLastSeason;
|
||||||
|
|
||||||
|
if (Utils.HasInternetConnectivity()) {
|
||||||
|
CheckSync(200);
|
||||||
|
}
|
||||||
|
NetworkChange.NetworkAvailabilityChanged += OnNetworkAvailabilityChanged;
|
||||||
|
_syncTimer.Tick += new EventHandler(OnSyncTimer);
|
||||||
|
_syncTimer.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Window_Closing(object sender, CancelEventArgs evt) {
|
private void Window_Closing(object sender, CancelEventArgs evt) {
|
||||||
@@ -195,7 +206,18 @@ namespace Elwig.Windows {
|
|||||||
Mouse.OverrideCursor = null;
|
Mouse.OverrideCursor = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void DownloadButton_Click(object sender, RoutedEventArgs evt) {
|
private async void SyncButton_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
if (App.Config.SyncUrl == null)
|
||||||
|
return;
|
||||||
|
Mouse.OverrideCursor = Cursors.Wait;
|
||||||
|
await Task.Run(async () => {
|
||||||
|
await SyncService.Download(App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword);
|
||||||
|
await SyncService.UploadModified(App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword);
|
||||||
|
});
|
||||||
|
Mouse.OverrideCursor = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void Menu_Sync_Download_Click(object sender, RoutedEventArgs evt) {
|
||||||
if (App.Config.SyncUrl == null)
|
if (App.Config.SyncUrl == null)
|
||||||
return;
|
return;
|
||||||
Mouse.OverrideCursor = Cursors.Wait;
|
Mouse.OverrideCursor = Cursors.Wait;
|
||||||
@@ -205,7 +227,7 @@ namespace Elwig.Windows {
|
|||||||
Mouse.OverrideCursor = null;
|
Mouse.OverrideCursor = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void UploadButton_Click(object sender, RoutedEventArgs evt) {
|
private async void Menu_Sync_UploadBranchDeliveries_Click(object sender, RoutedEventArgs evt) {
|
||||||
if (App.Config.SyncUrl == null)
|
if (App.Config.SyncUrl == null)
|
||||||
return;
|
return;
|
||||||
Mouse.OverrideCursor = Cursors.Wait;
|
Mouse.OverrideCursor = Cursors.Wait;
|
||||||
@@ -215,6 +237,16 @@ namespace Elwig.Windows {
|
|||||||
Mouse.OverrideCursor = null;
|
Mouse.OverrideCursor = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async void Menu_Sync_UploadModified_Click(object sender, RoutedEventArgs evt) {
|
||||||
|
if (App.Config.SyncUrl == null)
|
||||||
|
return;
|
||||||
|
Mouse.OverrideCursor = Cursors.Wait;
|
||||||
|
await Task.Run(async () => {
|
||||||
|
await SyncService.UploadModified(App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword);
|
||||||
|
});
|
||||||
|
Mouse.OverrideCursor = null;
|
||||||
|
}
|
||||||
|
|
||||||
private async void Menu_Database_Download_Click(object sender, RoutedEventArgs evt) {
|
private async void Menu_Database_Download_Click(object sender, RoutedEventArgs evt) {
|
||||||
if (App.Config.SyncUrl == null)
|
if (App.Config.SyncUrl == null)
|
||||||
return;
|
return;
|
||||||
@@ -324,9 +356,42 @@ namespace Elwig.Windows {
|
|||||||
App.FocusMailWindow();
|
App.FocusMailWindow();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override Task OnRenewContext(AppDbContext ctx) {
|
protected async override Task OnRenewContext(AppDbContext ctx) {
|
||||||
SeasonInput_TextChanged(null, null);
|
SeasonInput_TextChanged(null, null);
|
||||||
return Task.CompletedTask;
|
CheckSync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnSyncTimer(object? sender, EventArgs? evt) {
|
||||||
|
if (Utils.HasInternetConnectivity()) {
|
||||||
|
CheckSync();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnNetworkAvailabilityChanged(object? sender, NetworkAvailabilityEventArgs evt) {
|
||||||
|
if (!evt.IsAvailable) return;
|
||||||
|
if (Utils.HasInternetConnectivity()) {
|
||||||
|
CheckSync(1000);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void CheckSync(int delay = 0) {
|
||||||
|
if (App.Config.SyncUrl == null) return;
|
||||||
|
Utils.RunBackground("Daten Synchronisieren", async () => {
|
||||||
|
await Task.Delay(delay);
|
||||||
|
var ch = false;
|
||||||
|
using (var ctx = new AppDbContext()) {
|
||||||
|
ch = await SyncService.ChangesAvailable(ctx, App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword);
|
||||||
|
}
|
||||||
|
await App.MainDispatcher.BeginInvoke(() => {
|
||||||
|
if (ch) {
|
||||||
|
SyncButton_1.Text = "\uEA6A";
|
||||||
|
SyncButton_2.Text = "\uEA81";
|
||||||
|
} else {
|
||||||
|
SyncButton_1.Text = "\uE895";
|
||||||
|
SyncButton_2.Text = "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SeasonFinish_Expanded(object sender, RoutedEventArgs evt) {
|
private void SeasonFinish_Expanded(object sender, RoutedEventArgs evt) {
|
||||||
|
|||||||
Reference in New Issue
Block a user