diff --git a/Elwig/Services/DeliveryService.cs b/Elwig/Services/DeliveryService.cs index 7defa25..dfb98e5 100644 --- a/Elwig/Services/DeliveryService.cs +++ b/Elwig/Services/DeliveryService.cs @@ -15,10 +15,8 @@ using LinqKit; using System.Globalization; using System.Linq.Expressions; using Microsoft.EntityFrameworkCore; -using System.IO; using Microsoft.EntityFrameworkCore.ChangeTracking; using System.Windows.Controls; -using System.Net.Http; namespace Elwig.Services { public static class DeliveryService { @@ -799,40 +797,7 @@ namespace Elwig.Services { } else if (mode == ExportMode.Upload && App.Config.SyncUrl != null) { Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { - try { - var filename = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip"; - var path = Path.Combine(App.TempPath, filename); - var list = await query - .Select(p => p.Delivery) - .Distinct() - .Include(d => d.Parts).ThenInclude(p => p.PartModifiers) - .Include(d => d.Parts).ThenInclude(p => p.Rd) - .Include(d => d.Parts).ThenInclude(p => p.Kg!.Gl) - .AsSplitQuery() - .ToListAsync(); - var wbKgs = list - .SelectMany(d => d.Parts) - .Where(p => p.Kg != null) - .Select(p => p.Kg!) - .DistinctBy(k => k.KgNr) - .OrderBy(k => k.KgNr) - .ToList(); - if (list.Count == 0) { - MessageBox.Show("Es wurden keine Lieferungen zum Hochladen ausgewählt!", "Lieferungen hochladen", - MessageBoxButton.OK, MessageBoxImage.Error); - } else { - await ElwigData.Export(path, list, wbKgs, filterNames); - await Utils.UploadExportData(path, App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword); - MessageBox.Show($"Hochladen von {list.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochgeladen", - MessageBoxButton.OK, MessageBoxImage.Information); - } - } catch (HttpRequestException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); - } catch (TaskCanceledException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); - } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); - } + await SyncService.Upload(App.Config.SyncUrl, App.Config.SyncUrl, App.Config.SyncPassword, query, filterNames); }); Mouse.OverrideCursor = null; } else { diff --git a/Elwig/Services/MemberService.cs b/Elwig/Services/MemberService.cs index f3ade66..a1a69d5 100644 --- a/Elwig/Services/MemberService.cs +++ b/Elwig/Services/MemberService.cs @@ -9,9 +9,7 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Win32; using System; using System.Collections.Generic; -using System.IO; using System.Linq; -using System.Net.Http; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; @@ -562,46 +560,7 @@ namespace Elwig.Services { } else if (mode == ExportMode.Upload && App.Config.SyncUrl != null) { Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { - try { - var filename = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip"; - var path = Path.Combine(App.TempPath, filename); - var members = await query - .OrderBy(m => m.MgNr) - .Include(m => m.BillingAddress) - .Include(m => m.TelephoneNumbers) - .Include(m => m.EmailAddresses) - .Include(m => m.DefaultWbKg!.Gl) - .AsSplitQuery() - .ToListAsync(); - var areaComs = await query - .SelectMany(m => m.AreaCommitments) - .OrderBy(c => c.MgNr).ThenBy(c => c.FbNr) - .Include(c => c.Rd) - .Include(c => c.Kg.Gl) - .ToListAsync(); - var wbKgs = members - .Where(m => m.DefaultWbKg != null) - .Select(m => m.DefaultWbKg!) - .Union(areaComs.Select(c => c.Kg)) - .Distinct() - .OrderBy(k => k.KgNr) - .ToList(); - if (members.Count == 0) { - MessageBox.Show("Es wurden keine Mitglieder zum Hochladen ausgewählt!", "Mitglieder hochladen", - MessageBoxButton.OK, MessageBoxImage.Error); - } else { - await ElwigData.Export(path, members, areaComs, wbKgs, filterNames); - await Utils.UploadExportData(path, App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword); - MessageBox.Show($"Hochladen von {members.Count:N0} Mitgliedern erfolgreich!", "Mitglieder hochgeladen", - MessageBoxButton.OK, MessageBoxImage.Information); - } - } catch (HttpRequestException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Mitglieder hochladen", MessageBoxButton.OK, MessageBoxImage.Error); - } catch (TaskCanceledException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Mitglieder hochladen", MessageBoxButton.OK, MessageBoxImage.Error); - } catch (Exception exc) { - MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); - } + await SyncService.Upload(App.Config.SyncUrl, App.Config.SyncUrl, App.Config.SyncPassword, query, filterNames); }); Mouse.OverrideCursor = null; } else { diff --git a/Elwig/Services/SyncService.cs b/Elwig/Services/SyncService.cs new file mode 100644 index 0000000..a1fd0b9 --- /dev/null +++ b/Elwig/Services/SyncService.cs @@ -0,0 +1,171 @@ +using Elwig.Helpers; +using Elwig.Helpers.Export; +using Elwig.Models.Entities; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; +using System.Windows; + +namespace Elwig.Services { + public static class SyncService { + + public static async Task Upload(string url, string username, string password, IQueryable query, IEnumerable filterNames) { + try { + var filename = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip"; + var path = Path.Combine(App.TempPath, filename); + var members = await query + .OrderBy(m => m.MgNr) + .Include(m => m.BillingAddress) + .Include(m => m.TelephoneNumbers) + .Include(m => m.EmailAddresses) + .Include(m => m.DefaultWbKg!.Gl) + .AsSplitQuery() + .ToListAsync(); + var areaComs = await query + .SelectMany(m => m.AreaCommitments) + .OrderBy(c => c.MgNr).ThenBy(c => c.FbNr) + .Include(c => c.Rd) + .Include(c => c.Kg.Gl) + .ToListAsync(); + var wbKgs = members + .Where(m => m.DefaultWbKg != null) + .Select(m => m.DefaultWbKg!) + .Union(areaComs.Select(c => c.Kg)) + .Distinct() + .OrderBy(k => k.KgNr) + .ToList(); + if (members.Count == 0) { + MessageBox.Show("Es wurden keine Mitglieder zum Hochladen ausgewählt!", "Mitglieder hochladen", + MessageBoxButton.OK, MessageBoxImage.Error); + } else { + await ElwigData.Export(path, members, areaComs, wbKgs, filterNames); + await Utils.UploadExportData(path, url, username, password); + MessageBox.Show($"Hochladen von {members.Count:N0} Mitgliedern erfolgreich!", "Mitglieder hochgeladen", + MessageBoxButton.OK, MessageBoxImage.Information); + } + } catch (HttpRequestException exc) { + MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Mitglieder hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (TaskCanceledException exc) { + MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Mitglieder hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } + } + + public static async Task Upload(string url, string username, string password, IQueryable query, IEnumerable filterNames) { + try { + var filename = $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip"; + var path = Path.Combine(App.TempPath, filename); + var list = await query + .Select(p => p.Delivery) + .Distinct() + .Include(d => d.Parts).ThenInclude(p => p.PartModifiers) + .Include(d => d.Parts).ThenInclude(p => p.Rd) + .Include(d => d.Parts).ThenInclude(p => p.Kg!.Gl) + .AsSplitQuery() + .ToListAsync(); + var wbKgs = list + .SelectMany(d => d.Parts) + .Where(p => p.Kg != null) + .Select(p => p.Kg!) + .DistinctBy(k => k.KgNr) + .OrderBy(k => k.KgNr) + .ToList(); + if (list.Count == 0) { + MessageBox.Show("Es wurden keine Lieferungen zum Hochladen ausgewählt!", "Lieferungen hochladen", + MessageBoxButton.OK, MessageBoxImage.Error); + } else { + await ElwigData.Export(path, list, wbKgs, filterNames); + await Utils.UploadExportData(path, url, username, password); + MessageBox.Show($"Hochladen von {list.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochgeladen", + MessageBoxButton.OK, MessageBoxImage.Information); + } + } catch (HttpRequestException exc) { + MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (TaskCanceledException exc) { + MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error); + } + } + + public static async Task UploadBranchDeliveries(string url, string username, string password, int? year = null) { + try { + year ??= Utils.CurrentLastSeason; + var path = Path.Combine(App.TempPath, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.zip"); + using var ctx = new AppDbContext(); + var deliveries = await ctx.Deliveries + .Where(d => d.Year == year && d.ZwstId == App.ZwstId) + .Include(d => d.Parts).ThenInclude(p => p.PartModifiers) + .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 = deliveries + .SelectMany(d => d.Parts) + .Where(p => p.Kg != null) + .Select(p => p.Kg!) + .DistinctBy(k => k.KgNr) + .ToList(); + 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, wbKgs, [$"{year}", $"Zweigstelle {App.BranchName}"]); + await Utils.UploadExportData(path, url, username, password); + MessageBox.Show($"Hochladen von {deliveries.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochladen", + MessageBoxButton.OK, MessageBoxImage.Information); + } + } catch (HttpRequestException exc) { + MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (TaskCanceledException exc) { + MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); + } + } + + public static async Task Download(string url, string username, string password) { + try { + var data = await Utils.GetExportMetaData(url, username, password); + 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!["meta"]?["zwstid"]?.AsValue().GetValue() ?? f!["zwstid"]?.AsValue().GetValue(), + Device = f!["meta"]?["device"]?.AsValue().GetValue(), + Url = f!["url"]!.AsValue().GetValue(), + Size = f!["size"]!.AsValue().GetValue(), + }) + .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(); + using (var client = Utils.GetHttpClient(username, password)) { + 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, ElwigData.ImportMode.FromBranches); + } catch (HttpRequestException exc) { + MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Daten herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (TaskCanceledException exc) { + MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Daten herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); + } catch (Exception exc) { + MessageBox.Show(exc.Message, "Daten herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); + } + } + } +} diff --git a/Elwig/Windows/MainWindow.xaml.cs b/Elwig/Windows/MainWindow.xaml.cs index efde0ec..5061dbb 100644 --- a/Elwig/Windows/MainWindow.xaml.cs +++ b/Elwig/Windows/MainWindow.xaml.cs @@ -2,10 +2,10 @@ using Elwig.Helpers; using Elwig.Helpers.Billing; using Elwig.Helpers.Export; using Elwig.Models.Dtos; +using Elwig.Services; using Microsoft.EntityFrameworkCore; using Microsoft.Win32; using System; -using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Globalization; @@ -200,41 +200,7 @@ namespace Elwig.Windows { return; Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { - 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!["meta"]?["zwstid"]?.AsValue().GetValue() ?? f!["zwstid"]?.AsValue().GetValue(), - Device = f!["meta"]?["device"]?.AsValue().GetValue(), - Url = f!["url"]!.AsValue().GetValue(), - Size = f!["size"]!.AsValue().GetValue(), - }) - .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(); - 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, ElwigData.ImportMode.FromBranches); - } catch (HttpRequestException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Daten herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); - } catch (TaskCanceledException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Daten herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); - } catch (Exception exc) { - MessageBox.Show(exc.Message, "Daten herunterladen", MessageBoxButton.OK, MessageBoxImage.Error); - } + await SyncService.Download(App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword); }); Mouse.OverrideCursor = null; } @@ -244,43 +210,7 @@ namespace Elwig.Windows { return; Mouse.OverrideCursor = Cursors.Wait; await Task.Run(async () => { - try { - var path = Path.Combine(App.TempPath, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}_{App.ZwstId}.elwig.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) - .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 = deliveries - .SelectMany(d => d.Parts) - .Where(p => p.Kg != null) - .Select(p => p.Kg!) - .DistinctBy(k => k.KgNr) - .ToList(); - 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, wbKgs, [$"{Utils.CurrentLastSeason}", $"Zweigstelle {App.BranchName}"]); - await Utils.UploadExportData(path, App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword); - MessageBox.Show($"Hochladen von {deliveries.Count:N0} Lieferungen erfolgreich!", "Lieferungen hochladen", - MessageBoxButton.OK, MessageBoxImage.Information); - } - } catch (HttpRequestException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); - } catch (TaskCanceledException exc) { - MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); - } catch (Exception exc) { - MessageBox.Show(exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error); - } + await SyncService.UploadBranchDeliveries(App.Config.SyncUrl, App.Config.SyncUsername, App.Config.SyncPassword); }); Mouse.OverrideCursor = null; }