Compare commits
	
		
			2 Commits
		
	
	
		
			e79f4baa2f
			...
			d5e4e0a29d
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| d5e4e0a29d | |||
| 96570dffd4 | 
| @@ -19,6 +19,7 @@ | |||||||
|     <PackageReference Include="Balbarak.WeasyPrint" Version="2.0.2" /> |     <PackageReference Include="Balbarak.WeasyPrint" Version="2.0.2" /> | ||||||
|     <PackageReference Include="Extended.Wpf.Toolkit" Version="4.5.1" /> |     <PackageReference Include="Extended.Wpf.Toolkit" Version="4.5.1" /> | ||||||
|     <PackageReference Include="ini-parser" Version="2.5.2" /> |     <PackageReference Include="ini-parser" Version="2.5.2" /> | ||||||
|  |     <PackageReference Include="LinqKit" Version="1.2.4" /> | ||||||
|     <PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.22" /> |     <PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.22" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="7.0.11" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="7.0.11" /> | ||||||
|     <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.11" /> |     <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.11" /> | ||||||
|   | |||||||
| @@ -24,7 +24,7 @@ namespace Elwig.Helpers { | |||||||
|  |  | ||||||
|         public static readonly Regex SerialRegex = GeneratedSerialRegex(); |         public static readonly Regex SerialRegex = GeneratedSerialRegex(); | ||||||
|         public static readonly Regex TcpRegex = GeneratedTcpRegex(); |         public static readonly Regex TcpRegex = GeneratedTcpRegex(); | ||||||
|         public static readonly Regex PartialDateRegex = GeneratedPartialDateRegex(); |         public static readonly Regex DateFromToRegex = GeneratedFromToDateRegex(); | ||||||
|         public static readonly Regex FromToRegex = GeneratedFromToRegex(); |         public static readonly Regex FromToRegex = GeneratedFromToRegex(); | ||||||
|         public static readonly Regex FromToTimeRegex = GeneratedFromToTimeRegex(); |         public static readonly Regex FromToTimeRegex = GeneratedFromToTimeRegex(); | ||||||
|         public static readonly Regex AddressRegex = GeneratedAddressRegex(); |         public static readonly Regex AddressRegex = GeneratedAddressRegex(); | ||||||
| @@ -35,8 +35,8 @@ namespace Elwig.Helpers { | |||||||
|         [GeneratedRegex("^tcp://([A-Za-z0-9._-]+):([0-9]+)$", RegexOptions.Compiled)] |         [GeneratedRegex("^tcp://([A-Za-z0-9._-]+):([0-9]+)$", RegexOptions.Compiled)] | ||||||
|         private static partial Regex GeneratedTcpRegex(); |         private static partial Regex GeneratedTcpRegex(); | ||||||
|  |  | ||||||
|         [GeneratedRegex(@"^(0?[1-9]|[12][0-9]|3[01])\.(0?[1-9]|1[0-2])\.$", RegexOptions.Compiled)] |         [GeneratedRegex(@"^(-?(0?[1-9]|[12][0-9]|3[01])\.(0?[1-9]|1[0-2])\.([0-9]{4})?-?){1,2}$", RegexOptions.Compiled)] | ||||||
|         private static partial Regex GeneratedPartialDateRegex(); |         private static partial Regex GeneratedFromToDateRegex(); | ||||||
|  |  | ||||||
|         [GeneratedRegex(@"^([0-9]+([\.,][0-9]+)?)?-([0-9]+([\.,][0-9]+)?)?$", RegexOptions.Compiled)] |         [GeneratedRegex(@"^([0-9]+([\.,][0-9]+)?)?-([0-9]+([\.,][0-9]+)?)?$", RegexOptions.Compiled)] | ||||||
|         private static partial Regex GeneratedFromToRegex(); |         private static partial Regex GeneratedFromToRegex(); | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using System.ComponentModel.DataAnnotations.Schema; | using System.ComponentModel.DataAnnotations.Schema; | ||||||
|  | using IndexAttribute = Microsoft.EntityFrameworkCore.IndexAttribute; | ||||||
|  |  | ||||||
| namespace Elwig.Models { | namespace Elwig.Models { | ||||||
|     [Table("AT_plz_dest"), PrimaryKey("Id"), Index("Plz", "Okz", IsUnique = true)] |     [Table("AT_plz_dest"), PrimaryKey("Id"), Index("Plz", "Okz", IsUnique = true)] | ||||||
|   | |||||||
| @@ -1,6 +1,7 @@ | |||||||
| using Elwig.Helpers; | using Elwig.Helpers; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using System.ComponentModel.DataAnnotations.Schema; | using System.ComponentModel.DataAnnotations.Schema; | ||||||
|  | using IndexAttribute = Microsoft.EntityFrameworkCore.IndexAttribute; | ||||||
|  |  | ||||||
| namespace Elwig.Models { | namespace Elwig.Models { | ||||||
|     [Table("area_commitment_type"), PrimaryKey("VtrgId"), Index("SortId", "AttrId1", "AttrId2", "Discriminator")] |     [Table("area_commitment_type"), PrimaryKey("VtrgId"), Index("SortId", "AttrId1", "AttrId2", "Discriminator")] | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using System.ComponentModel.DataAnnotations.Schema; | using System.ComponentModel.DataAnnotations.Schema; | ||||||
|  | using IndexAttribute = Microsoft.EntityFrameworkCore.IndexAttribute; | ||||||
|  |  | ||||||
| namespace Elwig.Models { | namespace Elwig.Models { | ||||||
|     [Table("country"), PrimaryKey("Num"), Index("Alpha2", IsUnique = true), Index("Alpha3", IsUnique = true)] |     [Table("country"), PrimaryKey("Num"), Index("Alpha2", IsUnique = true), Index("Alpha3", IsUnique = true)] | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ using Elwig.Helpers; | |||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using System; | using System; | ||||||
| using System.ComponentModel.DataAnnotations.Schema; | using System.ComponentModel.DataAnnotations.Schema; | ||||||
|  | using IndexAttribute = Microsoft.EntityFrameworkCore.IndexAttribute; | ||||||
|  |  | ||||||
| namespace Elwig.Models { | namespace Elwig.Models { | ||||||
|     [Table("credit"), PrimaryKey("Year", "TgNr"), Index("Year", "AvNr", "MgNr", IsUnique = true)] |     [Table("credit"), PrimaryKey("Year", "TgNr"), Index("Year", "AvNr", "MgNr", IsUnique = true)] | ||||||
|   | |||||||
| @@ -4,6 +4,7 @@ using System; | |||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.ComponentModel.DataAnnotations.Schema; | using System.ComponentModel.DataAnnotations.Schema; | ||||||
| using System.Linq; | using System.Linq; | ||||||
|  | using IndexAttribute = Microsoft.EntityFrameworkCore.IndexAttribute; | ||||||
|  |  | ||||||
| namespace Elwig.Models { | namespace Elwig.Models { | ||||||
|     [Table("delivery"), PrimaryKey("Year", "DId"), Index("DateString", "ZwstId", "LNr", IsUnique = true), Index("LsNr", IsUnique = true)] |     [Table("delivery"), PrimaryKey("Year", "DId"), Index("DateString", "ZwstId", "LNr", IsUnique = true), Index("LsNr", IsUnique = true)] | ||||||
|   | |||||||
| @@ -3,6 +3,7 @@ using System; | |||||||
| using System.Collections.Generic; | using System.Collections.Generic; | ||||||
| using System.ComponentModel.DataAnnotations.Schema; | using System.ComponentModel.DataAnnotations.Schema; | ||||||
| using System.Linq; | using System.Linq; | ||||||
|  | using IndexAttribute = Microsoft.EntityFrameworkCore.IndexAttribute; | ||||||
|  |  | ||||||
| namespace Elwig.Models { | namespace Elwig.Models { | ||||||
|     [Table("wine_origin"), PrimaryKey("HkId"), Index("Name", IsUnique = true)] |     [Table("wine_origin"), PrimaryKey("HkId"), Index("Name", IsUnique = true)] | ||||||
|   | |||||||
| @@ -91,7 +91,8 @@ | |||||||
|             </Grid.ColumnDefinitions> |             </Grid.ColumnDefinitions> | ||||||
|  |  | ||||||
|             <TextBox x:Name="SearchInput" Grid.ColumnSpan="3" Margin="5,10,161,0" IsReadOnly="False" |             <TextBox x:Name="SearchInput" Grid.ColumnSpan="3" Margin="5,10,161,0" IsReadOnly="False" | ||||||
|                      TextChanged="SearchInput_TextChanged"/> |                      TextChanged="SearchInput_TextChanged" | ||||||
|  |                      ToolTip="Lieferungen filtern und durchsuchen. Die Filter sind beliebig kombinierbar.

Filtern nach:
Sorte: z.B. GV, ZW, rr, sa, ...
Qualitätsstufe: z.B. QUW, kab, ldw, ...
Gradation: z.B. >73, <15, 17-18, 15-, >17,5, 62-75, ...
Mitglied: z.B. 1234, 987, ...
Saison: z.B. 2020, >2015, 2017-2019, <2005, 2019-, ...
Zweigstelle: z.B. musterort, ...
Attribute: z.B. kabinett, !kabinett (alle außer kabinett), ...
Datum: z.B. 1.9., 15.9.-10.10., -15.10.2020, ...
Uhrzeit: z.B. 06:00-08:00, 18:00-, ...
Freitext: z.B. Lieferscheinnummern, "quw" (sucht nach dem Text "quw")"/> | ||||||
|             <xctk:IntegerUpDown Name="SeasonInput" Grid.ColumnSpan="3" Height="25" Width="56" FontSize="14" Minimum="1000" Maximum="9999" |             <xctk:IntegerUpDown Name="SeasonInput" Grid.ColumnSpan="3" Height="25" Width="56" FontSize="14" Minimum="1000" Maximum="9999" | ||||||
|                                 Margin="0,10,100,0" VerticalAlignment="Top" HorizontalAlignment="Right" |                                 Margin="0,10,100,0" VerticalAlignment="Top" HorizontalAlignment="Right" | ||||||
|                                 ValueChanged="SeasonInput_ValueChanged"/> |                                 ValueChanged="SeasonInput_ValueChanged"/> | ||||||
|   | |||||||
| @@ -2,6 +2,7 @@ using Elwig.Documents; | |||||||
| using Elwig.Helpers; | using Elwig.Helpers; | ||||||
| using Elwig.Helpers.Export; | using Elwig.Helpers.Export; | ||||||
| using Elwig.Models; | using Elwig.Models; | ||||||
|  | using LinqKit; | ||||||
| using Microsoft.EntityFrameworkCore; | using Microsoft.EntityFrameworkCore; | ||||||
| using Microsoft.EntityFrameworkCore.ChangeTracking; | using Microsoft.EntityFrameworkCore.ChangeTracking; | ||||||
| using Microsoft.Win32; | using Microsoft.Win32; | ||||||
| @@ -292,28 +293,25 @@ namespace Elwig.Windows { | |||||||
|                 .ThenBy(p => p.Delivery.LsNr) |                 .ThenBy(p => p.Delivery.LsNr) | ||||||
|                 .ThenBy(p => p.DPNr); |                 .ThenBy(p => p.DPNr); | ||||||
|  |  | ||||||
|             // TODO add filter for: |  | ||||||
|             //      attributes |  | ||||||
|             //      branches |  | ||||||
|             var filterVar = new List<string>(); |             var filterVar = new List<string>(); | ||||||
|             var filterQual = new List<string>(); |             var filterQual = new List<string>(); | ||||||
|             var filterMgNr = new List<int>(); |             var filterMgNr = new List<int>(); | ||||||
|             var filterDate = new List<string>(); |             var filterZwst = new List<string>(); | ||||||
|             var filterPartDate = new List<string>(); |             var filterAttr = new List<string>(); | ||||||
|             string? filterTimeGt = null; |             var filterNotAttr = new List<string>(); | ||||||
|             string? filterTimeLt = null; |             var filterDate = new List<(string?, string?)>(); | ||||||
|             int filterYearGt = 0; |             var filterTime = new List<(string?, string?)>(); | ||||||
|             int filterYearLt = 0; |             int filterYearGt = 0, filterYearLt = 0; | ||||||
|             double filterKmwGt = 0; |             double filterKmwGt = 0, filterKmwLt = 0; | ||||||
|             double filterKmwLt = 0; |             double filterOeGt = 0, filterOeLt = 0; | ||||||
|             double filterOeGt = 0; |  | ||||||
|             double filterOeLt = 0; |  | ||||||
|  |  | ||||||
|             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 Context.WineVarieties.ToDictionaryAsync(v => v.SortId, v => v); | ||||||
|                 var qual = await Context.WineQualityLevels.ToDictionaryAsync(q => q.QualId, q => q); |                 var qual = await Context.WineQualityLevels.ToDictionaryAsync(q => q.QualId, q => q); | ||||||
|                 var mgnr = await Context.Members.ToDictionaryAsync(m => m.MgNr.ToString(), m => m); |                 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); | ||||||
|  |  | ||||||
|                 for (int i = 0; i < filter.Count; i++) { |                 for (int i = 0; i < filter.Count; i++) { | ||||||
|                     var e = filter[i]; |                     var e = filter[i]; | ||||||
| @@ -329,6 +327,21 @@ namespace Elwig.Windows { | |||||||
|                         filterMgNr.Add(int.Parse(e)); |                         filterMgNr.Add(int.Parse(e)); | ||||||
|                         filter.RemoveAt(i--); |                         filter.RemoveAt(i--); | ||||||
|                         filterNames.Add(mgnr[e].AdministrativeName); |                         filterNames.Add(mgnr[e].AdministrativeName); | ||||||
|  |                     } else if (attr.ContainsKey(e.ToLower())) { | ||||||
|  |                         var a = attr[e.ToLower()]; | ||||||
|  |                         filterAttr.Add(a.AttrId); | ||||||
|  |                         filter.RemoveAt(i--); | ||||||
|  |                         filterNames.Add($"Attribut {a.Name}"); | ||||||
|  |                     } else if (e[0] == '!' && attr.ContainsKey(e[1..].ToLower())) { | ||||||
|  |                         var a = attr[e[1..].ToLower()]; | ||||||
|  |                         filterNotAttr.Add(a.AttrId); | ||||||
|  |                         filter.RemoveAt(i--); | ||||||
|  |                         filterNames.Add($"ohne Attribut {a.Name}"); | ||||||
|  |                     } else if (zwst.ContainsKey(e.ToLower())) { | ||||||
|  |                         var b = zwst[e.ToLower()]; | ||||||
|  |                         filterZwst.Add(b.ZwstId); | ||||||
|  |                         filter.RemoveAt(i--); | ||||||
|  |                         filterNames.Add($"Zweigstelle {b.Name}"); | ||||||
|                     } else if (e.StartsWith(">") || e.StartsWith("<")) { |                     } else if (e.StartsWith(">") || e.StartsWith("<")) { | ||||||
|                         if (double.TryParse(e[1..], out var num)) { |                         if (double.TryParse(e[1..], out var num)) { | ||||||
|                             switch ((e[0], num)) { |                             switch ((e[0], num)) { | ||||||
| @@ -340,12 +353,6 @@ namespace Elwig.Windows { | |||||||
|                                 case ('<', _): filterOeLt = num; break; |                                 case ('<', _): filterOeLt = num; break; | ||||||
|                             } |                             } | ||||||
|                             filter.RemoveAt(i--); |                             filter.RemoveAt(i--); | ||||||
|                         } else if (TimeOnly.TryParse(e[1..], out var time)) { |  | ||||||
|                             switch ((e[0], time)) { |  | ||||||
|                                 case ('>', _): filterTimeGt = $"{time:HH:mm}"; break; |  | ||||||
|                                 case ('<', _): filterTimeLt = $"{time:HH:mm}"; break; |  | ||||||
|                             } |  | ||||||
|                             filter.RemoveAt(i--); |  | ||||||
|                         } |                         } | ||||||
|                         if (e.Length == 1) filter.RemoveAt(i--); |                         if (e.Length == 1) filter.RemoveAt(i--); | ||||||
|                     } else if (e.Length > 1 && Utils.FromToRegex.IsMatch(e)) { |                     } else if (e.Length > 1 && Utils.FromToRegex.IsMatch(e)) { | ||||||
| @@ -373,26 +380,57 @@ namespace Elwig.Windows { | |||||||
|                         filter.RemoveAt(i--); |                         filter.RemoveAt(i--); | ||||||
|                     } else if (e.Length > 1 && Utils.FromToTimeRegex.IsMatch(e)) { |                     } else if (e.Length > 1 && Utils.FromToTimeRegex.IsMatch(e)) { | ||||||
|                         var parts = e.Split("-"); |                         var parts = e.Split("-"); | ||||||
|                         filterTimeGt = TimeOnly.TryParse(parts[0], out var from) ? $"{from:HH:mm}" : null; |                         filterTime.Add((TimeOnly.TryParse(parts[0], out var from) ? $"{from:HH:mm}" : null, TimeOnly.TryParse(parts[1], out var to) ? $"{to:HH:mm}" : null)); | ||||||
|                         filterTimeLt = TimeOnly.TryParse(parts[1], out var to) ? $"{to:HH:mm}" : null; |  | ||||||
|                         filter.RemoveAt(i--); |                         filter.RemoveAt(i--); | ||||||
|  |                         var t = filterTime.Last(); | ||||||
|  |                         if (t.Item1 != null && t.Item2 != null) { | ||||||
|  |                             filterNames.Add($"{t.Item1}–{t.Item2}"); | ||||||
|  |                         } else if (t.Item1 != null) { | ||||||
|  |                             filterNames.Add($"ab {t.Item1}"); | ||||||
|  |                         } else if (t.Item2 != null) { | ||||||
|  |                             filterNames.Add($"bis {t.Item2}"); | ||||||
|  |                         } | ||||||
|                     } else if (DateOnly.TryParse(e, out var date)) { |                     } else if (DateOnly.TryParse(e, out var date)) { | ||||||
|                         // TODO allow date ranges |                         var s = date.ToString("yyyy-MM-dd"); | ||||||
|                         filterDate.Add(date.ToString("yyyy-MM-dd")); |                         filterDate.Add((s, s)); | ||||||
|                         filter.RemoveAt(i--); |                         filter.RemoveAt(i--); | ||||||
|                         filterNames.Add(date.ToString("dd.MM.yyyy")); |                         if (filterNames.Contains(SeasonInput.Value.ToString()) && SeasonInput.Value == date.Year) | ||||||
|                     } else if (Utils.PartialDateRegex.IsMatch(e)) { |  | ||||||
|                         // TODO allow date ranges |  | ||||||
|                         var parts = e.Split("."); |  | ||||||
|                         var p0 = int.Parse(parts[0]); |  | ||||||
|                         var p1 = int.Parse(parts[1]); |  | ||||||
|                         filterPartDate.Add($"-{p1:00}-{p0:00}"); |  | ||||||
|                         filter.RemoveAt(i--); |  | ||||||
|                         if (filterNames.Contains(SeasonInput.Value.ToString())) { |  | ||||||
|                             filterNames.Remove(SeasonInput.Value.ToString()); |                             filterNames.Remove(SeasonInput.Value.ToString()); | ||||||
|                             filterNames.Add($"{p0:00}.{p1:00}.{SeasonInput.Value:0000}"); |                         filterNames.Add(date.ToString("dd.MM.yyyy")); | ||||||
|  |                     } else if (Utils.DateFromToRegex.IsMatch(e)) { | ||||||
|  |                         var parts = e.Split("-"); | ||||||
|  |                         if (parts.Length == 1) { | ||||||
|  |                             // single date | ||||||
|  |                             var dParts = parts[0].Split('.'); | ||||||
|  |                             var s = $"{dParts[2]}-{dParts[1].PadLeft(2, '0')}-{dParts[0].PadLeft(2, '0')}"; | ||||||
|  |                             filterDate.Add((s, s)); | ||||||
|  |                             filter.RemoveAt(i--); | ||||||
|  |                             var n = string.Join('.', s.Split('-').Reverse()); | ||||||
|  |                             if (dParts[2] == "") { | ||||||
|  |                                 filterNames.Remove(SeasonInput.Value.ToString()); | ||||||
|  |                                 filterNames.Add(n + SeasonInput.Value.ToString()); | ||||||
|                             } else { |                             } else { | ||||||
|                             filterNames.Add($"{p0:00}.{p1:00}."); |                                 if (SeasonInput.Value.ToString() == dParts[2]) | ||||||
|  |                                     filterNames.Remove(SeasonInput.Value.ToString()); | ||||||
|  |                                 filterNames.Add(n); | ||||||
|  |                             } | ||||||
|  |                         } else if (parts.Length == 2) { | ||||||
|  |                             // from/to date | ||||||
|  |                             var d1Parts = parts[0].Split('.'); | ||||||
|  |                             var d2Parts = parts[1].Split('.'); | ||||||
|  |                             var s1 = d1Parts.Length < 2 ? null : $"{d1Parts.ElementAtOrDefault(2)}-{d1Parts[1].PadLeft(2, '0')}-{d1Parts[0].PadLeft(2, '0')}"; | ||||||
|  |                             var s2 = d2Parts.Length < 2 ? null : $"{d2Parts.ElementAtOrDefault(2)}-{d2Parts[1].PadLeft(2, '0')}-{d2Parts[0].PadLeft(2, '0')}"; | ||||||
|  |                             filterDate.Add((s1, s2)); | ||||||
|  |                             filter.RemoveAt(i--); | ||||||
|  |                             var n1 = s1 == null ? null : string.Join('.', s1.Split('-').Reverse()); | ||||||
|  |                             var n2 = s2 == null ? null : string.Join('.', s2.Split('-').Reverse()); | ||||||
|  |                             if (n1 != null && n2 != null) { | ||||||
|  |                                 filterNames.Add($"{n1}–{n2}"); | ||||||
|  |                             } else if (n1 != null) { | ||||||
|  |                                 filterNames.Add($"ab dem {n1}"); | ||||||
|  |                             } else if (n2 != null) { | ||||||
|  |                                 filterNames.Add($"bis zum {n2}"); | ||||||
|  |                             } | ||||||
|                         } |                         } | ||||||
|                     } else if (e.Length > 2 && e.StartsWith("\"") && e.EndsWith("\"")) { |                     } else if (e.Length > 2 && e.StartsWith("\"") && e.EndsWith("\"")) { | ||||||
|                         filter[i] = e[1..^1]; |                         filter[i] = e[1..^1]; | ||||||
| @@ -401,15 +439,30 @@ namespace Elwig.Windows { | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 if (filterMgNr.Count > 0) dpq = dpq.Where(p => filterMgNr.Contains(p.Delivery.MgNr)); |  | ||||||
|                 if (filterDate.Count > 0) dpq = dpq.Where(p => filterDate.Contains(p.Delivery.DateString)); |  | ||||||
|                 if (filterPartDate.Count > 0) dpq = dpq.Where(p => filterPartDate.Contains(p.Delivery.DateString.Substring(4))); |  | ||||||
|                 if (filterYearGt > 0) dpq = dpq.Where(p => p.Year >= filterYearGt); |                 if (filterYearGt > 0) dpq = dpq.Where(p => p.Year >= filterYearGt); | ||||||
|                 if (filterYearLt > 0) dpq = dpq.Where(p => p.Year < filterYearLt); |                 if (filterYearLt > 0) dpq = dpq.Where(p => p.Year < filterYearLt); | ||||||
|                 if (filterTimeGt != null) dpq = dpq.Where(p => p.Delivery.TimeString != null && filterTimeGt.CompareTo(p.Delivery.TimeString) <= 0); |                 if (filterMgNr.Count > 0) dpq = dpq.Where(p => filterMgNr.Contains(p.Delivery.MgNr)); | ||||||
|                 if (filterTimeLt != null) dpq = dpq.Where(p => p.Delivery.TimeString != null && filterTimeLt.CompareTo(p.Delivery.TimeString) > 0); |                 if (filterDate.Count > 0) { | ||||||
|  |                     var pr = PredicateBuilder.New<DeliveryPart>(false); | ||||||
|  |                     foreach (var (d1, d2) in filterDate) | ||||||
|  |                         pr.Or(p => (d1 == null || d1.CompareTo(p.Delivery.DateString.Substring(10 - d1.Length)) <= 0) && (d2 == null || d2.CompareTo(p.Delivery.DateString.Substring(10 - d2.Length)) >= 0)); | ||||||
|  |                     dpq = dpq.Where(pr); | ||||||
|  |                 } | ||||||
|  |                 if (filterTime.Count > 0) { | ||||||
|  |                     var pr = PredicateBuilder.New<DeliveryPart>(false); | ||||||
|  |                     foreach (var (t1, t2) in filterTime) | ||||||
|  |                         pr.Or(p => (t1 == null || t1.CompareTo(p.Delivery.TimeString) <= 0) && (t2 == null || t2.CompareTo(p.Delivery.TimeString) > 0)); | ||||||
|  |                     dpq = dpq.Where(p => p.Delivery.TimeString != null).Where(pr); | ||||||
|  |                 } | ||||||
|                 if (filterVar.Count > 0) dpq = dpq.Where(p => filterVar.Contains(p.SortId)); |                 if (filterVar.Count > 0) dpq = dpq.Where(p => filterVar.Contains(p.SortId)); | ||||||
|                 if (filterQual.Count > 0) dpq = dpq.Where(p => filterQual.Contains(p.QualId)); |                 if (filterQual.Count > 0) dpq = dpq.Where(p => filterQual.Contains(p.QualId)); | ||||||
|  |                 if (filterZwst.Count > 0) dpq = dpq.Where(p => filterZwst.Contains(p.Delivery.ZwstId)); | ||||||
|  |                 if (filterAttr.Count > 0) | ||||||
|  |                     foreach (var a in filterAttr) | ||||||
|  |                         dpq = dpq.Where(p => p.PartAttributes.Select(a => a.Attr.AttrId).Contains(a)); | ||||||
|  |                 if (filterNotAttr.Count > 0) | ||||||
|  |                     foreach (var a in filterNotAttr) | ||||||
|  |                         dpq = dpq.Where(p => !p.PartAttributes.Select(a => a.Attr.AttrId).Contains(a)); | ||||||
|                 if (filterKmwGt > 0) dpq = dpq.Where(p => p.Kmw >= filterKmwGt); |                 if (filterKmwGt > 0) dpq = dpq.Where(p => p.Kmw >= filterKmwGt); | ||||||
|                 if (filterKmwLt > 0) dpq = dpq.Where(p => p.Kmw < filterKmwLt); |                 if (filterKmwLt > 0) dpq = dpq.Where(p => p.Kmw < filterKmwLt); | ||||||
|                 if (filterOeGt > 0) dpq = dpq.Where(p => p.Kmw * (4.54 + 0.022 * p.Kmw) >= filterOeGt); |                 if (filterOeGt > 0) dpq = dpq.Where(p => p.Kmw * (4.54 + 0.022 * p.Kmw) >= filterOeGt); | ||||||
| @@ -436,13 +489,6 @@ namespace Elwig.Windows { | |||||||
|                 } else if (filterOeLt > 0) { |                 } else if (filterOeLt > 0) { | ||||||
|                     filterNames.Add($"unter {filterOeLt:N1} °Oe"); |                     filterNames.Add($"unter {filterOeLt:N1} °Oe"); | ||||||
|                 } |                 } | ||||||
|                 if (filterTimeGt != null && filterTimeLt != null) { |  | ||||||
|                     filterNames.Add($"{filterTimeGt}–{filterTimeLt}"); |  | ||||||
|                 } else if (filterTimeGt != null) { |  | ||||||
|                     filterNames.Add($"ab {filterTimeGt}"); |  | ||||||
|                 } else if (filterTimeLt != null) { |  | ||||||
|                     filterNames.Add($"bis {filterTimeLt}"); |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             return (filterNames, dpq.Select(p => p.Delivery).Distinct().OrderBy(d => d.DateString).ThenBy(d => d.TimeString), dpq, filter); |             return (filterNames, dpq.Select(p => p.Delivery).Distinct().OrderBy(d => d.DateString).ThenBy(d => d.TimeString), dpq, filter); | ||||||
| @@ -560,7 +606,7 @@ namespace Elwig.Windows { | |||||||
|             ControlUtils.RenewItemsSource(MemberInput, await Context.Members.Where(m => m.IsActive || !IsCreating).OrderBy(m => m.FamilyName).ThenBy(m => m.GivenName).ToListAsync(), i => (i as Member)?.MgNr); |             ControlUtils.RenewItemsSource(MemberInput, await Context.Members.Where(m => m.IsActive || !IsCreating).OrderBy(m => m.FamilyName).ThenBy(m => m.GivenName).ToListAsync(), i => (i as Member)?.MgNr); | ||||||
|             ControlUtils.RenewItemsSource(BranchInput, await Context.Branches.OrderBy(b => b.Name).ToListAsync(), i => (i as Branch)?.ZwstId); |             ControlUtils.RenewItemsSource(BranchInput, await Context.Branches.OrderBy(b => b.Name).ToListAsync(), i => (i as Branch)?.ZwstId); | ||||||
|             ControlUtils.RenewItemsSource(WineVarietyInput, await Context.WineVarieties.OrderBy(v => v.Name).ToListAsync(), i => (i as WineVar)?.SortId); |             ControlUtils.RenewItemsSource(WineVarietyInput, await Context.WineVarieties.OrderBy(v => v.Name).ToListAsync(), i => (i as WineVar)?.SortId); | ||||||
|             ControlUtils.RenewItemsSource(AttributesInput, await Context.WineAttributes.Where(a => IsCreating || a.IsActive).OrderBy(a => a.Name).ToListAsync(), i => (i as WineAttr)?.AttrId); |             ControlUtils.RenewItemsSource(AttributesInput, await Context.WineAttributes.Where(a => !IsCreating || a.IsActive).OrderBy(a => a.Name).ToListAsync(), i => (i as WineAttr)?.AttrId); | ||||||
|             ControlUtils.RenewItemsSource(WineQualityLevelInput, await Context.WineQualityLevels.ToListAsync(), i => (i as WineQualLevel)?.QualId); |             ControlUtils.RenewItemsSource(WineQualityLevelInput, await Context.WineQualityLevels.ToListAsync(), i => (i as WineQualLevel)?.QualId); | ||||||
|             ControlUtils.RenewItemsSource(ModifiersInput, await Context.Modifiers.Where(m => m.Year == y).OrderBy(m => m.Ordering).ToListAsync(), i => (i as Modifier)?.ModId); |             ControlUtils.RenewItemsSource(ModifiersInput, await Context.Modifiers.Where(m => m.Year == y).OrderBy(m => m.Ordering).ToListAsync(), i => (i as Modifier)?.ModId); | ||||||
|             ControlUtils.RenewItemsSource(WineOriginInput, (await Context.WineOrigins.ToListAsync()).OrderByDescending(o => o.SortKey).ThenBy(o => o.HkId), i => (i as WineOrigin)?.HkId); |             ControlUtils.RenewItemsSource(WineOriginInput, (await Context.WineOrigins.ToListAsync()).OrderByDescending(o => o.SortKey).ThenBy(o => o.HkId), i => (i as WineOrigin)?.HkId); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user