AppDbContext: Move all calls to App.HintContextChange() outside of any AppDbContext block
All checks were successful
Test / Run tests (push) Successful in 2m44s

This commit is contained in:
2024-09-05 17:21:00 +02:00
parent 7437187630
commit 8d9172f91e
6 changed files with 180 additions and 169 deletions

View File

@ -53,7 +53,7 @@ namespace Elwig {
public static Dispatcher MainDispatcher { get; private set; } public static Dispatcher MainDispatcher { get; private set; }
private DateTime LastChanged; private DateTime LastChanged;
private static DateTime CurrentLastWrite => File.GetLastWriteTime(Config.DatabaseFile); 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() { public App() : base() {
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

View File

@ -100,39 +100,40 @@ namespace Elwig.Services {
} }
public static async Task<int> UpdateAreaCommitment(this AreaComAdminViewModel vm, int? oldFbNr) { public static async Task<int> UpdateAreaCommitment(this AreaComAdminViewModel vm, int? oldFbNr) {
using var ctx = new AppDbContext();
int newFbNr = (int)vm.FbNr!; int newFbNr = (int)vm.FbNr!;
var a = new AreaCom { using (var ctx = new AppDbContext()) {
FbNr = oldFbNr ?? newFbNr, var a = new AreaCom {
MgNr = (int)vm.MgNr!, FbNr = oldFbNr ?? newFbNr,
YearFrom = (int)vm.YearFrom!, MgNr = (int)vm.MgNr!,
YearTo = vm.YearTo, YearFrom = (int)vm.YearFrom!,
VtrgId = vm.AreaComType!.VtrgId, YearTo = vm.YearTo,
CultId = vm.WineCult?.CultId, VtrgId = vm.AreaComType!.VtrgId,
Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment, CultId = vm.WineCult?.CultId,
KgNr = vm.Kg!.KgNr, Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment,
RdNr = vm.Rd?.RdNr, KgNr = vm.Kg!.KgNr,
GstNr = vm.GstNr!.Trim(), RdNr = vm.Rd?.RdNr,
Area = (int)vm.Area!, GstNr = vm.GstNr!.Trim(),
}; Area = (int)vm.Area!,
};
if (vm.Rd?.RdNr == 0) { if (vm.Rd?.RdNr == 0) {
vm.Rd.RdNr = await ctx.NextRdNr(a.KgNr); vm.Rd.RdNr = await ctx.NextRdNr(a.KgNr);
a.RdNr = vm.Rd.RdNr; a.RdNr = vm.Rd.RdNr;
ctx.Add(vm.Rd); ctx.Add(vm.Rd);
} }
if (oldFbNr != null) { if (oldFbNr != null) {
ctx.Update(a); ctx.Update(a);
} else { } else {
ctx.Add(a); ctx.Add(a);
} }
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
if (newFbNr != a.FbNr) { if (newFbNr != a.FbNr) {
await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment SET fbnr = {newFbNr} WHERE fbnr = {oldFbNr}"); await ctx.Database.ExecuteSqlAsync($"UPDATE area_commitment SET fbnr = {newFbNr} WHERE fbnr = {oldFbNr}");
}
} }
await App.HintContextChange(); await App.HintContextChange();

View File

@ -502,126 +502,128 @@ namespace Elwig.Services {
} }
public static async Task<int> UpdateMember(this MemberAdminViewModel vm, int? oldMgNr) { public static async Task<int> UpdateMember(this MemberAdminViewModel vm, int? oldMgNr) {
using var ctx = new AppDbContext();
var newMgNr = (int)vm.MgNr!; 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(" ", ""), using (var ctx = new AppDbContext()) {
Bic = string.IsNullOrEmpty(vm.Bic) ? null : vm.Bic, 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, Iban = string.IsNullOrEmpty(vm.Iban) ? null : vm.Iban?.Replace(" ", ""),
LfbisNr = string.IsNullOrEmpty(vm.LfbisNr) ? null : vm.LfbisNr, Bic = string.IsNullOrEmpty(vm.Bic) ? null : vm.Bic,
IsBuchführend = vm.IsBuchführend,
IsOrganic = vm.IsOrganic,
EntryDateString = string.IsNullOrEmpty(vm.EntryDate) ? null : string.Join("-", vm.EntryDate.Split(".").Reverse()), UstIdNr = string.IsNullOrEmpty(vm.UstIdNr) ? null : vm.UstIdNr,
ExitDateString = string.IsNullOrEmpty(vm.ExitDate) ? null : string.Join("-", vm.ExitDate.Split(".").Reverse()), LfbisNr = string.IsNullOrEmpty(vm.LfbisNr) ? null : vm.LfbisNr,
BusinessShares = (int)vm.BusinessShares!, IsBuchführend = vm.IsBuchführend,
AccountingNr = string.IsNullOrEmpty(vm.AccountingNr) ? null : vm.AccountingNr, IsOrganic = vm.IsOrganic,
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,
};
if (oldMgNr != null) { EntryDateString = string.IsNullOrEmpty(vm.EntryDate) ? null : string.Join("-", vm.EntryDate.Split(".").Reverse()),
ctx.Update(m); ExitDateString = string.IsNullOrEmpty(vm.ExitDate) ? null : string.Join("-", vm.ExitDate.Split(".").Reverse()),
} else { BusinessShares = (int)vm.BusinessShares!,
ctx.Add(m); 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 (oldMgNr != null) {
if (vm.BillingOrt != null && vm.BillingName != null) { ctx.Update(m);
var p = vm.BillingOrt; } else {
ctx.Add(new BillingAddr { ctx.Add(m);
MgNr = m.MgNr, }
FullName = vm.BillingName,
Address = vm.BillingAddress ?? "",
CountryNum = p.CountryNum,
PostalDestId = p.Id,
});
}
ctx.RemoveRange(ctx.MemberTelephoneNrs.Where(t => t.MgNr == oldMgNr)); ctx.RemoveRange(ctx.BillingAddresses.Where(a => a.MgNr == oldMgNr));
ctx.AddRange(vm.PhoneNrs if (vm.BillingOrt != null && vm.BillingName != null) {
.Where(input => input.Number != null && input.Number != "") var p = vm.BillingOrt;
.Select((input, i) => new MemberTelNr { ctx.Add(new BillingAddr {
MgNr = m.MgNr, MgNr = m.MgNr,
Nr = i + 1, FullName = vm.BillingName,
Type = input.Type == -1 ? (input.Number!.StartsWith("+43 ") && input.Number![4] == '6' ? "mobile" : "landline") : vm.PhoneNrTypes[input.Type].Key, Address = vm.BillingAddress ?? "",
Number = input.Number!, CountryNum = p.CountryNum,
Comment = input.Comment, PostalDestId = p.Id,
})); });
}
ctx.RemoveRange(ctx.MemberEmailAddrs.Where(e => e.MgNr == oldMgNr)); ctx.RemoveRange(ctx.MemberTelephoneNrs.Where(t => t.MgNr == oldMgNr));
ctx.AddRange(vm.EmailAddresses ctx.AddRange(vm.PhoneNrs
.Where(input => input != null && input != "") .Where(input => input.Number != null && input.Number != "")
.Select((input, i) => new MemberEmailAddr { .Select((input, i) => new MemberTelNr {
MgNr = m.MgNr, MgNr = m.MgNr,
Nr = i + 1, Nr = i + 1,
Address = input!, Type = input.Type == -1 ? (input.Number!.StartsWith("+43 ") && input.Number![4] == '6' ? "mobile" : "landline") : vm.PhoneNrTypes[input.Type].Key,
Comment = null, 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(); await ctx.SaveChangesAsync();
}
vm.TransferPredecessorAreaComs = null;
if (vm.CancelAreaComs is int yearTo) { if (vm.TransferPredecessorAreaComs is int year && m.PredecessorMgNr is int predecessor) {
var areaComs = await ctx.AreaCommitments var areaComs = await ctx.AreaCommitments
.Where(c => c.MgNr == m.MgNr && (c.YearTo == null || c.YearTo > yearTo)) .Where(c => c.MgNr == predecessor && (c.YearTo == null || c.YearTo >= year))
.ToListAsync(); .ToListAsync();
foreach (var ac in areaComs) var fbNr = await ctx.NextFbNr();
ac.YearTo = yearTo; ctx.AddRange(areaComs.Select((c, i) => new AreaCom {
ctx.UpdateRange(areaComs); FbNr = fbNr + i,
await ctx.SaveChangesAsync(); MgNr = m.MgNr,
} VtrgId = c.VtrgId,
vm.CancelAreaComs = null; 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) { foreach (var ac in areaComs)
await ctx.Database.ExecuteSqlAsync($"UPDATE member SET mgnr = {newMgNr} WHERE mgnr = {oldMgNr}"); 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(); await App.HintContextChange();

View File

@ -662,14 +662,15 @@ namespace Elwig.Windows {
private async void SaveButton_Click(object sender, RoutedEventArgs e) { private async void SaveButton_Click(object sender, RoutedEventArgs e) {
try { try {
using var ctx = new AppDbContext(); using (var ctx = new AppDbContext()) {
var origData = BillingData.FromJson(PaymentVar.Data); var origData = BillingData.FromJson(PaymentVar.Data);
var data = BillingData.FromGraphEntries(GraphEntries, origData, Utils.GetVaributes(ctx, Year), var data = BillingData.FromGraphEntries(GraphEntries, origData, Utils.GetVaributes(ctx, Year),
AllVaributesAssigned, AllVaributesAssignedAbgew); AllVaributesAssigned, AllVaributesAssignedAbgew);
PaymentVar.Data = data.ToJsonString(); PaymentVar.Data = data.ToJsonString();
ctx.Update(PaymentVar); ctx.Update(PaymentVar);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
}
LockContext = false; LockContext = false;
await App.HintContextChange(); await App.HintContextChange();
} catch (Exception exc) { } catch (Exception exc) {

View File

@ -225,18 +225,21 @@ namespace Elwig.Windows {
private async void AddButton_Click(object sender, RoutedEventArgs evt) { private async void AddButton_Click(object sender, RoutedEventArgs evt) {
try { try {
using var ctx = new AppDbContext(); PaymentVar? v;
var v = new PaymentVar { using (var ctx = new AppDbContext()) {
Year = Year, v = new PaymentVar {
AvNr = await ctx.NextAvNr(Year), Year = Year,
Name = "Neue Auszahlungsvariante", AvNr = await ctx.NextAvNr(Year),
TestVariant = true, Name = "Neue Auszahlungsvariante",
DateString = $"{DateTime.Today:yyyy-MM-dd}", TestVariant = true,
Data = "{\"mode\": \"elwig\", \"version\": 1, \"payment\": {}, \"curves\": []}", 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(); await App.HintContextChange();
ControlUtils.SelectItem(PaymentVariantList, v); ControlUtils.SelectItem(PaymentVariantList, v);
@ -250,18 +253,21 @@ namespace Elwig.Windows {
private async void CopyButton_Click(object sender, RoutedEventArgs evt) { private async void CopyButton_Click(object sender, RoutedEventArgs evt) {
if (PaymentVariantList.SelectedItem is not PaymentVar orig) return; if (PaymentVariantList.SelectedItem is not PaymentVar orig) return;
try { try {
using var ctx = new AppDbContext(); PaymentVar? n;
var n = new PaymentVar { using (var ctx = new AppDbContext()) {
Year = orig.Year, n = new PaymentVar {
AvNr = await ctx.NextAvNr(Year), Year = orig.Year,
Name = $"{orig.Name} (Kopie)", AvNr = await ctx.NextAvNr(Year),
TestVariant = true, Name = $"{orig.Name} (Kopie)",
DateString = $"{DateTime.Today:yyyy-MM-dd}", TestVariant = true,
Data = orig.Data, DateString = $"{DateTime.Today:yyyy-MM-dd}",
}; Data = orig.Data,
};
ctx.Add(n);
await ctx.SaveChangesAsync();
}
ctx.Add(n);
await ctx.SaveChangesAsync();
await App.HintContextChange(); await App.HintContextChange();
ControlUtils.SelectItem(PaymentVariantList, n); ControlUtils.SelectItem(PaymentVariantList, n);
@ -275,9 +281,10 @@ namespace Elwig.Windows {
private async void DeleteButton_Click(object sender, RoutedEventArgs evt) { private async void DeleteButton_Click(object sender, RoutedEventArgs evt) {
if (PaymentVariantList.SelectedItem is not PaymentVar v || !v.TestVariant) return; if (PaymentVariantList.SelectedItem is not PaymentVar v || !v.TestVariant) return;
try { try {
using var ctx = new AppDbContext(); using (var ctx = new AppDbContext()) {
ctx.Remove(v); ctx.Remove(v);
await ctx.SaveChangesAsync(); await ctx.SaveChangesAsync();
}
await App.HintContextChange(); await App.HintContextChange();
} catch (Exception exc) { } catch (Exception exc) {
var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message; var str = "Der Eintrag konnte nicht in der Datenbank aktualisiert werden!\n\n" + exc.Message;

View File

@ -80,17 +80,17 @@ namespace Tests.HelperTests {
} }
private Task<Dictionary<string, AreaComBucket>> GetMemberAreaCommitmentBuckets(int year, int mgnr) { private Task<Dictionary<string, AreaComBucket>> GetMemberAreaCommitmentBuckets(int year, int mgnr) {
var ctx = new AppDbContext(); using var ctx = new AppDbContext();
return ctx.GetMemberAreaCommitmentBuckets(year, mgnr, Connection); return ctx.GetMemberAreaCommitmentBuckets(year, mgnr, Connection);
} }
private Task<Dictionary<string, int>> GetMemberDeliveryBuckets(int year, int mgnr) { private Task<Dictionary<string, int>> GetMemberDeliveryBuckets(int year, int mgnr) {
var ctx = new AppDbContext(); using var ctx = new AppDbContext();
return ctx.GetMemberDeliveryBuckets(year, mgnr, Connection); return ctx.GetMemberDeliveryBuckets(year, mgnr, Connection);
} }
private Task<Dictionary<string, int>> GetMemberPaymentBuckets(int year, int mgnr) { private Task<Dictionary<string, int>> GetMemberPaymentBuckets(int year, int mgnr) {
var ctx = new AppDbContext(); using var ctx = new AppDbContext();
return ctx.GetMemberPaymentBuckets(year, mgnr, Connection); return ctx.GetMemberPaymentBuckets(year, mgnr, Connection);
} }