Compare commits
	
		
			24 Commits
		
	
	
		
			0e17aa5408
			...
			v0.3.7
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 9df8056616 | |||
| 9e9195b9c0 | |||
| 1625f15f92 | |||
| 6a8bd9c932 | |||
| 05da8eefac | |||
| 04badb658b | |||
| 8f2f5b28cf | |||
| d5e4e0a29d | |||
| 96570dffd4 | |||
| e79f4baa2f | |||
| b79ba14f9e | |||
| de298ffef1 | |||
| eaf7b6bd41 | |||
| 2bb8205da0 | |||
| f623aa1fee | |||
| 00e7eeb774 | |||
| 47d51ded51 | |||
| 532bb826e1 | |||
| 8193bf483c | |||
| 34dcaf26d9 | |||
| 7411f570ee | |||
| 52702f3fa2 | |||
| 7f3573cede | |||
| 72359dc8be | 
@@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					using Elwig.Helpers;
 | 
				
			||||||
using Elwig.Models;
 | 
					using Elwig.Models;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Elwig.Documents {
 | 
					namespace Elwig.Documents {
 | 
				
			||||||
@@ -26,14 +27,9 @@ namespace Elwig.Documents {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        public string Address {
 | 
					        public string Address {
 | 
				
			||||||
            get {
 | 
					            get {
 | 
				
			||||||
                var b = Member.BillingAddress;
 | 
					                IAddress addr = (Member.BillingAddress != null && UseBillingAddress) ? Member.BillingAddress : Member;
 | 
				
			||||||
                if (b != null && UseBillingAddress) {
 | 
					                var plz = addr.PostalDest.AtPlz;
 | 
				
			||||||
                    var plz = b.PostalDest.AtPlz;
 | 
					                return (addr is BillingAddr ? $"{addr.Name}\n" : "") + $"{Member.AdministrativeName}\n{addr.Address}\n{plz?.Plz} {plz?.Ort.Name.Split(",")[0]}\n{addr.PostalDest.Country.Name}";
 | 
				
			||||||
                    return $"{b.Name}\n{Member.AdministrativeName}\n{b.Address}\n{plz.Plz} {plz.Ort.Name}\n{b.Country.Name}";
 | 
					 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    var plz = Member.PostalDest.AtPlz;
 | 
					 | 
				
			||||||
                    return $"{Member.AdministrativeName}\n{Member.Address}\n{plz.Plz} {plz.Ort.Name}\n{Member.PostalDest.Country.Name}";
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
using Elwig.Helpers;
 | 
					using Elwig.Helpers;
 | 
				
			||||||
using Elwig.Models;
 | 
					using Elwig.Models;
 | 
				
			||||||
 | 
					using Microsoft.EntityFrameworkCore;
 | 
				
			||||||
using System;
 | 
					using System;
 | 
				
			||||||
using System.Collections.Generic;
 | 
					using System.Collections.Generic;
 | 
				
			||||||
using System.Linq;
 | 
					using System.Linq;
 | 
				
			||||||
@@ -15,11 +16,19 @@ namespace Elwig.Documents {
 | 
				
			|||||||
            Deliveries = deliveries;
 | 
					            Deliveries = deliveries;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public DeliveryJournal(string filter, IQueryable<DeliveryPart> deliveries) :
 | 
				
			||||||
 | 
					            this(filter, deliveries
 | 
				
			||||||
 | 
					                .Include(p => p.Delivery)
 | 
				
			||||||
 | 
					                .Include(p => p.Delivery.Member)
 | 
				
			||||||
 | 
					                .Include(p => p.Variant)
 | 
				
			||||||
 | 
					                .ToList()) { }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public DeliveryJournal(AppDbContext ctx, DateOnly date) :
 | 
					        public DeliveryJournal(AppDbContext ctx, DateOnly date) :
 | 
				
			||||||
            this(date.ToString("dd.MM.yyyy"), ctx.DeliveryParts
 | 
					            this(date.ToString("dd.MM.yyyy"), ctx.DeliveryParts
 | 
				
			||||||
                .Where(p => p.Delivery.DateString == date.ToString("yyy-MM-dd"))
 | 
					                .Where(p => p.Delivery.DateString == date.ToString("yyy-MM-dd"))
 | 
				
			||||||
                .OrderBy(p => p.Delivery.LsNr)
 | 
					                .OrderBy(p => p.Delivery.DateString)
 | 
				
			||||||
                .ThenBy(p => p.DPNr)
 | 
					                .ThenBy(p => p.Delivery.TimeString)
 | 
				
			||||||
                .ToList()) { }
 | 
					                .ThenBy(p => p.Delivery.LsNr)
 | 
				
			||||||
 | 
					                .ThenBy(p => p.DPNr)) { }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -7,7 +7,7 @@
 | 
				
			|||||||
    <UseWPF>true</UseWPF>
 | 
					    <UseWPF>true</UseWPF>
 | 
				
			||||||
    <PreserveCompilationContext>true</PreserveCompilationContext>
 | 
					    <PreserveCompilationContext>true</PreserveCompilationContext>
 | 
				
			||||||
    <ApplicationIcon>elwig.ico</ApplicationIcon>
 | 
					    <ApplicationIcon>elwig.ico</ApplicationIcon>
 | 
				
			||||||
    <Version>0.3.3</Version>
 | 
					    <Version>0.3.7</Version>
 | 
				
			||||||
    <SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages>
 | 
					    <SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages>
 | 
				
			||||||
  </PropertyGroup>
 | 
					  </PropertyGroup>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -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();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -521,6 +521,36 @@ namespace Elwig.Helpers {
 | 
				
			|||||||
            return new(true, null);
 | 
					            return new(true, null);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        public static ValidationResult CheckTime(TextBox input, bool required) {
 | 
				
			||||||
 | 
					            string text = "";
 | 
				
			||||||
 | 
					            int pos = input.CaretIndex;
 | 
				
			||||||
 | 
					            int v = 0;
 | 
				
			||||||
 | 
					            for (int i = 0; i < input.Text.Length; i++) {
 | 
				
			||||||
 | 
					                char ch = input.Text[i];
 | 
				
			||||||
 | 
					                if (v >= 0 && v < 5 && v != 2 && char.IsAsciiDigit(ch)) {
 | 
				
			||||||
 | 
					                    if ((v == 0 && ch <= '2') || (v == 1 && (text[0] < '2' || ch <= '3')) || (v == 3 && ch <= '5') || v == 4) {
 | 
				
			||||||
 | 
					                        text += ch;
 | 
				
			||||||
 | 
					                        v++;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                } else if (v == 2 && ch == ':') {
 | 
				
			||||||
 | 
					                    text += ch;
 | 
				
			||||||
 | 
					                    v++;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if (i == input.CaretIndex - 1)
 | 
				
			||||||
 | 
					                    pos = text.Length;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            input.Text = text;
 | 
				
			||||||
 | 
					            input.CaretIndex = pos;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (text.Length == 0) {
 | 
				
			||||||
 | 
					                return required ? new(false, "Wert ist nicht optional") : new(true, null);
 | 
				
			||||||
 | 
					            } else if (v != 5) {
 | 
				
			||||||
 | 
					                return new(false, "Zeit ist ungültig");
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                return new(true, null);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public static ValidationResult CheckFbNr(TextBox input, bool required, AppDbContext ctx, AreaCom? c) {
 | 
					        public static ValidationResult CheckFbNr(TextBox input, bool required, AppDbContext ctx, AreaCom? c) {
 | 
				
			||||||
            var res = CheckInteger(input, required);
 | 
					            var res = CheckInteger(input, required);
 | 
				
			||||||
            if (!res.IsValid) {
 | 
					            if (!res.IsValid) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -99,6 +99,9 @@ namespace Elwig.Models {
 | 
				
			|||||||
        [NotMapped]
 | 
					        [NotMapped]
 | 
				
			||||||
        public IEnumerable<WineAttr> Attributes => PartAttributes.Select(a => a.Attr);
 | 
					        public IEnumerable<WineAttr> Attributes => PartAttributes.Select(a => a.Attr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        [NotMapped]
 | 
				
			||||||
 | 
					        public string AttributesString => string.Join("/", Attributes);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        [InverseProperty("Part")]
 | 
					        [InverseProperty("Part")]
 | 
				
			||||||
        public virtual ISet<DeliveryPartModifier> PartModifiers { get; private set; }
 | 
					        public virtual ISet<DeliveryPartModifier> PartModifiers { get; private set; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)]
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -482,6 +482,14 @@ namespace Elwig.Windows {
 | 
				
			|||||||
            InputLostFocus((TextBox)sender, Validator.CheckDate);
 | 
					            InputLostFocus((TextBox)sender, Validator.CheckDate);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected void TimeInput_TextChanged(object sender, RoutedEventArgs evt) {
 | 
				
			||||||
 | 
					            InputTextChanged((TextBox)sender, Validator.CheckTime);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        protected void TimeInput_LostFocus(object sender, RoutedEventArgs evt) {
 | 
				
			||||||
 | 
					            InputLostFocus((TextBox)sender, Validator.CheckTime);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        protected void PlzInput_TextChanged(object sender, RoutedEventArgs evt) {
 | 
					        protected void PlzInput_TextChanged(object sender, RoutedEventArgs evt) {
 | 
				
			||||||
            var plz = (TextBox)sender;
 | 
					            var plz = (TextBox)sender;
 | 
				
			||||||
            InputTextChanged(plz, Validator.CheckPlz);
 | 
					            InputTextChanged(plz, Validator.CheckPlz);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,7 +5,7 @@
 | 
				
			|||||||
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 | 
					        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 | 
				
			||||||
        xmlns:local="clr-namespace:Elwig.Windows"
 | 
					        xmlns:local="clr-namespace:Elwig.Windows"
 | 
				
			||||||
        xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
 | 
					        xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
 | 
				
			||||||
        Title="Lieferungen - Elwig" Height="720" Width="1100" MinHeight="700" MinWidth="1000"
 | 
					        Title="Lieferungen - Elwig" Height="720" Width="1100" MinHeight="720" MinWidth="1000"
 | 
				
			||||||
        Loaded="Window_Loaded">
 | 
					        Loaded="Window_Loaded">
 | 
				
			||||||
    <Window.Resources>
 | 
					    <Window.Resources>
 | 
				
			||||||
        <Style TargetType="Label">
 | 
					        <Style TargetType="Label">
 | 
				
			||||||
@@ -43,16 +43,13 @@
 | 
				
			|||||||
    <Grid>
 | 
					    <Grid>
 | 
				
			||||||
        <Grid.RowDefinitions>
 | 
					        <Grid.RowDefinitions>
 | 
				
			||||||
            <RowDefinition Height="19"/>
 | 
					            <RowDefinition Height="19"/>
 | 
				
			||||||
            <RowDefinition Height="0.625*"/>
 | 
					 | 
				
			||||||
            <RowDefinition Height="*"/>
 | 
					 | 
				
			||||||
            <RowDefinition Height="*"/>
 | 
					 | 
				
			||||||
            <RowDefinition Height="*"/>
 | 
					            <RowDefinition Height="*"/>
 | 
				
			||||||
            <RowDefinition Height="24"/>
 | 
					            <RowDefinition Height="24"/>
 | 
				
			||||||
        </Grid.RowDefinitions>
 | 
					        </Grid.RowDefinitions>
 | 
				
			||||||
        <Grid.ColumnDefinitions>
 | 
					        <Grid.ColumnDefinitions>
 | 
				
			||||||
            <ColumnDefinition Width="1*" MinWidth="400"/>
 | 
					            <ColumnDefinition Width="1*" MinWidth="400"/>
 | 
				
			||||||
            <ColumnDefinition Width="1*"/>
 | 
					            <ColumnDefinition Width="5"/>
 | 
				
			||||||
            <ColumnDefinition Width="1*"/>
 | 
					            <ColumnDefinition Width="2*" MinWidth="560"/>
 | 
				
			||||||
        </Grid.ColumnDefinitions>
 | 
					        </Grid.ColumnDefinitions>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <Menu Grid.ColumnSpan="3" BorderThickness="0,0,0,1" BorderBrush="LightGray" Background="White">
 | 
					        <Menu Grid.ColumnSpan="3" BorderThickness="0,0,0,1" BorderBrush="LightGray" Background="White">
 | 
				
			||||||
@@ -75,9 +72,13 @@
 | 
				
			|||||||
            <MenuItem Header="Exportieren">
 | 
					            <MenuItem Header="Exportieren">
 | 
				
			||||||
                <MenuItem x:Name="Menu_Export_Bki" Header="Traubentransportscheinliste (BKI)"/>
 | 
					                <MenuItem x:Name="Menu_Export_Bki" Header="Traubentransportscheinliste (BKI)"/>
 | 
				
			||||||
            </MenuItem>
 | 
					            </MenuItem>
 | 
				
			||||||
 | 
					            <MenuItem Header="Einstellungen">
 | 
				
			||||||
 | 
					                <MenuItem x:Name="Menu_Settings_EnableFreeEditing" Header="Freie Bearbeitung aktivieren"
 | 
				
			||||||
 | 
					                          IsCheckable="True" Checked="Menu_Settings_EnableFreeEditing_Checked" Unchecked="Menu_Settings_EnableFreeEditing_Unchecked"/>
 | 
				
			||||||
 | 
					            </MenuItem>
 | 
				
			||||||
        </Menu>
 | 
					        </Menu>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <Grid Grid.RowSpan="4" Grid.Row="1" Margin="5,0,5,0">
 | 
					        <Grid Grid.Row="1" Margin="5,0,0,0">
 | 
				
			||||||
            <Grid.RowDefinitions>
 | 
					            <Grid.RowDefinitions>
 | 
				
			||||||
                <RowDefinition Height="42"/>
 | 
					                <RowDefinition Height="42"/>
 | 
				
			||||||
                <RowDefinition Height="*"/>
 | 
					                <RowDefinition Height="*"/>
 | 
				
			||||||
@@ -90,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, !gv (ausgenommen GV), ...
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"/>
 | 
				
			||||||
@@ -105,17 +107,50 @@
 | 
				
			|||||||
                      CanUserDeleteRows="False" CanUserResizeRows="False" CanUserAddRows="False"
 | 
					                      CanUserDeleteRows="False" CanUserResizeRows="False" CanUserAddRows="False"
 | 
				
			||||||
                      Margin="5,0,5,0" Grid.Row="1" FontSize="14" Grid.ColumnSpan="3">
 | 
					                      Margin="5,0,5,0" Grid.Row="1" FontSize="14" Grid.ColumnSpan="3">
 | 
				
			||||||
                <DataGrid.Columns>
 | 
					                <DataGrid.Columns>
 | 
				
			||||||
                    <DataGridTextColumn Header="MgNr."   Binding="{Binding MgNr}" Width="70"/>
 | 
					                    <DataGridTextColumn Header="MgNr." Binding="{Binding MgNr, StringFormat='{}{0} '}" Width="50">
 | 
				
			||||||
                    <DataGridTextColumn Header="Datum"   Binding="{Binding Date, StringFormat='dd.MM.yy'}" Width="70"/>
 | 
					 | 
				
			||||||
                    <DataGridTextColumn Header="Zeit"    Binding="{Binding Time, StringFormat='HH:mm'}" Width="70"/>
 | 
					 | 
				
			||||||
                    <DataGridTextColumn Header="Sorte"   Binding="{Binding SortIdString}" Width="60"/>
 | 
					 | 
				
			||||||
                    <DataGridTextColumn Header="Gewicht" Binding="{Binding Weight, StringFormat='{}{0:N0} kg'}"  Width="70">
 | 
					 | 
				
			||||||
                        <DataGridTextColumn.CellStyle>
 | 
					                        <DataGridTextColumn.CellStyle>
 | 
				
			||||||
                            <Style>
 | 
					                            <Style>
 | 
				
			||||||
                                <Setter Property="TextBlock.TextAlignment" Value="Right"/>
 | 
					                                <Setter Property="TextBlock.TextAlignment" Value="Right"/>
 | 
				
			||||||
                            </Style>
 | 
					                            </Style>
 | 
				
			||||||
                        </DataGridTextColumn.CellStyle>
 | 
					                        </DataGridTextColumn.CellStyle>
 | 
				
			||||||
                    </DataGridTextColumn>
 | 
					                    </DataGridTextColumn>
 | 
				
			||||||
 | 
					                    <DataGridTextColumn Header="Datum" Binding="{Binding Date, StringFormat='dd.MM.yy'}" Width="70">
 | 
				
			||||||
 | 
					                        <DataGridTextColumn.CellStyle>
 | 
				
			||||||
 | 
					                            <Style>
 | 
				
			||||||
 | 
					                                <Setter Property="TextBlock.TextAlignment" Value="Center"/>
 | 
				
			||||||
 | 
					                            </Style>
 | 
				
			||||||
 | 
					                        </DataGridTextColumn.CellStyle>
 | 
				
			||||||
 | 
					                    </DataGridTextColumn>
 | 
				
			||||||
 | 
					                    <DataGridTextColumn Header="Zeit" Binding="{Binding Time, StringFormat='HH:mm'}" Width="50">
 | 
				
			||||||
 | 
					                        <DataGridTextColumn.CellStyle>
 | 
				
			||||||
 | 
					                            <Style>
 | 
				
			||||||
 | 
					                                <Setter Property="TextBlock.TextAlignment" Value="Center"/>
 | 
				
			||||||
 | 
					                            </Style>
 | 
				
			||||||
 | 
					                        </DataGridTextColumn.CellStyle>
 | 
				
			||||||
 | 
					                    </DataGridTextColumn>
 | 
				
			||||||
 | 
					                    <DataGridTextColumn Header="Sorte" Binding="{Binding SortIdString}" Width="50">
 | 
				
			||||||
 | 
					                        <DataGridTextColumn.CellStyle>
 | 
				
			||||||
 | 
					                            <Style>
 | 
				
			||||||
 | 
					                                <Setter Property="TextBlock.TextAlignment" Value="Center"/>
 | 
				
			||||||
 | 
					                            </Style>
 | 
				
			||||||
 | 
					                        </DataGridTextColumn.CellStyle>
 | 
				
			||||||
 | 
					                    </DataGridTextColumn>
 | 
				
			||||||
 | 
					                    <DataGridTextColumn Header="Gewicht" Binding="{Binding Weight, StringFormat='{}{0:N0} kg '}" Width="75">
 | 
				
			||||||
 | 
					                        <DataGridTextColumn.CellStyle>
 | 
				
			||||||
 | 
					                            <Style>
 | 
				
			||||||
 | 
					                                <Setter Property="TextBlock.TextAlignment" Value="Right"/>
 | 
				
			||||||
 | 
					                            </Style>
 | 
				
			||||||
 | 
					                        </DataGridTextColumn.CellStyle>
 | 
				
			||||||
 | 
					                    </DataGridTextColumn>
 | 
				
			||||||
 | 
					                    <DataGridTextColumn Header="Gradation" Binding="{Binding Kmw, StringFormat='{}{0:N1}° '}" Width="50">
 | 
				
			||||||
 | 
					                        <DataGridTextColumn.CellStyle>
 | 
				
			||||||
 | 
					                            <Style>
 | 
				
			||||||
 | 
					                                <Setter Property="TextBlock.TextAlignment" Value="Right"/>
 | 
				
			||||||
 | 
					                            </Style>
 | 
				
			||||||
 | 
					                        </DataGridTextColumn.CellStyle>
 | 
				
			||||||
 | 
					                    </DataGridTextColumn>
 | 
				
			||||||
 | 
					                    <DataGridTextColumn Header="LsNr." Binding="{Binding LsNr}" Width="120"/>
 | 
				
			||||||
 | 
					                    <DataGridTextColumn Header="Mitglied" Binding="{Binding Member.AdministrativeName}" Width="180"/>
 | 
				
			||||||
                </DataGrid.Columns>
 | 
					                </DataGrid.Columns>
 | 
				
			||||||
            </DataGrid>
 | 
					            </DataGrid>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -156,7 +191,21 @@
 | 
				
			|||||||
                    Click="CancelButton_Click"/>
 | 
					                    Click="CancelButton_Click"/>
 | 
				
			||||||
        </Grid>
 | 
					        </Grid>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <GroupBox Header="Mitglied" Grid.Column="1" Grid.Row="1" Margin="5,5,5,5">
 | 
					        <GridSplitter Grid.Column="1" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <Grid Grid.Row="1" Grid.Column="2">
 | 
				
			||||||
 | 
					            <Grid.RowDefinitions>
 | 
				
			||||||
 | 
					                <RowDefinition Height="0.625*"/>
 | 
				
			||||||
 | 
					                <RowDefinition Height="*"/>
 | 
				
			||||||
 | 
					                <RowDefinition Height="*"/>
 | 
				
			||||||
 | 
					                <RowDefinition Height="*"/>
 | 
				
			||||||
 | 
					            </Grid.RowDefinitions>
 | 
				
			||||||
 | 
					            <Grid.ColumnDefinitions>
 | 
				
			||||||
 | 
					                <ColumnDefinition Width="*"/>
 | 
				
			||||||
 | 
					                <ColumnDefinition Width="*"/>
 | 
				
			||||||
 | 
					            </Grid.ColumnDefinitions>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <GroupBox Header="Mitglied" Grid.Column="0" Grid.Row="0" Margin="5,5,5,5">
 | 
				
			||||||
                <Grid>
 | 
					                <Grid>
 | 
				
			||||||
                    <Grid.ColumnDefinitions>
 | 
					                    <Grid.ColumnDefinitions>
 | 
				
			||||||
                        <ColumnDefinition Width="70"/>
 | 
					                        <ColumnDefinition Width="70"/>
 | 
				
			||||||
@@ -176,7 +225,7 @@
 | 
				
			|||||||
                </Grid>
 | 
					                </Grid>
 | 
				
			||||||
            </GroupBox>
 | 
					            </GroupBox>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <GroupBox Header="Lieferung" Grid.Column="1" Grid.Row="2" Margin="5,5,5,5">
 | 
					            <GroupBox Header="Lieferung" Grid.Column="0" Grid.Row="1" Margin="5,5,5,5">
 | 
				
			||||||
                <Grid>
 | 
					                <Grid>
 | 
				
			||||||
                    <Grid.ColumnDefinitions>
 | 
					                    <Grid.ColumnDefinitions>
 | 
				
			||||||
                        <ColumnDefinition Width="100"/>
 | 
					                        <ColumnDefinition Width="100"/>
 | 
				
			||||||
@@ -185,18 +234,21 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                    <Label Content="LieferscheinNr.:" Margin="10,10,0,0" Grid.Column="0"/>
 | 
					                    <Label Content="LieferscheinNr.:" Margin="10,10,0,0" Grid.Column="0"/>
 | 
				
			||||||
                    <TextBox x:Name="LsNrInput" Width="126" Grid.Column="1" HorizontalAlignment="Left" Margin="0,10,0,0"
 | 
					                    <TextBox x:Name="LsNrInput" Width="126" Grid.Column="1" HorizontalAlignment="Left" Margin="0,10,0,0"
 | 
				
			||||||
                         IsReadOnly="True" IsTabStop="False"/>
 | 
					                             IsReadOnly="True" IsTabStop="False"
 | 
				
			||||||
 | 
					                             TextChanged="TextBox_TextChanged"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    <Label Content="Datum/Uhrzeit:" Margin="10,40,0,0" Grid.Column="0"/>
 | 
					                    <Label Content="Datum/Uhrzeit:" Margin="10,40,0,0" Grid.Column="0"/>
 | 
				
			||||||
                    <TextBox x:Name="DateInput" Width="77" Grid.Column="1" HorizontalAlignment="Left" Margin="0,40,0,0"
 | 
					                    <TextBox x:Name="DateInput" Width="77" Grid.Column="1" HorizontalAlignment="Left" Margin="0,40,0,0"
 | 
				
			||||||
                         IsReadOnly="True" IsTabStop="False"
 | 
					                             IsReadOnly="True"
 | 
				
			||||||
                         TextChanged="DateInput_TextChanged"/>
 | 
					                             TextChanged="DateInput_TextChanged" LostFocus="DateInput_LostFocus"/>
 | 
				
			||||||
                    <TextBox x:Name="TimeInput" Width="44" Grid.Column="1" HorizontalAlignment="Left" Margin="82,40,0,0"
 | 
					                    <TextBox x:Name="TimeInput" Width="44" Grid.Column="1" HorizontalAlignment="Left" Margin="82,40,0,0"
 | 
				
			||||||
                         IsReadOnly="True" IsTabStop="False"/>
 | 
					                             IsReadOnly="True"
 | 
				
			||||||
 | 
					                             TextChanged="TimeInput_TextChanged" LostFocus="TimeInput_LostFocus"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    <Label Content="Zweigstelle:" Margin="10,70,0,0" Grid.Column="0"/>
 | 
					                    <Label Content="Zweigstelle:" Margin="10,70,0,0" Grid.Column="0"/>
 | 
				
			||||||
                    <ComboBox x:Name="BranchInput" Width="126" Margin="0,70,10,0" Grid.Column="1" HorizontalAlignment="Left"
 | 
					                    <ComboBox x:Name="BranchInput" Width="126" Margin="0,70,10,0" Grid.Column="1" HorizontalAlignment="Left"
 | 
				
			||||||
                              IsEnabled="False"
 | 
					                              IsEnabled="False"
 | 
				
			||||||
 | 
					                              SelectionChanged="BranchInput_SelectionChanged"
 | 
				
			||||||
                              DisplayMemberPath="Name" TextSearch.TextPath="Name"/>
 | 
					                              DisplayMemberPath="Name" TextSearch.TextPath="Name"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    <Label Content="Anmerkung:" Margin="10,100,0,10"/>
 | 
					                    <Label Content="Anmerkung:" Margin="10,100,0,10"/>
 | 
				
			||||||
@@ -205,7 +257,7 @@
 | 
				
			|||||||
                </Grid>
 | 
					                </Grid>
 | 
				
			||||||
            </GroupBox>
 | 
					            </GroupBox>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <GroupBox Header="Sorte" Grid.Column="2" Grid.Row="1" Margin="5,5,5,5">
 | 
					            <GroupBox Header="Sorte" Grid.Column="1" Grid.Row="0" Margin="5,5,5,5">
 | 
				
			||||||
                <Grid>
 | 
					                <Grid>
 | 
				
			||||||
                    <Grid.ColumnDefinitions>
 | 
					                    <Grid.ColumnDefinitions>
 | 
				
			||||||
                        <ColumnDefinition Width="70"/>
 | 
					                        <ColumnDefinition Width="70"/>
 | 
				
			||||||
@@ -226,7 +278,7 @@
 | 
				
			|||||||
                </Grid>
 | 
					                </Grid>
 | 
				
			||||||
            </GroupBox>
 | 
					            </GroupBox>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <GroupBox Header="Gradation" Grid.Column="2" Grid.Row="2" Margin="5,5,5,5">
 | 
					            <GroupBox Header="Gradation" Grid.Column="1" Grid.Row="1" Margin="5,5,5,5">
 | 
				
			||||||
                <Grid>
 | 
					                <Grid>
 | 
				
			||||||
                    <Grid.ColumnDefinitions>
 | 
					                    <Grid.ColumnDefinitions>
 | 
				
			||||||
                        <ColumnDefinition Width="100"/>
 | 
					                        <ColumnDefinition Width="100"/>
 | 
				
			||||||
@@ -255,7 +307,7 @@
 | 
				
			|||||||
                </Grid>
 | 
					                </Grid>
 | 
				
			||||||
            </GroupBox>
 | 
					            </GroupBox>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <GroupBox Header="Gewicht" Grid.Column="2" Grid.Row="3" Margin="5,5,5,5">
 | 
					            <GroupBox Header="Gewicht" Grid.Column="1" Grid.Row="2" Margin="5,5,5,5">
 | 
				
			||||||
                <Grid>
 | 
					                <Grid>
 | 
				
			||||||
                    <Grid.ColumnDefinitions>
 | 
					                    <Grid.ColumnDefinitions>
 | 
				
			||||||
                        <ColumnDefinition Width="70"/>
 | 
					                        <ColumnDefinition Width="70"/>
 | 
				
			||||||
@@ -295,7 +347,7 @@
 | 
				
			|||||||
                </Grid>
 | 
					                </Grid>
 | 
				
			||||||
            </GroupBox>
 | 
					            </GroupBox>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <GroupBox Header="Sonstiges" Grid.Column="2" Grid.Row="4" Margin="5,5,5,10">
 | 
					            <GroupBox Header="Sonstiges" Grid.Column="1" Grid.Row="3" Margin="5,5,5,10">
 | 
				
			||||||
                <Grid>
 | 
					                <Grid>
 | 
				
			||||||
                    <Grid.ColumnDefinitions>
 | 
					                    <Grid.ColumnDefinitions>
 | 
				
			||||||
                        <ColumnDefinition Width="100"/>
 | 
					                        <ColumnDefinition Width="100"/>
 | 
				
			||||||
@@ -335,7 +387,7 @@
 | 
				
			|||||||
                </Grid>
 | 
					                </Grid>
 | 
				
			||||||
            </GroupBox>
 | 
					            </GroupBox>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <GroupBox Header="Teillieferungen" Grid.Column="1" Grid.Row="3" Margin="5,5,5,5">
 | 
					            <GroupBox Header="Teillieferungen" Grid.Column="0" Grid.Row="2" Margin="5,5,5,5">
 | 
				
			||||||
                <Grid>
 | 
					                <Grid>
 | 
				
			||||||
                    <Grid.ColumnDefinitions>
 | 
					                    <Grid.ColumnDefinitions>
 | 
				
			||||||
                        <ColumnDefinition/>
 | 
					                        <ColumnDefinition/>
 | 
				
			||||||
@@ -350,7 +402,8 @@
 | 
				
			|||||||
                                    <TextBlock Text="{Binding SortId}" Width="30"/>
 | 
					                                    <TextBlock Text="{Binding SortId}" Width="30"/>
 | 
				
			||||||
                                    <TextBlock Text="{Binding Kmw, StringFormat='{}{0:0.0}°'}" Width="40" TextAlignment="Right" Padding="0,0,10,0"/>
 | 
					                                    <TextBlock Text="{Binding Kmw, StringFormat='{}{0:0.0}°'}" Width="40" TextAlignment="Right" Padding="0,0,10,0"/>
 | 
				
			||||||
                                    <TextBlock Text="{Binding QualId}" Width="30"/>
 | 
					                                    <TextBlock Text="{Binding QualId}" Width="30"/>
 | 
				
			||||||
                                <TextBlock Text="{Binding Weight, StringFormat='{}{0:N0} kg'}" Width="60" TextAlignment="Right"/>
 | 
					                                    <TextBlock Text="{Binding Weight, StringFormat='{}{0:N0} kg'}" Width="60" TextAlignment="Right" Padding="0,0,10,0"/>
 | 
				
			||||||
 | 
					                                    <TextBlock Text="{Binding AttributesString}" Width="100"/>
 | 
				
			||||||
                                </StackPanel>
 | 
					                                </StackPanel>
 | 
				
			||||||
                            </DataTemplate>
 | 
					                            </DataTemplate>
 | 
				
			||||||
                        </ListBox.ItemTemplate>
 | 
					                        </ListBox.ItemTemplate>
 | 
				
			||||||
@@ -366,7 +419,7 @@
 | 
				
			|||||||
                </Grid>
 | 
					                </Grid>
 | 
				
			||||||
            </GroupBox>
 | 
					            </GroupBox>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <GroupBox Header="Herkunft" Grid.Column="1" Grid.Row="4" Margin="5,5,5,10">
 | 
					            <GroupBox Header="Herkunft" Grid.Column="0" Grid.Row="3" Margin="5,5,5,10">
 | 
				
			||||||
                <Grid>
 | 
					                <Grid>
 | 
				
			||||||
                    <Grid.ColumnDefinitions>
 | 
					                    <Grid.ColumnDefinitions>
 | 
				
			||||||
                        <ColumnDefinition Width="100"/>
 | 
					                        <ColumnDefinition Width="100"/>
 | 
				
			||||||
@@ -387,6 +440,7 @@
 | 
				
			|||||||
                              DisplayMemberPath="Name"/>
 | 
					                              DisplayMemberPath="Name"/>
 | 
				
			||||||
                </Grid>
 | 
					                </Grid>
 | 
				
			||||||
            </GroupBox>
 | 
					            </GroupBox>
 | 
				
			||||||
 | 
					        </Grid>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <StatusBar Grid.Row="5" Grid.ColumnSpan="3" BorderThickness="0,1,0,0" BorderBrush="Gray">
 | 
					        <StatusBar Grid.Row="5" Grid.ColumnSpan="3" BorderThickness="0,1,0,0" BorderBrush="Gray">
 | 
				
			||||||
            <StatusBar.ItemsPanel>
 | 
					            <StatusBar.ItemsPanel>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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;
 | 
				
			||||||
@@ -180,11 +181,30 @@ namespace Elwig.Windows {
 | 
				
			|||||||
            doc.Show();
 | 
					            doc.Show();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private void Menu_Settings_EnableFreeEditing_Checked(object sender, RoutedEventArgs evt) {
 | 
				
			||||||
 | 
					            if (IsEditing || IsCreating) {
 | 
				
			||||||
 | 
					                DateInput.IsReadOnly = false;
 | 
				
			||||||
 | 
					                TimeInput.IsReadOnly = false;
 | 
				
			||||||
 | 
					                BranchInput.IsEnabled = true;
 | 
				
			||||||
 | 
					                if (IsCreating) TimeInput.Text = "";
 | 
				
			||||||
 | 
					                OnSecondPassed(null, null);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private void Menu_Settings_EnableFreeEditing_Unchecked(object sender, RoutedEventArgs evt) {
 | 
				
			||||||
 | 
					            DateInput.IsReadOnly = true;
 | 
				
			||||||
 | 
					            TimeInput.IsReadOnly = true;
 | 
				
			||||||
 | 
					            BranchInput.IsEnabled = false;
 | 
				
			||||||
 | 
					            OnSecondPassed(null, null);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private void OnSecondPassed(object? sender, EventArgs? evt) {
 | 
					        private void OnSecondPassed(object? sender, EventArgs? evt) {
 | 
				
			||||||
            if (IsReceipt && IsCreating) {
 | 
					            if (IsReceipt && IsCreating && !Menu_Settings_EnableFreeEditing.IsChecked) {
 | 
				
			||||||
                var now = DateTime.Now;
 | 
					                var now = DateTime.Now;
 | 
				
			||||||
                TimeInput.Text = now.ToString("HH:mm");
 | 
					                TimeInput.Text = now.ToString("HH:mm");
 | 
				
			||||||
                DateInput.Text = now.ToString("dd.MM.yyyy");
 | 
					                DateInput.Text = now.ToString("dd.MM.yyyy");
 | 
				
			||||||
 | 
					                SetDefaultValue(TimeInput);
 | 
				
			||||||
 | 
					                SetDefaultValue(DateInput);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -259,38 +279,40 @@ namespace Elwig.Windows {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            if (TodayOnlyInput.IsChecked == true) {
 | 
					            if (TodayOnlyInput.IsChecked == true) {
 | 
				
			||||||
                deliveryQuery = deliveryQuery
 | 
					                deliveryQuery = deliveryQuery
 | 
				
			||||||
                    .Where(d => (d.DateString == Utils.Today.ToString("yyyy-MM-dd") && d.TimeString.CompareTo("03:00:00") > 0) ||
 | 
					                    .Where(d => (d.DateString == Utils.Today.ToString("yyyy-MM-dd") && (d.TimeString == null || d.TimeString.CompareTo("03:00:00") > 0)) ||
 | 
				
			||||||
                                (d.DateString == Utils.Today.AddDays(1).ToString("yyyy-MM-dd") && d.TimeString.CompareTo("03:00:00") <= 0));
 | 
					                                (d.DateString == Utils.Today.AddDays(1).ToString("yyyy-MM-dd") && (d.TimeString == null || d.TimeString.CompareTo("03:00:00") <= 0)));
 | 
				
			||||||
                filterNames.Add(Utils.Today.ToString("dd.MM.yyyy"));
 | 
					                filterNames.Add(Utils.Today.ToString("dd.MM.yyyy"));
 | 
				
			||||||
            } else if (AllSeasonsInput.IsChecked == false) {
 | 
					            } else if (AllSeasonsInput.IsChecked == false) {
 | 
				
			||||||
                deliveryQuery = deliveryQuery.Where(d => d.Year == SeasonInput.Value);
 | 
					                deliveryQuery = deliveryQuery.Where(d => d.Year == SeasonInput.Value);
 | 
				
			||||||
                filterNames.Add(SeasonInput.Value.ToString() ?? "");
 | 
					                filterNames.Add(SeasonInput.Value.ToString() ?? "");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            deliveryQuery = deliveryQuery.OrderBy(d => d.DateString).ThenBy(d => d.TimeString);
 | 
					            IQueryable<DeliveryPart> dpq = deliveryQuery
 | 
				
			||||||
            IQueryable<DeliveryPart> dpq = deliveryQuery.SelectMany(d => d.Parts);
 | 
					                .SelectMany(d => d.Parts)
 | 
				
			||||||
 | 
					                .OrderBy(p => p.Delivery.DateString)
 | 
				
			||||||
 | 
					                .ThenBy(p => p.Delivery.TimeString)
 | 
				
			||||||
 | 
					                .ThenBy(p => p.Delivery.LsNr)
 | 
				
			||||||
 | 
					                .ThenBy(p => p.DPNr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // TODO add filter for:
 | 
					 | 
				
			||||||
            //      attributes
 | 
					 | 
				
			||||||
            //      branches
 | 
					 | 
				
			||||||
            var filterVar = new List<string>();
 | 
					            var filterVar = new List<string>();
 | 
				
			||||||
 | 
					            var filterNotVar = 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];
 | 
				
			||||||
@@ -298,6 +320,10 @@ namespace Elwig.Windows {
 | 
				
			|||||||
                        filterVar.Add(e.ToUpper());
 | 
					                        filterVar.Add(e.ToUpper());
 | 
				
			||||||
                        filter.RemoveAt(i--);
 | 
					                        filter.RemoveAt(i--);
 | 
				
			||||||
                        filterNames.Add(var[e.ToUpper()].Name);
 | 
					                        filterNames.Add(var[e.ToUpper()].Name);
 | 
				
			||||||
 | 
					                    } else if (e.Length == 3 && e[0] == '!' && var.ContainsKey(e[1..].ToUpper())) {
 | 
				
			||||||
 | 
					                        filterNotVar.Add(e[1..].ToUpper());
 | 
				
			||||||
 | 
					                        filter.RemoveAt(i--);
 | 
				
			||||||
 | 
					                        filterNames.Add("außer " + var[e[1..].ToUpper()].Name);
 | 
				
			||||||
                    } else if (e.Length == 3 && qual.ContainsKey(e.ToUpper())) {
 | 
					                    } else if (e.Length == 3 && qual.ContainsKey(e.ToUpper())) {
 | 
				
			||||||
                        filterQual.Add(e.ToUpper());
 | 
					                        filterQual.Add(e.ToUpper());
 | 
				
			||||||
                        filter.RemoveAt(i--);
 | 
					                        filter.RemoveAt(i--);
 | 
				
			||||||
@@ -306,6 +332,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)) {
 | 
				
			||||||
@@ -317,12 +358,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)) {
 | 
				
			||||||
@@ -330,14 +365,14 @@ namespace Elwig.Windows {
 | 
				
			|||||||
                        double? from = (parts[0].Length > 0) ? double.Parse(parts[0].Replace(".", ",")) : null;
 | 
					                        double? from = (parts[0].Length > 0) ? double.Parse(parts[0].Replace(".", ",")) : null;
 | 
				
			||||||
                        double? to = (parts[1].Length > 0) ? double.Parse(parts[1].Replace(".", ",")) : null;
 | 
					                        double? to = (parts[1].Length > 0) ? double.Parse(parts[1].Replace(".", ",")) : null;
 | 
				
			||||||
                        switch ((from, to)) {
 | 
					                        switch ((from, to)) {
 | 
				
			||||||
                            case (<= 30, <= 30):
 | 
					                            case ( <= 30, <= 30):
 | 
				
			||||||
                            case (<= 30, null):
 | 
					                            case ( <= 30, null):
 | 
				
			||||||
                            case (null, <= 30):
 | 
					                            case (null, <= 30):
 | 
				
			||||||
                                filterKmwGt = from ?? 0;
 | 
					                                filterKmwGt = from ?? 0;
 | 
				
			||||||
                                filterKmwLt = to ?? 0;
 | 
					                                filterKmwLt = to ?? 0;
 | 
				
			||||||
                                break;
 | 
					                                break;
 | 
				
			||||||
                            case (>= 1900, >= 1900):
 | 
					                            case ( >= 1900, >= 1900):
 | 
				
			||||||
                            case (>= 1900, null):
 | 
					                            case ( >= 1900, null):
 | 
				
			||||||
                            case (null, >= 1900):
 | 
					                            case (null, >= 1900):
 | 
				
			||||||
                                filterYearGt = (int)(from ?? 0);
 | 
					                                filterYearGt = (int)(from ?? 0);
 | 
				
			||||||
                                filterYearLt = (int)(to ?? -1) + 1;
 | 
					                                filterYearLt = (int)(to ?? -1) + 1;
 | 
				
			||||||
@@ -350,26 +385,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];
 | 
				
			||||||
@@ -378,15 +444,31 @@ 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 => 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 => 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 (filterNotVar.Count > 0) dpq = dpq.Where(p => !filterNotVar.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);
 | 
				
			||||||
@@ -404,25 +486,18 @@ namespace Elwig.Windows {
 | 
				
			|||||||
                } else if (filterKmwGt > 0) {
 | 
					                } else if (filterKmwGt > 0) {
 | 
				
			||||||
                    filterNames.Add($"ab {filterKmwGt:N1} °KMW");
 | 
					                    filterNames.Add($"ab {filterKmwGt:N1} °KMW");
 | 
				
			||||||
                } else if (filterKmwLt > 0) {
 | 
					                } else if (filterKmwLt > 0) {
 | 
				
			||||||
                    filterNames.Add($"bis {filterKmwLt:N1} °KMW");
 | 
					                    filterNames.Add($"unter {filterKmwLt:N1} °KMW");
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                if (filterOeGt > 0 && filterOeLt > 0) {
 | 
					                if (filterOeGt > 0 && filterOeLt > 0) {
 | 
				
			||||||
                    filterNames.Add($"{filterOeGt:N1}–{filterOeLt:N1} °Oe");
 | 
					                    filterNames.Add($"{filterOeGt:N1}–{filterOeLt:N1} °Oe");
 | 
				
			||||||
                } else if (filterOeGt > 0) {
 | 
					                } else if (filterOeGt > 0) {
 | 
				
			||||||
                    filterNames.Add($"ab {filterOeGt:N1} °Oe");
 | 
					                    filterNames.Add($"ab {filterOeGt:N1} °Oe");
 | 
				
			||||||
                } else if (filterOeLt > 0) {
 | 
					                } else if (filterOeLt > 0) {
 | 
				
			||||||
                    filterNames.Add($"bis {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(), dpq, filter);
 | 
					            return (filterNames, dpq.Select(p => p.Delivery).Distinct().OrderBy(d => d.DateString).ThenBy(d => d.TimeString), dpq, filter);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private async Task RefreshDeliveryListQuery(bool updateSort = false) {
 | 
					        private async Task RefreshDeliveryListQuery(bool updateSort = false) {
 | 
				
			||||||
@@ -447,6 +522,7 @@ namespace Elwig.Windows {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
            var members = deliveries.Select(d => d.Member).DistinctBy(m => m.MgNr).ToList();
 | 
					            var members = deliveries.Select(d => d.Member).DistinctBy(m => m.MgNr).ToList();
 | 
				
			||||||
            StatusMembers.Text = $"Mitglieder: {members.Count}" + (members.Count > 0 && members.Count <= 4 ? $" ({string.Join(", ", members.Select(m => m.AdministrativeName))})" : "");
 | 
					            StatusMembers.Text = $"Mitglieder: {members.Count}" + (members.Count > 0 && members.Count <= 4 ? $" ({string.Join(", ", members.Select(m => m.AdministrativeName))})" : "");
 | 
				
			||||||
 | 
					            StatusMembers.ToolTip = StatusMembers.Text;
 | 
				
			||||||
            StatusDeliveries.Text = $"Lieferungen: {deliveries.Count}";
 | 
					            StatusDeliveries.Text = $"Lieferungen: {deliveries.Count}";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (filter.Count == 0) {
 | 
					            if (filter.Count == 0) {
 | 
				
			||||||
@@ -479,8 +555,8 @@ namespace Elwig.Windows {
 | 
				
			|||||||
                    if (groups.Count == 1) {
 | 
					                    if (groups.Count == 1) {
 | 
				
			||||||
                        var g = groups.First().Key;
 | 
					                        var g = groups.First().Key;
 | 
				
			||||||
                        if (g != "") {
 | 
					                        if (g != "") {
 | 
				
			||||||
                            StatusWeight.Text += $" ({g})";
 | 
					                            StatusWeight.Text += $" [{g}]";
 | 
				
			||||||
                            StatusGradation.Text += $" ({g})";
 | 
					                            StatusGradation.Text += $" [{g}]";
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        var sortGroups = parts
 | 
					                        var sortGroups = parts
 | 
				
			||||||
@@ -490,12 +566,12 @@ namespace Elwig.Windows {
 | 
				
			|||||||
                            .ToList();
 | 
					                            .ToList();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        if (sortGroups.Count > 1 && sortGroups.Count <= 4) {
 | 
					                        if (sortGroups.Count > 1 && sortGroups.Count <= 4) {
 | 
				
			||||||
                            StatusWeight.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Item2:N0} kg" + (g.Key == "" ? "" : $" ({g.Key})")))}";
 | 
					                            StatusWeight.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Item2:N0} kg ({(double)g.Item2 / weight:0%})" + (g.Key == "" ? "" : $" [{g.Key}]")))}";
 | 
				
			||||||
                            StatusGradation.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Item3:N1}/{g.Item4:N1}/{g.Item5:N1}" + (g.Key == "" ? "" : $" ({g.Key})")))}";
 | 
					                            StatusGradation.Text += $" = {string.Join(" + ", sortGroups.Select(g => $"{g.Item3:N1}/{g.Item4:N1}/{g.Item5:N1}" + (g.Key == "" ? "" : $" [{g.Key}]")))}";
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                    } else if (groups.Count <= 4) {
 | 
					                    } else if (groups.Count <= 4) {
 | 
				
			||||||
                        StatusWeight.Text += $" = {string.Join(" + ", groups.Select(g => $"{g.Item2:N0} kg" + (g.Key == "" ? "" : $" ({g.Key})")))}";
 | 
					                        StatusWeight.Text += $" = {string.Join(" + ", groups.Select(g => $"{g.Item2:N0} kg ({(double)g.Item2 / weight:0%})" + (g.Key == "" ? "" : $" [{g.Key}]")))}";
 | 
				
			||||||
                        StatusGradation.Text += $" = {string.Join(" + ", groups.Select(g => $"{g.Item3:N1}/{g.Item4:N1}/{g.Item5:N1}" + (g.Key == "" ? "" : $" ({g.Key})")))}";
 | 
					                        StatusGradation.Text += $" = {string.Join(" + ", groups.Select(g => $"{g.Item3:N1}/{g.Item4:N1}/{g.Item5:N1}" + (g.Key == "" ? "" : $" [{g.Key}]")))}";
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
@@ -503,6 +579,10 @@ namespace Elwig.Windows {
 | 
				
			|||||||
                StatusWeight.Text = "Gewicht: -";
 | 
					                StatusWeight.Text = "Gewicht: -";
 | 
				
			||||||
                StatusGradation.Text = "Gradation: -";
 | 
					                StatusGradation.Text = "Gradation: -";
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            StatusVarieties.ToolTip = StatusVarieties.Text;
 | 
				
			||||||
 | 
					            StatusWeight.ToolTip = StatusWeight.Text;
 | 
				
			||||||
 | 
					            StatusGradation.ToolTip = StatusGradation.Text;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        protected override async Task OnRenewContext() {
 | 
					        protected override async Task OnRenewContext() {
 | 
				
			||||||
@@ -532,7 +612,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);
 | 
				
			||||||
@@ -658,10 +738,10 @@ namespace Elwig.Windows {
 | 
				
			|||||||
            if (deliveryNew || InputHasChanged(DateInput)) {
 | 
					            if (deliveryNew || InputHasChanged(DateInput)) {
 | 
				
			||||||
                d.LNr = await Context.NextLNr(d.Date);
 | 
					                d.LNr = await Context.NextLNr(d.Date);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            if (IsCreating) {
 | 
					            if (IsCreating && !InputIsNotDefault(TimeInput)) {
 | 
				
			||||||
                d.TimeString = DateTime.Now.ToString("HH:mm:ss");
 | 
					                d.TimeString = DateTime.Now.ToString("HH:mm:ss");
 | 
				
			||||||
            } else if (InputHasChanged(TimeInput)) {
 | 
					            } else if (IsCreating || InputHasChanged(TimeInput)) {
 | 
				
			||||||
                d.TimeString = TimeInput.Text + ":00";
 | 
					                d.TimeString = (TimeInput.Text != "") ? TimeInput.Text + ":00" : null;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            d.ZwstId = (BranchInput.SelectedItem as Branch)?.ZwstId;
 | 
					            d.ZwstId = (BranchInput.SelectedItem as Branch)?.ZwstId;
 | 
				
			||||||
            d.LsNr = LsNrInput.Text;
 | 
					            d.LsNr = LsNrInput.Text;
 | 
				
			||||||
@@ -890,7 +970,7 @@ namespace Elwig.Windows {
 | 
				
			|||||||
                if (App.Config.Debug) {
 | 
					                if (App.Config.Debug) {
 | 
				
			||||||
                    doc.Show();
 | 
					                    doc.Show();
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    doc.Print(2);
 | 
					                    await doc.Print(2);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            FinishButton.Cursor = null;
 | 
					            FinishButton.Cursor = null;
 | 
				
			||||||
@@ -1111,8 +1191,8 @@ namespace Elwig.Windows {
 | 
				
			|||||||
                day = day.AddDays(-1);
 | 
					                day = day.AddDays(-1);
 | 
				
			||||||
            var lsnrs = await Context.Deliveries
 | 
					            var lsnrs = await Context.Deliveries
 | 
				
			||||||
                .Where(d => d.ZwstId == delivery.ZwstId)
 | 
					                .Where(d => d.ZwstId == delivery.ZwstId)
 | 
				
			||||||
                .Where(d => (d.DateString == day.ToString("yyyy-MM-dd") && d.TimeString.CompareTo("03:00:00") > 0) ||
 | 
					                .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.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)
 | 
					                .Where(d => d.LsNr != delivery.LsNr)
 | 
				
			||||||
                .OrderBy(d => d.LsNr)
 | 
					                .OrderBy(d => d.LsNr)
 | 
				
			||||||
                .Select(d => d.LsNr)
 | 
					                .Select(d => d.LsNr)
 | 
				
			||||||
@@ -1264,9 +1344,9 @@ namespace Elwig.Windows {
 | 
				
			|||||||
            AbgewertetInput.IsEnabled = false;
 | 
					            AbgewertetInput.IsEnabled = false;
 | 
				
			||||||
            ManualWeighingInput.IsEnabled = false;
 | 
					            ManualWeighingInput.IsEnabled = false;
 | 
				
			||||||
            LsNrInput.IsReadOnly = true;
 | 
					            LsNrInput.IsReadOnly = true;
 | 
				
			||||||
            DateInput.IsReadOnly = true;
 | 
					            DateInput.IsReadOnly = !Menu_Settings_EnableFreeEditing.IsChecked;
 | 
				
			||||||
            TimeInput.IsReadOnly = true;
 | 
					            TimeInput.IsReadOnly = !Menu_Settings_EnableFreeEditing.IsChecked;
 | 
				
			||||||
            BranchInput.IsEnabled = false;
 | 
					            BranchInput.IsEnabled = Menu_Settings_EnableFreeEditing.IsChecked;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private void DisableWeighingButtons() {
 | 
					        private void DisableWeighingButtons() {
 | 
				
			||||||
@@ -1290,15 +1370,25 @@ namespace Elwig.Windows {
 | 
				
			|||||||
            if (DateInput.Text == "" || BranchInput.SelectedItem == null) {
 | 
					            if (DateInput.Text == "" || BranchInput.SelectedItem == null) {
 | 
				
			||||||
                LsNrInput.Text = "";
 | 
					                LsNrInput.Text = "";
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
 | 
					                try {
 | 
				
			||||||
                    var branch = (Branch)BranchInput.SelectedItem;
 | 
					                    var branch = (Branch)BranchInput.SelectedItem;
 | 
				
			||||||
                    var date = DateOnly.ParseExact(DateInput.Text, "dd.MM.yyyy");
 | 
					                    var date = DateOnly.ParseExact(DateInput.Text, "dd.MM.yyyy");
 | 
				
			||||||
                    var lnr = await Context.NextLNr(date);
 | 
					                    var lnr = await Context.NextLNr(date);
 | 
				
			||||||
                    LsNrInput.Text = Utils.GenerateLsNr(date, branch.ZwstId, lnr);
 | 
					                    LsNrInput.Text = Utils.GenerateLsNr(date, branch.ZwstId, lnr);
 | 
				
			||||||
 | 
					                } catch {
 | 
				
			||||||
 | 
					                    LsNrInput.Text = "";
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private void DateInput_TextChanged(object sender, TextChangedEventArgs evt) {
 | 
					        private void DateInput_TextChanged(object sender, TextChangedEventArgs evt) {
 | 
				
			||||||
            if (IsCreating) UpdateLsNr().GetAwaiter().GetResult();
 | 
					            base.DateInput_TextChanged(sender, evt);
 | 
				
			||||||
 | 
					            if (IsEditing ||  IsCreating) UpdateLsNr().GetAwaiter().GetResult();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        private void BranchInput_SelectionChanged(object sender, RoutedEventArgs evt) {
 | 
				
			||||||
 | 
					            base.ComboBox_SelectionChanged(sender, evt);
 | 
				
			||||||
 | 
					            if (IsEditing || IsCreating) UpdateLsNr().GetAwaiter().GetResult();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private void UpdateWineVariety(bool valid) {
 | 
					        private void UpdateWineVariety(bool valid) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,7 +4,7 @@
 | 
				
			|||||||
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 | 
					        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 | 
				
			||||||
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 | 
					        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 | 
				
			||||||
        xmlns:local="clr-namespace:Elwig.Windows"
 | 
					        xmlns:local="clr-namespace:Elwig.Windows"
 | 
				
			||||||
        Title="Mitglieder - Elwig" Height="670" Width="1250" MinHeight="600" MinWidth="1000"
 | 
					        Title="Mitglieder - Elwig" Height="700" Width="1250" MinHeight="650" MinWidth="1150"
 | 
				
			||||||
        Loaded="Window_Loaded">
 | 
					        Loaded="Window_Loaded">
 | 
				
			||||||
    <Window.Resources>
 | 
					    <Window.Resources>
 | 
				
			||||||
        <Style TargetType="Label">
 | 
					        <Style TargetType="Label">
 | 
				
			||||||
@@ -36,16 +36,13 @@
 | 
				
			|||||||
    <Grid>
 | 
					    <Grid>
 | 
				
			||||||
        <Grid.RowDefinitions>
 | 
					        <Grid.RowDefinitions>
 | 
				
			||||||
            <RowDefinition Height="19"/>
 | 
					            <RowDefinition Height="19"/>
 | 
				
			||||||
            <RowDefinition Height="0.8*"/>
 | 
					            <RowDefinition Height="1*"/>
 | 
				
			||||||
            <RowDefinition Height="0.8*"/>
 | 
					            <RowDefinition Height="24"/>
 | 
				
			||||||
            <RowDefinition Height="0.2*"/>
 | 
					 | 
				
			||||||
            <RowDefinition Height="1.3*"/>
 | 
					 | 
				
			||||||
            <RowDefinition Height="0.8*"/>
 | 
					 | 
				
			||||||
        </Grid.RowDefinitions>
 | 
					        </Grid.RowDefinitions>
 | 
				
			||||||
        <Grid.ColumnDefinitions>
 | 
					        <Grid.ColumnDefinitions>
 | 
				
			||||||
            <ColumnDefinition Width="370"/>
 | 
					            <ColumnDefinition Width="1*" MinWidth="300"/>
 | 
				
			||||||
            <ColumnDefinition Width="1*"/>
 | 
					            <ColumnDefinition Width="5"/>
 | 
				
			||||||
            <ColumnDefinition Width="1*"/>
 | 
					            <ColumnDefinition Width="2.5*" MinWidth="800"/>
 | 
				
			||||||
        </Grid.ColumnDefinitions>
 | 
					        </Grid.ColumnDefinitions>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <Menu Grid.ColumnSpan="3" BorderThickness="0,0,0,1" BorderBrush="LightGray" Background="White">
 | 
					        <Menu Grid.ColumnSpan="3" BorderThickness="0,0,0,1" BorderBrush="LightGray" Background="White">
 | 
				
			||||||
@@ -71,7 +68,7 @@
 | 
				
			|||||||
            </MenuItem>
 | 
					            </MenuItem>
 | 
				
			||||||
        </Menu>
 | 
					        </Menu>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <Grid Grid.RowSpan="5" Grid.Row="1" Margin="5,0,5,0">
 | 
					        <Grid Grid.Row="1" Margin="5,0,0,0">
 | 
				
			||||||
            <Grid.RowDefinitions>
 | 
					            <Grid.RowDefinitions>
 | 
				
			||||||
                <RowDefinition Height="39"/>
 | 
					                <RowDefinition Height="39"/>
 | 
				
			||||||
                <RowDefinition Height="*"/>
 | 
					                <RowDefinition Height="*"/>
 | 
				
			||||||
@@ -93,9 +90,23 @@
 | 
				
			|||||||
                      SelectionChanged="MemberList_SelectionChanged"
 | 
					                      SelectionChanged="MemberList_SelectionChanged"
 | 
				
			||||||
                      Margin="5,0,5,0" Grid.Row="1" FontSize="14" Grid.ColumnSpan="3">
 | 
					                      Margin="5,0,5,0" Grid.Row="1" FontSize="14" Grid.ColumnSpan="3">
 | 
				
			||||||
                <DataGrid.Columns>
 | 
					                <DataGrid.Columns>
 | 
				
			||||||
                    <DataGridTextColumn Header="MgNr."    Binding="{Binding MgNr}"       Width="70"/>
 | 
					                    <DataGridTextColumn Header="MgNr." Binding="{Binding MgNr, StringFormat='{}{0} '}" Width="50">
 | 
				
			||||||
                    <DataGridTextColumn Header="Nachname" Binding="{Binding FamilyName}" Width="4*"/>
 | 
					                        <DataGridTextColumn.CellStyle>
 | 
				
			||||||
                    <DataGridTextColumn Header="Vorname"  Binding="{Binding GivenName}"  Width="3*"/>
 | 
					                            <Style>
 | 
				
			||||||
 | 
					                                <Setter Property="TextBlock.TextAlignment" Value="Right"/>
 | 
				
			||||||
 | 
					                            </Style>
 | 
				
			||||||
 | 
					                        </DataGridTextColumn.CellStyle>
 | 
				
			||||||
 | 
					                    </DataGridTextColumn>
 | 
				
			||||||
 | 
					                    <DataGridTextColumn Header="Nachname" Binding="{Binding FamilyName}" Width="140"/>
 | 
				
			||||||
 | 
					                    <DataGridTextColumn Header="Vorname" Binding="{Binding GivenName}" Width="140"/>
 | 
				
			||||||
 | 
					                    <DataGridTextColumn Header="GA" Binding="{Binding BusinessShares, StringFormat='{}{0} '}" Width="40">
 | 
				
			||||||
 | 
					                        <DataGridTextColumn.CellStyle>
 | 
				
			||||||
 | 
					                            <Style>
 | 
				
			||||||
 | 
					                                <Setter Property="TextBlock.TextAlignment" Value="Right"/>
 | 
				
			||||||
 | 
					                            </Style>
 | 
				
			||||||
 | 
					                        </DataGridTextColumn.CellStyle>
 | 
				
			||||||
 | 
					                    </DataGridTextColumn>
 | 
				
			||||||
 | 
					                    <DataGridTextColumn Header="Rechnungsadresse" Binding="{Binding BillingAddress.Name}" Width="200"/>
 | 
				
			||||||
                </DataGrid.Columns>
 | 
					                </DataGrid.Columns>
 | 
				
			||||||
            </DataGrid>
 | 
					            </DataGrid>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -120,7 +131,22 @@
 | 
				
			|||||||
                    Click="CancelButton_Click"/>
 | 
					                    Click="CancelButton_Click"/>
 | 
				
			||||||
        </Grid>
 | 
					        </Grid>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        <GroupBox Header="Persönliche Daten" Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" Margin="5,5,5,5">
 | 
					        <GridSplitter Grid.Column="1" Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <Grid Grid.Column="2" Grid.Row="1">
 | 
				
			||||||
 | 
					            <Grid.RowDefinitions>
 | 
				
			||||||
 | 
					                <RowDefinition Height="0.8*"/>
 | 
				
			||||||
 | 
					                <RowDefinition Height="0.8*"/>
 | 
				
			||||||
 | 
					                <RowDefinition Height="0.2*"/>
 | 
				
			||||||
 | 
					                <RowDefinition Height="1.3*"/>
 | 
				
			||||||
 | 
					                <RowDefinition Height="0.8*"/>
 | 
				
			||||||
 | 
					            </Grid.RowDefinitions>
 | 
				
			||||||
 | 
					            <Grid.ColumnDefinitions>
 | 
				
			||||||
 | 
					                <ColumnDefinition Width="*"/>
 | 
				
			||||||
 | 
					                <ColumnDefinition Width="*"/>
 | 
				
			||||||
 | 
					            </Grid.ColumnDefinitions>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            <GroupBox Header="Persönliche Daten" Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Margin="5,5,5,5">
 | 
				
			||||||
                <Grid>
 | 
					                <Grid>
 | 
				
			||||||
                    <Grid.ColumnDefinitions>
 | 
					                    <Grid.ColumnDefinitions>
 | 
				
			||||||
                        <ColumnDefinition Width="80"/>
 | 
					                        <ColumnDefinition Width="80"/>
 | 
				
			||||||
@@ -175,7 +201,7 @@
 | 
				
			|||||||
                              Margin="47,160,10,0" Grid.Column="1" Grid.ColumnSpan="3"/>
 | 
					                              Margin="47,160,10,0" Grid.Column="1" Grid.ColumnSpan="3"/>
 | 
				
			||||||
                </Grid>
 | 
					                </Grid>
 | 
				
			||||||
            </GroupBox>
 | 
					            </GroupBox>
 | 
				
			||||||
        <GroupBox Header="Kontaktdaten" Grid.Column="1" Grid.Row="3" Grid.RowSpan="2" Margin="5,5,5,5">
 | 
					            <GroupBox Header="Kontaktdaten" Grid.Column="0" Grid.Row="2" Grid.RowSpan="2" Margin="5,5,5,5">
 | 
				
			||||||
                <Grid>
 | 
					                <Grid>
 | 
				
			||||||
                    <Grid.ColumnDefinitions>
 | 
					                    <Grid.ColumnDefinitions>
 | 
				
			||||||
                        <ColumnDefinition Width="135"/>
 | 
					                        <ColumnDefinition Width="135"/>
 | 
				
			||||||
@@ -246,7 +272,7 @@
 | 
				
			|||||||
                             TextChanged="TextBox_TextChanged"/>
 | 
					                             TextChanged="TextBox_TextChanged"/>
 | 
				
			||||||
                </Grid>
 | 
					                </Grid>
 | 
				
			||||||
            </GroupBox>
 | 
					            </GroupBox>
 | 
				
			||||||
        <GroupBox Header="Bankverbindung" Grid.Column="1" Grid.Row="5" Margin="5,5,5,10">
 | 
					            <GroupBox Header="Bankverbindung" Grid.Column="0" Grid.Row="4" Margin="5,5,5,10">
 | 
				
			||||||
                <Grid>
 | 
					                <Grid>
 | 
				
			||||||
                    <Grid.ColumnDefinitions>
 | 
					                    <Grid.ColumnDefinitions>
 | 
				
			||||||
                        <ColumnDefinition Width="65"/>
 | 
					                        <ColumnDefinition Width="65"/>
 | 
				
			||||||
@@ -262,7 +288,7 @@
 | 
				
			|||||||
                             TextChanged="BicInput_TextChanged" LostFocus="BicInput_LostFocus"/>
 | 
					                             TextChanged="BicInput_TextChanged" LostFocus="BicInput_LostFocus"/>
 | 
				
			||||||
                </Grid>
 | 
					                </Grid>
 | 
				
			||||||
            </GroupBox>
 | 
					            </GroupBox>
 | 
				
			||||||
        <GroupBox Header="Betrieb" Grid.Column="2" Grid.Row="1" Grid.RowSpan="1" Margin="5,5,5,5">
 | 
					            <GroupBox Header="Betrieb" Grid.Column="1" Grid.Row="0" Grid.RowSpan="1" Margin="5,5,5,5">
 | 
				
			||||||
                <Grid>
 | 
					                <Grid>
 | 
				
			||||||
                    <Grid.ColumnDefinitions>
 | 
					                    <Grid.ColumnDefinitions>
 | 
				
			||||||
                        <ColumnDefinition Width="90"/>
 | 
					                        <ColumnDefinition Width="90"/>
 | 
				
			||||||
@@ -283,7 +309,7 @@
 | 
				
			|||||||
                              Grid.Column="2" HorizontalAlignment="Left" Margin="10,15,0,0" VerticalAlignment="Top" IsChecked="False"/>
 | 
					                              Grid.Column="2" HorizontalAlignment="Left" Margin="10,15,0,0" VerticalAlignment="Top" IsChecked="False"/>
 | 
				
			||||||
                </Grid>
 | 
					                </Grid>
 | 
				
			||||||
            </GroupBox>
 | 
					            </GroupBox>
 | 
				
			||||||
        <GroupBox Header="Rechnungsadresse (optional)" Grid.Column="2" Grid.Row="2" Grid.RowSpan="2" Margin="5,5,5,5">
 | 
					            <GroupBox Header="Rechnungsadresse (optional)" Grid.Column="1" Grid.Row="1" Grid.RowSpan="2" Margin="5,5,5,5">
 | 
				
			||||||
                <Grid>
 | 
					                <Grid>
 | 
				
			||||||
                    <Grid.ColumnDefinitions>
 | 
					                    <Grid.ColumnDefinitions>
 | 
				
			||||||
                        <ColumnDefinition Width="65"/>
 | 
					                        <ColumnDefinition Width="65"/>
 | 
				
			||||||
@@ -305,7 +331,7 @@
 | 
				
			|||||||
                              Margin="47,70,10,0" Grid.Column="1"/>
 | 
					                              Margin="47,70,10,0" Grid.Column="1"/>
 | 
				
			||||||
                </Grid>
 | 
					                </Grid>
 | 
				
			||||||
            </GroupBox>
 | 
					            </GroupBox>
 | 
				
			||||||
        <GroupBox Header="Genossenschaft" Grid.Column="2" Grid.Row="4" Grid.RowSpan="2" Margin="5,5,5,10">
 | 
					            <GroupBox Header="Genossenschaft" Grid.Column="1" Grid.Row="3" Grid.RowSpan="2" Margin="5,5,5,10">
 | 
				
			||||||
                <Grid>
 | 
					                <Grid>
 | 
				
			||||||
                    <Grid.ColumnDefinitions>
 | 
					                    <Grid.ColumnDefinitions>
 | 
				
			||||||
                        <ColumnDefinition Width="120"/>
 | 
					                        <ColumnDefinition Width="120"/>
 | 
				
			||||||
@@ -361,10 +387,6 @@
 | 
				
			|||||||
                              Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"
 | 
					                              Checked="CheckBox_Changed" Unchecked="CheckBox_Changed"
 | 
				
			||||||
                              HorizontalAlignment="Left" Margin="60,225,0,0" VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="2"/>
 | 
					                              HorizontalAlignment="Left" Margin="60,225,0,0" VerticalAlignment="Top" Grid.Column="1" Grid.ColumnSpan="2"/>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                <Label Content="Gebundene Fläche:" Margin="10,250,0,0" Grid.Column="0"/>
 | 
					 | 
				
			||||||
                <TextBlock x:Name="AreaCommitment" Text="- m²"
 | 
					 | 
				
			||||||
                           Grid.Column="1" HorizontalAlignment="Stretch" Margin="5,252,5,0" TextWrapping="NoWrap" VerticalAlignment="Top" FontSize="14" TextAlignment="Right"/>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    <Button x:Name="DeliveryButton" Content="Lieferungen" Click="DeliveryButton_Click" IsEnabled="False"
 | 
					                    <Button x:Name="DeliveryButton" Content="Lieferungen" Click="DeliveryButton_Click" IsEnabled="False"
 | 
				
			||||||
                            HorizontalAlignment="Right" Margin="10,00,10,37" Width="150" VerticalAlignment="Bottom" Grid.ColumnSpan="3"/>
 | 
					                            HorizontalAlignment="Right" Margin="10,00,10,37" Width="150" VerticalAlignment="Bottom" Grid.ColumnSpan="3"/>
 | 
				
			||||||
                    <Button x:Name="AreaCommitmentButton" Content="Flächenbindungen" Click="AreaCommitmentButton_Click" IsEnabled="False"
 | 
					                    <Button x:Name="AreaCommitmentButton" Content="Flächenbindungen" Click="AreaCommitmentButton_Click" IsEnabled="False"
 | 
				
			||||||
@@ -372,4 +394,44 @@
 | 
				
			|||||||
                </Grid>
 | 
					                </Grid>
 | 
				
			||||||
            </GroupBox>
 | 
					            </GroupBox>
 | 
				
			||||||
        </Grid>
 | 
					        </Grid>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        <StatusBar Grid.Row="5" Grid.ColumnSpan="3" BorderThickness="0,1,0,0" BorderBrush="Gray">
 | 
				
			||||||
 | 
					            <StatusBar.ItemsPanel>
 | 
				
			||||||
 | 
					                <ItemsPanelTemplate>
 | 
				
			||||||
 | 
					                    <Grid>
 | 
				
			||||||
 | 
					                        <Grid.ColumnDefinitions>
 | 
				
			||||||
 | 
					                            <ColumnDefinition Width="150"/>
 | 
				
			||||||
 | 
					                            <ColumnDefinition Width="Auto"/>
 | 
				
			||||||
 | 
					                            <ColumnDefinition Width="200"/>
 | 
				
			||||||
 | 
					                            <ColumnDefinition Width="Auto"/>
 | 
				
			||||||
 | 
					                            <ColumnDefinition Width="2*"/>
 | 
				
			||||||
 | 
					                            <ColumnDefinition Width="Auto"/>
 | 
				
			||||||
 | 
					                            <ColumnDefinition Width="3*"/>
 | 
				
			||||||
 | 
					                            <ColumnDefinition Width="Auto"/>
 | 
				
			||||||
 | 
					                            <ColumnDefinition Width="3*"/>
 | 
				
			||||||
 | 
					                        </Grid.ColumnDefinitions>
 | 
				
			||||||
 | 
					                    </Grid>
 | 
				
			||||||
 | 
					                </ItemsPanelTemplate>
 | 
				
			||||||
 | 
					            </StatusBar.ItemsPanel>
 | 
				
			||||||
 | 
					            <StatusBarItem>
 | 
				
			||||||
 | 
					                <TextBlock Name="StatusMembers" Text="Mitglieder: -"/>
 | 
				
			||||||
 | 
					            </StatusBarItem>
 | 
				
			||||||
 | 
					            <Separator Grid.Column="1"/>
 | 
				
			||||||
 | 
					            <StatusBarItem Grid.Column="2">
 | 
				
			||||||
 | 
					                <TextBlock Name="StatusBusinessShares" Text="Geschäftsanteile: -"/>
 | 
				
			||||||
 | 
					            </StatusBarItem>
 | 
				
			||||||
 | 
					            <Separator Grid.Column="3"/>
 | 
				
			||||||
 | 
					            <StatusBarItem Grid.Column="4">
 | 
				
			||||||
 | 
					                <TextBlock Name="StatusAreaCommitment" Text="Gebundene Fläche: -"/>
 | 
				
			||||||
 | 
					            </StatusBarItem>
 | 
				
			||||||
 | 
					            <Separator Grid.Column="5"/>
 | 
				
			||||||
 | 
					            <StatusBarItem Grid.Column="6">
 | 
				
			||||||
 | 
					                <TextBlock Name="StatusDeliveriesLastSeason" Text="Lieferungen (letzte Saison): -"/>
 | 
				
			||||||
 | 
					            </StatusBarItem>
 | 
				
			||||||
 | 
					            <Separator Grid.Column="7"/>
 | 
				
			||||||
 | 
					            <StatusBarItem Grid.Column="8">
 | 
				
			||||||
 | 
					                <TextBlock Name="StatusDeliveriesThisSeason" Text="Lieferungen (aktuelle Saison): -"/>
 | 
				
			||||||
 | 
					            </StatusBarItem>
 | 
				
			||||||
 | 
					        </StatusBar>
 | 
				
			||||||
 | 
					    </Grid>
 | 
				
			||||||
</local:AdministrationWindow>
 | 
					</local:AdministrationWindow>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -140,6 +140,8 @@ namespace Elwig.Windows {
 | 
				
			|||||||
            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(DefaultKgInput, await Context.WbKgs.Select(k => k.AtKg).OrderBy(k => k.Name).ToListAsync(), i => (i as AT_Kg)?.KgNr);
 | 
					            ControlUtils.RenewItemsSource(DefaultKgInput, await Context.WbKgs.Select(k => k.AtKg).OrderBy(k => k.Name).ToListAsync(), i => (i as AT_Kg)?.KgNr);
 | 
				
			||||||
            await RefreshMemberList();
 | 
					            await RefreshMemberList();
 | 
				
			||||||
 | 
					            StatusMembers.Text = $"Mitglieder: {await Context.Members.CountAsync(m => m.IsActive):N0} ({await Context.Members.CountAsync():N0})";
 | 
				
			||||||
 | 
					            StatusBusinessShares.Text = $"Geschäftsanteile: {await Context.Members.SumAsync(m => m.BusinessShares):N0}";
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private void SetPhoneNrInput(int nr, string? type, string? number, string? comment) {
 | 
					        private void SetPhoneNrInput(int nr, string? type, string? number, string? comment) {
 | 
				
			||||||
@@ -274,22 +276,46 @@ namespace Elwig.Windows {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private async void Menu_Print_Letterheads_MgNr_Click(object sender, RoutedEventArgs evt) {
 | 
					        private async void Menu_Print_Letterheads_MgNr_Click(object sender, RoutedEventArgs evt) {
 | 
				
			||||||
            using var d = await Document.Merge(Context.Members
 | 
					            var n = await Context.Members.CountAsync(m => m.IsActive);
 | 
				
			||||||
                .Where(m => m.IsActive)
 | 
					            var res = MessageBox.Show(
 | 
				
			||||||
 | 
					                $"Sollen wirklich {n} Seiten gedruckt werden?", "Ausdruck Bestätigen",
 | 
				
			||||||
 | 
					                MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No);
 | 
				
			||||||
 | 
					            if (res != MessageBoxResult.Yes)
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
				
			||||||
 | 
					            using var doc = await Document.Merge(Context.Members
 | 
				
			||||||
 | 
					                .Where(m => m.IsActive && m.ContactViaPost)
 | 
				
			||||||
                .OrderBy(m => m.MgNr)
 | 
					                .OrderBy(m => m.MgNr)
 | 
				
			||||||
                .Select(m => new Letterhead(m)));
 | 
					                .Select(m => new Letterhead(m)));
 | 
				
			||||||
            await d.Generate();
 | 
					            await doc.Generate();
 | 
				
			||||||
            d.Show();
 | 
					            Mouse.OverrideCursor = null;
 | 
				
			||||||
 | 
					            if (App.Config.Debug) {
 | 
				
			||||||
 | 
					                doc.Show();
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                await doc.Print();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private async void Menu_Print_Letterheads_Name_Click(object sender, RoutedEventArgs evt) {
 | 
					        private async void Menu_Print_Letterheads_Name_Click(object sender, RoutedEventArgs evt) {
 | 
				
			||||||
            using var d = await Document.Merge(Context.Members
 | 
					            var n = await Context.Members.CountAsync(m => m.IsActive);
 | 
				
			||||||
                .Where(m => m.IsActive)
 | 
					            var res = MessageBox.Show(
 | 
				
			||||||
 | 
					                $"Sollen wirklich {n} Seiten gedruckt werden?", "Ausdruck Bestätigen",
 | 
				
			||||||
 | 
					                MessageBoxButton.YesNo, MessageBoxImage.Warning, MessageBoxResult.No);
 | 
				
			||||||
 | 
					            if (res != MessageBoxResult.Yes)
 | 
				
			||||||
 | 
					                return;
 | 
				
			||||||
 | 
					            Mouse.OverrideCursor = Cursors.AppStarting;
 | 
				
			||||||
 | 
					            using var doc = await Document.Merge(Context.Members
 | 
				
			||||||
 | 
					                .Where(m => m.IsActive && m.ContactViaPost)
 | 
				
			||||||
                .OrderBy(m => m.FamilyName)
 | 
					                .OrderBy(m => m.FamilyName)
 | 
				
			||||||
                .ThenBy(m => m.GivenName)
 | 
					                .ThenBy(m => m.GivenName)
 | 
				
			||||||
                .Select(m => new Letterhead(m)));
 | 
					                .Select(m => new Letterhead(m)));
 | 
				
			||||||
            await d.Generate();
 | 
					            await doc.Generate();
 | 
				
			||||||
            d.Show();
 | 
					            Mouse.OverrideCursor = null;
 | 
				
			||||||
 | 
					            if (App.Config.Debug) {
 | 
				
			||||||
 | 
					                doc.Show();
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                await doc.Print();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private void FocusSearchInput(object sender, RoutedEventArgs evt) {
 | 
					        private void FocusSearchInput(object sender, RoutedEventArgs evt) {
 | 
				
			||||||
@@ -568,7 +594,11 @@ namespace Elwig.Windows {
 | 
				
			|||||||
            ContactPostalInput.IsChecked = m.ContactViaPost;
 | 
					            ContactPostalInput.IsChecked = m.ContactViaPost;
 | 
				
			||||||
            ContactEmailInput.IsChecked = m.ContactViaEmail;
 | 
					            ContactEmailInput.IsChecked = m.ContactViaEmail;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            AreaCommitment.Text = $"{m.ActiveAreaCommitments.Select(c => c.Area).Sum():N0} m²";
 | 
					            var d1 = Context.Deliveries.Where(d => d.Year == Utils.CurrentLastSeason && d.MgNr == m.MgNr);
 | 
				
			||||||
 | 
					            var d2 = Context.Deliveries.Where(d => d.Year == Utils.CurrentLastSeason - 1 && d.MgNr == m.MgNr);
 | 
				
			||||||
 | 
					            StatusDeliveriesLastSeason.Text = $"Lieferungen ({Utils.CurrentLastSeason - 1}): {d2.Count():N0} ({d2.Sum(d => d.Parts.Count):N0}), {d2.SelectMany(d => d.Parts).Sum(p => p.Weight):N0} kg";
 | 
				
			||||||
 | 
					            StatusDeliveriesThisSeason.Text = $"Lieferungen ({Utils.CurrentLastSeason}): {d1.Count():N0} ({d1.Sum(d => d.Parts.Count):N0}), {d1.SelectMany(d => d.Parts).Sum(p => p.Weight):N0} kg";
 | 
				
			||||||
 | 
					            StatusAreaCommitment.Text = $"Gebundene Fläche: {m.ActiveAreaCommitments.Select(c => c.Area).Sum():N0} m²";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Menu_Member_SendEmail.IsEnabled = m.EmailAddresses.Count > 0;
 | 
					            Menu_Member_SendEmail.IsEnabled = m.EmailAddresses.Count > 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -577,7 +607,9 @@ namespace Elwig.Windows {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        new protected void ClearInputs(bool validate = false) {
 | 
					        new protected void ClearInputs(bool validate = false) {
 | 
				
			||||||
            Menu_Member_SendEmail.IsEnabled = false;
 | 
					            Menu_Member_SendEmail.IsEnabled = false;
 | 
				
			||||||
            AreaCommitment.Text = "- m²";
 | 
					            StatusDeliveriesLastSeason.Text = $"Lieferungen ({Utils.CurrentLastSeason - 1}): -";
 | 
				
			||||||
 | 
					            StatusDeliveriesThisSeason.Text = $"Lieferungen ({Utils.CurrentLastSeason}): -";
 | 
				
			||||||
 | 
					            StatusAreaCommitment.Text = "Gebundene Fläche: -";
 | 
				
			||||||
            Age.Text = "-";
 | 
					            Age.Text = "-";
 | 
				
			||||||
            base.ClearInputs(validate);
 | 
					            base.ClearInputs(validate);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user