From bf6297f63b019da03eb23225d1e377a61d2a9e36 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Fri, 12 Dec 2025 12:34:57 +0100 Subject: [PATCH] DeliveryPart: Add Unloading type instead of IsLesewagen --- Elwig/Helpers/AppDbUpdater.cs | 2 +- Elwig/Helpers/Export/ElwigData.cs | 4 +- Elwig/Models/Entities/DeliveryPart.cs | 26 +++++++- Elwig/Resources/Sql/34-35.sql | 6 ++ Elwig/Services/DeliveryService.cs | 32 ++++++++-- Elwig/ViewModels/DeliveryAdminViewModel.cs | 22 ++++++- Elwig/Windows/DeliveryAdminWindow.xaml | 34 ++++++++--- Elwig/Windows/DeliveryAdminWindow.xaml.cs | 71 ++++++++++++++++------ Tests/fetch-resources.bat | 2 +- 9 files changed, 159 insertions(+), 40 deletions(-) create mode 100644 Elwig/Resources/Sql/34-35.sql diff --git a/Elwig/Helpers/AppDbUpdater.cs b/Elwig/Helpers/AppDbUpdater.cs index 9b327dd..4479b8b 100644 --- a/Elwig/Helpers/AppDbUpdater.cs +++ b/Elwig/Helpers/AppDbUpdater.cs @@ -9,7 +9,7 @@ namespace Elwig.Helpers { public static class AppDbUpdater { // Don't forget to update value in Tests/fetch-resources.bat! - public static readonly int RequiredSchemaVersion = 34; + public static readonly int RequiredSchemaVersion = 35; private static int VersionOffset = 0; diff --git a/Elwig/Helpers/Export/ElwigData.cs b/Elwig/Helpers/Export/ElwigData.cs index bd05061..774fdeb 100644 --- a/Elwig/Helpers/Export/ElwigData.cs +++ b/Elwig/Helpers/Export/ElwigData.cs @@ -744,8 +744,8 @@ namespace Elwig.Helpers.Export { }; if (p.IsSplCheck) obj["spl_check"] = p.IsSplCheck; if (p.IsHandPicked != null) obj["hand_picked"] = p.IsHandPicked; - if (p.IsLesewagen != null) obj["lesewagen"] = p.IsLesewagen; if (p.IsGebunden != null) obj["gebunden"] = p.IsGebunden; + if (p.Unloading != null) obj["unloading"] = p.Unloading; if (p.Temperature != null) obj["temperature"] = p.Temperature; if (p.Acid != null) obj["acid"] = p.Acid; if (p.ScaleId != null) obj["scale_id"] = p.ScaleId; @@ -818,8 +818,8 @@ namespace Elwig.Helpers.Export { Comment = p["comment"]?.AsValue().GetValue(), IsSplCheck = p["spl_check"]?.AsValue().GetValue() ?? false, IsHandPicked = p["hand_picked"]?.AsValue().GetValue(), - IsLesewagen = p["lesewagen"]?.AsValue().GetValue(), IsGebunden = p["gebunden"]?.AsValue().GetValue(), + Unloading = p["unloading"]?.AsValue().GetValue() ?? ((p["lesewagen"]?.AsValue().GetValue() ?? false) ? DeliveryPart.Pumped : null), Temperature = p["temperature"]?.AsValue().GetValue(), Acid = p["acid"]?.AsValue().GetValue(), ScaleId = p["scale_id"]?.AsValue().GetValue(), diff --git a/Elwig/Models/Entities/DeliveryPart.cs b/Elwig/Models/Entities/DeliveryPart.cs index f4ab189..0eb5d82 100644 --- a/Elwig/Models/Entities/DeliveryPart.cs +++ b/Elwig/Models/Entities/DeliveryPart.cs @@ -9,6 +9,11 @@ using System.Text.Json.Nodes; namespace Elwig.Models.Entities { [Table("delivery_part"), PrimaryKey("Year", "DId", "DPNr")] public class DeliveryPart : IDelivery { + + public const string Dumper = "dumper"; + public const string Pumped = "pumped"; + public const string Box = "box"; + [Column("year")] public int Year { get; set; } @@ -86,12 +91,27 @@ namespace Elwig.Models.Entities { [Column("hand_picked")] public bool? IsHandPicked { get; set; } - [Column("lesewagen")] - public bool? IsLesewagen { get; set; } - [Column("gebunden")] public bool? IsGebunden { get; set; } + [Column("unloading")] + public string? Unloading { get; set; } + [NotMapped] + public bool IsDumper { + get => Unloading == Dumper; + set => Unloading = value ? Dumper : Unloading; + } + [NotMapped] + public bool IsPumped { + get => Unloading == Pumped; + set => Unloading = value ? Pumped : Unloading; + } + [NotMapped] + public bool IsBox { + get => Unloading == Box; + set => Unloading = value ? Box : Unloading; + } + [Column("temperature")] public double? Temperature { get; set; } diff --git a/Elwig/Resources/Sql/34-35.sql b/Elwig/Resources/Sql/34-35.sql new file mode 100644 index 0000000..18dd2ed --- /dev/null +++ b/Elwig/Resources/Sql/34-35.sql @@ -0,0 +1,6 @@ +-- schema version 34 to 33 + +ALTER TABLE delivery_part ADD COLUMN unloading TEXT DEFAULT NULL; +UPDATE delivery_part SET unloading = 'pumped' WHERE lesewagen; +UPDATE delivery_part SET unloading = 'box' WHERE (SELECT zwstid IN ('H','S') FROM delivery d WHERE (d.year, d.did) = (delivery_part.year, delivery_part.did)); +ALTER TABLE delivery_part DROP COLUMN lesewagen; diff --git a/Elwig/Services/DeliveryService.cs b/Elwig/Services/DeliveryService.cs index f3c3fb3..eb3dfe7 100644 --- a/Elwig/Services/DeliveryService.cs +++ b/Elwig/Services/DeliveryService.cs @@ -80,9 +80,9 @@ namespace Elwig.Services { vm.PartComment = p.Comment ?? ""; vm.TemperatureString = (p.Temperature != null) ? $"{p.Temperature:N1}" : ""; vm.AcidString = (p.Acid != null) ? $"{p.Acid:N1}" : ""; - vm.IsLesewagen = p.IsLesewagen ?? false; vm.IsHandPicked = p.IsHandPicked; vm.IsGebunden = p.IsGebunden; + vm.Unloading = p.Unloading; vm.ScaleId = p.ScaleId; vm.WeighingData = p.WeighingData; @@ -188,14 +188,38 @@ namespace Elwig.Services { prd = prd.And(p => p.IsNetWeight == true); filter.RemoveAt(i--); filterNames.Add("gerebelt gewogen"); + } else if (e.Length >= 5 && e.Length <= 11 && "planenwagen".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { + prd = prd.And(p => p.Unloading == DeliveryPart.Dumper); + filter.RemoveAt(i--); + filterNames.Add("Planenw./Kipper"); + } else if (e.Length >= 6 && e.Length <= 12 && "!planenwagen".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { + prd = prd.And(p => p.Unloading != DeliveryPart.Dumper); + filter.RemoveAt(i--); + filterNames.Add("kein Planenw./Kipper"); + } else if (e.Length >= 4 && e.Length <= 6 && "kipper".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { + prd = prd.And(p => p.Unloading == DeliveryPart.Dumper); + filter.RemoveAt(i--); + filterNames.Add("Planenw./Kipper"); + } else if (e.Length >= 5 && e.Length <= 7 && "!kipper".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { + prd = prd.And(p => p.Unloading != DeliveryPart.Dumper); + filter.RemoveAt(i--); + filterNames.Add("kein Planenw./Kipper"); } else if (e.Length >= 5 && e.Length <= 9 && "lesewagen".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { - prd = prd.And(p => p.IsLesewagen == true); + prd = prd.And(p => p.Unloading == DeliveryPart.Pumped); filter.RemoveAt(i--); filterNames.Add("Lesewagen"); } else if (e.Length >= 6 && e.Length <= 10 && "!lesewagen".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { - prd = prd.And(p => p.IsLesewagen == false); + prd = prd.And(p => p.Unloading != DeliveryPart.Pumped); filter.RemoveAt(i--); filterNames.Add("kein Lesewagen"); + } else if (e.Length >= 5 && e.Length <= 6 && "kisten".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { + prd = prd.And(p => p.Unloading == DeliveryPart.Box); + filter.RemoveAt(i--); + filterNames.Add("Kisten"); + } else if (e.Length >= 6 && e.Length <= 7 && "!kisten".StartsWith(e, StringComparison.CurrentCultureIgnoreCase)) { + prd = prd.And(p => p.Unloading != DeliveryPart.Box); + filter.RemoveAt(i--); + filterNames.Add("keine Kisten"); } else if (e.Length == 2 && var.ContainsKey(e.ToUpper())) { filterVar.Add(e.ToUpper()); filter.RemoveAt(i--); @@ -483,8 +507,8 @@ namespace Elwig.Services { IsNetWeight = vm.IsNetWeight, IsHandPicked = vm.IsHandPicked, - IsLesewagen = vm.IsLesewagen, IsGebunden = vm.IsGebunden, + Unloading = vm.Unloading, Temperature = vm.Temperature, Acid = vm.Acid, Comment = string.IsNullOrEmpty(vm.PartComment) ? null : vm.PartComment, diff --git a/Elwig/ViewModels/DeliveryAdminViewModel.cs b/Elwig/ViewModels/DeliveryAdminViewModel.cs index c2e3ac7..fa9c2bd 100644 --- a/Elwig/ViewModels/DeliveryAdminViewModel.cs +++ b/Elwig/ViewModels/DeliveryAdminViewModel.cs @@ -169,10 +169,28 @@ namespace Elwig.ViewModels { set => AcidString = $"{value:0.0}"; } [ObservableProperty] - private bool _isLesewagen; - [ObservableProperty] private bool? _isHandPicked; + public string? Unloading { + get => IsUnloadingDumper ? DeliveryPart.Dumper : IsUnloadingPumped ? DeliveryPart.Pumped : IsUnloadingBox ? DeliveryPart.Box : null; + set { + switch (value) { + case DeliveryPart.Dumper: IsUnloadingDumper = true; break; + case DeliveryPart.Pumped: IsUnloadingPumped = true; break; + case DeliveryPart.Box: IsUnloadingBox = true; break; + default: IsUnloadingOther = true; break; + } + } + } + [ObservableProperty] + private bool _isUnloadingDumper; + [ObservableProperty] + private bool _isUnloadingPumped; + [ObservableProperty] + private bool _isUnloadingBox; + [ObservableProperty] + private bool _isUnloadingOther; + [ObservableProperty] private string _statusMembers = "-"; [ObservableProperty] diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml b/Elwig/Windows/DeliveryAdminWindow.xaml index 37c8b32..06f120b 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml +++ b/Elwig/Windows/DeliveryAdminWindow.xaml @@ -369,8 +369,9 @@ - - + + + @@ -404,7 +405,7 @@ - + @@ -563,7 +564,7 @@ - + @@ -592,18 +593,31 @@ TextChanged="TemperatureAcidInput_TextChanged" LostFocus="TemperatureAcidInput_LostFocus" Grid.Column="1" Margin="0,100,10,10" VerticalAlignment="Top"/> - + + + + + - + diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs index b8af7fe..b39e5bf 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs @@ -320,11 +320,16 @@ namespace Elwig.Windows { } if (App.Config.WeighingMode == WeighingMode.Box) { - LesewagenInput.IsEnabled = false; - SetDefaultValue(LesewagenInput, false); + SetDefaultValue(UnloadingDumperInput, false); + SetDefaultValue(UnloadingPumpedInput, false); + SetDefaultValue(UnloadingBoxInput, true); + SetDefaultValue(UnloadingOtherInput, false); + UnloadingBoxInput.IsChecked = true; } else { - LesewagenInput.IsEnabled = true; - UnsetDefaultValue(LesewagenInput); + UnsetDefaultValue(UnloadingDumperInput); + UnsetDefaultValue(UnloadingPumpedInput); + UnsetDefaultValue(UnloadingBoxInput); + UnsetDefaultValue(UnloadingOtherInput); } if (App.Config.WeighingMode != WeighingMode.Net) { @@ -354,8 +359,8 @@ namespace Elwig.Windows { ClearDefaultValues(); ViewModel.IsNetWeight = App.Config.WeighingMode == WeighingMode.Net; - ViewModel.IsLesewagen = false; ViewModel.IsHandPicked = App.Config.WeighingMode != WeighingMode.Net ? true : null; + ViewModel.Unloading = null; ViewModel.IsGebunden = null; InitialDefaultInputs(); @@ -1326,6 +1331,7 @@ namespace Elwig.Windows { private void ModifiersInput_SelectionChanged(object sender, SelectionChangedEventArgs evt) { if (!IsEditing && !IsCreating) return; var mod = ModifiersInput.SelectedItems.Cast().ToList(); + var source = ModifiersInput.ItemsSource.Cast().ToList(); if (App.Client.IsMatzen) { var kl = mod.Where(m => m.Name.StartsWith("Klasse ")); if (kl.Count() > 1) { @@ -1334,33 +1340,64 @@ namespace Elwig.Windows { ModifiersInput.SelectedItems.Remove(r); }); } - } else if (App.Client.IsWinzerkeller) { + } + + if (source.Any(m => m.Name.Contains("Lesewagen"))) { if (mod.Any(m => m.Name.Contains("Lesewagen"))) { - ViewModel.IsLesewagen = true; + ViewModel.IsUnloadingPumped = true; } else { - ViewModel.IsLesewagen = false; + ViewModel.IsUnloadingPumped = false; + } + } + if (source.Any(m => m.Name.Contains("Kiste"))) { + if (mod.Any(m => m.Name.Contains("Kiste"))) { + ViewModel.IsUnloadingBox = true; + } else { + ViewModel.IsUnloadingBox = false; } } } - private void LesewagenInput_Changed(object sender, RoutedEventArgs evt) { + private void UnloadingInput_Checked(object sender, RoutedEventArgs evt) { if (!IsEditing && !IsCreating) return; var mod = ModifiersInput.SelectedItems.Cast().ToList(); var source = ModifiersInput.ItemsSource.Cast().ToList(); - var lw = LesewagenInput.IsChecked == true; if (App.Client.IsMatzen) { - var kl = mod.Where(m => m.Name.StartsWith("Klasse ")).Select(m => m.ModId).LastOrDefault("A")[0]; - if (lw) kl++; else kl--; - var newKl = source.FirstOrDefault(m => m.ModId == kl.ToString()); + var kl = mod.Where(m => m.Name.StartsWith("Klasse ")).Select(m => m.ModId).LastOrDefault("_")[0]; + if (ViewModel.IsUnloadingPumped && (kl == 'A' || kl == '_')) { + kl = 'B'; + } else if (kl == 'B' && !ViewModel.IsUnloadingPumped) { + kl = 'A'; + } else if (ViewModel.IsUnloadingDumper && (kl == 'B' || kl == '_')) { + kl = 'A'; + } else { + kl = '_'; + } + var newKl = source.FirstOrDefault(m => m?.ModId == kl.ToString(), null); if (newKl != null) ModifiersInput.SelectedItems.Add(newKl); - } else if (App.Client.IsWinzerkeller) { - if (lw && !mod.Any(m => m.Name.Contains("Lesewagen"))) { + } + + if (source.Any(m => m.Name.Contains("Lesewagen"))) { + if (ViewModel.IsUnloadingPumped && !mod.Any(m => m.Name.Contains("Lesewagen"))) { ModifiersInput.SelectedItems.Add(source.First(m => m.Name.Contains("Lesewagen"))); - } else if (!lw && mod.Any(m => m.Name.Contains("Lesewagen"))) { + } else if (!ViewModel.IsUnloadingPumped && mod.Any(m => m.Name.Contains("Lesewagen"))) { ModifiersInput.SelectedItems.Remove(mod.First(m => m.Name.Contains("Lesewagen"))); } } - CheckBox_Changed(sender, evt); + if (source.Any(m => m.Name.Contains("Kiste"))) { + if (ViewModel.IsUnloadingBox && !mod.Any(m => m.Name.Contains("Kiste"))) { + ModifiersInput.SelectedItems.Add(source.First(m => m.Name.Contains("Kiste"))); + } else if (!ViewModel.IsUnloadingBox && mod.Any(m => m.Name.Contains("Kiste"))) { + ModifiersInput.SelectedItems.Remove(mod.First(m => m.Name.Contains("Kiste"))); + } + } + + RadioButton_Changed(sender, evt); + } + + private void UnloadingInput_Unchecked(object sender, RoutedEventArgs evt) { + if (!IsEditing && !IsCreating) return; + RadioButton_Changed(sender, evt); } private void UpdateWineOrigin() { diff --git a/Tests/fetch-resources.bat b/Tests/fetch-resources.bat index 98693bc..4cc9941 100644 --- a/Tests/fetch-resources.bat +++ b/Tests/fetch-resources.bat @@ -1 +1 @@ -curl --fail -s -L "https://elwig.at/files/create.sql?v=34" -u "elwig:ganzGeheim123!" -o "Resources\Sql\Create.sql" +curl --fail -s -L "https://elwig.at/files/create.sql?v=35" -u "elwig:ganzGeheim123!" -o "Resources\Sql\Create.sql"