diff --git a/Elwig/Models/Delivery.cs b/Elwig/Models/Delivery.cs index 5594713..7692189 100644 --- a/Elwig/Models/Delivery.cs +++ b/Elwig/Models/Delivery.cs @@ -97,11 +97,10 @@ namespace Elwig.Models { public int SearchScore(IEnumerable keywords) { var list = new string?[] { - LsNr, Year.ToString(), Date.ToString("dd.MM.yyyy"), Time?.ToString("HH:mm"), - MgNr.ToString(), Member.FamilyName, Member.MiddleName, Member.GivenName, Member.BillingAddress?.Name, + LsNr, Date.ToString("dd.MM.yyyy"), Time?.ToString("HH:mm"), + Member.FamilyName, Member.MiddleName, Member.GivenName, Member.BillingAddress?.Name, Comment }.ToList(); - list.AddRange(Parts.Select(p => p.SortId).Distinct()); list.AddRange(Parts.Select(p => p.Comment).Distinct()); return Utils.GetSearchScore(list, keywords); } diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml b/Elwig/Windows/DeliveryAdminWindow.xaml index b4d0d2d..51dcf87 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml +++ b/Elwig/Windows/DeliveryAdminWindow.xaml @@ -80,14 +80,17 @@ - + - + Checked="AllSeasonsInput_Changed" Unchecked="AllSeasonsInput_Changed"/> (d.DateString == Utils.Today.ToString("yyyy-MM-dd") && d.TimeString.CompareTo("03:00:00") > 0) || (d.DateString == Utils.Today.AddDays(1).ToString("yyyy-MM-dd") && d.TimeString.CompareTo("03:00:00") <= 0)); - } else if (SeasonOnlyInput.IsChecked == true) { - deliveryQuery = deliveryQuery.Where(d => d.Year == Utils.CurrentLastSeason); + } else if (AllSeasonsInput.IsChecked == false) { + deliveryQuery = deliveryQuery.Where(d => d.Year == SeasonInput.Value); + } + + var filter = TextFilter.ToList(); + if (filter.Count > 0) { + var var = await Context.WineVarieties.Select(v => v.SortId).ToListAsync(); + var qual = await Context.WineQualityLevels.Select(q => q.QualId).ToListAsync(); + var mgnr = await Context.Members.Select(m => m.MgNr.ToString()).ToListAsync(); + var filterVar = new List(); + var filterQual = new List(); + var filterMgNr = new List(); + double filterKmwGt = 0; + double filterKmwLt = 0; + double filterOeGt = 0; + double filterOeLt = 0; + + for (int i = 0; i < filter.Count; i++) { + var e = filter[i]; + if (e.Length == 2 && var.Contains(e.ToUpper())) { + filterVar.Add(e.ToUpper()); + filter.RemoveAt(i--); + } else if (e.Length == 3 && qual.Contains(e.ToUpper())) { + filterQual.Add(e.ToUpper()); + filter.RemoveAt(i--); + } else if (e.All(char.IsAsciiDigit) && mgnr.Contains(e)) { + filterMgNr.Add(int.Parse(e)); + filter.RemoveAt(i--); + } else if (e.StartsWith(">") || e.StartsWith("<")) { + if (double.TryParse(e[1..], out var res)) { + switch ((e[0], res)) { + case ('>', <= 30): filterKmwGt = res; break; + case ('<', <= 30): filterKmwLt = res; break; + case ('>', _): filterOeGt = res; break; + case ('<', _): filterOeLt = res; break; + } + filter.RemoveAt(i--); + } + if (e.Length == 1) filter.RemoveAt(i--); + } else if (e.Length > 2 && e.StartsWith("\"") && e.EndsWith("\"")) { + filter[i] = e[1..^1]; + } + } + + if (filterMgNr.Count > 0) deliveryQuery = deliveryQuery.Where(d => filterMgNr.Contains(d.MgNr)); + if (filterVar.Count > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => filterVar.Contains(p.SortId))); + if (filterQual.Count > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => filterQual.Contains(p.QualId))); + if (filterKmwGt > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => p.Kmw >= filterKmwGt)); + if (filterKmwLt > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => p.Kmw < filterKmwLt)); + if (filterOeGt > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => p.Kmw * (4.54 + 0.022 * p.Kmw) >= filterOeGt)); + if (filterOeLt > 0) deliveryQuery = deliveryQuery.Where(d => d.Parts.Any(p => p.Kmw * (4.54 + 0.022 * p.Kmw) < filterOeLt)); } List deliveries = await deliveryQuery.OrderByDescending(d => d.DateString).ThenByDescending(d => d.TimeString).ToListAsync(); - if (TextFilter.Count > 0) { + if (filter.Count > 0 && deliveries.Count > 0) { var dict = deliveries .ToDictionary(d => d, d => d.SearchScore(TextFilter)) .OrderByDescending(a => a.Value) @@ -451,14 +503,31 @@ namespace Elwig.Windows { await RefreshDeliveryListQuery(true); } - private async void TodayOnlyInput_Changed(object sender, RoutedEventArgs evt) { - if (TodayOnlyInput.IsChecked == true && SeasonOnlyInput.IsChecked == true) SeasonOnlyInput.IsChecked = false; + private async void SeasonInput_ValueChanged(object sender, RoutedEventArgs evt) { + if (SeasonInput.Value == null) return; + TodayOnlyInput.IsChecked = false; + AllSeasonsInput.IsChecked = false; await RefreshDeliveryListQuery(); } - private async void SeasonOnlyInput_Changed(object sender, RoutedEventArgs evt) { - if (!IsInitialized) return; - if (SeasonOnlyInput.IsChecked == true && TodayOnlyInput.IsChecked == true) TodayOnlyInput.IsChecked = false; + private async void TodayOnlyInput_Changed(object sender, RoutedEventArgs evt) { + if (TodayOnlyInput.IsChecked == true && AllSeasonsInput.IsChecked == false) { + SeasonInput.Value = Utils.Today.Year; + TodayOnlyInput.IsChecked = true; + } + await RefreshDeliveryListQuery(); + } + + private async void AllSeasonsInput_Changed(object sender, RoutedEventArgs evt) { + if (AllSeasonsInput.IsChecked == true) { + SeasonInput.IsEnabled = false; + SeasonInput.Text = ""; + } else { + SeasonInput.IsEnabled = true; + var today = TodayOnlyInput.IsChecked; + SeasonInput.Value = Utils.CurrentLastSeason; + TodayOnlyInput.IsChecked = today; + } await RefreshDeliveryListQuery(); } @@ -518,7 +587,7 @@ namespace Elwig.Windows { var p = await UpdateDeliveryPart(DeliveryList.SelectedItem as Delivery, DeliveryPartList.SelectedItem as DeliveryPart); await RefreshDeliveryList(); RefreshDeliveryParts(); - DeliveryList.SelectedItem = p.Delivery; + DeliveryList.SelectedItem = p?.Delivery; DeliveryPartList.SelectedItem = null; InitialInputs(); } @@ -528,7 +597,7 @@ namespace Elwig.Windows { var p = await UpdateDeliveryPart(DeliveryList.SelectedItem as Delivery, DeliveryPartList.SelectedItem as DeliveryPart); await RefreshDeliveryList(); RefreshDeliveryParts(); - if (p != null) { + if (p?.Delivery != null) { using var doc = new DeliveryNote(p.Delivery); await doc.Generate(); doc.Show(); @@ -747,14 +816,16 @@ namespace Elwig.Windows { private void LockSearchInputs() { SearchInput.IsEnabled = false; + SeasonInput.IsEnabled = false; TodayOnlyInput.IsEnabled = false; - SeasonOnlyInput.IsEnabled = false; + AllSeasonsInput.IsEnabled = false; } private void UnlockSearchInputs() { SearchInput.IsEnabled = true; + SeasonInput.IsEnabled = true; TodayOnlyInput.IsEnabled = true; - SeasonOnlyInput.IsEnabled = true; + AllSeasonsInput.IsEnabled = (Member != null); } new protected void UnlockInputs() {