[#43] DeliveryAdminWindow: Do not use Context from WintextWindow any more

This commit is contained in:
2024-03-19 11:48:26 +01:00
parent 2f3524db9d
commit 98688168b8

View File

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