Compare commits
	
		
			7 Commits
		
	
	
		
			v1.0.1.5
			...
			86cf3a6bbb
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 86cf3a6bbb | |||
| ed268bf322 | |||
| 93836ae243 | |||
| b9838da76b | |||
| 4c23dff64d | |||
| 50d5c4bee0 | |||
| 1203db38ba | 
@@ -197,10 +197,12 @@ namespace Elwig {
 | 
			
		||||
            var ch = CurrentLastWrite;
 | 
			
		||||
            if (ch > CurrentApp.LastChanged)
 | 
			
		||||
                CurrentApp.LastChanged = ch;
 | 
			
		||||
            foreach (Window w in CurrentApp.Windows) {
 | 
			
		||||
                if (w is not ContextWindow c) continue;
 | 
			
		||||
                MainDispatcher.BeginInvoke(c.HintContextChange);
 | 
			
		||||
            }
 | 
			
		||||
            MainDispatcher.Invoke(() => {
 | 
			
		||||
                foreach (Window w in CurrentApp.Windows) {
 | 
			
		||||
                    if (w is not ContextWindow c) continue;
 | 
			
		||||
                    MainDispatcher.BeginInvoke(c.HintContextChange);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void OnAutoUpdateTimer(object? sender, EventArgs? evt) {
 | 
			
		||||
 
 | 
			
		||||
@@ -27,13 +27,13 @@
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <PackageReference Include="CommunityToolkit.Mvvm" Version="8.4.0" />
 | 
			
		||||
    <PackageReference Include="LinqKit" Version="1.3.8" />
 | 
			
		||||
    <PackageReference Include="MailKit" Version="4.11.0" />
 | 
			
		||||
    <PackageReference Include="MailKit" Version="4.12.0" />
 | 
			
		||||
    <PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.36" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="9.0.4" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.4" />
 | 
			
		||||
    <PackageReference Include="Microsoft.Extensions.Configuration.Ini" Version="9.0.4" />
 | 
			
		||||
    <PackageReference Include="Microsoft.Web.WebView2" Version="1.0.3179.45" />
 | 
			
		||||
    <PackageReference Include="NJsonSchema" Version="11.2.0" />
 | 
			
		||||
    <PackageReference Include="NJsonSchema" Version="11.3.2" />
 | 
			
		||||
    <PackageReference Include="PdfiumViewer" Version="2.13.0" />
 | 
			
		||||
    <PackageReference Include="PdfiumViewer.Native.x86_64.no_v8-no_xfa" Version="2018.4.8.256" />
 | 
			
		||||
    <PackageReference Include="RazorLight" Version="2.3.1" />
 | 
			
		||||
 
 | 
			
		||||
@@ -434,8 +434,7 @@ namespace Elwig.Helpers {
 | 
			
		||||
            if (accept != null)
 | 
			
		||||
                client.DefaultRequestHeaders.Accept.Add(new(accept));
 | 
			
		||||
            if (username != null || password != null)
 | 
			
		||||
                client.DefaultRequestHeaders.Authorization = new("Basic", Convert.ToBase64String(
 | 
			
		||||
                    Utils.UTF8.GetBytes($"{username}:{password}")));
 | 
			
		||||
                client.DefaultRequestHeaders.Authorization = new("Basic", Convert.ToBase64String(Utils.UTF8.GetBytes($"{username}:{password}")));
 | 
			
		||||
            return client;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -454,6 +453,8 @@ namespace Elwig.Helpers {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task UploadExportData(string zip, string url, string username, string password) {
 | 
			
		||||
            if (url.StartsWith("https://elwig.at/clients/"))
 | 
			
		||||
                url = "https://sync.elwig.at/" + url[25..];
 | 
			
		||||
            if (!url.EndsWith('/')) url += "/";
 | 
			
		||||
            using var client = GetHttpClient(username, password, accept: "application/json");
 | 
			
		||||
            var content = new StreamContent(new FileStream(zip, FileMode.Open, FileAccess.Read));
 | 
			
		||||
@@ -463,6 +464,8 @@ namespace Elwig.Helpers {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task<JsonArray> GetExportMetaData(string url, string username, string password) {
 | 
			
		||||
            if (url.StartsWith("https://elwig.at/clients/"))
 | 
			
		||||
                url = "https://sync.elwig.at/" + url[25..];
 | 
			
		||||
            using var client = GetHttpClient(username, password, accept: "application/json");
 | 
			
		||||
            using var res = await client.GetAsync(url);
 | 
			
		||||
            res.EnsureSuccessStatusCode();
 | 
			
		||||
@@ -496,34 +499,39 @@ namespace Elwig.Helpers {
 | 
			
		||||
            if (App.Config.Smtp == null)
 | 
			
		||||
                return false;
 | 
			
		||||
 | 
			
		||||
            SmtpClient? client = null;
 | 
			
		||||
            try {
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                client = await GetSmtpClient();
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
 | 
			
		||||
                using var msg = new MimeMessage();
 | 
			
		||||
                msg.From.Add(new MailboxAddress(App.Client.NameFull, App.Config.Smtp.Value.From));
 | 
			
		||||
                msg.To.AddRange(member.EmailAddresses.OrderBy(a => a.Nr).Select(a => new MailboxAddress(member.AdministrativeName, a.Address)));
 | 
			
		||||
                msg.Subject = subject;
 | 
			
		||||
                var body = new Multipart("mixed") {
 | 
			
		||||
                    new TextPart("plain") { Text = text }
 | 
			
		||||
                };
 | 
			
		||||
                foreach (var doc in docs) {
 | 
			
		||||
                    var name = NormalizeFileName(doc.Title);
 | 
			
		||||
                    body.Add(doc.AsEmailAttachment($"{name}.pdf"));
 | 
			
		||||
            var success = await Task.Run(async () => {
 | 
			
		||||
                SmtpClient? client = null;
 | 
			
		||||
                try {
 | 
			
		||||
                    client = await GetSmtpClient();
 | 
			
		||||
 | 
			
		||||
                    using var msg = new MimeMessage();
 | 
			
		||||
                    msg.From.Add(new MailboxAddress(App.Client.NameFull, App.Config.Smtp.Value.From));
 | 
			
		||||
                    msg.To.AddRange(member.EmailAddresses.OrderBy(a => a.Nr).Select(a => new MailboxAddress(member.AdministrativeName, a.Address)));
 | 
			
		||||
                    msg.Subject = subject;
 | 
			
		||||
                    var body = new Multipart("mixed") {
 | 
			
		||||
                        new TextPart("plain") { Text = text }
 | 
			
		||||
                    };
 | 
			
		||||
                    foreach (var doc in docs) {
 | 
			
		||||
                        var name = NormalizeFileName(doc.Title);
 | 
			
		||||
                        body.Add(doc.AsEmailAttachment($"{name}.pdf"));
 | 
			
		||||
                    }
 | 
			
		||||
                    msg.Body = body;
 | 
			
		||||
                    await client!.SendAsync(msg);
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                    return false;
 | 
			
		||||
                } finally {
 | 
			
		||||
                    if (client != null)
 | 
			
		||||
                        await client.DisconnectAsync(true);
 | 
			
		||||
                    client?.Dispose();
 | 
			
		||||
                }
 | 
			
		||||
                msg.Body = body;
 | 
			
		||||
                await client!.SendAsync(msg);
 | 
			
		||||
            } catch (Exception exc) {
 | 
			
		||||
                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                return false;
 | 
			
		||||
            } finally {
 | 
			
		||||
                if (client != null)
 | 
			
		||||
                    await client.DisconnectAsync(true);
 | 
			
		||||
                client?.Dispose();
 | 
			
		||||
                Mouse.OverrideCursor = null;
 | 
			
		||||
            }
 | 
			
		||||
            return true;
 | 
			
		||||
                return true;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
            return success;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task ExportDocument(Document doc, ExportMode mode, string? filename = null, (Member, string, string)? emailData = null) {
 | 
			
		||||
 
 | 
			
		||||
@@ -108,7 +108,8 @@ namespace Elwig.Services {
 | 
			
		||||
        public static async Task<int> UpdateAreaCommitment(this AreaComAdminViewModel vm, int? oldFbNr) {
 | 
			
		||||
            int newFbNr = (int)vm.FbNr!;
 | 
			
		||||
 | 
			
		||||
            using (var ctx = new AppDbContext()) {
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                var a = new AreaCom {
 | 
			
		||||
                    FbNr = oldFbNr ?? newFbNr,
 | 
			
		||||
                    MgNr = (int)vm.MgNr!,
 | 
			
		||||
@@ -140,7 +141,7 @@ namespace Elwig.Services {
 | 
			
		||||
                if (newFbNr != a.FbNr) {
 | 
			
		||||
                    await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment SET fbnr = {newFbNr} WHERE fbnr = {oldFbNr}");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            App.HintContextChange();
 | 
			
		||||
 | 
			
		||||
@@ -253,5 +254,16 @@ namespace Elwig.Services {
 | 
			
		||||
            }
 | 
			
		||||
            return grid;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task DeleteAreaCom(int fbnr) {
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                var l = (await ctx.AreaCommitments.FindAsync(fbnr))!;
 | 
			
		||||
                ctx.Remove(l);
 | 
			
		||||
                await ctx.SaveChangesAsync();
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            App.HintContextChange();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -430,9 +430,10 @@ namespace Elwig.Services {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task<DeliveryPart> UpdateDeliveryPart(this DeliveryAdminViewModel vm, int? oldYear, int? oldDid, int? oldDpnr, bool dateHasChanged, bool timeHasChanged, bool timeIsDefault) {
 | 
			
		||||
            DeliveryPart p;
 | 
			
		||||
            var p = await Task.Run(async () => {
 | 
			
		||||
                DeliveryPart p;
 | 
			
		||||
 | 
			
		||||
            using (var ctx = new AppDbContext()) {
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                int year = oldYear ?? Utils.CurrentYear;
 | 
			
		||||
                int did = oldDid ?? await ctx.NextDId(year);
 | 
			
		||||
                int dpnr = oldDpnr ?? await ctx.NextDPNr(year, did);
 | 
			
		||||
@@ -524,7 +525,9 @@ namespace Elwig.Services {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                await ctx.SaveChangesAsync();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
                return p;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            App.HintContextChange();
 | 
			
		||||
 | 
			
		||||
@@ -532,9 +535,10 @@ namespace Elwig.Services {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task<Delivery> SplitDeliveryToMember(int year, int did, int[] weights, int mgnr) {
 | 
			
		||||
            Delivery n;
 | 
			
		||||
            var n = await Task.Run(async () => {
 | 
			
		||||
                Delivery n;
 | 
			
		||||
 | 
			
		||||
            using (var ctx = new AppDbContext()) {
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                bool anyLeft = false;
 | 
			
		||||
                var d = (await ctx.Deliveries.FindAsync(year, did))!;
 | 
			
		||||
                var lnr = await ctx.NextLNr(d.Date, d.ZwstId);
 | 
			
		||||
@@ -577,7 +581,9 @@ namespace Elwig.Services {
 | 
			
		||||
                await ctx.SaveChangesAsync();
 | 
			
		||||
                if (!anyLeft)
 | 
			
		||||
                    await ctx.Database.ExecuteSqlAsync($"DELETE FROM delivery WHERE (year, did) = ({d.Year}, {d.DId})");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
                return n;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            App.HintContextChange();
 | 
			
		||||
 | 
			
		||||
@@ -585,9 +591,9 @@ namespace Elwig.Services {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task<Delivery> SplitDeliveryToLsNr(int year, int did, int[] weights, string lsnr) {
 | 
			
		||||
            Delivery n;
 | 
			
		||||
 | 
			
		||||
            using (var ctx = new AppDbContext()) {
 | 
			
		||||
            var n = await Task.Run(async () => {
 | 
			
		||||
                Delivery n;
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                var anyLeft = false;
 | 
			
		||||
                n = (await ctx.Deliveries.FirstAsync(d => d.LsNr == lsnr))!;
 | 
			
		||||
                var d = (await ctx.Deliveries.FindAsync(year, did))!;
 | 
			
		||||
@@ -616,7 +622,9 @@ namespace Elwig.Services {
 | 
			
		||||
                await ctx.SaveChangesAsync();
 | 
			
		||||
                if (!anyLeft && n.LsNr != d.LsNr)
 | 
			
		||||
                    await ctx.Database.ExecuteSqlAsync($"DELETE FROM delivery WHERE (year, did) = ({d.Year}, {d.DId})");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
                return n;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            App.HintContextChange();
 | 
			
		||||
 | 
			
		||||
@@ -624,7 +632,8 @@ namespace Elwig.Services {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task DepreciateDelivery(int year, int did, int[] weights) {
 | 
			
		||||
            using (var ctx = new AppDbContext()) {
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                var d = (await ctx.Deliveries.FindAsync(year, did))!;
 | 
			
		||||
                var dpnr = await ctx.NextDPNr(year, did);
 | 
			
		||||
                foreach (var (p, w) in d.Parts.ToList().Zip(weights)) {
 | 
			
		||||
@@ -648,21 +657,23 @@ namespace Elwig.Services {
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                await ctx.SaveChangesAsync();
 | 
			
		||||
            }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            App.HintContextChange();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task GenerateDeliveryNote(int year, int did, ExportMode mode) {
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            try {
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                var d = (await ctx.Deliveries.FindAsync(year, did))!;
 | 
			
		||||
                using var doc = new DeliveryNote(d, ctx);
 | 
			
		||||
                await Utils.ExportDocument(doc, mode, d.LsNr, (d.Member, $"{DeliveryNote.Name} Nr. {d.LsNr}", $"Im Anhang finden Sie den {DeliveryNote.Name} Nr. {d.LsNr}"));
 | 
			
		||||
            } catch (Exception exc) {
 | 
			
		||||
                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
            }
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                try {
 | 
			
		||||
                    using var ctx = new AppDbContext();
 | 
			
		||||
                    var d = (await ctx.Deliveries.FindAsync(year, did))!;
 | 
			
		||||
                    using var doc = new DeliveryNote(d, ctx);
 | 
			
		||||
                    await Utils.ExportDocument(doc, mode, d.LsNr, (d.Member, $"{DeliveryNote.Name} Nr. {d.LsNr}", $"Im Anhang finden Sie den {DeliveryNote.Name} Nr. {d.LsNr}"));
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -707,14 +718,16 @@ namespace Elwig.Services {
 | 
			
		||||
                    Title = $"{DeliveryJournal.Name} speichern unter - Elwig"
 | 
			
		||||
                };
 | 
			
		||||
                if (d.ShowDialog() == true) {
 | 
			
		||||
                    Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                    try {
 | 
			
		||||
                        var data = await DeliveryJournalData.FromQuery(query, filterNames);
 | 
			
		||||
                        using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                        await ods.AddTable(data);
 | 
			
		||||
                    } catch (Exception exc) {
 | 
			
		||||
                        MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                    }
 | 
			
		||||
                    Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                    await Task.Run(async () => {
 | 
			
		||||
                        try {
 | 
			
		||||
                            var data = await DeliveryJournalData.FromQuery(query, filterNames);
 | 
			
		||||
                            using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                            await ods.AddTable(data);
 | 
			
		||||
                        } catch (Exception exc) {
 | 
			
		||||
                            MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                    Mouse.OverrideCursor = null;
 | 
			
		||||
                }
 | 
			
		||||
            } else if (mode == ExportMode.Export) {
 | 
			
		||||
@@ -725,58 +738,64 @@ namespace Elwig.Services {
 | 
			
		||||
                    Title = $"{DeliveryJournal.Name} speichern unter - Elwig"
 | 
			
		||||
                };
 | 
			
		||||
                if (d.ShowDialog() == true) {
 | 
			
		||||
                    Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                    Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                    await Task.Run(async () => {
 | 
			
		||||
                        try {
 | 
			
		||||
                            await ElwigData.Export(d.FileName, await query
 | 
			
		||||
                                .Select(p => p.Delivery)
 | 
			
		||||
                                .Distinct()
 | 
			
		||||
                                .Include(d => d.Parts)
 | 
			
		||||
                                .ThenInclude(p => p.PartModifiers)
 | 
			
		||||
                                .AsSplitQuery()
 | 
			
		||||
                                .ToListAsync(), filterNames);
 | 
			
		||||
                        } catch (Exception exc) {
 | 
			
		||||
                            MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                    Mouse.OverrideCursor = null;
 | 
			
		||||
                }
 | 
			
		||||
            } else if (mode == ExportMode.Upload && App.Config.SyncUrl != null) {
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                await Task.Run(async () => {
 | 
			
		||||
                    try {
 | 
			
		||||
                        await ElwigData.Export(d.FileName, await query
 | 
			
		||||
                        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)
 | 
			
		||||
                            .AsSplitQuery()
 | 
			
		||||
                            .ToListAsync(), filterNames);
 | 
			
		||||
                            .ToListAsync();
 | 
			
		||||
                        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, 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);
 | 
			
		||||
                    }
 | 
			
		||||
                    Mouse.OverrideCursor = null;
 | 
			
		||||
                }
 | 
			
		||||
            } else if (mode == ExportMode.Upload && App.Config.SyncUrl != null) {
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                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)
 | 
			
		||||
                        .AsSplitQuery()
 | 
			
		||||
                        .ToListAsync();
 | 
			
		||||
                    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, 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);
 | 
			
		||||
                }
 | 
			
		||||
                });
 | 
			
		||||
                Mouse.OverrideCursor = null;
 | 
			
		||||
            } else {
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                try {
 | 
			
		||||
                    var data = await DeliveryJournalData.FromQuery(query, filterNames);
 | 
			
		||||
                    using var doc = new DeliveryJournal(string.Join(" / ", filterNames), data);
 | 
			
		||||
                    await Utils.ExportDocument(doc, mode);
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                }
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                await Task.Run(async () => {
 | 
			
		||||
                    try {
 | 
			
		||||
                        var data = await DeliveryJournalData.FromQuery(query, filterNames);
 | 
			
		||||
                        using var doc = new DeliveryJournal(string.Join(" / ", filterNames), data);
 | 
			
		||||
                        await Utils.ExportDocument(doc, mode);
 | 
			
		||||
                    } catch (Exception exc) {
 | 
			
		||||
                        MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
                Mouse.OverrideCursor = null;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -798,14 +817,16 @@ namespace Elwig.Services {
 | 
			
		||||
                throw new ArgumentException("Invalid value for ExportSubject");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            try {
 | 
			
		||||
                var data = await WineQualityStatisticsData.FromQuery(query, App.Client.OrderingMemberList);
 | 
			
		||||
                using var doc = new WineQualityStatistics(string.Join(" / ", filterNames), data);
 | 
			
		||||
                await Utils.ExportDocument(doc, mode);
 | 
			
		||||
            } catch (Exception exc) {
 | 
			
		||||
                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
            }
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                try {
 | 
			
		||||
                    var data = await WineQualityStatisticsData.FromQuery(query, App.Client.OrderingMemberList);
 | 
			
		||||
                    using var doc = new WineQualityStatistics(string.Join(" / ", filterNames), data);
 | 
			
		||||
                    await Utils.ExportDocument(doc, mode);
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -829,14 +850,16 @@ namespace Elwig.Services {
 | 
			
		||||
                Title = $"Lieferstatistik pro Ort speichern unter - Elwig"
 | 
			
		||||
            };
 | 
			
		||||
            if (d.ShowDialog() == true) {
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                try {
 | 
			
		||||
                    using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                    var tbl = await WineLocalityStatisticsData.FromQuery(query, filterNames);
 | 
			
		||||
                    await ods.AddTable(tbl);
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                }
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                await Task.Run(async () => {
 | 
			
		||||
                    try {
 | 
			
		||||
                        using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                        var tbl = await WineLocalityStatisticsData.FromQuery(query, filterNames);
 | 
			
		||||
                        await ods.AddTable(tbl);
 | 
			
		||||
                    } catch (Exception exc) {
 | 
			
		||||
                        MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
                Mouse.OverrideCursor = null;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -875,33 +898,37 @@ namespace Elwig.Services {
 | 
			
		||||
                    Title = $"{DeliveryDepreciationList.Name} speichern unter - Elwig"
 | 
			
		||||
                };
 | 
			
		||||
                if (d.ShowDialog() == true) {
 | 
			
		||||
                    Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                    try {
 | 
			
		||||
                        using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                        var tblTotal = await DeliveryJournalData.FromQuery(query, filterNames);
 | 
			
		||||
                        tblTotal.FullName = DeliveryDepreciationList.Name;
 | 
			
		||||
                        tblTotal.Name = "Gesamt";
 | 
			
		||||
                        await ods.AddTable(tblTotal);
 | 
			
		||||
                        foreach (var branch in await ctx.Branches.OrderBy(b => b.Name).ToListAsync()) {
 | 
			
		||||
                            var tbl = await DeliveryJournalData.FromQuery(query.Where(p => p.Delivery.ZwstId == branch.ZwstId), filterNames);
 | 
			
		||||
                            tbl.FullName = DeliveryDepreciationList.Name;
 | 
			
		||||
                            tbl.Name = branch.Name;
 | 
			
		||||
                            await ods.AddTable(tbl);
 | 
			
		||||
                    Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                    await Task.Run(async () => {
 | 
			
		||||
                        try {
 | 
			
		||||
                            using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                            var tblTotal = await DeliveryJournalData.FromQuery(query, filterNames);
 | 
			
		||||
                            tblTotal.FullName = DeliveryDepreciationList.Name;
 | 
			
		||||
                            tblTotal.Name = "Gesamt";
 | 
			
		||||
                            await ods.AddTable(tblTotal);
 | 
			
		||||
                            foreach (var branch in await ctx.Branches.OrderBy(b => b.Name).ToListAsync()) {
 | 
			
		||||
                                var tbl = await DeliveryJournalData.FromQuery(query.Where(p => p.Delivery.ZwstId == branch.ZwstId), filterNames);
 | 
			
		||||
                                tbl.FullName = DeliveryDepreciationList.Name;
 | 
			
		||||
                                tbl.Name = branch.Name;
 | 
			
		||||
                                await ods.AddTable(tbl);
 | 
			
		||||
                            }
 | 
			
		||||
                        } catch (Exception exc) {
 | 
			
		||||
                            MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                        }
 | 
			
		||||
                    } catch (Exception exc) {
 | 
			
		||||
                        MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                    }
 | 
			
		||||
                    });
 | 
			
		||||
                    Mouse.OverrideCursor = null;
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                try {
 | 
			
		||||
                    var data = await DeliveryJournalData.FromQuery(query, filterNames);
 | 
			
		||||
                    using var doc = new DeliveryDepreciationList(string.Join(" / ", filterNames), data);
 | 
			
		||||
                    await Utils.ExportDocument(doc, mode);
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                }
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                await Task.Run(async () => {
 | 
			
		||||
                    try {
 | 
			
		||||
                        var data = await DeliveryJournalData.FromQuery(query, filterNames);
 | 
			
		||||
                        using var doc = new DeliveryDepreciationList(string.Join(" / ", filterNames), data);
 | 
			
		||||
                        await Utils.ExportDocument(doc, mode);
 | 
			
		||||
                    } catch (Exception exc) {
 | 
			
		||||
                        MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
                Mouse.OverrideCursor = null;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
@@ -1070,10 +1097,12 @@ namespace Elwig.Services {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task DeleteDelivery(string lsnr) {
 | 
			
		||||
            using (var ctx = new AppDbContext()) {
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                await ctx.Deliveries.Where(d => d.LsNr == lsnr).ExecuteDeleteAsync();
 | 
			
		||||
                await ctx.SaveChangesAsync();
 | 
			
		||||
            }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            App.HintContextChange();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -367,51 +367,57 @@ namespace Elwig.Services {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task GenerateMemberDataSheet(Member m, ExportMode mode) {
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            try {
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                using var doc = new MemberDataSheet(m, ctx);
 | 
			
		||||
                await Utils.ExportDocument(doc, mode, emailData: (m, MemberDataSheet.Name, "Im Anhang finden Sie das aktuelle Stammdatenblatt"));
 | 
			
		||||
            } catch (Exception exc) {
 | 
			
		||||
                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
            }
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                try {
 | 
			
		||||
                    using var ctx = new AppDbContext();
 | 
			
		||||
                    using var doc = new MemberDataSheet(m, ctx);
 | 
			
		||||
                    await Utils.ExportDocument(doc, mode, emailData: (m, MemberDataSheet.Name, "Im Anhang finden Sie das aktuelle Stammdatenblatt"));
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task GenerateDeliveryConfirmation(Member m, int year, ExportMode mode) {
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            try {
 | 
			
		||||
                var b = new Billing(year);
 | 
			
		||||
                await b.FinishSeason();
 | 
			
		||||
                await b.CalculateBuckets();
 | 
			
		||||
                App.HintContextChange();
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                try {
 | 
			
		||||
                    var b = new Billing(year);
 | 
			
		||||
                    await b.FinishSeason();
 | 
			
		||||
                    await b.CalculateBuckets();
 | 
			
		||||
                    App.HintContextChange();
 | 
			
		||||
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                var data = await DeliveryConfirmationDeliveryData.ForMember(ctx.DeliveryParts, year, m);
 | 
			
		||||
                using var doc = new DeliveryConfirmation(ctx, year, m, data);
 | 
			
		||||
                await Utils.ExportDocument(doc, mode, emailData: (m, $"{DeliveryConfirmation.Name} {year}", $"Im Anhang finden Sie die Anlieferungsbestätigung {year}"));
 | 
			
		||||
            } catch (Exception exc) {
 | 
			
		||||
                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
            }
 | 
			
		||||
                    using var ctx = new AppDbContext();
 | 
			
		||||
                    var data = await DeliveryConfirmationDeliveryData.ForMember(ctx.DeliveryParts, year, m);
 | 
			
		||||
                    using var doc = new DeliveryConfirmation(ctx, year, m, data);
 | 
			
		||||
                    await Utils.ExportDocument(doc, mode, emailData: (m, $"{DeliveryConfirmation.Name} {year}", $"Im Anhang finden Sie die Anlieferungsbestätigung {year}"));
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task GenerateCreditNote(Member m, int year, int avnr, ExportMode mode) {
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            try {
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                var v = (await ctx.PaymentVariants.FindAsync(year, avnr))!;
 | 
			
		||||
                var data = await CreditNoteDeliveryData.ForPaymentVariant(ctx.CreditNoteDeliveryRows, ctx.Seasons, year, avnr);
 | 
			
		||||
                var p = (await ctx.MemberPayments.FindAsync(year, avnr, m.MgNr))!;
 | 
			
		||||
                var b = BillingData.FromJson((await ctx.PaymentVariants.FindAsync(year, avnr))!.Data);
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                try {
 | 
			
		||||
                    using var ctx = new AppDbContext();
 | 
			
		||||
                    var v = (await ctx.PaymentVariants.FindAsync(year, avnr))!;
 | 
			
		||||
                    var data = await CreditNoteDeliveryData.ForPaymentVariant(ctx.CreditNoteDeliveryRows, ctx.Seasons, year, avnr);
 | 
			
		||||
                    var p = (await ctx.MemberPayments.FindAsync(year, avnr, m.MgNr))!;
 | 
			
		||||
                    var b = BillingData.FromJson((await ctx.PaymentVariants.FindAsync(year, avnr))!.Data);
 | 
			
		||||
 | 
			
		||||
                using var doc = new CreditNote(ctx, p, data[m.MgNr],
 | 
			
		||||
                    b.ConsiderContractPenalties, b.ConsiderTotalPenalty, b.ConsiderAutoBusinessShares, b.ConsiderCustomModifiers,
 | 
			
		||||
                    await ctx.GetMemberUnderDelivery(year, m.MgNr));
 | 
			
		||||
                await Utils.ExportDocument(doc, mode, emailData: (m, $"{CreditNote.Name} {v.Name}", $"Im Anhang finden Sie die Traubengutschrift {v.Name}"));
 | 
			
		||||
            } catch (Exception exc) {
 | 
			
		||||
                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
            }
 | 
			
		||||
                    using var doc = new CreditNote(ctx, p, data[m.MgNr],
 | 
			
		||||
                        b.ConsiderContractPenalties, b.ConsiderTotalPenalty, b.ConsiderAutoBusinessShares, b.ConsiderCustomModifiers,
 | 
			
		||||
                        await ctx.GetMemberUnderDelivery(year, m.MgNr));
 | 
			
		||||
                    await Utils.ExportDocument(doc, mode, emailData: (m, $"{CreditNote.Name} {v.Name}", $"Im Anhang finden Sie die Traubengutschrift {v.Name}"));
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -464,14 +470,16 @@ namespace Elwig.Services {
 | 
			
		||||
                    Title = $"{MemberList.Name} speichern unter - Elwig"
 | 
			
		||||
                };
 | 
			
		||||
                if (d.ShowDialog() == true) {
 | 
			
		||||
                    Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                    try {
 | 
			
		||||
                        var data = await MemberListData.FromQuery(query, filterNames, filterNames.Where(f => f.StartsWith("Flächenbindung")).Select(f => f.Split(' ')[^1]));
 | 
			
		||||
                        using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                        await ods.AddTable(data);
 | 
			
		||||
                    } catch (Exception exc) {
 | 
			
		||||
                        MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                    }
 | 
			
		||||
                    Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                    await Task.Run(async () => {
 | 
			
		||||
                        try {
 | 
			
		||||
                            var data = await MemberListData.FromQuery(query, filterNames, filterNames.Where(f => f.StartsWith("Flächenbindung")).Select(f => f.Split(' ')[^1]));
 | 
			
		||||
                            using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                            await ods.AddTable(data);
 | 
			
		||||
                        } catch (Exception exc) {
 | 
			
		||||
                            MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                    Mouse.OverrideCursor = null;
 | 
			
		||||
                }
 | 
			
		||||
            } else if (mode == ExportMode.Export) {
 | 
			
		||||
@@ -482,8 +490,33 @@ namespace Elwig.Services {
 | 
			
		||||
                    Title = $"{MemberList.Name} speichern unter - Elwig"
 | 
			
		||||
                };
 | 
			
		||||
                if (d.ShowDialog() == true) {
 | 
			
		||||
                    Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                    Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                    await Task.Run(async () => {
 | 
			
		||||
                        try {
 | 
			
		||||
                            var members = await query
 | 
			
		||||
                                .OrderBy(m => m.MgNr)
 | 
			
		||||
                                .Include(m => m.BillingAddress)
 | 
			
		||||
                                .Include(m => m.TelephoneNumbers)
 | 
			
		||||
                                .Include(m => m.EmailAddresses)
 | 
			
		||||
                                .AsSplitQuery()
 | 
			
		||||
                                .ToListAsync();
 | 
			
		||||
                            var areaComs = await query
 | 
			
		||||
                                .SelectMany(m => m.AreaCommitments)
 | 
			
		||||
                                .Include(c => c.Rd)
 | 
			
		||||
                                .ToListAsync();
 | 
			
		||||
                            await ElwigData.Export(d.FileName, members, areaComs, filterNames);
 | 
			
		||||
                        } catch (Exception exc) {
 | 
			
		||||
                            MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                    Mouse.OverrideCursor = null;
 | 
			
		||||
                }
 | 
			
		||||
            } 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)
 | 
			
		||||
@@ -495,99 +528,80 @@ namespace Elwig.Services {
 | 
			
		||||
                            .SelectMany(m => m.AreaCommitments)
 | 
			
		||||
                            .Include(c => c.Rd)
 | 
			
		||||
                            .ToListAsync();
 | 
			
		||||
                        await ElwigData.Export(d.FileName, members, areaComs, filterNames);
 | 
			
		||||
                        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, 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);
 | 
			
		||||
                    }
 | 
			
		||||
                    Mouse.OverrideCursor = null;
 | 
			
		||||
                }
 | 
			
		||||
            } else if (mode == ExportMode.Upload && App.Config.SyncUrl != null) {
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                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)
 | 
			
		||||
                        .AsSplitQuery()
 | 
			
		||||
                        .ToListAsync();
 | 
			
		||||
                    var areaComs = await query
 | 
			
		||||
                        .SelectMany(m => m.AreaCommitments)
 | 
			
		||||
                        .Include(c => c.Rd)
 | 
			
		||||
                        .ToListAsync();
 | 
			
		||||
                    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, 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);
 | 
			
		||||
                }
 | 
			
		||||
                });
 | 
			
		||||
                Mouse.OverrideCursor = null;
 | 
			
		||||
            } else {
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                try {
 | 
			
		||||
                    var data = await MemberListData.FromQuery(query, filterNames, filterNames.Where(f => f.StartsWith("Flächenbindung")).Select(f => f.Split(' ')[^1]));
 | 
			
		||||
                    using var doc = new MemberList(string.Join(" / ", filterNames), data);
 | 
			
		||||
                    await Utils.ExportDocument(doc, mode);
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                }
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                await Task.Run(async () => {
 | 
			
		||||
                    try {
 | 
			
		||||
                        var data = await MemberListData.FromQuery(query, filterNames, filterNames.Where(f => f.StartsWith("Flächenbindung")).Select(f => f.Split(' ')[^1]));
 | 
			
		||||
                        using var doc = new MemberList(string.Join(" / ", filterNames), data);
 | 
			
		||||
                        await Utils.ExportDocument(doc, mode);
 | 
			
		||||
                    } catch (Exception exc) {
 | 
			
		||||
                        MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
                Mouse.OverrideCursor = null;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task<int> UpdateMember(this MemberAdminViewModel vm, int? oldMgNr) {
 | 
			
		||||
            var newMgNr = (int)vm.MgNr!;
 | 
			
		||||
            var m = new Member {
 | 
			
		||||
                MgNr = oldMgNr ?? newMgNr,
 | 
			
		||||
                PredecessorMgNr = vm.PredecessorMgNr,
 | 
			
		||||
                IsJuridicalPerson = vm.IsJuridicalPerson,
 | 
			
		||||
                Prefix = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.Prefix) ? null : vm.Prefix,
 | 
			
		||||
                GivenName = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.GivenName) ? null : vm.GivenName,
 | 
			
		||||
                Name = vm.Name!,
 | 
			
		||||
                Suffix = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.Suffix) ? null : vm.Suffix,
 | 
			
		||||
                ForTheAttentionOf = !vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.ForTheAttentionOf) ? null : vm.ForTheAttentionOf,
 | 
			
		||||
                Birthday = string.IsNullOrEmpty(vm.Birthday) ? null : string.Join("-", vm.Birthday!.Split(".").Reverse()),
 | 
			
		||||
                IsDeceased = vm.IsDeceased,
 | 
			
		||||
                CountryNum = 40,  // Austria AT AUT
 | 
			
		||||
                PostalDestId = vm.Ort!.Id,
 | 
			
		||||
                Address = vm.Address!,
 | 
			
		||||
 | 
			
		||||
            using (var ctx = new AppDbContext()) {
 | 
			
		||||
                var m = new Member {
 | 
			
		||||
                    MgNr = oldMgNr ?? newMgNr,
 | 
			
		||||
                    PredecessorMgNr = vm.PredecessorMgNr,
 | 
			
		||||
                    IsJuridicalPerson = vm.IsJuridicalPerson,
 | 
			
		||||
                    Prefix = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.Prefix) ? null : vm.Prefix,
 | 
			
		||||
                    GivenName = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.GivenName) ? null : vm.GivenName,
 | 
			
		||||
                    Name = vm.Name!,
 | 
			
		||||
                    Suffix = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.Suffix) ? null : vm.Suffix,
 | 
			
		||||
                    ForTheAttentionOf = !vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.ForTheAttentionOf) ? null : vm.ForTheAttentionOf,
 | 
			
		||||
                    Birthday = string.IsNullOrEmpty(vm.Birthday) ? null : string.Join("-", vm.Birthday!.Split(".").Reverse()),
 | 
			
		||||
                    IsDeceased = vm.IsDeceased,
 | 
			
		||||
                    CountryNum = 40,  // Austria AT AUT
 | 
			
		||||
                    PostalDestId = vm.Ort!.Id,
 | 
			
		||||
                    Address = vm.Address!,
 | 
			
		||||
                Iban = string.IsNullOrEmpty(vm.Iban) ? null : vm.Iban?.Replace(" ", ""),
 | 
			
		||||
                Bic = string.IsNullOrEmpty(vm.Bic) ? null : vm.Bic,
 | 
			
		||||
 | 
			
		||||
                    Iban = string.IsNullOrEmpty(vm.Iban) ? null : vm.Iban?.Replace(" ", ""),
 | 
			
		||||
                    Bic = string.IsNullOrEmpty(vm.Bic) ? null : vm.Bic,
 | 
			
		||||
                UstIdNr = string.IsNullOrEmpty(vm.UstIdNr) ? null : vm.UstIdNr,
 | 
			
		||||
                LfbisNr = string.IsNullOrEmpty(vm.LfbisNr) ? null : vm.LfbisNr,
 | 
			
		||||
                IsBuchführend = vm.IsBuchführend,
 | 
			
		||||
                IsOrganic = vm.IsOrganic,
 | 
			
		||||
 | 
			
		||||
                    UstIdNr = string.IsNullOrEmpty(vm.UstIdNr) ? null : vm.UstIdNr,
 | 
			
		||||
                    LfbisNr = string.IsNullOrEmpty(vm.LfbisNr) ? null : vm.LfbisNr,
 | 
			
		||||
                    IsBuchführend = vm.IsBuchführend,
 | 
			
		||||
                    IsOrganic = vm.IsOrganic,
 | 
			
		||||
 | 
			
		||||
                    EntryDateString = string.IsNullOrEmpty(vm.EntryDate) ? null : string.Join("-", vm.EntryDate.Split(".").Reverse()),
 | 
			
		||||
                    ExitDateString = string.IsNullOrEmpty(vm.ExitDate) ? null : string.Join("-", vm.ExitDate.Split(".").Reverse()),
 | 
			
		||||
                    BusinessShares = (int)vm.BusinessShares!,
 | 
			
		||||
                    AccountingNr = string.IsNullOrEmpty(vm.AccountingNr) ? null : vm.AccountingNr,
 | 
			
		||||
                    IsActive = vm.IsActive,
 | 
			
		||||
                    IsVollLieferant = vm.IsVollLieferant,
 | 
			
		||||
                    IsFunktionär = vm.IsFunktionär,
 | 
			
		||||
                    ZwstId = vm.Branch?.ZwstId,
 | 
			
		||||
                    DefaultKgNr = vm.DefaultKg?.KgNr,
 | 
			
		||||
                    Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment,
 | 
			
		||||
                    ContactViaPost = vm.ContactViaPost,
 | 
			
		||||
                    ContactViaEmail = vm.ContactViaEmail,
 | 
			
		||||
                };
 | 
			
		||||
                EntryDateString = string.IsNullOrEmpty(vm.EntryDate) ? null : string.Join("-", vm.EntryDate.Split(".").Reverse()),
 | 
			
		||||
                ExitDateString = string.IsNullOrEmpty(vm.ExitDate) ? null : string.Join("-", vm.ExitDate.Split(".").Reverse()),
 | 
			
		||||
                BusinessShares = (int)vm.BusinessShares!,
 | 
			
		||||
                AccountingNr = string.IsNullOrEmpty(vm.AccountingNr) ? null : vm.AccountingNr,
 | 
			
		||||
                IsActive = vm.IsActive,
 | 
			
		||||
                IsVollLieferant = vm.IsVollLieferant,
 | 
			
		||||
                IsFunktionär = vm.IsFunktionär,
 | 
			
		||||
                ZwstId = vm.Branch?.ZwstId,
 | 
			
		||||
                DefaultKgNr = vm.DefaultKg?.KgNr,
 | 
			
		||||
                Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment,
 | 
			
		||||
                ContactViaPost = vm.ContactViaPost,
 | 
			
		||||
                ContactViaEmail = vm.ContactViaEmail,
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                if (oldMgNr != null) {
 | 
			
		||||
                    ctx.Update(m);
 | 
			
		||||
                } else {
 | 
			
		||||
@@ -670,7 +684,7 @@ namespace Elwig.Services {
 | 
			
		||||
                if (newMgNr != m.MgNr) {
 | 
			
		||||
                    await ctx.Database.ExecuteSqlAsync($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {oldMgNr}");
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            App.HintContextChange();
 | 
			
		||||
 | 
			
		||||
@@ -678,7 +692,8 @@ namespace Elwig.Services {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static async Task DeleteMember(int mgnr, bool deletePaymentData, bool deleteDeliveries, bool deleteAreaComs) {
 | 
			
		||||
            using (var ctx = new AppDbContext()) {
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                var l = (await ctx.Members.FindAsync(mgnr))!;
 | 
			
		||||
                if (deletePaymentData) {
 | 
			
		||||
                    ctx.RemoveRange(l.Credits);
 | 
			
		||||
@@ -691,7 +706,8 @@ namespace Elwig.Services {
 | 
			
		||||
                }
 | 
			
		||||
                ctx.Remove(l);
 | 
			
		||||
                await ctx.SaveChangesAsync();
 | 
			
		||||
            }
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            App.HintContextChange();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -203,13 +203,9 @@ namespace Elwig.Windows {
 | 
			
		||||
                $"Soll die Flächenbindung {a.GstNr} ({a.Area} m²) wirklich unwiderruflich gelöscht werden?",
 | 
			
		||||
                "Flächenbindung löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel);
 | 
			
		||||
            if (r == MessageBoxResult.OK) {
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                try {
 | 
			
		||||
                    using (var ctx = new AppDbContext()) {
 | 
			
		||||
                        ctx.Remove(a);
 | 
			
		||||
                        await ctx.SaveChangesAsync();
 | 
			
		||||
                    }
 | 
			
		||||
                    App.HintContextChange();
 | 
			
		||||
                    await AreaComService.DeleteAreaCom(a.FbNr);
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message;
 | 
			
		||||
                    if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
 | 
			
		||||
@@ -227,7 +223,7 @@ namespace Elwig.Windows {
 | 
			
		||||
 | 
			
		||||
        private async void AreaCommitmentSaveButton_Click(object? sender, RoutedEventArgs? evt) {
 | 
			
		||||
            AreaCommitmentSaveButton.IsEnabled = false;
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
 | 
			
		||||
            int fbnr;
 | 
			
		||||
            try {
 | 
			
		||||
@@ -237,9 +233,8 @@ namespace Elwig.Windows {
 | 
			
		||||
                if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
 | 
			
		||||
                MessageBox.Show(str, "Flächenbindung aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                AreaCommitmentSaveButton.IsEnabled = true;
 | 
			
		||||
                return;
 | 
			
		||||
            } finally {
 | 
			
		||||
                Mouse.OverrideCursor = null;
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            IsEditing = false;
 | 
			
		||||
@@ -252,6 +247,7 @@ namespace Elwig.Windows {
 | 
			
		||||
            FinishInputFilling();
 | 
			
		||||
            await RefreshList();
 | 
			
		||||
            RefreshInputs();
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
            ViewModel.SearchQuery = "";
 | 
			
		||||
            ControlUtils.SelectItem(AreaCommitmentList, AreaCommitmentList.ItemsSource.Cast<AreaCom>().Where(a => a.FbNr == fbnr).FirstOrDefault());
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -157,7 +157,7 @@ namespace Elwig.Windows {
 | 
			
		||||
            }
 | 
			
		||||
            var d = new NewSeasonDialog(s, currencies);
 | 
			
		||||
            if (d.ShowDialog() == true) {
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                try {
 | 
			
		||||
                    using var ctx = new AppDbContext();
 | 
			
		||||
                    ctx.Add(new Season {
 | 
			
		||||
@@ -209,7 +209,7 @@ namespace Elwig.Windows {
 | 
			
		||||
                $"Soll die Saison {s.Year} wirklich unwiderruflich gelöscht werden?",
 | 
			
		||||
                "Saison löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel);
 | 
			
		||||
            if (r == MessageBoxResult.OK) {
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                try {
 | 
			
		||||
                    using var ctx = new AppDbContext();
 | 
			
		||||
                    ctx.Remove(s);
 | 
			
		||||
 
 | 
			
		||||
@@ -318,8 +318,7 @@ namespace Elwig.Windows {
 | 
			
		||||
 | 
			
		||||
        private async void SaveButton_Click(object? sender, RoutedEventArgs? evt) {
 | 
			
		||||
            SaveButton.IsEnabled = false;
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            try {
 | 
			
		||||
                await Save();
 | 
			
		||||
            } catch (Exception exc) {
 | 
			
		||||
@@ -327,9 +326,8 @@ namespace Elwig.Windows {
 | 
			
		||||
                if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
 | 
			
		||||
                MessageBox.Show(str, "Stammdaten aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                SaveButton.IsEnabled = true;
 | 
			
		||||
                return;
 | 
			
		||||
            } finally {
 | 
			
		||||
                Mouse.OverrideCursor = null;
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            IsEditing = false;
 | 
			
		||||
@@ -349,6 +347,7 @@ namespace Elwig.Windows {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            App.HintContextChange();
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void FillInputs(ClientParameters p, Season? s) {
 | 
			
		||||
 
 | 
			
		||||
@@ -719,7 +719,7 @@ namespace Elwig.Windows {
 | 
			
		||||
        private async void NewDeliveryPartButton_Click(object sender, RoutedEventArgs evt) {
 | 
			
		||||
            FinishButton.IsEnabled = false;
 | 
			
		||||
            NewDeliveryPartButton.IsEnabled = false;
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            DeliveryPartList.IsEnabled = false;
 | 
			
		||||
 | 
			
		||||
            DeliveryPart? p;
 | 
			
		||||
@@ -757,7 +757,7 @@ namespace Elwig.Windows {
 | 
			
		||||
        private async void FinishButton_Click(object sender, RoutedEventArgs evt) {
 | 
			
		||||
            FinishButton.IsEnabled = false;
 | 
			
		||||
            NewDeliveryPartButton.IsEnabled = false;
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            DeliveryPartList.IsEnabled = false;
 | 
			
		||||
 | 
			
		||||
            DeliveryPart? p;
 | 
			
		||||
@@ -888,7 +888,7 @@ namespace Elwig.Windows {
 | 
			
		||||
            if (res == null)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            try {
 | 
			
		||||
                var id = res.Value.Item1;
 | 
			
		||||
                var weights = res.Value.Item2;
 | 
			
		||||
@@ -959,7 +959,7 @@ namespace Elwig.Windows {
 | 
			
		||||
                $"Soll die Lieferung {d.LsNr} ({d.Member.AdministrativeName}, MgNr. {d.Member.MgNr}) wirklich unwiderruflich gelöscht werden?",
 | 
			
		||||
                "Lieferung löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel);
 | 
			
		||||
            if (r == MessageBoxResult.OK) {
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                try {
 | 
			
		||||
                    await DeliveryService.DeleteDelivery(d.LsNr);
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
@@ -979,7 +979,7 @@ namespace Elwig.Windows {
 | 
			
		||||
 | 
			
		||||
        private async void SaveButton_Click(object? sender, RoutedEventArgs? evt) {
 | 
			
		||||
            SaveButton.IsEnabled = false;
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
 | 
			
		||||
            DeliveryPart? p;
 | 
			
		||||
            try {
 | 
			
		||||
@@ -996,9 +996,8 @@ namespace Elwig.Windows {
 | 
			
		||||
                if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
 | 
			
		||||
                MessageBox.Show(str, "Lieferung aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                SaveButton.IsEnabled = true;
 | 
			
		||||
                return;
 | 
			
		||||
            } finally {
 | 
			
		||||
                Mouse.OverrideCursor = null;
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            IsEditing = false;
 | 
			
		||||
@@ -1015,6 +1014,7 @@ namespace Elwig.Windows {
 | 
			
		||||
            await RefreshDeliveryParts();
 | 
			
		||||
            RefreshInputs();
 | 
			
		||||
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
            DepreciateButton.IsEnabled = true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ namespace Elwig.Windows {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private async void Menu_Help_Smtp_Click(object sender, RoutedEventArgs evt) {
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            try {
 | 
			
		||||
                using var client = await Utils.GetSmtpClient();
 | 
			
		||||
                await client!.DisconnectAsync(true);
 | 
			
		||||
@@ -133,8 +133,10 @@ namespace Elwig.Windows {
 | 
			
		||||
                    Multiselect = true,
 | 
			
		||||
                };
 | 
			
		||||
                if (d.ShowDialog() == true) {
 | 
			
		||||
                    Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                    await ElwigData.Import(d.FileNames, ElwigData.ImportMode.Interactively);
 | 
			
		||||
                    Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                    await Task.Run(async () => {
 | 
			
		||||
                        await ElwigData.Import(d.FileNames, ElwigData.ImportMode.Interactively);
 | 
			
		||||
                    });
 | 
			
		||||
                }
 | 
			
		||||
            } catch (Exception exc) {
 | 
			
		||||
                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
@@ -145,77 +147,81 @@ namespace Elwig.Windows {
 | 
			
		||||
        private async void DownloadButton_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!["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();
 | 
			
		||||
            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<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>();
 | 
			
		||||
                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);
 | 
			
		||||
                    var imported = await ElwigData.GetImportedFiles();
 | 
			
		||||
                    var import = files
 | 
			
		||||
                        .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)) {
 | 
			
		||||
                        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, "Fehler", 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 ElwigData.Import(paths, ElwigData.ImportMode.FromBranches);
 | 
			
		||||
            } catch (HttpRequestException exc) {
 | 
			
		||||
                MessageBox.Show("Eventuell Internetverbindung prüfen!\n\n" + exc.Message, "Fehler", 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);
 | 
			
		||||
            }
 | 
			
		||||
            });
 | 
			
		||||
            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}.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)
 | 
			
		||||
                    .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:N0} Lieferungen erfolgreich!", "Lieferungen hochladen",
 | 
			
		||||
                        MessageBoxButton.OK, MessageBoxImage.Information);
 | 
			
		||||
            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)
 | 
			
		||||
                        .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: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, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                }
 | 
			
		||||
            } 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, "Lieferungen hochladen", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
            }
 | 
			
		||||
            });
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -270,24 +276,31 @@ namespace Elwig.Windows {
 | 
			
		||||
            AreaCommitmentsButton.IsEnabled = valid;
 | 
			
		||||
            BreakdownMemberVarietyButton.IsEnabled = valid;
 | 
			
		||||
 | 
			
		||||
            SeasonStatMembersTotal.Text = "-";
 | 
			
		||||
            SeasonStatMembersGeb.Text = "-";
 | 
			
		||||
            SeasonStatWeightTotal.Text = "-";
 | 
			
		||||
            SeasonStatWeightGeb.Text = "-";
 | 
			
		||||
            SeasonStatWeightUngeb.Text = "-";
 | 
			
		||||
            SeasonStatArea.Text = "-";
 | 
			
		||||
            if (valid) {
 | 
			
		||||
                var areaComs = Utils.ActiveAreaCommitments(ctx.AreaCommitments, year!.Value);
 | 
			
		||||
                var weightTotal = await ctx.DeliveryParts.Where(p => p.Year == year).SumAsync(p => p.Weight);
 | 
			
		||||
                var gebWeight = await ctx.DeliveryPartBuckets.Where(b => b.Year == year && b.Discr != "_").SumAsync(b => b.Value);
 | 
			
		||||
                SeasonStatMembersTotal.Text = $"{await ctx.Deliveries.Where(d => d.Year == year).Select(d => d.Member).Distinct().CountAsync():N0}";
 | 
			
		||||
                SeasonStatMembersGeb.Text = $"{await areaComs.Select(c => c.Member).Distinct().CountAsync():N0}";
 | 
			
		||||
                SeasonStatWeightTotal.Text = $"{weightTotal:N0} kg";
 | 
			
		||||
                SeasonStatWeightGeb.Text = $"{gebWeight:N0} kg";
 | 
			
		||||
                SeasonStatWeightUngeb.Text = $"{weightTotal - gebWeight:N0} kg";
 | 
			
		||||
                SeasonStatArea.Text = $"{await areaComs.SumAsync(c => c.Area):N0} m²";
 | 
			
		||||
            } else {
 | 
			
		||||
                SeasonStatMembersTotal.Text = "-";
 | 
			
		||||
                SeasonStatMembersGeb.Text = "-";
 | 
			
		||||
                SeasonStatWeightTotal.Text = "-";
 | 
			
		||||
                SeasonStatWeightGeb.Text = "-";
 | 
			
		||||
                SeasonStatWeightUngeb.Text = "-";
 | 
			
		||||
                SeasonStatArea.Text = "-";
 | 
			
		||||
            }
 | 
			
		||||
                await Task.Run(async () => {
 | 
			
		||||
                    var membersTotal = await ctx.Deliveries.Where(d => d.Year == year).Select(d => d.Member).Distinct().CountAsync();
 | 
			
		||||
                    var areaComs = Utils.ActiveAreaCommitments(ctx.AreaCommitments, year!.Value);
 | 
			
		||||
                    var membersGeb = await areaComs.Select(c => c.Member).Distinct().CountAsync();
 | 
			
		||||
                    var weightTotal = await ctx.DeliveryParts.Where(p => p.Year == year).SumAsync(p => p.Weight);
 | 
			
		||||
                    var gebWeight = await ctx.DeliveryPartBuckets.Where(b => b.Year == year && b.Discr != "_").SumAsync(b => b.Value);
 | 
			
		||||
                    var area = await areaComs.SumAsync(c => c.Area);
 | 
			
		||||
                    await App.MainDispatcher.BeginInvoke(() => {
 | 
			
		||||
                        if (year != SeasonInput.Value) return;
 | 
			
		||||
                        SeasonStatMembersTotal.Text = $"{membersTotal:N0}";
 | 
			
		||||
                        SeasonStatMembersGeb.Text = $"{membersGeb:N0}";
 | 
			
		||||
                        SeasonStatWeightTotal.Text = $"{weightTotal:N0} kg";
 | 
			
		||||
                        SeasonStatWeightGeb.Text = $"{gebWeight:N0} kg";
 | 
			
		||||
                        SeasonStatWeightUngeb.Text = $"{weightTotal - gebWeight:N0} kg";
 | 
			
		||||
                        SeasonStatArea.Text = $"{area:N0} m²";
 | 
			
		||||
                    });
 | 
			
		||||
                });
 | 
			
		||||
            };
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void DeliveryConfirmationButton_Click(object sender, RoutedEventArgs evt) {
 | 
			
		||||
@@ -315,22 +328,24 @@ namespace Elwig.Windows {
 | 
			
		||||
            if (d.ShowDialog() == false)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            try {
 | 
			
		||||
                var b = new Billing(year);
 | 
			
		||||
                await b.FinishSeason();
 | 
			
		||||
                await b.CalculateBuckets();
 | 
			
		||||
                App.HintContextChange();
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                try {
 | 
			
		||||
                    var b = new Billing(year);
 | 
			
		||||
                    await b.FinishSeason();
 | 
			
		||||
                    await b.CalculateBuckets();
 | 
			
		||||
                    App.HintContextChange();
 | 
			
		||||
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                var tbl1 = await OverUnderDeliveryData.ForSeason(ctx.OverUnderDeliveryRows, year);
 | 
			
		||||
                var tbl2 = await AreaComUnderDeliveryData.ForSeason(ctx.AreaComUnderDeliveryRows, year);
 | 
			
		||||
                using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                await ods.AddTable(tbl1);
 | 
			
		||||
                await ods.AddTable(tbl2);
 | 
			
		||||
            } catch (Exception exc) {
 | 
			
		||||
                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
            }
 | 
			
		||||
                    using var ctx = new AppDbContext();
 | 
			
		||||
                    var tbl1 = await OverUnderDeliveryData.ForSeason(ctx.OverUnderDeliveryRows, year);
 | 
			
		||||
                    var tbl2 = await AreaComUnderDeliveryData.ForSeason(ctx.AreaComUnderDeliveryRows, year);
 | 
			
		||||
                    using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                    await ods.AddTable(tbl1);
 | 
			
		||||
                    await ods.AddTable(tbl2);
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -346,24 +361,26 @@ namespace Elwig.Windows {
 | 
			
		||||
            if (d.ShowDialog() == false)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            try {
 | 
			
		||||
                var b = new Billing(year);
 | 
			
		||||
                await b.FinishSeason();
 | 
			
		||||
                await b.CalculateBuckets();
 | 
			
		||||
                App.HintContextChange();
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                try {
 | 
			
		||||
                    var b = new Billing(year);
 | 
			
		||||
                    await b.FinishSeason();
 | 
			
		||||
                    await b.CalculateBuckets();
 | 
			
		||||
                    App.HintContextChange();
 | 
			
		||||
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                var tblTotal = await WeightBreakdownData.ForSeason(ctx.WeightBreakDownRows, year);
 | 
			
		||||
                await ods.AddTable(tblTotal);
 | 
			
		||||
                foreach (var branch in await ctx.Branches.OrderBy(b => b.Name).ToListAsync()) {
 | 
			
		||||
                    var tbl = await WeightBreakdownData.ForSeason(ctx.WeightBreakDownRows, year, branch);
 | 
			
		||||
                    await ods.AddTable(tbl);
 | 
			
		||||
                    using var ctx = new AppDbContext();
 | 
			
		||||
                    using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                    var tblTotal = await WeightBreakdownData.ForSeason(ctx.WeightBreakDownRows, year);
 | 
			
		||||
                    await ods.AddTable(tblTotal);
 | 
			
		||||
                    foreach (var branch in await ctx.Branches.OrderBy(b => b.Name).ToListAsync()) {
 | 
			
		||||
                        var tbl = await WeightBreakdownData.ForSeason(ctx.WeightBreakDownRows, year, branch);
 | 
			
		||||
                        await ods.AddTable(tbl);
 | 
			
		||||
                    }
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                }
 | 
			
		||||
            } catch (Exception exc) {
 | 
			
		||||
                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
            }
 | 
			
		||||
            });
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -379,20 +396,22 @@ namespace Elwig.Windows {
 | 
			
		||||
            if (d.ShowDialog() == false)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            try {
 | 
			
		||||
                var b = new Billing(year);
 | 
			
		||||
                await b.FinishSeason();
 | 
			
		||||
                await b.CalculateBuckets();
 | 
			
		||||
                App.HintContextChange();
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                try {
 | 
			
		||||
                    var b = new Billing(year);
 | 
			
		||||
                    await b.FinishSeason();
 | 
			
		||||
                    await b.CalculateBuckets();
 | 
			
		||||
                    App.HintContextChange();
 | 
			
		||||
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                var tbl = await MemberAreaComsData.ForSeason(ctx.MemberAreaComsRows, year);
 | 
			
		||||
                using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                await ods.AddTable(tbl);
 | 
			
		||||
            } catch (Exception exc) {
 | 
			
		||||
                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
            }
 | 
			
		||||
                    using var ctx = new AppDbContext();
 | 
			
		||||
                    var tbl = await MemberAreaComsData.ForSeason(ctx.MemberAreaComsRows, year);
 | 
			
		||||
                    using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                    await ods.AddTable(tbl);
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -408,20 +427,22 @@ namespace Elwig.Windows {
 | 
			
		||||
            if (d.ShowDialog() == false)
 | 
			
		||||
                return;
 | 
			
		||||
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            try {
 | 
			
		||||
                var b = new Billing(year);
 | 
			
		||||
                await b.FinishSeason();
 | 
			
		||||
                await b.CalculateBuckets();
 | 
			
		||||
                App.HintContextChange();
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            await Task.Run(async () => {
 | 
			
		||||
                try {
 | 
			
		||||
                    var b = new Billing(year);
 | 
			
		||||
                    await b.FinishSeason();
 | 
			
		||||
                    await b.CalculateBuckets();
 | 
			
		||||
                    App.HintContextChange();
 | 
			
		||||
 | 
			
		||||
                using var ctx = new AppDbContext();
 | 
			
		||||
                var tbl = await MemberDeliveryPerVarietyData.ForSeason(ctx.MemberDeliveryPerVariantRows, year);
 | 
			
		||||
                using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                await ods.AddTable(tbl);
 | 
			
		||||
            } catch (Exception exc) {
 | 
			
		||||
                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
            }
 | 
			
		||||
                    using var ctx = new AppDbContext();
 | 
			
		||||
                    var tbl = await MemberDeliveryPerVarietyData.ForSeason(ctx.MemberDeliveryPerVariantRows, year);
 | 
			
		||||
                    using var ods = new OdsFile(d.FileName);
 | 
			
		||||
                    await ods.AddTable(tbl);
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -389,7 +389,7 @@ namespace Elwig.Windows {
 | 
			
		||||
            }
 | 
			
		||||
            var d = new DeleteMemberDialog(m.MgNr, m.AdministrativeName, areaComs, deliveries, credits);
 | 
			
		||||
            if (d.ShowDialog() == true) {
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
                Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
                try {
 | 
			
		||||
                    await MemberService.DeleteMember(m.MgNr, d.DeletePaymentData, d.DeleteDeliveries, d.DeleteAreaComs);
 | 
			
		||||
                } catch (Exception exc) {
 | 
			
		||||
@@ -408,7 +408,7 @@ namespace Elwig.Windows {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private async void SaveButton_Click(object? sender, RoutedEventArgs? evt) {
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            SaveButton.IsEnabled = false;
 | 
			
		||||
 | 
			
		||||
            int mgnr;
 | 
			
		||||
@@ -419,9 +419,8 @@ namespace Elwig.Windows {
 | 
			
		||||
                if (exc.InnerException != null) str += "\n\n" + exc.InnerException.Message;
 | 
			
		||||
                MessageBox.Show(str, "Mitglied aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                SaveButton.IsEnabled = true;
 | 
			
		||||
                return;
 | 
			
		||||
            } finally {
 | 
			
		||||
                Mouse.OverrideCursor = null;
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            IsEditing = false;
 | 
			
		||||
@@ -436,6 +435,7 @@ namespace Elwig.Windows {
 | 
			
		||||
            await RefreshList();
 | 
			
		||||
            RefreshInputs();
 | 
			
		||||
            ViewModel.SearchQuery = "";
 | 
			
		||||
            Mouse.OverrideCursor = null;
 | 
			
		||||
            if (mgnr is int m)
 | 
			
		||||
                FocusMember(m);
 | 
			
		||||
        }
 | 
			
		||||
@@ -491,15 +491,17 @@ namespace Elwig.Windows {
 | 
			
		||||
 | 
			
		||||
        private async void Menu_Contact_Letterhead_Click(object sender, RoutedEventArgs evt) {
 | 
			
		||||
            if (ViewModel.SelectedMember is not Member m) return;
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
			
		||||
            Mouse.OverrideCursor = Cursors.Wait;
 | 
			
		||||
            try {
 | 
			
		||||
                using var doc = new Letterhead(m);
 | 
			
		||||
                await doc.Generate();
 | 
			
		||||
                if (!App.Config.Debug) {
 | 
			
		||||
                    await doc.Print();
 | 
			
		||||
                } else {
 | 
			
		||||
                    doc.Show();
 | 
			
		||||
                }
 | 
			
		||||
                await Task.Run(async () => {
 | 
			
		||||
                    using var doc = new Letterhead(m);
 | 
			
		||||
                    await doc.Generate();
 | 
			
		||||
                    if (!App.Config.Debug) {
 | 
			
		||||
                        await doc.Print();
 | 
			
		||||
                    } else {
 | 
			
		||||
                        doc.Show();
 | 
			
		||||
                    }
 | 
			
		||||
                });
 | 
			
		||||
            } catch (Exception exc) {
 | 
			
		||||
                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user