diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs index 31a7da0..c548f74 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs @@ -5,7 +5,6 @@ using Elwig.Helpers.Weighing; using Elwig.Models.Entities; using LinqKit; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.Win32; using System; using System.Collections.Generic; @@ -100,18 +99,32 @@ namespace Elwig.Windows { } public DeliveryAdminWindow(int mgnr) : this() { - Member = Context.Members.Find(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value"); + using var ctx = new AppDbContext(); + Member = GetMember(mgnr) ?? throw new ArgumentException("MgNr argument has invalid value"); Title = $"Lieferungen - {Member.AdministrativeName} - Elwig"; AllSeasonsInput.IsEnabled = true; } + private static async Task GetMemberAsync(int mgnr) { + using var ctx = new AppDbContext(); + return await ctx.Members + .Include(m => m.PostalDest.AtPlz!.Ort) + .Include(m => m.DefaultWbKg!.AtKg) + .FirstOrDefaultAsync(m => m.MgNr == mgnr); + } + + private static Member? GetMember(int mgnr) { + return GetMemberAsync(mgnr).GetAwaiter().GetResult(); + } + private void Window_Loaded(object sender, RoutedEventArgs evt) { OnSecondPassed(null, null); Timer.Start(); LockInputs(); if (IsReceipt) { NewDeliveryButton_Click(null, null); - if ((Context.Seasons.Find(Utils.CurrentYear)) == null) { + using var ctx = new AppDbContext(); + if (ctx.Seasons.Find(Utils.CurrentYear) == null) { MessageBox.Show("Die Saison für das aktuelle Jahr wurde noch nicht erstellt. Neue Lieferungen können nicht abgespeichert werden.", "Saison noch nicht erstellt", MessageBoxButton.OK, MessageBoxImage.Warning); } @@ -122,7 +135,8 @@ namespace Elwig.Windows { if (DeliveryList.SelectedItem is not Delivery d) return; Mouse.OverrideCursor = Cursors.AppStarting; try { - using var doc = new DeliveryNote(d, Context); + using var ctx = new AppDbContext(); + using var doc = new DeliveryNote((await ctx.Deliveries.FindAsync(d.Year, d.DId))!, ctx); await doc.Generate(); doc.Show(); } catch (Exception exc) { @@ -135,7 +149,8 @@ namespace Elwig.Windows { if (DeliveryList.SelectedItem is not Delivery d) return; Mouse.OverrideCursor = Cursors.AppStarting; try { - using var doc = new DeliveryNote(d, Context); + using var ctx = new AppDbContext(); + using var doc = new DeliveryNote((await ctx.Deliveries.FindAsync(d.Year, d.DId))!, ctx); await doc.Generate(); await doc.Print(); } catch (Exception exc) { @@ -164,7 +179,8 @@ namespace Elwig.Windows { private async void Menu_Print_DeliveryJournal_ShowToday_Click(object sender, RoutedEventArgs evt) { Mouse.OverrideCursor = Cursors.AppStarting; try { - var doc = new DeliveryJournal(Context, DateOnly.FromDateTime(Utils.Today)); + using var ctx = new AppDbContext(); + using var doc = new DeliveryJournal(ctx, DateOnly.FromDateTime(Utils.Today)); await doc.Generate(); doc.Show(); } catch (Exception exc) { @@ -176,7 +192,8 @@ namespace Elwig.Windows { private async void Menu_Print_DeliveryJournal_PrintToday_Click(object sender, RoutedEventArgs evt) { Mouse.OverrideCursor = Cursors.AppStarting; try { - var doc = new DeliveryJournal(Context, DateOnly.FromDateTime(Utils.Today)); + using var ctx = new AppDbContext(); + using var doc = new DeliveryJournal(ctx, DateOnly.FromDateTime(Utils.Today)); await doc.Generate(); await doc.Print(); } catch (Exception exc) { @@ -188,7 +205,8 @@ namespace Elwig.Windows { private async void Menu_Print_DeliveryJournal_ShowFilter_Click(object sender, RoutedEventArgs evt) { Mouse.OverrideCursor = Cursors.AppStarting; try { - var (f, _, d, _, _) = await GetFilters(); + using var ctx = new AppDbContext(); + var (f, _, d, _, _) = await GetFilters(ctx); var doc = new DeliveryJournal(string.Join(" / ", f), d); await doc.Generate(); doc.Show(); @@ -201,7 +219,8 @@ namespace Elwig.Windows { private async void Menu_Print_DeliveryJournal_PrintFilter_Click(object sender, RoutedEventArgs evt) { Mouse.OverrideCursor = Cursors.AppStarting; try { - var (f, _, d, _, _) = await GetFilters(); + using var ctx = new AppDbContext(); + var (f, _, d, _, _) = await GetFilters(ctx); var doc = new DeliveryJournal(string.Join(" / ", f), d); await doc.Generate(); doc.Show(); @@ -323,9 +342,9 @@ namespace Elwig.Windows { await RefreshDeliveryListQuery(); } - private async Task<(List, IQueryable, IQueryable, Predicate, List)> GetFilters() { + private async Task<(List, IQueryable, IQueryable, Predicate, List)> GetFilters(AppDbContext ctx) { List filterNames = []; - IQueryable deliveryQuery = Context.Deliveries; + IQueryable deliveryQuery = ctx.Deliveries; if (IsReceipt && App.BranchNum > 1) { deliveryQuery = deliveryQuery.Where(d => d.ZwstId == App.ZwstId); filterNames.Add($"Zweigstelle {App.BranchName}"); @@ -364,12 +383,12 @@ namespace Elwig.Windows { var filter = TextFilter.ToList(); if (filter.Count > 0) { - var var = await Context.WineVarieties.ToDictionaryAsync(v => v.SortId, v => v); - var qual = await Context.WineQualityLevels.Where(q => !q.IsPredicate).ToDictionaryAsync(q => q.QualId, q => q); - var mgnr = await Context.Members.ToDictionaryAsync(m => m.MgNr.ToString(), m => m); - var zwst = await Context.Branches.ToDictionaryAsync(b => b.Name.ToLower().Split(" ")[0], b => b); - var attr = await Context.WineAttributes.ToDictionaryAsync(a => a.Name.ToLower().Split(' ')[0], a => a); - var cult = await Context.WineCultivations.ToDictionaryAsync(c => c.Name.ToLower().Split(' ')[0], c => c); + var var = await ctx.WineVarieties.ToDictionaryAsync(v => v.SortId, v => v); + var qual = await ctx.WineQualityLevels.Where(q => !q.IsPredicate).ToDictionaryAsync(q => q.QualId, q => q); + var mgnr = await ctx.Members.ToDictionaryAsync(m => m.MgNr.ToString(), m => m); + var zwst = await ctx.Branches.ToDictionaryAsync(b => b.Name.ToLower().Split(" ")[0], b => b); + var attr = await ctx.WineAttributes.ToDictionaryAsync(a => a.Name.ToLower().Split(' ')[0], a => a); + var cult = await ctx.WineCultivations.ToDictionaryAsync(c => c.Name.ToLower().Split(' ')[0], c => c); for (int i = 0; i < filter.Count; i++) { var e = filter[i]; @@ -629,8 +648,13 @@ namespace Elwig.Windows { } private async Task RefreshDeliveryListQuery(bool updateSort = false) { - var (_, deliveryQuery, deliveryPartsQuery, predicate, filter) = await GetFilters(); - var deliveries = await deliveryQuery.ToListAsync(); + using var ctx = new AppDbContext(); + var (_, deliveryQuery, deliveryPartsQuery, predicate, filter) = await GetFilters(ctx); + var deliveries = await deliveryQuery + .Include(d => d.Parts).ThenInclude(p => p.PartModifiers) + .ThenInclude(m => m.Modifier) + .AsSplitQuery() + .ToListAsync(); deliveries.Reverse(); if (filter.Count > 0 && deliveries.Count > 0) { @@ -773,9 +797,10 @@ namespace Elwig.Windows { protected override async Task OnRenewContext() { await base.OnRenewContext(); + using var ctx = new AppDbContext(); if (Member != null) { - if (Context.Members.Find(Member.MgNr) is not Member m) { + if (await GetMemberAsync(Member.MgNr) is not Member m) { Close(); return; } @@ -784,7 +809,7 @@ namespace Elwig.Windows { } Menu_Export_Bki.Items.Clear(); - foreach (var s in await Context.Seasons.OrderByDescending(s => s.Year).ToListAsync()) { + foreach (var s in await ctx.Seasons.OrderByDescending(s => s.Year).ToListAsync()) { var i = new MenuItem { Header = $"Saison {s.Year}", }; @@ -795,19 +820,31 @@ namespace Elwig.Windows { await RefreshDeliveryList(); var d = DeliveryList.SelectedItem as Delivery; var y = d?.Year ?? Utils.CurrentLastSeason; - ControlUtils.RenewItemsSource(MemberInput, await Context.Members.Where(m => m.IsActive || !IsCreating).OrderBy(m => m.FamilyName).ThenBy(m => m.GivenName).ToListAsync()); - ControlUtils.RenewItemsSource(BranchInput, await Context.Branches.OrderBy(b => b.Name).ToListAsync()); - ControlUtils.RenewItemsSource(WineVarietyInput, await Context.WineVarieties.OrderBy(v => v.Name).ToListAsync()); - var attrList = await Context.WineAttributes.Where(a => !IsCreating || a.IsActive).OrderBy(a => a.Name).Cast().ToListAsync(); + ControlUtils.RenewItemsSource(MemberInput, await ctx.Members + .Where(m => m.IsActive || !IsCreating) + .Include(m => m.PostalDest.AtPlz!.Ort) + .Include(m => m.DefaultWbKg!.AtKg) + .OrderBy(m => m.FamilyName) + .ThenBy(m => m.GivenName) + .ToListAsync()); + ControlUtils.RenewItemsSource(BranchInput, await ctx.Branches.OrderBy(b => b.Name).ToListAsync()); + ControlUtils.RenewItemsSource(WineVarietyInput, await ctx.WineVarieties.OrderBy(v => v.Name).ToListAsync()); + var attrList = await ctx.WineAttributes.Where(a => !IsCreating || a.IsActive).OrderBy(a => a.Name).Cast().ToListAsync(); attrList.Insert(0, new NullItem("")); ControlUtils.RenewItemsSource(AttributeInput, attrList, null, ControlUtils.RenewSourceDefault.First); - var cultList = await Context.WineCultivations.OrderBy(a => a.Name).Cast().ToListAsync(); + var cultList = await ctx.WineCultivations.OrderBy(a => a.Name).Cast().ToListAsync(); cultList.Insert(0, new NullItem("")); ControlUtils.RenewItemsSource(CultivationInput, cultList, null, ControlUtils.RenewSourceDefault.First); - ControlUtils.RenewItemsSource(WineQualityLevelInput, await Context.WineQualityLevels.ToListAsync()); - ControlUtils.RenewItemsSource(ModifiersInput, await Context.Modifiers.Where(m => m.Year == y).OrderBy(m => m.Ordering).ToListAsync()); - ControlUtils.RenewItemsSource(WineOriginInput, (await Context.WineOrigins.ToListAsync()).OrderByDescending(o => o.SortKey).ThenBy(o => o.HkId)); - var kgList = await Context.WbKgs.Select(k => k.AtKg).OrderBy(k => k.Name).Cast().ToListAsync(); + ControlUtils.RenewItemsSource(WineQualityLevelInput, await ctx.WineQualityLevels.ToListAsync()); + ControlUtils.RenewItemsSource(ModifiersInput, await ctx.Modifiers.Where(m => m.Year == y).OrderBy(m => m.Ordering).ToListAsync()); + ControlUtils.RenewItemsSource(WineOriginInput, (await ctx.WineOrigins.ToListAsync()).OrderByDescending(o => o.SortKey).ThenBy(o => o.HkId)); + var kgList = (await ctx.Katastralgemeinden + .Where(k => k.WbKg != null) + .Include(k => k.WbKg) + .Include(k => k.Gem.WbGem) + .OrderBy(k => k.Name) + .AsSplitQuery() + .ToListAsync()).Cast().ToList(); kgList.Insert(0, new NullItem()); ControlUtils.RenewItemsSource(WineKgInput, kgList); UpdateRdInput(); @@ -825,11 +862,12 @@ namespace Elwig.Windows { } private async Task RefreshDeliveryParts() { + using var ctx = new AppDbContext(); if (DeliveryList.SelectedItem is Delivery d) { - ControlUtils.RenewItemsSource(ModifiersInput, await Context.Modifiers.Where(m => m.Year == d.Year).OrderBy(m => m.Ordering).ToListAsync()); + ControlUtils.RenewItemsSource(ModifiersInput, await ctx.Modifiers.Where(m => m.Year == d.Year).OrderBy(m => m.Ordering).ToListAsync()); ControlUtils.RenewItemsSource(DeliveryPartList, d.FilteredParts.OrderBy(p => p.DPNr).ToList(), DeliveryPartList_SelectionChanged, ControlUtils.RenewSourceDefault.First); } else { - ControlUtils.RenewItemsSource(ModifiersInput, await Context.Modifiers.Where(m => m.Year == Utils.CurrentLastSeason).OrderBy(m => m.Ordering).ToListAsync()); + ControlUtils.RenewItemsSource(ModifiersInput, await ctx.Modifiers.Where(m => m.Year == Utils.CurrentLastSeason).OrderBy(m => m.Ordering).ToListAsync()); DeliveryPartList.ItemsSource = null; } } @@ -902,100 +940,95 @@ namespace Elwig.Windows { FinishInputFilling(); } - private async Task UpdateDeliveryPart(Delivery? d, DeliveryPart? p) { - int year, did, dpnr; - bool deliveryNew = (d == null), partNew = (p == null); - var originalMgNr = d?.MgNr; - var originalMemberKgNr = d?.Member?.DefaultKgNr; - if (d == null) { - d = Context.CreateProxy(); - year = Utils.CurrentYear; - did = await Context.NextDId(year); - } else { - year = d.Year; - did = d.DId; - } - if (p == null) { - p = Context.CreateProxy(); - dpnr = await Context.NextDPNr(year, did); - } else { - dpnr = p.DPNr; - } - d.Year = year; - d.DId = did; - p.Year = year; - p.DId = did; - p.DPNr = dpnr; + private async Task UpdateDeliveryPart(int? oldYear, int? oldDid, int? oldDpnr) { + using var ctx = new AppDbContext(); - d.DateString = string.Join("-", DateInput.Text.Split(".").Reverse()); - if (deliveryNew || InputHasChanged(DateInput)) { - d.LNr = await Context.NextLNr(d.Date); - } + int year = oldYear ?? Utils.CurrentYear; + int did = oldDid ?? await ctx.NextDId(year); + int dpnr = oldDpnr ?? await ctx.NextDPNr(year, did); + + var oldDelivery = await ctx.Deliveries.FindAsync(year, did); + bool deliveryNew = (oldDid == null); + bool partNew = (oldDpnr == null); + var originalMgNr = oldDelivery?.MgNr; + var originalMemberKgNr = oldDelivery?.Member.DefaultKgNr; + + var date = DateOnly.ParseExact(DateInput.Text, "dd.MM.yyyy"); + int? newLnr = (deliveryNew || InputHasChanged(DateInput)) ? await ctx.NextLNr(date) : null; + + string? newTimeString = null; if (IsCreating && !InputIsNotDefault(TimeInput)) { - d.TimeString = DateTime.Now.ToString("HH:mm:ss"); + newTimeString = DateTime.Now.ToString("HH:mm:ss"); } else if (IsCreating || InputHasChanged(TimeInput)) { - d.TimeString = (TimeInput.Text != "") ? TimeInput.Text + ":00" : null; + newTimeString = (TimeInput.Text != "") ? TimeInput.Text + ":00" : null; } - d.ZwstId = (BranchInput.SelectedItem as Branch)!.ZwstId; - d.LsNr = LsNrInput.Text; - d.MgNr = int.Parse(MgNrInput.Text); - d.Comment = (CommentInput.Text == "") ? null : CommentInput.Text; - p.SortId = (WineVarietyInput.SelectedItem as WineVar)!.SortId; - p.AttrId = (AttributeInput.SelectedItem as WineAttr)?.AttrId; - p.CultId = (CultivationInput.SelectedItem as WineCult)?.CultId; - p.Kmw = double.Parse(GradationKmwInput.Text); - p.QualId = (WineQualityLevelInput.SelectedItem as WineQualLevel)!.QualId; - p.HkId = (WineOriginInput.SelectedItem as WineOrigin)!.HkId; - p.KgNr = (WineKgInput.SelectedItem as AT_Kg)?.KgNr; - p.RdNr = (WineRdInput.SelectedItem as WbRd)?.RdNr; + var d = new Delivery { + Year = year, + DId = did, + DateString = $"{date:yyyy-MM-dd}", + TimeString = newTimeString ?? oldDelivery?.TimeString, + LNr = newLnr ?? oldDelivery!.LNr, + ZwstId = (BranchInput.SelectedItem as Branch)!.ZwstId, + LsNr = LsNrInput.Text, + MgNr = int.Parse(MgNrInput.Text), + Comment = (CommentInput.Text == "") ? null : CommentInput.Text, + }; - p.IsNetWeight = GerebeltGewogenInput.IsChecked ?? false; - p.IsHandPicked = HandPickedInput.IsChecked; - p.IsLesewagen = LesewagenInput.IsChecked; - p.IsGebunden = GebundenInput.IsChecked; - p.Temperature = (TemperatureInput.Text == "") ? null : double.Parse(TemperatureInput.Text); - p.Acid = (AcidInput.Text == "") ? null : double.Parse(AcidInput.Text); - p.Comment = (PartCommentInput.Text == "") ? null : PartCommentInput.Text; + var p = new DeliveryPart { + Year = year, + DId = did, + DPNr = dpnr, - p.Weight = int.Parse(WeightInput.Text.Replace(Utils.GroupSeparator, "")); - p.IsManualWeighing = ManualWeighingInput.IsChecked ?? false; - p.ScaleId = ScaleId; - p.WeighingId = WeighingId; - p.WeighingReason = ManualWeighingReason; + SortId = (WineVarietyInput.SelectedItem as WineVar)!.SortId, + AttrId = (AttributeInput.SelectedItem as WineAttr)?.AttrId, + CultId = (CultivationInput.SelectedItem as WineCult)?.CultId, + Kmw = double.Parse(GradationKmwInput.Text), + QualId = (WineQualityLevelInput.SelectedItem as WineQualLevel)!.QualId, + HkId = (WineOriginInput.SelectedItem as WineOrigin)!.HkId, + KgNr = (WineKgInput.SelectedItem as AT_Kg)?.KgNr, + RdNr = (WineRdInput.SelectedItem as WbRd)?.RdNr, + + IsNetWeight = GerebeltGewogenInput.IsChecked ?? false, + IsHandPicked = HandPickedInput.IsChecked, + IsLesewagen = LesewagenInput.IsChecked, + IsGebunden = GebundenInput.IsChecked, + Temperature = (TemperatureInput.Text == "") ? null : double.Parse(TemperatureInput.Text), + Acid = (AcidInput.Text == "") ? null : double.Parse(AcidInput.Text), + Comment = (PartCommentInput.Text == "") ? null : PartCommentInput.Text, + + Weight = int.Parse(WeightInput.Text.Replace(Utils.GroupSeparator, "")), + IsManualWeighing = ManualWeighingInput.IsChecked ?? false, + ScaleId = ScaleId, + WeighingId = WeighingId, + WeighingReason = ManualWeighingReason, + }; - EntityEntry? dEntry = null; - EntityEntry? pEntry = null; try { - if (IsEditing) { - dEntry = Context.Update(d); - pEntry = Context.Update(p); - } else if (IsCreating) { - dEntry = deliveryNew ? await Context.AddAsync(d) : Context.Update(d); - pEntry = partNew ? await Context.AddAsync(p) : Context.Update(p); + if (IsEditing || !deliveryNew) { + ctx.Update(d); + } else { + ctx.Add(d); + } + if (IsEditing || !partNew) { + ctx.Update(p); + } else { + ctx.Add(p); } - Context.UpdateDeliveryPartModifiers(p, ModifiersInput.SelectedItems.Cast()); + ctx.UpdateDeliveryPartModifiers(p, ModifiersInput.SelectedItems.Cast()); if (originalMgNr != null && originalMgNr.Value != d.MgNr) { // update origin (KgNr), if default is selected - var newKgNr = (await Context.Members.FindAsync(d.MgNr))?.DefaultKgNr; + var newKgNr = (await ctx.Members.FindAsync(d.MgNr))?.DefaultKgNr; foreach (var part in d.Parts.Where(part => part.DPNr != dpnr && part.KgNr == originalMemberKgNr)) { part.KgNr = newKgNr; - Context.Update(part); + ctx.Update(part); } } - await Context.SaveChangesAsync(); + await ctx.SaveChangesAsync(); } catch (Exception exc) { - if (dEntry != null) { - dEntry.State = EntityState.Detached; - await dEntry.ReloadAsync(); - } - if (pEntry != null) { - pEntry.State = EntityState.Detached; - await pEntry.ReloadAsync(); - } 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; MessageBox.Show(str, "Lieferung aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); @@ -1150,7 +1183,11 @@ namespace Elwig.Windows { NewDeliveryPartButton.IsEnabled = false; NewDeliveryPartButton.Cursor = Cursors.Wait; DeliveryPartList.IsEnabled = false; - var p = await UpdateDeliveryPart(DeliveryList.SelectedItem as Delivery, DeliveryPartList.SelectedItem as DeliveryPart); + var p = await UpdateDeliveryPart( + (DeliveryList.SelectedItem as Delivery)?.Year, + (DeliveryList.SelectedItem as Delivery)?.DId, + (DeliveryPartList.SelectedItem as DeliveryPart)?.DPNr + ); EmptyScale(); await RefreshDeliveryList(); await RefreshDeliveryParts(); @@ -1166,14 +1203,19 @@ namespace Elwig.Windows { NewDeliveryPartButton.IsEnabled = false; FinishButton.Cursor = Cursors.Wait; DeliveryPartList.IsEnabled = false; - var p = await UpdateDeliveryPart(DeliveryList.SelectedItem as Delivery, DeliveryPartList.SelectedItem as DeliveryPart); + var p = await UpdateDeliveryPart( + (DeliveryList.SelectedItem as Delivery)?.Year, + (DeliveryList.SelectedItem as Delivery)?.DId, + (DeliveryPartList.SelectedItem as DeliveryPart)?.DPNr + ); EmptyScale(); await RefreshDeliveryList(); await RefreshDeliveryParts(); if (p?.Delivery != null) { Mouse.OverrideCursor = Cursors.AppStarting; try { - using var doc = new DeliveryNote(p.Delivery, Context); + using var ctx = new AppDbContext(); + using var doc = new DeliveryNote((await ctx.Deliveries.FindAsync(p.Year, p.DId))!, ctx); await doc.Generate(); if (App.Config.Debug) { doc.Show(); @@ -1199,10 +1241,17 @@ namespace Elwig.Windows { if (r != MessageBoxResult.Yes) return; } - var attrList = await Context.WineAttributes.OrderBy(a => a.Name).Cast().ToListAsync(); + using var ctx = new AppDbContext(); + var attrList = await ctx.WineAttributes.OrderBy(a => a.Name).Cast().ToListAsync(); attrList.Insert(0, new NullItem("")); ControlUtils.RenewItemsSource(AttributeInput, attrList, null, ControlUtils.RenewSourceDefault.First); - ControlUtils.RenewItemsSource(MemberInput, await Context.Members.Where(m => m.IsActive || !IsReceipt).OrderBy(m => m.FamilyName).ThenBy(m => m.GivenName).ToListAsync()); + ControlUtils.RenewItemsSource(MemberInput, await ctx.Members + .Where(m => m.IsActive || !IsReceipt) + .Include(m => m.PostalDest.AtPlz!.Ort) + .Include(m => m.DefaultWbKg!.AtKg) + .OrderBy(m => m.FamilyName) + .ThenBy(m => m.GivenName) + .ToListAsync()); if (DeliveryList.SelectedItem is not Delivery d) { // switch away from creating mode IsCreating = false; @@ -1227,10 +1276,17 @@ namespace Elwig.Windows { private async void NewDeliveryButton_Click(object? sender, RoutedEventArgs? evt) { TodayOnlyInput.IsChecked = true; SearchInput.Text = ""; - var attrList = await Context.WineAttributes.Where(a => a.IsActive).OrderBy(a => a.Name).Cast().ToListAsync(); + using var ctx = new AppDbContext(); + var attrList = await ctx.WineAttributes.Where(a => a.IsActive).OrderBy(a => a.Name).Cast().ToListAsync(); attrList.Insert(0, new NullItem("")); ControlUtils.RenewItemsSource(AttributeInput, attrList, null, ControlUtils.RenewSourceDefault.First); - ControlUtils.RenewItemsSource(MemberInput, await Context.Members.Where(m => m.IsActive || !IsReceipt).OrderBy(m => m.FamilyName).ThenBy(m => m.GivenName).ToListAsync()); + ControlUtils.RenewItemsSource(MemberInput, await ctx.Members + .Where(m => m.IsActive || !IsReceipt) + .Include(m => m.PostalDest.AtPlz!.Ort) + .Include(m => m.DefaultWbKg!.AtKg) + .OrderBy(m => m.FamilyName) + .ThenBy(m => m.GivenName) + .ToListAsync()); IsCreating = true; DeliveryList.IsEnabled = false; DeliveryPartList.IsEnabled = false; @@ -1246,53 +1302,46 @@ namespace Elwig.Windows { private async void AbwertenButton_Click(object sender, RoutedEventArgs evt) { if (DeliveryPartList.SelectedItem is not DeliveryPart p) return; var res = Utils.ShowAbwertenDialog($"{p.Delivery.LsNr}/{p.DPNr}", p.Delivery.Member.AdministrativeName, p.Weight); - EntityEntry? entry1 = null, entry2 = null; + if (res == null || res <= 0) + return; + + Mouse.OverrideCursor = Cursors.AppStarting; try { - if (res == null || res <= 0) - return; - Mouse.OverrideCursor = Cursors.AppStarting; + using var ctx = new AppDbContext(); ClearOriginalValues(); if (res >= p.Weight) { ControlUtils.SelectItemWithPk(WineQualityLevelInput, "WEI"); ControlUtils.SelectItemWithPk(WineOriginInput, "OEST"); p.QualId = "WEI"; p.HkId = "OEST"; - entry1 = Context.Update(p); + ctx.Update(p); } else { var w = p.Weight - res.Value; WeightInput.Text = $"{w:N0}"; p.Weight = w; - entry1 = Context.Update(p); + ctx.Update(p); var d = p.Delivery; - var p2 = Context.CreateProxy(); - var values = Context.Entry(p).CurrentValues; - Context.Entry(p2).CurrentValues.SetValues(values); - p2.DPNr = await Context.NextDPNr(d.Year, d.DId); + var p2 = ctx.CreateProxy(); + var values = ctx.Entry(p).CurrentValues; + ctx.Entry(p2).CurrentValues.SetValues(values); + p2.DPNr = await ctx.NextDPNr(d.Year, d.DId); p2.Weight = res.Value; p2.QualId = "WEI"; p2.HkId = "OEST"; - entry2 = await Context.AddAsync(p2); + ctx.Add(p2); - Context.UpdateDeliveryPartModifiers(p2, p.Modifiers); + ctx.UpdateDeliveryPartModifiers(p2, p.Modifiers); } - await Context.SaveChangesAsync(); + await ctx.SaveChangesAsync(); await RefreshDeliveryParts(); - Mouse.OverrideCursor = null; FinishInputFilling(); } catch (Exception exc) { - if (entry1 != null) { - entry1.State = EntityState.Detached; - await entry1.ReloadAsync(); - } - if (entry2 != null) { - entry2.State = EntityState.Detached; - await entry2.ReloadAsync(); - } 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; MessageBox.Show(str, "Lieferung aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); } + Mouse.OverrideCursor = null; } private void WeighingManualButton_Click(object sender, RoutedEventArgs evt) { @@ -1332,8 +1381,10 @@ namespace Elwig.Windows { "Lieferung löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); if (r == MessageBoxResult.Yes) { Mouse.OverrideCursor = Cursors.AppStarting; - Context.Remove(d); - await Context.SaveChangesAsync(); + using (var ctx = new AppDbContext()) { + ctx.Remove(d); + await ctx.SaveChangesAsync(); + } await RefreshDeliveryList(); await RefreshDeliveryParts(); Mouse.OverrideCursor = null; @@ -1349,7 +1400,11 @@ namespace Elwig.Windows { DeliveryList.IsEnabled = true; DeliveryPartList.IsEnabled = true; - DeliveryPart p = await UpdateDeliveryPart(DeliveryList.SelectedItem as Delivery, DeliveryPartList.SelectedItem as DeliveryPart); + var p = await UpdateDeliveryPart( + (DeliveryList.SelectedItem as Delivery)?.Year, + (DeliveryList.SelectedItem as Delivery)?.DId, + (DeliveryPartList.SelectedItem as DeliveryPart)?.DPNr + ); SaveButton.Cursor = null; @@ -1404,61 +1459,58 @@ namespace Elwig.Windows { if (delivery.Time <= new TimeOnly(3, 0)) day = day.AddDays(-1); - var lsnrs = await Context.Deliveries - .Where(d => d.ZwstId == delivery.ZwstId) - .Where(d => (d.DateString == day.ToString("yyyy-MM-dd") && (d.TimeString == null || d.TimeString.CompareTo("03:00:00") > 0)) || - (d.DateString == day.AddDays(1).ToString("yyyy-MM-dd") && (d.TimeString == null || d.TimeString.CompareTo("03:00:00") <= 0))) - .Where(d => d.LsNr != delivery.LsNr) - .OrderBy(d => d.LsNr) - .Select(d => d.LsNr) - .ToListAsync(); - var res = Utils.ShowDeliveryExtractionDialog($"{delivery.LsNr}/{p.DPNr}", delivery.Member.AdministrativeName, count == 1, lsnrs); - if (res == null) return; - EntityEntry? entry = null; + string? res; + using (var ctx = new AppDbContext()) { + var lsnrs = await ctx.Deliveries + .Where(d => d.ZwstId == delivery.ZwstId) + .Where(d => (d.DateString == day.ToString("yyyy-MM-dd") && (d.TimeString == null || d.TimeString.CompareTo("03:00:00") > 0)) || + (d.DateString == day.AddDays(1).ToString("yyyy-MM-dd") && (d.TimeString == null || d.TimeString.CompareTo("03:00:00") <= 0))) + .Where(d => d.LsNr != delivery.LsNr) + .OrderBy(d => d.LsNr) + .Select(d => d.LsNr) + .ToListAsync(); + + res = Utils.ShowDeliveryExtractionDialog($"{delivery.LsNr}/{p.DPNr}", delivery.Member.AdministrativeName, count == 1, lsnrs); + if (res == null) + return; + } + + Mouse.OverrideCursor = Cursors.AppStarting; try { - Delivery? d = null; - Mouse.OverrideCursor = Cursors.AppStarting; + using var ctx = new AppDbContext(); if (res == "new") { - d = Context.CreateProxy(); - d.Date = delivery.Date; - d.Time = delivery.Time; - d.Year = p.Year; - d.DId = await Context.NextDId(d.Year); - d.LNr = await Context.NextLNr(d.Date); - d.ZwstId = delivery.ZwstId; - d.MgNr = delivery.MgNr; - d.Comment = delivery.Comment; - d.LsNr = Utils.GenerateLsNr(d); - entry = await Context.AddAsync(d); - await Context.SaveChangesAsync(); - } else { - d = await Context.Deliveries.Where(d => d.LsNr == res).FirstOrDefaultAsync(); + var lnr = await ctx.NextLNr(delivery.Date); + ctx.Add(new Delivery { + Year = p.Year, + DId = await ctx.NextDId(p.Year), + LNr = lnr, + DateString = $"{delivery.Date:yyyy-MM-dd}", + TimeString = $"{delivery.Time:HH:mm:SS}", + ZwstId = delivery.ZwstId, + MgNr = delivery.MgNr, + Comment = delivery.Comment, + LsNr = Utils.GenerateLsNr(delivery.Date, delivery.ZwstId, lnr), + }); + await ctx.SaveChangesAsync(); } + Delivery? d = await ctx.Deliveries.Where(d => d.LsNr == res).FirstOrDefaultAsync(); if (d == null) return; - await Context.Database.ExecuteSqlAsync($"UPDATE delivery_part SET year = {d.Year}, did = {d.DId}, dpnr = {await Context.NextDPNr(d.Year, d.DId)} WHERE (year, did, dpnr) = ({p.Year}, {p.DId}, {p.DPNr})"); - Context.Entry(p).State = EntityState.Detached; + await ctx.Database.ExecuteSqlAsync($"UPDATE delivery_part SET year = {d.Year}, did = {d.DId}, dpnr = {await ctx.NextDPNr(d.Year, d.DId)} WHERE (year, did, dpnr) = ({p.Year}, {p.DId}, {p.DPNr})"); if (count == 1) { - await Context.Database.ExecuteSqlAsync($"DELETE FROM delivery WHERE (year, did) = ({delivery.Year}, {delivery.DId})"); - Context.Entry(delivery).State = EntityState.Detached; + await ctx.Database.ExecuteSqlAsync($"DELETE FROM delivery WHERE (year, did) = ({delivery.Year}, {delivery.DId})"); } - await Context.SaveChangesAsync(); - await Context.Entry(p).ReloadAsync(); - await Context.Entry(delivery).ReloadAsync(); + await ctx.SaveChangesAsync(); - Mouse.OverrideCursor = null; await RefreshDeliveryList(); ControlUtils.SelectItem(DeliveryList, d); } catch (Exception exc) { - if (entry != null) { - entry.State = EntityState.Detached; - await entry.ReloadAsync(); - } 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; MessageBox.Show(str, "Lieferung aktualisieren", MessageBoxButton.OK, MessageBoxImage.Error); } + Mouse.OverrideCursor = null; } private async void DeleteDeliveryPartButton_Click(object sender, RoutedEventArgs evt) { @@ -1470,8 +1522,10 @@ namespace Elwig.Windows { "Lieferung löschen", MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No); if (r == MessageBoxResult.Yes) { Mouse.OverrideCursor = Cursors.AppStarting; - Context.Remove(p); - await Context.SaveChangesAsync(); + using (var ctx = new AppDbContext()) { + ctx.Remove(p); + await ctx.SaveChangesAsync(); + } await RefreshDeliveryParts(); Mouse.OverrideCursor = null; } @@ -1588,7 +1642,8 @@ namespace Elwig.Windows { try { var branch = (Branch)BranchInput.SelectedItem; var date = DateOnly.ParseExact(DateInput.Text, "dd.MM.yyyy"); - var lnr = await Context.NextLNr(date); + using var ctx = new AppDbContext(); + var lnr = await ctx.NextLNr(date); LsNrInput.Text = Utils.GenerateLsNr(date, branch.ZwstId, lnr); } catch { LsNrInput.Text = ""; @@ -1639,14 +1694,15 @@ namespace Elwig.Windows { } private void UpdateWineQualityLevels() { + using var ctx = new AppDbContext(); if (!GetInputValid(GradationKmwInput)) { UnsetDefaultValue(WineQualityLevelInput); - WineQualityLevelInput.ItemsSource = Context.WineQualityLevels.Where(q => q.QualId == "WEI").ToList(); + WineQualityLevelInput.ItemsSource = ctx.WineQualityLevels.Where(q => q.QualId == "WEI").ToList(); return; } var kmw = double.Parse(GradationKmwInput.Text); - WineQualityLevelInput.ItemsSource = Context.WineQualityLevels.Where(q => q.MinKmw == null || q.MinKmw <= kmw).ToList(); - var qual = Context.GetWineQualityLevel(kmw).GetAwaiter().GetResult(); + WineQualityLevelInput.ItemsSource = ctx.WineQualityLevels.Where(q => q.MinKmw == null || q.MinKmw <= kmw).ToList(); + var qual = ctx.GetWineQualityLevel(kmw).GetAwaiter().GetResult(); SetDefaultValue(WineQualityLevelInput, qual); if (WineQualityLevelInput.SelectedItem == null || (WineQualityLevelInput.SelectedItem is WineQualLevel selected && !selected.IsPredicate)) { ControlUtils.SelectItem(WineQualityLevelInput, qual); @@ -1754,7 +1810,8 @@ namespace Elwig.Windows { private void UpdateRdInput() { if (WineKgInput.SelectedItem is AT_Kg kg) { - var list = Context.WbRde.Where(r => r.KgNr == kg.KgNr).OrderBy(r => r.Name).Cast().ToList(); + using var ctx = new AppDbContext(); + var list = ctx.WbRde.Where(r => r.KgNr == kg.KgNr).OrderBy(r => r.Name).Cast().ToList(); list.Insert(0, new NullItem()); ControlUtils.RenewItemsSource(WineRdInput, list); if (WineRdInput.SelectedItem == null) WineRdInput.SelectedIndex = 0; @@ -1778,7 +1835,8 @@ namespace Elwig.Windows { AbgewertetInput.IsChecked = false; return; } - var defQual = Context.GetWineQualityLevel(double.Parse(GradationKmwInput.Text)).GetAwaiter().GetResult(); + using var ctx = new AppDbContext(); + var defQual = ctx.GetWineQualityLevel(double.Parse(GradationKmwInput.Text)).GetAwaiter().GetResult(); AbgewertetInput.IsChecked = !qual.IsPredicate && defQual != qual; }