diff --git a/Elwig/Controls/UnitTextBox.xaml b/Elwig/Controls/UnitTextBox.xaml
index a2564e3..bf3667c 100644
--- a/Elwig/Controls/UnitTextBox.xaml
+++ b/Elwig/Controls/UnitTextBox.xaml
@@ -9,7 +9,7 @@
BorderThickness="{Binding Path=BorderThickness, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"
BorderBrush="{Binding Path=BorderBrush, RelativeSource={RelativeSource TemplatedParent}, Mode=OneWay}"
SnapsToDevicePixels="True">
-
+
diff --git a/Elwig/Dialogs/AbwertenDialog.xaml b/Elwig/Dialogs/AbwertenDialog.xaml
deleted file mode 100644
index 6289cb4..0000000
--- a/Elwig/Dialogs/AbwertenDialog.xaml
+++ /dev/null
@@ -1,56 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- Welche Menge der Teillieferung
- von
- mit soll abgewertet werden?
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Elwig/Dialogs/AbwertenDialog.xaml.cs b/Elwig/Dialogs/AbwertenDialog.xaml.cs
deleted file mode 100644
index 50396e9..0000000
--- a/Elwig/Dialogs/AbwertenDialog.xaml.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using Elwig.Helpers;
-using System.Windows;
-using System.Windows.Controls;
-
-namespace Elwig.Dialogs {
- public partial class AbwertenDialog : Window {
-
- public int Weight;
-
- public AbwertenDialog(string lsnr, string name, int weight) {
- Weight = weight;
- InitializeComponent();
- TextLsNr.Text = lsnr;
- TextMember.Text = name;
- TextWeight.Text = $"{weight:N0}{Utils.UnitSeparator}kg";
- }
-
- private void ConfirmButton_Click(object sender, RoutedEventArgs evt) {
- DialogResult = true;
- Weight = int.Parse(WeightInput.Text);
- Close();
- }
-
- private void UpdateButtons() {
- ConfirmButton.IsEnabled = int.TryParse(WeightInput.Text, out var w) && w > 0 && w <= Weight;
- }
-
- private void WeightInput_TextChanged(object sender, TextChangedEventArgs evt) {
- Validator.CheckInteger(WeightInput, true, 5);
- UpdateButtons();
- }
- }
-}
diff --git a/Elwig/Dialogs/DeleteMemberDialog.xaml b/Elwig/Dialogs/DeleteMemberDialog.xaml
index 1a21516..8fd7641 100644
--- a/Elwig/Dialogs/DeleteMemberDialog.xaml
+++ b/Elwig/Dialogs/DeleteMemberDialog.xaml
@@ -57,8 +57,8 @@
Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"
IsChecked="{Binding DeletePaymentData}"/>
-
-
+
diff --git a/Elwig/Dialogs/DeliveryExtractionDialog.xaml b/Elwig/Dialogs/DeliveryExtractionDialog.xaml
deleted file mode 100644
index 4e74b4d..0000000
--- a/Elwig/Dialogs/DeliveryExtractionDialog.xaml
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- Was soll mit der Teillieferung
- von geschehen?
-
-
-
-
-
-
-
-
-
-
diff --git a/Elwig/Dialogs/DeliveryExtractionDialog.xaml.cs b/Elwig/Dialogs/DeliveryExtractionDialog.xaml.cs
deleted file mode 100644
index b2b8966..0000000
--- a/Elwig/Dialogs/DeliveryExtractionDialog.xaml.cs
+++ /dev/null
@@ -1,37 +0,0 @@
-using System.Collections.Generic;
-using System.Windows;
-
-namespace Elwig.Dialogs {
- public partial class DeliveryExtractionDialog : Window {
-
- public string? AddTo;
-
- public DeliveryExtractionDialog(string lsnr, string name, bool single, IEnumerable lsnrs) {
- InitializeComponent();
- TextLsNr.Text = lsnr;
- TextMember.Text = name;
- NewDeliveryButton.IsEnabled = !single;
- DeliveryList.IsEnabled = false;
- DeliveryList.ItemsSource = lsnrs;
- }
-
- private void ConfirmButton_Click(object sender, RoutedEventArgs evt) {
- DialogResult = true;
- AddTo = NewDeliveryButton.IsChecked == true ? "new" : DeliveryList.SelectedItem as string;
- Close();
- }
-
- private void UpdateButtons() {
- ConfirmButton.IsEnabled = NewDeliveryButton.IsChecked == true || (AddToDeliveryButton.IsChecked == true && DeliveryList.SelectedItem != null);
- DeliveryList.IsEnabled = AddToDeliveryButton.IsChecked == true;
- }
-
- private void Selection_Changed(object sender, RoutedEventArgs evt) {
- UpdateButtons();
- }
-
- private void DeliveryList_SelectionChanged(object sender, RoutedEventArgs evt) {
- UpdateButtons();
- }
- }
-}
diff --git a/Elwig/Dialogs/DeliverySplittingDialog.xaml b/Elwig/Dialogs/DeliverySplittingDialog.xaml
new file mode 100644
index 0000000..52a554a
--- /dev/null
+++ b/Elwig/Dialogs/DeliverySplittingDialog.xaml
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Elwig/Dialogs/DeliverySplittingDialog.xaml.cs b/Elwig/Dialogs/DeliverySplittingDialog.xaml.cs
new file mode 100644
index 0000000..3308549
--- /dev/null
+++ b/Elwig/Dialogs/DeliverySplittingDialog.xaml.cs
@@ -0,0 +1,163 @@
+using Elwig.Helpers;
+using Elwig.Models.Entities;
+using Elwig.Windows;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+
+namespace Elwig.Dialogs {
+ public partial class DeliverySplittingDialog : ContextWindow {
+
+ public class Row {
+ public DeliveryPart Part { get; set; }
+ public bool SplitCompletely { get; set; }
+ public string? SplitWeightString { get; set; }
+ public int? SplitWeight {
+ get => int.TryParse(SplitWeightString, out var v) ? v : null;
+ set => SplitWeightString = $"{value}";
+ }
+ public bool SplitWeightEnabled { get; set; }
+ }
+
+ private readonly Delivery _delivery;
+
+ public int? MgNr { get; set; }
+ public string? LsNr { get; set; }
+ public int[]? Weights => DeliveryParts.Select(r => r.SplitCompletely ? r.Part.Weight : r.SplitWeight ?? 0).ToArray();
+
+ public ObservableCollection DeliveryParts { get; set; }
+
+ public DeliverySplittingDialog(Delivery d) {
+ _delivery = d;
+ DeliveryParts = new(d.Parts.Select(p => new Row {
+ Part = p,
+ SplitCompletely = false,
+ SplitWeight = null,
+ SplitWeightEnabled = true,
+ }).ToList());
+ InitializeComponent();
+ }
+
+ protected override async Task OnRenewContext(AppDbContext ctx) {
+ ControlUtils.RenewItemsSource(MemberInput, await ctx.Members
+ .Where(m => m.IsActive)
+ .OrderBy(m => m.Name)
+ .ThenBy(m => m.GivenName)
+ .ToListAsync());
+ ControlUtils.RenewItemsSource(DeliveryInput, await ctx.Deliveries
+ .Where(d => d.DateString == $"{_delivery.Date:yyyy-MM-dd}" && d.ZwstId == _delivery.ZwstId)
+ .OrderBy(d => d.LsNr)
+ .Include(d => d.Member)
+ .Include(d => d.Parts)
+ .ToListAsync());
+ if (DeliveryInput.SelectedItem == null)
+ ControlUtils.SelectItem(DeliveryInput, _delivery);
+ CheckValidity();
+ }
+
+ private void ConfirmButton_Click(object sender, RoutedEventArgs evt) {
+ if (DepreciateModeInput.IsChecked == true) {
+ MgNr = null;
+ LsNr = null;
+ } else if (MemberModeInput.IsChecked == true) {
+ MgNr = ((Member)MemberInput.SelectedItem).MgNr;
+ LsNr = null;
+ } else if (DeliveryModeInput.IsChecked == true) {
+ MgNr = null;
+ LsNr = ((Delivery)DeliveryInput.SelectedItem).LsNr;
+ }
+ DialogResult = true;
+ Close();
+ }
+
+ private void ModeInput_Changed(object sender, RoutedEventArgs evt) {
+ if (!IsLoaded) return;
+ CheckValidity();
+ if (DepreciateModeInput.IsChecked == true) {
+ MgNrInput.Visibility = Visibility.Hidden;
+ MemberInput.Visibility = Visibility.Hidden;
+ MemberReferenceButton.Visibility = Visibility.Hidden;
+ DeliveryInput.Visibility = Visibility.Hidden;
+ } else if (MemberModeInput.IsChecked == true) {
+ MgNrInput.Visibility = Visibility.Visible;
+ MemberInput.Visibility = Visibility.Visible;
+ MemberReferenceButton.Visibility = Visibility.Visible;
+ DeliveryInput.Visibility = Visibility.Hidden;
+ } else if (DeliveryModeInput.IsChecked == true) {
+ MgNrInput.Visibility = Visibility.Hidden;
+ MemberInput.Visibility = Visibility.Hidden;
+ MemberReferenceButton.Visibility = Visibility.Hidden;
+ DeliveryInput.Visibility = Visibility.Visible;
+ }
+ }
+
+ private void CheckValidity() {
+ var weight = DeliveryParts.Sum(r => r.SplitCompletely ? r.Part.Weight : r.SplitWeight ?? 0);
+ var total = DeliveryParts.Sum(r => r.Part.Weight);
+ InfoBlock.Text = $"Insgesamt {weight:N0} kg / {total:N0} kg ausgewählt.";
+ ConfirmButton.IsEnabled = DeliveryParts.Any(r => r.SplitCompletely || r.SplitWeight > 0) && (
+ DepreciateModeInput.IsChecked == true ||
+ (MemberModeInput.IsChecked == true && MemberInput.SelectedItem != null && !DeliveryParts.All(r => r.SplitCompletely)) ||
+ (DeliveryModeInput.IsChecked == true && DeliveryInput.SelectedItem != null));
+ }
+
+ private void MgNrInput_TextChanged(object sender, TextChangedEventArgs evt) {
+ var res = Validator.CheckMgNr((TextBox)sender, true);
+ var text = MgNrInput.Text;
+ var caret = MgNrInput.CaretIndex;
+ ControlUtils.SelectItemWithPk(MemberInput, res.IsValid ? int.Parse(MgNrInput.Text) : null);
+ MgNrInput.Text = text;
+ MgNrInput.CaretIndex = caret;
+ }
+
+ private void MemberInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
+ var m = MemberInput.SelectedItem as Member;
+ MgNrInput.Text = m?.MgNr.ToString();
+ CheckValidity();
+ }
+
+ private void MemberReferenceButton_Click(object sender, RoutedEventArgs evt) {
+ if (MemberInput.SelectedItem is not Member m) return;
+ App.FocusMember(m.MgNr);
+ }
+
+ private void DeliveryInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) {
+ CheckValidity();
+ }
+
+ private void SplitCompletelyInput_Changed(object sender, RoutedEventArgs evt) {
+ var checkbox = (CheckBox)sender;
+ var dpnr = int.Parse(checkbox.Tag.ToString()!);
+ var row = DeliveryParts.First(d => d.Part.DPNr == dpnr);
+ if (checkbox.IsChecked == true) {
+ row.SplitWeightEnabled = false;
+ row.SplitWeight = row.Part.Weight;
+ } else if (checkbox.IsChecked == false) {
+ row.SplitWeightEnabled = true;
+ row.SplitWeight = null;
+ }
+ CollectionViewSource.GetDefaultView(DeliveryParts).Refresh();
+ CheckValidity();
+ }
+
+ private void SplitWeightInput_TextChanged(object sender, TextChangedEventArgs evt) {
+ var textbox = (TextBox)sender;
+ Validator.CheckInteger(textbox, false, 6);
+ var dpnr = int.Parse(textbox.Tag.ToString()!);
+ var row = DeliveryParts.First(d => d.Part.DPNr == dpnr);
+ var w = int.TryParse(textbox.Text, out var v) ? v : (int?)null;
+ if (w >= row.Part.Weight) {
+ row.SplitCompletely = true;
+ row.SplitWeightEnabled = false;
+ row.SplitWeight = row.Part.Weight;
+ CollectionViewSource.GetDefaultView(DeliveryParts).Refresh();
+ }
+ CheckValidity();
+ }
+ }
+}
diff --git a/Elwig/Helpers/Utils.cs b/Elwig/Helpers/Utils.cs
index 4398400..f4a3703 100644
--- a/Elwig/Helpers/Utils.cs
+++ b/Elwig/Helpers/Utils.cs
@@ -267,9 +267,9 @@ namespace Elwig.Helpers {
return d.ShowDialog() == true ? (d.Weight, d.Reason) : null;
}
- public static int? ShowAbwertenDialog(string lsnr, string name, int weight) {
- var d = new AbwertenDialog(lsnr, name, weight);
- return d.ShowDialog() == true ? d.Weight : null;
+ public static (string?, int[])? ShowDeliverySplittingDialog(Delivery delivery) {
+ var d = new DeliverySplittingDialog(delivery);
+ return d.ShowDialog() == true ? (d.MgNr?.ToString() ?? d.LsNr, d.Weights ?? []) : null;
}
public static double? ShowLinearPriceIncreaseDialog() {
@@ -277,11 +277,6 @@ namespace Elwig.Helpers {
return d.ShowDialog() == true ? d.Price : null;
}
- public static string? ShowDeliveryExtractionDialog(string lsnr, string name, bool single, IEnumerable lsnrs) {
- var d = new DeliveryExtractionDialog(lsnr, name, single, lsnrs);
- return d.ShowDialog() == true ? d.AddTo : null;
- }
-
public static Footer GenerateFooter(string lineBreak, string seperator) {
return new Footer(lineBreak, seperator);
}
diff --git a/Elwig/Services/DeliveryService.cs b/Elwig/Services/DeliveryService.cs
index 2540894..2e3bfd1 100644
--- a/Elwig/Services/DeliveryService.cs
+++ b/Elwig/Services/DeliveryService.cs
@@ -430,103 +430,229 @@ namespace Elwig.Services {
}
public static async Task UpdateDeliveryPart(this DeliveryAdminViewModel vm, int? oldYear, int? oldDid, int? oldDpnr, bool dateHasChanged, bool timeHasChanged, bool timeIsDefault) {
- using var ctx = new AppDbContext();
+ DeliveryPart p;
- int year = oldYear ?? Utils.CurrentYear;
- int did = oldDid ?? await ctx.NextDId(year);
- int dpnr = oldDpnr ?? await ctx.NextDPNr(year, did);
+ using (var ctx = new AppDbContext()) {
+ 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 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(vm.Date!, "dd.MM.yyyy");
- int? newLnr = (deliveryNew || dateHasChanged) ? await ctx.NextLNr(date, vm.Branch!.ZwstId) : null;
- string? newLsNr = (newLnr != null) ? Utils.GenerateLsNr(date, vm.Branch!.ZwstId, newLnr.Value) : null;
+ var date = DateOnly.ParseExact(vm.Date!, "dd.MM.yyyy");
+ int? newLnr = (deliveryNew || dateHasChanged) ? await ctx.NextLNr(date, vm.Branch!.ZwstId) : null;
+ string? newLsNr = (newLnr != null) ? Utils.GenerateLsNr(date, vm.Branch!.ZwstId, newLnr.Value) : null;
- string? newTimeString = null;
- if (partNew && timeIsDefault) {
- newTimeString = DateTime.Now.ToString("HH:mm:ss");
- } else if (partNew || timeHasChanged) {
- newTimeString = string.IsNullOrEmpty(vm.Time) ? null : vm.Time + ":00";
- }
-
- var d = new Delivery {
- Year = year,
- DId = did,
- DateString = $"{date:yyyy-MM-dd}",
- TimeString = newTimeString ?? oldDelivery?.TimeString,
- LNr = newLnr ?? oldDelivery!.LNr,
- ZwstId = vm.Branch!.ZwstId,
- LsNr = newLsNr ?? vm.LsNr!,
- MgNr = (int)vm.MgNr!,
- Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment,
- };
-
- var p = new DeliveryPart {
- Year = year,
- DId = did,
- DPNr = dpnr,
-
- SortId = vm.WineVar!.SortId,
- AttrId = vm.WineAttr?.AttrId,
- CultId = vm.WineCult?.CultId,
- Kmw = (double)vm.GradationKmw!,
- QualId = vm.WineQualityLevel!.QualId,
- HkId = vm.WineOrigin!.HkId,
- KgNr = vm.WineKg?.KgNr,
- RdNr = vm.WineRd?.RdNr,
-
- IsNetWeight = vm.IsNetWeight,
- IsHandPicked = vm.IsHandPicked,
- IsLesewagen = vm.IsLesewagen,
- IsGebunden = vm.IsGebunden,
- Temperature = vm.Temperature,
- Acid = vm.Acid,
- Comment = string.IsNullOrEmpty(vm.PartComment) ? null : vm.PartComment,
-
- Weight = (int)vm.Weight!,
- IsManualWeighing = vm.IsManualWeighing,
- ScaleId = vm.ScaleId,
- WeighingData = vm.WeighingData,
- WeighingReason = vm.ManualWeighingReason,
- };
-
- if (oldDelivery != null && ctx.Entry(oldDelivery) is EntityEntry entry) {
- entry.State = EntityState.Detached;
- }
- if (!deliveryNew) {
- ctx.Update(d);
- } else {
- ctx.Add(d);
- }
- if (!partNew) {
- ctx.Update(p);
- } else {
- ctx.Add(p);
- }
-
- ctx.UpdateDeliveryPartModifiers(p, await ctx.DeliveryPartModifiers
- .Where(m => m.Year == p.Year && m.DId == p.DId && m.DPNr == p.DPNr)
- .Select(m => m.Modifier)
- .ToListAsync(), vm.Modifiers);
-
- if (originalMgNr != null && originalMgNr.Value != d.MgNr) {
- // update origin (KgNr), if default is selected
- 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;
- ctx.Update(part);
+ string? newTimeString = null;
+ if (partNew && timeIsDefault) {
+ newTimeString = DateTime.Now.ToString("HH:mm:ss");
+ } else if (partNew || timeHasChanged) {
+ newTimeString = string.IsNullOrEmpty(vm.Time) ? null : vm.Time + ":00";
}
+
+ var d = new Delivery {
+ Year = year,
+ DId = did,
+ DateString = $"{date:yyyy-MM-dd}",
+ TimeString = newTimeString ?? oldDelivery?.TimeString,
+ LNr = newLnr ?? oldDelivery!.LNr,
+ ZwstId = vm.Branch!.ZwstId,
+ LsNr = newLsNr ?? vm.LsNr!,
+ MgNr = (int)vm.MgNr!,
+ Comment = string.IsNullOrEmpty(vm.Comment) ? null : vm.Comment,
+ };
+
+ p = new DeliveryPart {
+ Year = year,
+ DId = did,
+ DPNr = dpnr,
+
+ SortId = vm.WineVar!.SortId,
+ AttrId = vm.WineAttr?.AttrId,
+ CultId = vm.WineCult?.CultId,
+ Kmw = (double)vm.GradationKmw!,
+ QualId = vm.WineQualityLevel!.QualId,
+ HkId = vm.WineOrigin!.HkId,
+ KgNr = vm.WineKg?.KgNr,
+ RdNr = vm.WineRd?.RdNr,
+
+ IsNetWeight = vm.IsNetWeight,
+ IsHandPicked = vm.IsHandPicked,
+ IsLesewagen = vm.IsLesewagen,
+ IsGebunden = vm.IsGebunden,
+ Temperature = vm.Temperature,
+ Acid = vm.Acid,
+ Comment = string.IsNullOrEmpty(vm.PartComment) ? null : vm.PartComment,
+
+ Weight = (int)vm.Weight!,
+ IsManualWeighing = vm.IsManualWeighing,
+ ScaleId = vm.ScaleId,
+ WeighingData = vm.WeighingData,
+ WeighingReason = vm.ManualWeighingReason,
+ };
+
+ if (oldDelivery != null && ctx.Entry(oldDelivery) is EntityEntry entry) {
+ entry.State = EntityState.Detached;
+ }
+ if (!deliveryNew) {
+ ctx.Update(d);
+ } else {
+ ctx.Add(d);
+ }
+ if (!partNew) {
+ ctx.Update(p);
+ } else {
+ ctx.Add(p);
+ }
+
+ ctx.UpdateDeliveryPartModifiers(p, await ctx.DeliveryPartModifiers
+ .Where(m => m.Year == p.Year && m.DId == p.DId && m.DPNr == p.DPNr)
+ .Select(m => m.Modifier)
+ .ToListAsync(), vm.Modifiers);
+
+ if (originalMgNr != null && originalMgNr.Value != d.MgNr) {
+ // update origin (KgNr), if default is selected
+ 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;
+ ctx.Update(part);
+ }
+ }
+
+ await ctx.SaveChangesAsync();
}
- await ctx.SaveChangesAsync();
+ App.HintContextChange();
return p;
}
+ public static async Task SplitDeliveryToMember(int year, int did, int[] weights, int mgnr) {
+ Delivery n;
+
+ using (var ctx = new AppDbContext()) {
+ bool anyLeft = false;
+ var d = (await ctx.Deliveries.FindAsync(year, did))!;
+ var lnr = await ctx.NextLNr(d.Date, d.ZwstId);
+ n = new Delivery {
+ Year = year,
+ DId = await ctx.NextDId(d.Year),
+ DateString = d.DateString,
+ TimeString = d.TimeString,
+ ZwstId = d.ZwstId,
+ LNr = lnr,
+ LsNr = Utils.GenerateLsNr(d.Date, d.ZwstId, lnr),
+ MgNr = mgnr,
+ Comment = d.Comment,
+ };
+ ctx.Add(n);
+ await ctx.SaveChangesAsync();
+
+ var dpnr = 1;
+ foreach (var (p, w) in d.Parts.ToList().Zip(weights)) {
+ if (w <= 0) {
+ anyLeft = true;
+ continue;
+ } else if (w >= p.Weight) {
+ await ctx.Database.ExecuteSqlAsync($"UPDATE delivery_part SET year = {n.Year}, did = {n.DId}, dpnr = {dpnr++} WHERE (year, did, dpnr) = ({p.Year}, {p.DId}, {p.DPNr})");
+ } else {
+ anyLeft = true;
+ p.Weight -= w;
+ ctx.Update(p);
+ var s = ctx.CreateProxy();
+ var values = ctx.Entry(p).CurrentValues;
+ ctx.Entry(s).CurrentValues.SetValues(values);
+ s.Year = n.Year;
+ s.DId = n.DId;
+ s.DPNr = dpnr++;
+ s.Weight = w;
+ ctx.Add(s);
+ }
+ }
+
+ await ctx.SaveChangesAsync();
+ if (!anyLeft)
+ await ctx.Database.ExecuteSqlAsync($"DELETE FROM delivery WHERE (year, did) = ({d.Year}, {d.DId})");
+ }
+
+ App.HintContextChange();
+
+ return n;
+ }
+
+ public static async Task SplitDeliveryToLsNr(int year, int did, int[] weights, string lsnr) {
+ Delivery n;
+
+ using (var ctx = new AppDbContext()) {
+ var anyLeft = false;
+ n = (await ctx.Deliveries.FirstAsync(d => d.LsNr == lsnr))!;
+ var d = (await ctx.Deliveries.FindAsync(year, did))!;
+ var dpnr = await ctx.NextDPNr(n.Year, n.DId);
+ foreach (var (p, w) in d.Parts.ToList().Zip(weights)) {
+ if (w <= 0) {
+ anyLeft = true;
+ continue;
+ } else if (w >= p.Weight) {
+ await ctx.Database.ExecuteSqlAsync($"UPDATE delivery_part SET year = {n.Year}, did = {n.DId}, dpnr = {dpnr++} WHERE (year, did, dpnr) = ({p.Year}, {p.DId}, {p.DPNr})");
+ } else {
+ anyLeft = true;
+ p.Weight -= w;
+ ctx.Update(p);
+ var s = ctx.CreateProxy();
+ var values = ctx.Entry(p).CurrentValues;
+ ctx.Entry(s).CurrentValues.SetValues(values);
+ s.Year = n.Year;
+ s.DId = n.DId;
+ s.DPNr = dpnr++;
+ s.Weight = w;
+ ctx.Add(s);
+ }
+ }
+
+ await ctx.SaveChangesAsync();
+ if (!anyLeft)
+ await ctx.Database.ExecuteSqlAsync($"DELETE FROM delivery WHERE (year, did) = ({d.Year}, {d.DId})");
+ }
+
+ App.HintContextChange();
+
+ return n;
+ }
+
+ public static async Task DepreciateDelivery(int year, int did, int[] weights) {
+ using (var ctx = new AppDbContext()) {
+ var d = (await ctx.Deliveries.FindAsync(year, did))!;
+ var dpnr = await ctx.NextDPNr(year, did);
+ foreach (var (p, w) in d.Parts.ToList().Zip(weights)) {
+ if (w <= 0) {
+ continue;
+ } else if (w >= p.Weight) {
+ p.QualId = "WEI";
+ p.HkId = "OEST";
+ ctx.Update(p);
+ } else {
+ p.Weight -= w;
+ ctx.Update(p);
+ var n = ctx.CreateProxy();
+ var values = ctx.Entry(p).CurrentValues;
+ ctx.Entry(n).CurrentValues.SetValues(values);
+ n.DPNr = dpnr++;
+ n.Weight = w;
+ n.QualId = "WEI";
+ n.HkId = "OEST";
+ ctx.Add(n);
+ }
+ }
+ await ctx.SaveChangesAsync();
+ }
+
+ App.HintContextChange();
+ }
+
public static async Task GenerateDeliveryNote(int year, int did, ExportMode mode) {
Mouse.OverrideCursor = Cursors.AppStarting;
try {
diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml b/Elwig/Windows/DeliveryAdminWindow.xaml
index 5f5cb8b..9d18fe4 100644
--- a/Elwig/Windows/DeliveryAdminWindow.xaml
+++ b/Elwig/Windows/DeliveryAdminWindow.xaml
@@ -274,10 +274,10 @@
Alt+Einfg
-
+ Click="DepreciateButton_Click"/>
diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs
index 555b163..de236fd 100644
--- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs
+++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs
@@ -638,15 +638,11 @@ namespace Elwig.Windows {
private void DeliveryPartList_SelectionChanged(object? sender, SelectionChangedEventArgs? evt) {
RefreshInputs();
if (DeliveryPartList.SelectedItem is DeliveryPart p) {
- AbwertenButton.IsEnabled = p.QualId != "WEI";
+ DepreciateButton.IsEnabled = true;
EditDeliveryButton.IsEnabled = true;
- ExtractDeliveryPartButton.IsEnabled = !IsCreating;
- DeleteDeliveryPartButton.IsEnabled = DeliveryList.SelectedItem is Delivery { Parts.Count: > 1 } && !IsCreating;
} else {
- AbwertenButton.IsEnabled = false;
+ DepreciateButton.IsEnabled = false;
EditDeliveryButton.IsEnabled = false;
- ExtractDeliveryPartButton.IsEnabled = false;
- DeleteDeliveryPartButton.IsEnabled = false;
}
}
@@ -855,43 +851,29 @@ namespace Elwig.Windows {
LockSearchInputs();
}
- 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);
- if (res == null || res <= 0)
+ private async void DepreciateButton_Click(object sender, RoutedEventArgs evt) {
+ if (DeliveryList.SelectedItem is not Delivery d) return;
+ var res = Utils.ShowDeliverySplittingDialog(d);
+ if (res == null)
return;
Mouse.OverrideCursor = Cursors.AppStarting;
try {
- using var ctx = new AppDbContext();
- ClearOriginalValues();
- if (res >= p.Weight) {
- ControlUtils.SelectItemWithPk(WineQualityLevelInput, "WEI");
- ControlUtils.SelectItemWithPk(WineOriginInput, "OEST");
- p.QualId = "WEI";
- p.HkId = "OEST";
- ctx.Update(p);
+ var id = res.Value.Item1;
+ var weights = res.Value.Item2;
+ if (id == null) {
+ // abwerten
+ await DeliveryService.DepreciateDelivery(d.Year, d.DId, weights);
+ } else if (id.All(char.IsAsciiDigit)) {
+ // auf Mitglied übertragen
+ var n = await DeliveryService.SplitDeliveryToMember(d.Year, d.DId, weights, int.Parse(id));
+ await Task.Delay(500);
+ ControlUtils.SelectItemWithPk(DeliveryList, n.Year, n.DId);
} else {
- var w = p.Weight - res.Value;
- ViewModel.Weight = w;
- p.Weight = w;
- ctx.Update(p);
-
- var d = p.Delivery;
- 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";
- ctx.Add(p2);
-
- ctx.UpdateDeliveryPartModifiers(p2, [], p.Modifiers);
+ // zu existierender Lieferung hinzufügen
+ var n = await DeliveryService.SplitDeliveryToLsNr(d.Year, d.DId, weights, id);
+ ControlUtils.SelectItemWithPk(DeliveryList, n.Year, n.DId);
}
- await ctx.SaveChangesAsync();
- await RefreshDeliveryParts();
- FinishInputFilling();
} catch (Exception exc) {
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;
@@ -929,9 +911,7 @@ namespace Elwig.Windows {
UnlockInputs();
LockSearchInputs();
- AbwertenButton.IsEnabled = false;
- ExtractDeliveryPartButton.IsEnabled = false;
- DeleteDeliveryPartButton.IsEnabled = false;
+ DepreciateButton.IsEnabled = false;
}
protected override void ShortcutDelete() {
@@ -1003,9 +983,7 @@ namespace Elwig.Windows {
await RefreshDeliveryParts();
RefreshInputs();
- AbwertenButton.IsEnabled = p.QualId != "WEI";
- ExtractDeliveryPartButton.IsEnabled = DeliveryPartList.SelectedItem != null && !IsCreating;
- DeleteDeliveryPartButton.IsEnabled = DeliveryList.SelectedItem is Delivery { Parts.Count: > 1 } && !IsCreating;
+ DepreciateButton.IsEnabled = true;
}
protected override void ShortcutReset() {
@@ -1036,93 +1014,7 @@ namespace Elwig.Windows {
LockInputs();
UnlockSearchInputs();
- AbwertenButton.IsEnabled = DeliveryPartList.SelectedItem is DeliveryPart p && p.QualId != "WEI";
- ExtractDeliveryPartButton.IsEnabled = DeliveryPartList.SelectedItem != null && !IsCreating;
- DeleteDeliveryPartButton.IsEnabled = DeliveryList.SelectedItem is Delivery { Parts.Count: > 1 } && !IsCreating;
- }
-
- private async void ExtractDeliveryPartButton_Click(object sender, RoutedEventArgs evt) {
- if (DeliveryPartList.SelectedItem is not DeliveryPart p)
- return;
-
- var delivery = p.Delivery;
- var day = delivery.Date;
- var count = delivery.Parts.Count;
-
- if (delivery.Time <= new TimeOnly(3, 0))
- day = day.AddDays(-1);
-
- 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 {
- using var ctx = new AppDbContext();
- if (res == "new") {
- var lnr = await ctx.NextLNr(delivery.Date, delivery.ZwstId);
- var lsnr = Utils.GenerateLsNr(delivery.Date, delivery.ZwstId, lnr);
- 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 = lsnr,
- });
- await ctx.SaveChangesAsync();
- res = lsnr;
- }
- Delivery? d = await ctx.Deliveries.Where(d => d.LsNr == res).FirstOrDefaultAsync();
- if (d == null) return;
-
- 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 ctx.Database.ExecuteSqlAsync($"DELETE FROM delivery WHERE (year, did) = ({delivery.Year}, {delivery.DId})");
- }
- await ctx.SaveChangesAsync();
-
- await RefreshList();
- ControlUtils.SelectItem(DeliveryList, d);
- } catch (Exception exc) {
- 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) {
- if (DeliveryPartList.SelectedItem is not DeliveryPart p)
- return;
-
- var r = MessageBox.Show(
- $"Soll die Teillieferung Nr. {p.DPNr} wirklich unwiderruflich gelöscht werden?",
- "Lieferung löschen", MessageBoxButton.OKCancel, MessageBoxImage.Warning, MessageBoxResult.Cancel);
- if (r == MessageBoxResult.OK) {
- Mouse.OverrideCursor = Cursors.AppStarting;
- using (var ctx = new AppDbContext()) {
- ctx.Remove(p);
- await ctx.SaveChangesAsync();
- }
- await RefreshDeliveryParts();
- Mouse.OverrideCursor = null;
- }
+ DepreciateButton.IsEnabled = DeliveryPartList.SelectedItem != null;
}
private void ShowSaveResetCancelButtons() {
@@ -1145,22 +1037,22 @@ namespace Elwig.Windows {
private void ShowNewEditDeleteButtons() {
NewDeliveryButton.IsEnabled = ViewModel.IsReceipt;
- AbwertenButton.IsEnabled = DeliveryPartList.SelectedItem is DeliveryPart p && p.QualId == "WEI";
+ DepreciateButton.IsEnabled = DeliveryList.SelectedItem != null;
EditDeliveryButton.IsEnabled = DeliveryPartList.SelectedItem != null;
DeleteDeliveryButton.IsEnabled = DeliveryList.SelectedItem != null;
NewDeliveryButton.Visibility = ViewModel.IsReceipt ? Visibility.Visible : Visibility.Hidden;
- AbwertenButton.Visibility = !ViewModel.IsReceipt ? Visibility.Visible : Visibility.Hidden;
+ DepreciateButton.Visibility = !ViewModel.IsReceipt ? Visibility.Visible : Visibility.Hidden;
EditDeliveryButton.Visibility = Visibility.Visible;
DeleteDeliveryButton.Visibility = Visibility.Visible;
}
private void HideNewEditDeleteButtons() {
NewDeliveryButton.IsEnabled = false;
- AbwertenButton.IsEnabled = false;
+ DepreciateButton.IsEnabled = false;
EditDeliveryButton.IsEnabled = false;
DeleteDeliveryButton.IsEnabled = false;
NewDeliveryButton.Visibility = Visibility.Hidden;
- AbwertenButton.Visibility = Visibility.Hidden;
+ DepreciateButton.Visibility = Visibility.Hidden;
EditDeliveryButton.Visibility = Visibility.Hidden;
DeleteDeliveryButton.Visibility = Visibility.Hidden;
}