From 8d9172f91ee3d7edfb690d68530cb4cd8341c49e Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Thu, 5 Sep 2024 17:21:00 +0200 Subject: [PATCH] AppDbContext: Move all calls to App.HintContextChange() outside of any AppDbContext block --- Elwig/App.xaml.cs | 2 +- Elwig/Services/AreaComService.cs | 55 ++--- Elwig/Services/MemberService.cs | 214 ++++++++++---------- Elwig/Windows/ChartWindow.xaml.cs | 15 +- Elwig/Windows/PaymentVariantsWindow.xaml.cs | 57 +++--- Tests/HelperTests/BillingTest.cs | 6 +- 6 files changed, 180 insertions(+), 169 deletions(-) diff --git a/Elwig/App.xaml.cs b/Elwig/App.xaml.cs index 93ed1ed..38fde09 100644 --- a/Elwig/App.xaml.cs +++ b/Elwig/App.xaml.cs @@ -53,7 +53,7 @@ namespace Elwig { public static Dispatcher MainDispatcher { get; private set; } private DateTime LastChanged; private static DateTime CurrentLastWrite => File.GetLastWriteTime(Config.DatabaseFile); - private readonly DispatcherTimer ContextTimer = new() { Interval = TimeSpan.FromSeconds(5) }; + private readonly DispatcherTimer ContextTimer = new() { Interval = TimeSpan.FromSeconds(2) }; public App() : base() { Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); diff --git a/Elwig/Services/AreaComService.cs b/Elwig/Services/AreaComService.cs index b8d8f7b..09b08b5 100644 --- a/Elwig/Services/AreaComService.cs +++ b/Elwig/Services/AreaComService.cs @@ -100,39 +100,40 @@ namespace Elwig.Services { } public static async Task UpdateAreaCommitment(this AreaComAdminViewModel vm, int? oldFbNr) { - using var ctx = new AppDbContext(); int newFbNr = (int)vm.FbNr!; - var a = new AreaCom { - FbNr = oldFbNr ?? newFbNr, - MgNr = (int)vm.MgNr!, - YearFrom = (int)vm.YearFrom!, - YearTo = vm.YearTo, - VtrgId = vm.AreaComType!.VtrgId, - CultId = vm.WineCult?.CultId, - Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment, - KgNr = vm.Kg!.KgNr, - RdNr = vm.Rd?.RdNr, - GstNr = vm.GstNr!.Trim(), - Area = (int)vm.Area!, - }; + using (var ctx = new AppDbContext()) { + var a = new AreaCom { + FbNr = oldFbNr ?? newFbNr, + MgNr = (int)vm.MgNr!, + YearFrom = (int)vm.YearFrom!, + YearTo = vm.YearTo, + VtrgId = vm.AreaComType!.VtrgId, + CultId = vm.WineCult?.CultId, + Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment, + KgNr = vm.Kg!.KgNr, + RdNr = vm.Rd?.RdNr, + GstNr = vm.GstNr!.Trim(), + Area = (int)vm.Area!, + }; - if (vm.Rd?.RdNr == 0) { - vm.Rd.RdNr = await ctx.NextRdNr(a.KgNr); - a.RdNr = vm.Rd.RdNr; - ctx.Add(vm.Rd); - } + if (vm.Rd?.RdNr == 0) { + vm.Rd.RdNr = await ctx.NextRdNr(a.KgNr); + a.RdNr = vm.Rd.RdNr; + ctx.Add(vm.Rd); + } - if (oldFbNr != null) { - ctx.Update(a); - } else { - ctx.Add(a); - } + if (oldFbNr != null) { + ctx.Update(a); + } else { + ctx.Add(a); + } - await ctx.SaveChangesAsync(); + await ctx.SaveChangesAsync(); - if (newFbNr != a.FbNr) { - await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment SET fbnr = {newFbNr} WHERE fbnr = {oldFbNr}"); + if (newFbNr != a.FbNr) { + await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment SET fbnr = {newFbNr} WHERE fbnr = {oldFbNr}"); + } } await App.HintContextChange(); diff --git a/Elwig/Services/MemberService.cs b/Elwig/Services/MemberService.cs index 719fe6c..fbffee0 100644 --- a/Elwig/Services/MemberService.cs +++ b/Elwig/Services/MemberService.cs @@ -502,126 +502,128 @@ namespace Elwig.Services { } public static async Task UpdateMember(this MemberAdminViewModel vm, int? oldMgNr) { - using var ctx = new AppDbContext(); 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!, - Iban = string.IsNullOrEmpty(vm.Iban) ? null : vm.Iban?.Replace(" ", ""), - Bic = string.IsNullOrEmpty(vm.Bic) ? null : vm.Bic, + 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!, - UstIdNr = string.IsNullOrEmpty(vm.UstIdNr) ? null : vm.UstIdNr, - LfbisNr = string.IsNullOrEmpty(vm.LfbisNr) ? null : vm.LfbisNr, - IsBuchführend = vm.IsBuchführend, - IsOrganic = vm.IsOrganic, + Iban = string.IsNullOrEmpty(vm.Iban) ? null : vm.Iban?.Replace(" ", ""), + Bic = string.IsNullOrEmpty(vm.Bic) ? null : vm.Bic, - 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, - }; + UstIdNr = string.IsNullOrEmpty(vm.UstIdNr) ? null : vm.UstIdNr, + LfbisNr = string.IsNullOrEmpty(vm.LfbisNr) ? null : vm.LfbisNr, + IsBuchführend = vm.IsBuchführend, + IsOrganic = vm.IsOrganic, - if (oldMgNr != null) { - ctx.Update(m); - } else { - ctx.Add(m); - } + 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, + }; - ctx.RemoveRange(ctx.BillingAddresses.Where(a => a.MgNr == oldMgNr)); - if (vm.BillingOrt != null && vm.BillingName != null) { - var p = vm.BillingOrt; - ctx.Add(new BillingAddr { - MgNr = m.MgNr, - FullName = vm.BillingName, - Address = vm.BillingAddress ?? "", - CountryNum = p.CountryNum, - PostalDestId = p.Id, - }); - } + if (oldMgNr != null) { + ctx.Update(m); + } else { + ctx.Add(m); + } - ctx.RemoveRange(ctx.MemberTelephoneNrs.Where(t => t.MgNr == oldMgNr)); - ctx.AddRange(vm.PhoneNrs - .Where(input => input.Number != null && input.Number != "") - .Select((input, i) => new MemberTelNr { - MgNr = m.MgNr, - Nr = i + 1, - Type = input.Type == -1 ? (input.Number!.StartsWith("+43 ") && input.Number![4] == '6' ? "mobile" : "landline") : vm.PhoneNrTypes[input.Type].Key, - Number = input.Number!, - Comment = input.Comment, - })); + ctx.RemoveRange(ctx.BillingAddresses.Where(a => a.MgNr == oldMgNr)); + if (vm.BillingOrt != null && vm.BillingName != null) { + var p = vm.BillingOrt; + ctx.Add(new BillingAddr { + MgNr = m.MgNr, + FullName = vm.BillingName, + Address = vm.BillingAddress ?? "", + CountryNum = p.CountryNum, + PostalDestId = p.Id, + }); + } - ctx.RemoveRange(ctx.MemberEmailAddrs.Where(e => e.MgNr == oldMgNr)); - ctx.AddRange(vm.EmailAddresses - .Where(input => input != null && input != "") - .Select((input, i) => new MemberEmailAddr { - MgNr = m.MgNr, - Nr = i + 1, - Address = input!, - Comment = null, - })); + ctx.RemoveRange(ctx.MemberTelephoneNrs.Where(t => t.MgNr == oldMgNr)); + ctx.AddRange(vm.PhoneNrs + .Where(input => input.Number != null && input.Number != "") + .Select((input, i) => new MemberTelNr { + MgNr = m.MgNr, + Nr = i + 1, + Type = input.Type == -1 ? (input.Number!.StartsWith("+43 ") && input.Number![4] == '6' ? "mobile" : "landline") : vm.PhoneNrTypes[input.Type].Key, + Number = input.Number!, + Comment = input.Comment, + })); - await ctx.SaveChangesAsync(); + ctx.RemoveRange(ctx.MemberEmailAddrs.Where(e => e.MgNr == oldMgNr)); + ctx.AddRange(vm.EmailAddresses + .Where(input => input != null && input != "") + .Select((input, i) => new MemberEmailAddr { + MgNr = m.MgNr, + Nr = i + 1, + Address = input!, + Comment = null, + })); - if (vm.TransferPredecessorAreaComs is int year && m.PredecessorMgNr is int predecessor) { - var areaComs = await ctx.AreaCommitments - .Where(c => c.MgNr == predecessor && (c.YearTo == null || c.YearTo >= year)) - .ToListAsync(); - - var fbNr = await ctx.NextFbNr(); - ctx.AddRange(areaComs.Select((c, i) => new AreaCom { - FbNr = fbNr + i, - MgNr = m.MgNr, - VtrgId = c.VtrgId, - CultId = c.CultId, - Area = c.Area, - KgNr = c.KgNr, - GstNr = c.GstNr, - RdNr = c.RdNr, - YearFrom = vm.MaintainAreaComYearTo ? c.YearFrom : year, - YearTo = c.YearTo, - })); - - foreach (var ac in areaComs) - ac.YearTo = year - 1; - ctx.UpdateRange(areaComs); await ctx.SaveChangesAsync(); - } - vm.TransferPredecessorAreaComs = null; - if (vm.CancelAreaComs is int yearTo) { - var areaComs = await ctx.AreaCommitments - .Where(c => c.MgNr == m.MgNr && (c.YearTo == null || c.YearTo > yearTo)) - .ToListAsync(); + if (vm.TransferPredecessorAreaComs is int year && m.PredecessorMgNr is int predecessor) { + var areaComs = await ctx.AreaCommitments + .Where(c => c.MgNr == predecessor && (c.YearTo == null || c.YearTo >= year)) + .ToListAsync(); - foreach (var ac in areaComs) - ac.YearTo = yearTo; - ctx.UpdateRange(areaComs); - await ctx.SaveChangesAsync(); - } - vm.CancelAreaComs = null; + var fbNr = await ctx.NextFbNr(); + ctx.AddRange(areaComs.Select((c, i) => new AreaCom { + FbNr = fbNr + i, + MgNr = m.MgNr, + VtrgId = c.VtrgId, + CultId = c.CultId, + Area = c.Area, + KgNr = c.KgNr, + GstNr = c.GstNr, + RdNr = c.RdNr, + YearFrom = vm.MaintainAreaComYearTo ? c.YearFrom : year, + YearTo = c.YearTo, + })); - if (newMgNr != m.MgNr) { - await ctx.Database.ExecuteSqlAsync($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {oldMgNr}"); + foreach (var ac in areaComs) + ac.YearTo = year - 1; + ctx.UpdateRange(areaComs); + await ctx.SaveChangesAsync(); + } + vm.TransferPredecessorAreaComs = null; + + if (vm.CancelAreaComs is int yearTo) { + var areaComs = await ctx.AreaCommitments + .Where(c => c.MgNr == m.MgNr && (c.YearTo == null || c.YearTo > yearTo)) + .ToListAsync(); + + foreach (var ac in areaComs) + ac.YearTo = yearTo; + ctx.UpdateRange(areaComs); + await ctx.SaveChangesAsync(); + } + vm.CancelAreaComs = null; + + if (newMgNr != m.MgNr) { + await ctx.Database.ExecuteSqlAsync($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {oldMgNr}"); + } } await App.HintContextChange(); diff --git a/Elwig/Windows/ChartWindow.xaml.cs b/Elwig/Windows/ChartWindow.xaml.cs index 2f96b8f..f320188 100644 --- a/Elwig/Windows/ChartWindow.xaml.cs +++ b/Elwig/Windows/ChartWindow.xaml.cs @@ -662,14 +662,15 @@ namespace Elwig.Windows { private async void SaveButton_Click(object sender, RoutedEventArgs e) { try { - using var ctx = new AppDbContext(); - var origData = BillingData.FromJson(PaymentVar.Data); - var data = BillingData.FromGraphEntries(GraphEntries, origData, Utils.GetVaributes(ctx, Year), - AllVaributesAssigned, AllVaributesAssignedAbgew); + using (var ctx = new AppDbContext()) { + var origData = BillingData.FromJson(PaymentVar.Data); + var data = BillingData.FromGraphEntries(GraphEntries, origData, Utils.GetVaributes(ctx, Year), + AllVaributesAssigned, AllVaributesAssignedAbgew); - PaymentVar.Data = data.ToJsonString(); - ctx.Update(PaymentVar); - await ctx.SaveChangesAsync(); + PaymentVar.Data = data.ToJsonString(); + ctx.Update(PaymentVar); + await ctx.SaveChangesAsync(); + } LockContext = false; await App.HintContextChange(); } catch (Exception exc) { diff --git a/Elwig/Windows/PaymentVariantsWindow.xaml.cs b/Elwig/Windows/PaymentVariantsWindow.xaml.cs index bc77de0..e6a0e9a 100644 --- a/Elwig/Windows/PaymentVariantsWindow.xaml.cs +++ b/Elwig/Windows/PaymentVariantsWindow.xaml.cs @@ -225,18 +225,21 @@ namespace Elwig.Windows { private async void AddButton_Click(object sender, RoutedEventArgs evt) { try { - using var ctx = new AppDbContext(); - var v = new PaymentVar { - Year = Year, - AvNr = await ctx.NextAvNr(Year), - Name = "Neue Auszahlungsvariante", - TestVariant = true, - DateString = $"{DateTime.Today:yyyy-MM-dd}", - Data = "{\"mode\": \"elwig\", \"version\": 1, \"payment\": {}, \"curves\": []}", - }; + PaymentVar? v; + using (var ctx = new AppDbContext()) { + v = new PaymentVar { + Year = Year, + AvNr = await ctx.NextAvNr(Year), + Name = "Neue Auszahlungsvariante", + TestVariant = true, + DateString = $"{DateTime.Today:yyyy-MM-dd}", + Data = "{\"mode\": \"elwig\", \"version\": 1, \"payment\": {}, \"curves\": []}", + }; + + ctx.Add(v); + await ctx.SaveChangesAsync(); + } - ctx.Add(v); - await ctx.SaveChangesAsync(); await App.HintContextChange(); ControlUtils.SelectItem(PaymentVariantList, v); @@ -250,18 +253,21 @@ namespace Elwig.Windows { private async void CopyButton_Click(object sender, RoutedEventArgs evt) { if (PaymentVariantList.SelectedItem is not PaymentVar orig) return; try { - using var ctx = new AppDbContext(); - var n = new PaymentVar { - Year = orig.Year, - AvNr = await ctx.NextAvNr(Year), - Name = $"{orig.Name} (Kopie)", - TestVariant = true, - DateString = $"{DateTime.Today:yyyy-MM-dd}", - Data = orig.Data, - }; + PaymentVar? n; + using (var ctx = new AppDbContext()) { + n = new PaymentVar { + Year = orig.Year, + AvNr = await ctx.NextAvNr(Year), + Name = $"{orig.Name} (Kopie)", + TestVariant = true, + DateString = $"{DateTime.Today:yyyy-MM-dd}", + Data = orig.Data, + }; + + ctx.Add(n); + await ctx.SaveChangesAsync(); + } - ctx.Add(n); - await ctx.SaveChangesAsync(); await App.HintContextChange(); ControlUtils.SelectItem(PaymentVariantList, n); @@ -275,9 +281,10 @@ namespace Elwig.Windows { private async void DeleteButton_Click(object sender, RoutedEventArgs evt) { if (PaymentVariantList.SelectedItem is not PaymentVar v || !v.TestVariant) return; try { - using var ctx = new AppDbContext(); - ctx.Remove(v); - await ctx.SaveChangesAsync(); + using (var ctx = new AppDbContext()) { + ctx.Remove(v); + await ctx.SaveChangesAsync(); + } await App.HintContextChange(); } catch (Exception exc) { var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message; diff --git a/Tests/HelperTests/BillingTest.cs b/Tests/HelperTests/BillingTest.cs index 3bd7764..3b5d076 100644 --- a/Tests/HelperTests/BillingTest.cs +++ b/Tests/HelperTests/BillingTest.cs @@ -80,17 +80,17 @@ namespace Tests.HelperTests { } private Task> GetMemberAreaCommitmentBuckets(int year, int mgnr) { - var ctx = new AppDbContext(); + using var ctx = new AppDbContext(); return ctx.GetMemberAreaCommitmentBuckets(year, mgnr, Connection); } private Task> GetMemberDeliveryBuckets(int year, int mgnr) { - var ctx = new AppDbContext(); + using var ctx = new AppDbContext(); return ctx.GetMemberDeliveryBuckets(year, mgnr, Connection); } private Task> GetMemberPaymentBuckets(int year, int mgnr) { - var ctx = new AppDbContext(); + using var ctx = new AppDbContext(); return ctx.GetMemberPaymentBuckets(year, mgnr, Connection); }