Compare commits
	
		
			14 Commits
		
	
	
		
			ba691f4d17
			...
			v0.3.1
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| b4f1eeee84 | |||
| 2922fe0138 | |||
| 704facbc6b | |||
| 404e8a0c27 | |||
| ef621fab2d | |||
| 0938e33fe1 | |||
| 6b5c283e10 | |||
| b6400c41c4 | |||
| 24b7078a05 | |||
| dc215d3350 | |||
| b80cbc037c | |||
| 4891501f62 | |||
| 6d3adc48f6 | |||
| f5eea1e906 | 
@@ -11,6 +11,7 @@ using System.Windows.Threading;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.Threading;
 | 
			
		||||
using System.Windows.Markup;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
 | 
			
		||||
namespace Elwig {
 | 
			
		||||
    public partial class App : Application {
 | 
			
		||||
@@ -20,10 +21,23 @@ namespace Elwig {
 | 
			
		||||
        public static readonly string TempPath = Path.Combine(Path.GetTempPath(), "Elwig");
 | 
			
		||||
        public static readonly Config Config = new(DataPath + "config.ini");
 | 
			
		||||
 | 
			
		||||
        public static int VersionMajor { get; private set; }
 | 
			
		||||
        public static int VersionMinor { get; private set; }
 | 
			
		||||
        public static int VersionPatch { get; private set; }
 | 
			
		||||
        public static string Version {
 | 
			
		||||
            get => $"{VersionMajor}.{VersionMinor}.{VersionPatch}";
 | 
			
		||||
            private set {
 | 
			
		||||
                var p = value.Split(".").Select(p => int.Parse(p.Trim())).ToArray();
 | 
			
		||||
                VersionMajor = p.ElementAtOrDefault(0);
 | 
			
		||||
                VersionMinor = p.ElementAtOrDefault(1);
 | 
			
		||||
                VersionPatch = p.ElementAtOrDefault(2);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static string ZwstId { get; private set; }
 | 
			
		||||
        public static string BranchName { get; private set; }
 | 
			
		||||
        public static int? BranchPlz { get; private set; }
 | 
			
		||||
        public static string? BranchOrt { get; private set; }
 | 
			
		||||
        public static string? BranchLocation { get; private set; }
 | 
			
		||||
        public static string? BranchAddress { get; private set; }
 | 
			
		||||
        public static string? BranchPhoneNr { get; private set; }
 | 
			
		||||
        public static string? BranchFaxNr { get; private set; }
 | 
			
		||||
@@ -36,7 +50,7 @@ namespace Elwig {
 | 
			
		||||
 | 
			
		||||
        public App() : base() {
 | 
			
		||||
            System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);
 | 
			
		||||
            Directory.CreateDirectory(App.TempPath);
 | 
			
		||||
            Directory.CreateDirectory(TempPath);
 | 
			
		||||
            Directory.CreateDirectory(DataPath);
 | 
			
		||||
            MainDispatcher = Dispatcher;
 | 
			
		||||
            Scales = Array.Empty<IScale>();
 | 
			
		||||
@@ -56,15 +70,19 @@ namespace Elwig {
 | 
			
		||||
                new FrameworkPropertyMetadata(XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag))
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
            Dictionary<string, (string, string, int?, string?, string?, string?, string?, string?)> branches = new();
 | 
			
		||||
            using (var ctx = new AppDbContext()) {
 | 
			
		||||
            Version = typeof(App).GetTypeInfo().Assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion ?? "";
 | 
			
		||||
 | 
			
		||||
            try {
 | 
			
		||||
                    if (!ctx.Database.CanConnect()) {
 | 
			
		||||
                        MessageBox.Show($"Invalid Database:\n\n{Config.DatabaseFile}", "Invalid Database", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                AppDbUpdater.CheckDb();
 | 
			
		||||
            } catch (Exception e) {
 | 
			
		||||
                MessageBox.Show($"Invalid Database:\n\n{e.Message}", "Invalid Database", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                Shutdown();
 | 
			
		||||
                return;
 | 
			
		||||
                    } else {
 | 
			
		||||
                        branches = ctx.Branches.ToDictionary(b => b.Name.ToLower(), b => (b.ZwstId, b.Name, b.PostalDest?.AtPlz?.Plz, b.PostalDest?.AtPlz?.Dest, b.Address, b.PhoneNr, b.FaxNr, b.MobileNr));
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Dictionary<string, (string, string, int?, string?, string?, string?, string?, string?)> branches = new();
 | 
			
		||||
            using (var ctx = new AppDbContext()) {
 | 
			
		||||
                branches = ctx.Branches.ToDictionary(b => b.Name.ToLower(), b => (b.ZwstId, b.Name, b.PostalDest?.AtPlz?.Plz, b.PostalDest?.AtPlz?.Ort.Name, b.Address, b.PhoneNr, b.FaxNr, b.MobileNr));
 | 
			
		||||
                try {
 | 
			
		||||
                    Client = new(ctx);
 | 
			
		||||
                } catch (Exception e) {
 | 
			
		||||
@@ -73,12 +91,7 @@ namespace Elwig {
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
                } catch (Exception e) {
 | 
			
		||||
                    MessageBox.Show($"Invalid Database:\n\n{e.Message}", "Invalid Database", MessageBoxButton.OK, MessageBoxImage.Error);
 | 
			
		||||
                    Shutdown();
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            Utils.RunBackground("HTML Initialization", () => Documents.Html.Init(PrintingReadyChanged));
 | 
			
		||||
            Utils.RunBackground("PDF Initialization", () => Documents.Pdf.Init(PrintingReadyChanged));
 | 
			
		||||
 | 
			
		||||
@@ -114,7 +127,7 @@ namespace Elwig {
 | 
			
		||||
                    ZwstId = entry.Item1;
 | 
			
		||||
                    BranchName = entry.Item2;
 | 
			
		||||
                    BranchPlz = entry.Item3;
 | 
			
		||||
                    BranchOrt = entry.Item4;
 | 
			
		||||
                    BranchLocation = entry.Item4;
 | 
			
		||||
                    BranchAddress = entry.Item5;
 | 
			
		||||
                    BranchPhoneNr = entry.Item6;
 | 
			
		||||
                    BranchFaxNr = entry.Item7;
 | 
			
		||||
@@ -125,7 +138,7 @@ namespace Elwig {
 | 
			
		||||
                ZwstId = entry.Item1;
 | 
			
		||||
                BranchName = entry.Item2;
 | 
			
		||||
                BranchPlz = entry.Item3;
 | 
			
		||||
                BranchOrt = entry.Item4;
 | 
			
		||||
                BranchLocation = entry.Item4;
 | 
			
		||||
                BranchAddress = entry.Item5;
 | 
			
		||||
                BranchPhoneNr = entry.Item6;
 | 
			
		||||
                BranchFaxNr = entry.Item7;
 | 
			
		||||
 
 | 
			
		||||
@@ -13,7 +13,7 @@ namespace Elwig.Documents {
 | 
			
		||||
 | 
			
		||||
        public BusinessDocument(string title, Member m, bool includeSender = false) : base(title) {
 | 
			
		||||
            Member = m;
 | 
			
		||||
            Location = App.BranchName;
 | 
			
		||||
            Location = App.BranchLocation;
 | 
			
		||||
            IncludeSender = includeSender;
 | 
			
		||||
            var uid = (m.UstIdNr ?? "-") + (m.IsBuchführend ? "" : " <i>(pauschaliert)</i>");
 | 
			
		||||
            Aside = $"<table><colgroup><col span='1' style='width: 22.5mm;'/><col span='1' style='width: 42.5mm;'/></colgroup>" +
 | 
			
		||||
 
 | 
			
		||||
@@ -90,7 +90,8 @@
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            <tr><td></td><td colspan="5">
 | 
			
		||||
                @Raw(part.ManualWeighing ? "<i>Handwiegung</i>" : $"<i>Waage:</i> {part.ScaleId ?? "?"}, <i>ID:</i> {part.WeighingId ?? "?"}") (@(part.IsGerebelt ? "gerebelt gewogen" : "nicht gerebelt gewogen"))
 | 
			
		||||
                @Raw(part.ManualWeighing ? "<i>Handwiegung</i>" : $"<i>Waage:</i> {part.ScaleId ?? "?"}, <i>ID:</i> {part.WeighingId ?? "?"}")
 | 
			
		||||
                (@(part.IsGerebelt ? "gerebelt gewogen" : "nicht gerebelt gewogen"))@Raw(part.WeighingReason != null ? $", <i>Begründung:</i>" : "") @part.WeighingReason
 | 
			
		||||
            </td></tr>
 | 
			
		||||
            @if (part.Comment != null) {
 | 
			
		||||
                <tr><td></td><td colspan="5"><i>Anmerkung:</i> @part.Comment</td></tr>
 | 
			
		||||
@@ -153,7 +154,7 @@
 | 
			
		||||
                    @Raw(FormatRow(Model.Member.DeliveryObligation, Model.Member.DeliveryRight, Model.Member.Deliveries.Where(d => d.Year == Model.Delivery.Year).Sum(d => d.Weight)))
 | 
			
		||||
                </tr>
 | 
			
		||||
                @foreach (var (id, name, right, obligation, sum) in Model.MemberBuckets.OrderBy(b => b.Item1)) {
 | 
			
		||||
                    if (right > 0 || obligation > 0 || (sum > 0 && buckets[id[..2]] > 1)) {
 | 
			
		||||
                    if (right > 0 || obligation > 0 || (sum > 0 && buckets[id[..2]] > 1 && !id.EndsWith('_'))) {
 | 
			
		||||
                        <tr class="@(sortids.Contains(id[..2]) ? "" : "optional")">
 | 
			
		||||
                            <th>@name</th>
 | 
			
		||||
                            @Raw(FormatRow(obligation, right, sum))
 | 
			
		||||
 
 | 
			
		||||
@@ -75,6 +75,14 @@ aside table tbody td {
 | 
			
		||||
    font-size: 10pt;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
aside table tbody th {
 | 
			
		||||
    padding: 0.25mm 0.5mm 0.25mm 1mm;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
aside table tbody td {
 | 
			
		||||
    padding: 0.25mm 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
aside table tbody th {
 | 
			
		||||
    font-weight: normal;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@
 | 
			
		||||
    <UseWPF>true</UseWPF>
 | 
			
		||||
    <PreserveCompilationContext>true</PreserveCompilationContext>
 | 
			
		||||
    <ApplicationIcon>elwig.ico</ApplicationIcon>
 | 
			
		||||
    <Version>0.2.1</Version>
 | 
			
		||||
    <Version>0.3.1</Version>
 | 
			
		||||
    <SatelliteResourceLanguages>de-AT</SatelliteResourceLanguages>
 | 
			
		||||
  </PropertyGroup>
 | 
			
		||||
 | 
			
		||||
@@ -19,9 +19,9 @@
 | 
			
		||||
    <PackageReference Include="Balbarak.WeasyPrint" Version="2.0.2" />
 | 
			
		||||
    <PackageReference Include="Extended.Wpf.Toolkit" Version="4.5.1" />
 | 
			
		||||
    <PackageReference Include="ini-parser" Version="2.5.2" />
 | 
			
		||||
    <PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.21" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="7.0.10" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.10" />
 | 
			
		||||
    <PackageReference Include="Microsoft.AspNetCore.Razor.Language" Version="6.0.22" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="7.0.11" />
 | 
			
		||||
    <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.11" />
 | 
			
		||||
    <PackageReference Include="Microsoft.Web.WebView2" Version="1.0.1938.49" />
 | 
			
		||||
    <PackageReference Include="RazorLight" Version="2.3.1" />
 | 
			
		||||
    <PackageReference Include="ScottPlot.WPF" Version="4.1.67" />
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										78
									
								
								Elwig/Helpers/AppDbUpdater.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								Elwig/Helpers/AppDbUpdater.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,78 @@
 | 
			
		||||
using Microsoft.Data.Sqlite;
 | 
			
		||||
using System;
 | 
			
		||||
 | 
			
		||||
namespace Elwig.Helpers {
 | 
			
		||||
    public static class AppDbUpdater {
 | 
			
		||||
 | 
			
		||||
        public static readonly int RequiredSchemaVersion = 1;
 | 
			
		||||
 | 
			
		||||
        private static int _versionOffset = 0;
 | 
			
		||||
        private static readonly Action<SqliteConnection>[] _updaters = new[] {
 | 
			
		||||
            UpdateDbSchema_1_To_2, UpdateDbSchema_2_To_3
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        private static void ExecuteNonQuery(SqliteConnection cnx, string sql) {
 | 
			
		||||
            using var cmd = cnx.CreateCommand();
 | 
			
		||||
            cmd.CommandText = sql;
 | 
			
		||||
            cmd.ExecuteNonQuery();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private static object? ExecuteScalar(SqliteConnection cnx, string sql) {
 | 
			
		||||
            using var cmd = cnx.CreateCommand();
 | 
			
		||||
            cmd.CommandText = sql;
 | 
			
		||||
            return cmd.ExecuteScalar();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static string CheckDb() {
 | 
			
		||||
            using var cnx = AppDbContext.Connect();
 | 
			
		||||
 | 
			
		||||
            var applId = (long?)ExecuteScalar(cnx, "PRAGMA application_id") ?? 0;
 | 
			
		||||
            if (applId != 0x454C5747) throw new Exception("Invalid application_id of database");
 | 
			
		||||
 | 
			
		||||
            var schemaVers = (long?)ExecuteScalar(cnx, "PRAGMA schema_version") ?? 0;
 | 
			
		||||
            _versionOffset = (int)(schemaVers % 100);
 | 
			
		||||
            if (_versionOffset != 0) {
 | 
			
		||||
                // schema was modified manually/externally
 | 
			
		||||
                // TODO issue warning
 | 
			
		||||
            }
 | 
			
		||||
            UpdateDbSchema(cnx, (int)(schemaVers / 100), RequiredSchemaVersion);
 | 
			
		||||
 | 
			
		||||
            var userVers = (long?)ExecuteScalar(cnx, "PRAGMA user_version") ?? 0;
 | 
			
		||||
            var major = userVers >> 24;
 | 
			
		||||
            var minor = (userVers >> 16) & 0xFF;
 | 
			
		||||
            var patch = userVers & 0xFFFF;
 | 
			
		||||
 | 
			
		||||
            if (App.VersionMajor > major || App.VersionMinor > minor || App.VersionPatch > patch) {
 | 
			
		||||
                long vers = (App.VersionMajor << 24) | (App.VersionMinor << 16) | App.VersionPatch;
 | 
			
		||||
                ExecuteNonQuery(cnx, $"PRAGMA user_version = {vers}");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return $"{major}.{minor}.{patch}";
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private static void UpdateDbSchema(SqliteConnection cnx, int fromVersion, int toVersion) {
 | 
			
		||||
            if (fromVersion == toVersion) {
 | 
			
		||||
                return;
 | 
			
		||||
            } else if (fromVersion > toVersion) {
 | 
			
		||||
                throw new Exception("schema_version of database is too new");
 | 
			
		||||
            } else if (toVersion - 1 > _updaters.Length) {
 | 
			
		||||
                throw new Exception("Unable to update database schema: Updater not implemented");
 | 
			
		||||
            } else if (fromVersion <= 0) {
 | 
			
		||||
                throw new Exception("schema_version of database is invalid");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ExecuteNonQuery(cnx, "PRAGMA locking_mode = EXCLUSIVE");
 | 
			
		||||
            ExecuteNonQuery(cnx, "BEGIN EXCLUSIVE");
 | 
			
		||||
            for (int i = fromVersion; i < toVersion; i++) {
 | 
			
		||||
                _updaters[i - 1](cnx);
 | 
			
		||||
            }
 | 
			
		||||
            ExecuteNonQuery(cnx, "COMMIT");
 | 
			
		||||
            ExecuteNonQuery(cnx, "VACUUM");
 | 
			
		||||
            ExecuteNonQuery(cnx, $"PRAGMA schema_version = {toVersion * 100 + _versionOffset}");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private static void UpdateDbSchema_1_To_2(SqliteConnection cnx) { }
 | 
			
		||||
 | 
			
		||||
        private static void UpdateDbSchema_2_To_3(SqliteConnection cnx) { }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -70,9 +70,9 @@ namespace Elwig.Helpers {
 | 
			
		||||
            for (int i = 0; i < input.Text.Length; i++) {
 | 
			
		||||
                char ch = input.Text[i];
 | 
			
		||||
                if (char.IsAsciiDigit(ch)) {
 | 
			
		||||
                    if (v2 == -1 && v1 < maxLen) {
 | 
			
		||||
                    if (v2 == -1 && (maxLen == -1 || v1 < maxLen)) {
 | 
			
		||||
                        text += ch; v1++;
 | 
			
		||||
                    } else if (v2 != -1 && v2 < maxDecimal) {
 | 
			
		||||
                    } else if (v2 != -1 && (maxDecimal == -1 || v2 < maxDecimal)) {
 | 
			
		||||
                        text += ch; v2++;
 | 
			
		||||
                    }
 | 
			
		||||
                } else if (v2 == 0-1 && ch == ',' || ch == '.') {
 | 
			
		||||
 
 | 
			
		||||
@@ -87,6 +87,9 @@ namespace Elwig.Models {
 | 
			
		||||
        [Column("weighing_id")]
 | 
			
		||||
        public string? WeighingId { get; set; }
 | 
			
		||||
 | 
			
		||||
        [Column("weighing_reason")]
 | 
			
		||||
        public string? WeighingReason { get; set; }
 | 
			
		||||
 | 
			
		||||
        [Column("comment")]
 | 
			
		||||
        public string? Comment { get; set; }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -128,9 +128,6 @@ namespace Elwig.Models {
 | 
			
		||||
        [Column("address")]
 | 
			
		||||
        public string Address { get; set; }
 | 
			
		||||
 | 
			
		||||
        [Column("email")]
 | 
			
		||||
        public string? Email { get; set; }
 | 
			
		||||
 | 
			
		||||
        [Column("default_kgnr")]
 | 
			
		||||
        public int? DefaultKgNr { get; set; }
 | 
			
		||||
 | 
			
		||||
@@ -174,6 +171,9 @@ namespace Elwig.Models {
 | 
			
		||||
        [InverseProperty("Member")]
 | 
			
		||||
        public virtual ISet<MemberTelNr> TelephoneNumbers { get; private set; }
 | 
			
		||||
 | 
			
		||||
        [InverseProperty("member")]
 | 
			
		||||
        public virtual ISet<MemberEmailAddr> EmailAddresses { get; private set; }
 | 
			
		||||
 | 
			
		||||
        public string FullAddress => $"{Address}, {PostalDest.AtPlz.Plz} {PostalDest.AtPlz.Ort.Name}";
 | 
			
		||||
 | 
			
		||||
        public int DeliveryRight => BusinessShares * App.Client.DeliveryRight;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										22
									
								
								Elwig/Models/MemberEmailAddr.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								Elwig/Models/MemberEmailAddr.cs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
using Microsoft.EntityFrameworkCore;
 | 
			
		||||
using System.ComponentModel.DataAnnotations.Schema;
 | 
			
		||||
 | 
			
		||||
namespace Elwig.Models {
 | 
			
		||||
    [Table("member_email_address"), PrimaryKey("MgNr", "Nr")]
 | 
			
		||||
    public class MemberEmailAddr {
 | 
			
		||||
        [Column("mgnr")]
 | 
			
		||||
        public int MgNr { get; set; }
 | 
			
		||||
 | 
			
		||||
        [Column("nr")]
 | 
			
		||||
        public int Nr { get; set; }
 | 
			
		||||
 | 
			
		||||
        [Column("address")]
 | 
			
		||||
        public string Address { get; set; }
 | 
			
		||||
 | 
			
		||||
        [Column("comment")]
 | 
			
		||||
        public string? Comment { get; set; }
 | 
			
		||||
 | 
			
		||||
        [ForeignKey("MgNr")]
 | 
			
		||||
        public virtual Member Member { get; private set; }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -462,6 +462,10 @@ namespace Elwig.Windows {
 | 
			
		||||
            InputTextChanged((TextBox)sender, Validator.CheckInteger);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected void DecimalInput_TextChanged(object sender, RoutedEventArgs evt) {
 | 
			
		||||
            InputTextChanged((TextBox)sender, Validator.CheckDecimal);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected void PartialDateInput_TextChanged(object sender, RoutedEventArgs evt) {
 | 
			
		||||
            InputTextChanged((TextBox)sender, Validator.CheckPartialDate);
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -131,6 +131,10 @@
 | 
			
		||||
                <Label Content="Bewirt.-Art:" Margin="10,100,0,0" Grid.Column="0" Grid.ColumnSpan="2"/>
 | 
			
		||||
                <ComboBox x:Name="WineCultivationInput" DisplayMemberPath="Name" TextSearch.TextPath="Name"
 | 
			
		||||
                          HorizontalAlignment="Stretch" Margin="0,100,10,0" Grid.Column="1" Grid.ColumnSpan="3"/>
 | 
			
		||||
 | 
			
		||||
                <Label Content="Anmerkung:" Margin="10,130,0,0" Grid.Column="0" Grid.ColumnSpan="2"/>
 | 
			
		||||
                <TextBox x:Name="CommentInput" TextChanged="TextBox_TextChanged"
 | 
			
		||||
                         HorizontalAlignment="Stretch" Margin="0,130,10,0" Grid.Column="1" Grid.ColumnSpan="3"/>
 | 
			
		||||
            </Grid>
 | 
			
		||||
        </GroupBox>
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -40,11 +40,8 @@ namespace Elwig.Windows {
 | 
			
		||||
 | 
			
		||||
        private async Task RefreshAreaCommitmentListQuery() {
 | 
			
		||||
            List<AreaCom> areaComs = await Context.AreaCommitments.Where(a => a.MgNr == Member.MgNr).OrderBy(a => a.FbNr).ToListAsync();
 | 
			
		||||
 | 
			
		||||
            ControlUtils.RenewItemsSource(AreaCommitmentList, areaComs, i => (i as AreaCom)?.FbNr);
 | 
			
		||||
            if (areaComs.Count == 1)
 | 
			
		||||
                AreaCommitmentList.SelectedIndex = 0;
 | 
			
		||||
 | 
			
		||||
            ControlUtils.RenewItemsSource(AreaCommitmentList, areaComs, i => (i as AreaCom)?.FbNr,
 | 
			
		||||
                AreaCommitmentList_SelectionChanged, ControlUtils.RenewSourceDefault.None);
 | 
			
		||||
            RefreshInputs();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -82,6 +79,8 @@ namespace Elwig.Windows {
 | 
			
		||||
            AreaComTypeInput.SelectedItem = a.AreaComType;
 | 
			
		||||
            WineCultivationInput.SelectedItem = a.WineCult;
 | 
			
		||||
 | 
			
		||||
            CommentInput.Text = a.Comment;
 | 
			
		||||
 | 
			
		||||
            FinishInputFilling();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -151,6 +150,7 @@ namespace Elwig.Windows {
 | 
			
		||||
            a.Area = int.Parse(AreaInput.Text);
 | 
			
		||||
            a.VtrgId = (AreaComTypeInput.SelectedItem as AreaComType)?.VtrgId;
 | 
			
		||||
            a.CultId = (WineCultivationInput.SelectedItem as WineCult)?.CultId;
 | 
			
		||||
            a.Comment = (CommentInput.Text == "") ? null : CommentInput.Text;
 | 
			
		||||
 | 
			
		||||
            EntityEntry<AreaCom>? tr = null;
 | 
			
		||||
            try {
 | 
			
		||||
 
 | 
			
		||||
@@ -117,6 +117,7 @@ namespace Elwig.Windows {
 | 
			
		||||
            await Context.SaveChangesAsync();
 | 
			
		||||
 | 
			
		||||
            foreach (var mod in ModifierList.Where(m => !ModifierIds.ContainsKey(m))) {
 | 
			
		||||
                if (mod.ModId == null) continue;
 | 
			
		||||
                await Context.AddAsync(mod);
 | 
			
		||||
            }
 | 
			
		||||
            await Context.SaveChangesAsync();
 | 
			
		||||
@@ -321,6 +322,7 @@ namespace Elwig.Windows {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void SeasonModifierRelInput_TextChanged(object sender, TextChangedEventArgs evt) {
 | 
			
		||||
            // DecimalInput_TextChanged(sender, evt); FIXME '-' is ignored
 | 
			
		||||
            if ((!IsEditing && !IsCreating) || SeasonModifierList.SelectedItem is not Modifier mod) return;
 | 
			
		||||
            ModifiersChanged = ModifiersChanged || (SeasonModifierRelInput.Text ?? "") != ((SeasonModifierList.SelectedItem as Modifier)?.Rel?.ToString() ?? "");
 | 
			
		||||
            if (ModifierUpdate) return;
 | 
			
		||||
@@ -331,11 +333,13 @@ namespace Elwig.Windows {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void SeasonModifierAbsInput_TextChanged(object sender, TextChangedEventArgs evt) {
 | 
			
		||||
            if ((!IsEditing && !IsCreating) || SeasonModifierList.SelectedItem is not Modifier mod) return;
 | 
			
		||||
            // DecimalInput_TextChanged(sender, evt); FIXME '-' is ignored
 | 
			
		||||
            if ((!IsEditing && !IsCreating) || SeasonModifierList.SelectedItem is not Modifier mod || SeasonList.SelectedItem is not Season s) return;
 | 
			
		||||
            ModifiersChanged = ModifiersChanged || (SeasonModifierAbsInput.Text ?? "") != ((SeasonModifierList.SelectedItem as Modifier)?.Abs?.ToString() ?? "");
 | 
			
		||||
            if (ModifierUpdate) return;
 | 
			
		||||
            mod.Abs = decimal.TryParse(SeasonModifierAbsInput.Text, out var v) ? v : null;
 | 
			
		||||
            if (mod.Abs != null) SeasonModifierRelInput.Text = "";
 | 
			
		||||
            // FIXME ValueStr does not work in ModifierList when modifier is newly created
 | 
			
		||||
            mod.AbsValue = decimal.TryParse(SeasonModifierAbsInput.Text, out var v) ? Utils.DecToDb(v, s.Precision) : null;
 | 
			
		||||
            if (mod.AbsValue != null) SeasonModifierRelInput.Text = "";
 | 
			
		||||
            CollectionViewSource.GetDefaultView(ModifierList).Refresh();
 | 
			
		||||
            UpdateButtons();
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -233,7 +233,6 @@ namespace Elwig.Windows {
 | 
			
		||||
            double filterOeLt = 0;
 | 
			
		||||
 | 
			
		||||
            var filter = TextFilter.ToList();
 | 
			
		||||
            var hasFilters = filter.Count > 0;
 | 
			
		||||
            if (filter.Count > 0) {
 | 
			
		||||
                var var = await Context.WineVarieties.Select(v => v.SortId).ToListAsync();
 | 
			
		||||
                var qual = await Context.WineQualityLevels.Select(q => q.QualId).ToListAsync();
 | 
			
		||||
@@ -340,7 +339,7 @@ namespace Elwig.Windows {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            ControlUtils.RenewItemsSource(DeliveryList, deliveries, d => ((d as Delivery)?.Year, (d as Delivery)?.DId),
 | 
			
		||||
                DeliveryList_SelectionChanged, hasFilters ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort);
 | 
			
		||||
                DeliveryList_SelectionChanged, filter.Count > 0 ? ControlUtils.RenewSourceDefault.IfOnly : ControlUtils.RenewSourceDefault.None, !updateSort);
 | 
			
		||||
 | 
			
		||||
            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))})" : "");
 | 
			
		||||
@@ -530,6 +529,7 @@ namespace Elwig.Windows {
 | 
			
		||||
 | 
			
		||||
            ScaleId = p?.ScaleId;
 | 
			
		||||
            WeighingId = p?.WeighingId;
 | 
			
		||||
            ManualWeighingReason = p?.WeighingReason;
 | 
			
		||||
 | 
			
		||||
            FinishInputFilling();
 | 
			
		||||
        }
 | 
			
		||||
@@ -560,7 +560,7 @@ namespace Elwig.Windows {
 | 
			
		||||
            p.DPNr = dpnr;
 | 
			
		||||
 | 
			
		||||
            d.DateString = string.Join("-", DateInput.Text.Split(".").Reverse());
 | 
			
		||||
            if (IsCreating || InputHasChanged(DateInput)) {
 | 
			
		||||
            if (deliveryNew || InputHasChanged(DateInput)) {
 | 
			
		||||
                d.LNr = await Context.NextLNr(d.Date);
 | 
			
		||||
            }
 | 
			
		||||
            if (IsCreating) {
 | 
			
		||||
@@ -591,8 +591,7 @@ namespace Elwig.Windows {
 | 
			
		||||
            p.ManualWeighing = ManualWeighingInput.IsChecked ?? false;
 | 
			
		||||
            p.ScaleId = ScaleId;
 | 
			
		||||
            p.WeighingId = WeighingId;
 | 
			
		||||
            if (ManualWeighingReason != null)
 | 
			
		||||
                p.Comment = (p.Comment != null ? $"{p.Comment} / " : "") + $"Begründung Handwiegung: {ManualWeighingReason}";
 | 
			
		||||
            p.WeighingReason = ManualWeighingReason;
 | 
			
		||||
 | 
			
		||||
            EntityEntry<Delivery>? dEntry = null;
 | 
			
		||||
            EntityEntry<DeliveryPart>? pEntry = null;
 | 
			
		||||
 
 | 
			
		||||
@@ -178,60 +178,64 @@
 | 
			
		||||
                    <ColumnDefinition Width="2*"/>
 | 
			
		||||
                </Grid.ColumnDefinitions>
 | 
			
		||||
 | 
			
		||||
                <Label Content="E-Mail-Adresse:" Margin="10,10,0,0" Grid.Column="0"/>
 | 
			
		||||
                <TextBox x:Name="EmailAddressInput" Margin="0,10,10,0" Grid.Column="1" Grid.ColumnSpan="2"
 | 
			
		||||
                <Label Content="E-Mail-Adresse (1):" Margin="10,10,0,0" Grid.Column="0"/>
 | 
			
		||||
                <TextBox x:Name="EmailAddress1Input" Margin="0,10,10,0" Grid.Column="1" Grid.ColumnSpan="2"
 | 
			
		||||
                         TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
 | 
			
		||||
 | 
			
		||||
                <ComboBox x:Name="PhoneNr1TypeInput" DisplayMemberPath="Value" Margin="6,40,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr1Input" Margin="0,40,5,0" Grid.Column="1"
 | 
			
		||||
                <Label Content="E-Mail-Adresse (2):" Margin="10,40,0,0" Grid.Column="0"/>
 | 
			
		||||
                <TextBox x:Name="EmailAddress2Input" Margin="0,40,10,0" Grid.Column="1" Grid.ColumnSpan="2"
 | 
			
		||||
                         TextChanged="EmailAddressInput_TextChanged" LostFocus="EmailAddressInput_LostFocus"/>
 | 
			
		||||
 | 
			
		||||
                <ComboBox x:Name="PhoneNr1TypeInput" DisplayMemberPath="Value" Margin="6,70,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr1Input" Margin="0,70,5,0" Grid.Column="1"
 | 
			
		||||
                         TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr1CommentInput" Margin="0,40,10,0" Grid.Column="2"
 | 
			
		||||
                <TextBox x:Name="PhoneNr1CommentInput" Margin="0,70,10,0" Grid.Column="2"
 | 
			
		||||
                         TextChanged="TextBox_TextChanged"/>
 | 
			
		||||
 | 
			
		||||
                <ComboBox x:Name="PhoneNr2TypeInput" DisplayMemberPath="Value" Margin="6,70,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr2Input" Margin="0,70,5,0" Grid.Column="1"
 | 
			
		||||
                <ComboBox x:Name="PhoneNr2TypeInput" DisplayMemberPath="Value" Margin="6,100,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr2Input" Margin="0,100,5,0" Grid.Column="1"
 | 
			
		||||
                         TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr2CommentInput" Margin="0,70,10,0" Grid.Column="2"
 | 
			
		||||
                <TextBox x:Name="PhoneNr2CommentInput" Margin="0,100,10,0" Grid.Column="2"
 | 
			
		||||
                         TextChanged="TextBox_TextChanged"/>
 | 
			
		||||
 | 
			
		||||
                <ComboBox x:Name="PhoneNr3TypeInput" DisplayMemberPath="Value" Margin="6,100,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr3Input" Margin="0,100,5,0" Grid.Column="1"
 | 
			
		||||
                <ComboBox x:Name="PhoneNr3TypeInput" DisplayMemberPath="Value" Margin="6,130,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr3Input" Margin="0,130,5,0" Grid.Column="1"
 | 
			
		||||
                         TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr3CommentInput" Margin="0,100,10,0" Grid.Column="2"
 | 
			
		||||
                <TextBox x:Name="PhoneNr3CommentInput" Margin="0,130,10,0" Grid.Column="2"
 | 
			
		||||
                         TextChanged="TextBox_TextChanged"/>
 | 
			
		||||
 | 
			
		||||
                <ComboBox x:Name="PhoneNr4TypeInput" DisplayMemberPath="Value" Margin="6,130,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr4Input" Margin="0,130,5,0" Grid.Column="1"
 | 
			
		||||
                <ComboBox x:Name="PhoneNr4TypeInput" DisplayMemberPath="Value" Margin="6,160,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr4Input" Margin="0,160,5,0" Grid.Column="1"
 | 
			
		||||
                         TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr4CommentInput" Margin="0,130,10,0" Grid.Column="2"
 | 
			
		||||
                <TextBox x:Name="PhoneNr4CommentInput" Margin="0,160,10,0" Grid.Column="2"
 | 
			
		||||
                         TextChanged="TextBox_TextChanged"/>
 | 
			
		||||
 | 
			
		||||
                <ComboBox x:Name="PhoneNr5TypeInput" DisplayMemberPath="Value" Margin="6,160,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr5Input" Margin="0,160,5,0" Grid.Column="1"
 | 
			
		||||
                <ComboBox x:Name="PhoneNr5TypeInput" DisplayMemberPath="Value" Margin="6,190,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr5Input" Margin="0,190,5,0" Grid.Column="1"
 | 
			
		||||
                         TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr5CommentInput" Margin="0,160,10,0" Grid.Column="2"
 | 
			
		||||
                <TextBox x:Name="PhoneNr5CommentInput" Margin="0,190,10,0" Grid.Column="2"
 | 
			
		||||
                         TextChanged="TextBox_TextChanged"/>
 | 
			
		||||
 | 
			
		||||
                <ComboBox x:Name="PhoneNr6TypeInput" DisplayMemberPath="Value" Margin="6,190,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr6Input" Margin="0,190,5,0" Grid.Column="1"
 | 
			
		||||
                <ComboBox x:Name="PhoneNr6TypeInput" DisplayMemberPath="Value" Margin="6,220,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr6Input" Margin="0,220,5,0" Grid.Column="1"
 | 
			
		||||
                         TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr6CommentInput" Margin="0,190,10,0" Grid.Column="2"
 | 
			
		||||
                <TextBox x:Name="PhoneNr6CommentInput" Margin="0,220,10,0" Grid.Column="2"
 | 
			
		||||
                         TextChanged="TextBox_TextChanged"/>
 | 
			
		||||
 | 
			
		||||
                <ComboBox x:Name="PhoneNr7TypeInput" DisplayMemberPath="Value" Margin="6,220,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr7Input" Margin="0,220,5,0" Grid.Column="1"
 | 
			
		||||
                <ComboBox x:Name="PhoneNr7TypeInput" DisplayMemberPath="Value" Margin="6,250,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr7Input" Margin="0,250,5,0" Grid.Column="1"
 | 
			
		||||
                         TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr7CommentInput" Margin="0,220,10,0" Grid.Column="2"
 | 
			
		||||
                <TextBox x:Name="PhoneNr7CommentInput" Margin="0,250,10,0" Grid.Column="2"
 | 
			
		||||
                         TextChanged="TextBox_TextChanged"/>
 | 
			
		||||
 | 
			
		||||
                <ComboBox x:Name="PhoneNr8TypeInput" DisplayMemberPath="Value" Margin="6,250,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr8Input" Margin="0,250,5,0" Grid.Column="1"
 | 
			
		||||
                <ComboBox x:Name="PhoneNr8TypeInput" DisplayMemberPath="Value" Margin="6,280,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr8Input" Margin="0,280,5,0" Grid.Column="1"
 | 
			
		||||
                         TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr8CommentInput" Margin="0,250,10,0" Grid.Column="2"
 | 
			
		||||
                <TextBox x:Name="PhoneNr8CommentInput" Margin="0,280,10,0" Grid.Column="2"
 | 
			
		||||
                         TextChanged="TextBox_TextChanged"/>
 | 
			
		||||
 | 
			
		||||
                <ComboBox x:Name="PhoneNr9TypeInput" DisplayMemberPath="Value" Margin="6,280,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr9Input" Margin="0,280,5,0" Grid.Column="1"
 | 
			
		||||
                <ComboBox x:Name="PhoneNr9TypeInput" DisplayMemberPath="Value" Margin="6,310,5,0" FontSize="12" Padding="6,4,4,4"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr9Input" Margin="0,310,5,0" Grid.Column="1"
 | 
			
		||||
                         TextChanged="PhoneNrInput_TextChanged" LostFocus="PhoneNrInput_LostFocus"/>
 | 
			
		||||
                <TextBox x:Name="PhoneNr9CommentInput" Margin="0,280,10,0" Grid.Column="2"
 | 
			
		||||
                         TextChanged="TextBox_TextChanged"/>
 | 
			
		||||
 
 | 
			
		||||
@@ -266,7 +266,7 @@ namespace Elwig.Windows {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void Menu_Member_SendEmail_Click(object sender, RoutedEventArgs evt) {
 | 
			
		||||
            Utils.MailTo(((Member)MemberList.SelectedItem).Email);
 | 
			
		||||
            Utils.MailTo(((Member)MemberList.SelectedItem).EmailAddresses.First().Address);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void FocusSearchInput(object sender, RoutedEventArgs evt) {
 | 
			
		||||
@@ -349,8 +349,6 @@ namespace Elwig.Windows {
 | 
			
		||||
            m.PostalDestId = ((AT_PlzDest)OrtInput.SelectedItem).Id;
 | 
			
		||||
            m.Address = AddressInput.Text;
 | 
			
		||||
 | 
			
		||||
            m.Email = (EmailAddressInput.Text == "") ? null : EmailAddressInput.Text;
 | 
			
		||||
 | 
			
		||||
            m.Iban = (IbanInput.Text == "") ? null : IbanInput.Text.Replace(" ", "");
 | 
			
		||||
            m.Bic = (BicInput.Text == "") ? null : BicInput.Text;
 | 
			
		||||
 | 
			
		||||
@@ -424,6 +422,27 @@ namespace Elwig.Windows {
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                for (int i = 0; i < 2; i++) {
 | 
			
		||||
                    var input = i == 0 ? EmailAddress1Input : EmailAddress2Input;
 | 
			
		||||
                    var emailAddr = m.EmailAddresses.FirstOrDefault(a => a.Nr - 1 == i);
 | 
			
		||||
                    if (input.Text == "") {
 | 
			
		||||
                        if (emailAddr != null) {
 | 
			
		||||
                            Context.Remove(emailAddr);
 | 
			
		||||
                        }
 | 
			
		||||
                    } else {
 | 
			
		||||
                        MemberEmailAddr a = emailAddr ?? Context.CreateProxy<MemberEmailAddr>();
 | 
			
		||||
                        a.Nr = i + 1;
 | 
			
		||||
                        a.Address = input.Text;
 | 
			
		||||
                        a.Comment = null;
 | 
			
		||||
                        if (emailAddr == null) {
 | 
			
		||||
                            a.MgNr = newMgNr;
 | 
			
		||||
                            await Context.AddAsync(a);
 | 
			
		||||
                        } else {
 | 
			
		||||
                            Context.Update(a);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                await Context.SaveChangesAsync();
 | 
			
		||||
 | 
			
		||||
                if (newMgNr != m.MgNr) {
 | 
			
		||||
@@ -475,7 +494,10 @@ namespace Elwig.Windows {
 | 
			
		||||
                OrtInput.SelectedItem = null;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            EmailAddressInput.Text = m.Email;
 | 
			
		||||
            var emailAddrs = m.EmailAddresses.OrderBy(a => a.Nr).ToList();
 | 
			
		||||
            EmailAddress1Input.Text = emailAddrs.Count > 0 ? emailAddrs[0].Address : "";
 | 
			
		||||
            EmailAddress2Input.Text = emailAddrs.Count > 1 ? emailAddrs[1].Address : "";
 | 
			
		||||
 | 
			
		||||
            var phoneNrs = m.TelephoneNumbers.OrderBy(p => p.Nr).ToList();
 | 
			
		||||
            for (int i = 0; i < PhoneNrInputs.Length; i++) {
 | 
			
		||||
                if (i < phoneNrs.Count) {
 | 
			
		||||
@@ -525,7 +547,7 @@ namespace Elwig.Windows {
 | 
			
		||||
 | 
			
		||||
            AreaCommitment.Text = $"{m.ActiveAreaCommitments.Select(c => c.Area).Sum():N0} m²";
 | 
			
		||||
 | 
			
		||||
            Menu_Member_SendEmail.IsEnabled = m.Email != null;
 | 
			
		||||
            Menu_Member_SendEmail.IsEnabled = m.EmailAddresses.Count > 0;
 | 
			
		||||
 | 
			
		||||
            FinishInputFilling();
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user