[#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 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<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) {
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<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 = [];
IQueryable<Delivery> deliveryQuery = Context.Deliveries;
IQueryable<Delivery> 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<object>().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<object>().ToListAsync();
attrList.Insert(0, new NullItem(""));
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(""));
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<object>().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<object>().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<DeliveryPart> 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<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;
private async Task<DeliveryPart> 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<Delivery>? dEntry = null;
EntityEntry<DeliveryPart>? 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<Modifier>());
ctx.UpdateDeliveryPartModifiers(p, ModifiersInput.SelectedItems.Cast<Modifier>());
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<object>().ToListAsync();
using var ctx = new AppDbContext();
var attrList = await ctx.WineAttributes.OrderBy(a => a.Name).Cast<object>().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<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(""));
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<DeliveryPart>? 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<DeliveryPart>();
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<DeliveryPart>();
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<Delivery>? 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<Delivery>();
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<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());
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;
}