From 0ed793d9be0d84259a2d326385a875ca06daf02b Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Tue, 22 Sep 2026 14:28:56 +0200 Subject: [PATCH] Entities/Member: Add OrganicOperatorId --- Elwig/Documents/MemberDataSheet.cs | 3 +- Elwig/Helpers/Export/ElwigData.cs | 2 ++ Elwig/Helpers/Validator.cs | 31 ++++++++++++++++++ Elwig/Models/Entities/Member.cs | 3 ++ Elwig/Resources/Sql/41-42.sql | 5 +++ Elwig/Services/MemberService.cs | 2 ++ Elwig/ViewModels/MemberAdminViewModel.cs | 2 ++ Elwig/Windows/AdministrationWindow.cs | 8 +++++ Elwig/Windows/MemberAdminWindow.xaml | 41 +++++++++++++++--------- 9 files changed, 80 insertions(+), 17 deletions(-) diff --git a/Elwig/Documents/MemberDataSheet.cs b/Elwig/Documents/MemberDataSheet.cs index 27b42c6..be2b87a 100644 --- a/Elwig/Documents/MemberDataSheet.cs +++ b/Elwig/Documents/MemberDataSheet.cs @@ -161,7 +161,8 @@ namespace Elwig.Documents { .AddCell(NewDataTh("Buchführend:", colspan: 2)).AddCell(NewTd(new KernedParagraph(Member.IsBuchführend ? "Ja " : "Nein ", 10) .Add(Normal($"({(Member.IsBuchführend ? season.VatNormal : season.VatFlatrate) * 100:N0}% USt.)", 8)), colspan: 2)) .AddCell(NewDataTh("(Katastralgemeinde mit dem größten Anteil an Weinbauflächen)", 8, colspan: 2)) - .AddCell(NewDataTh("Bio:", colspan: 2)).AddCell(NewTd((Member.IsOrganic ? "Ja" : "Nein") + (Member.OrganicAuthorityCode != null ? $" ({Member.OrganicAuthorityCode})" : ""), colspan: 2)) + .AddCell(NewDataTh("Bio:", colspan: 2)).AddCell(NewTd(new KernedParagraph(Member.IsOrganic ? "Ja" : "Nein", 10) + .Add(Normal(Member.OrganicAuthorityCode != null || Member.OrganicOperatorId != null ? $" ({Member.OrganicAuthorityCode}{(Member.OrganicAuthorityCode != null && Member.OrganicOperatorId != null ? ", " : "")}{Member.OrganicOperatorId})" : "", 8)), colspan: 2)) .AddCell(NewDataHdr("Genossenschaft", colspan: 6)) .AddCell(NewDataTh("Status:")).AddCell(NewTd(new KernedParagraph(Member.IsActive ? "Aktiv " : "Nicht aktiv ", 10) .Add(Normal("(" + (Member.ExitDate != null ? $"{Member.EntryDate:dd.MM.yyyy}\u2013{Member.ExitDate:dd.MM.yyyy}" : $"seit {Member.EntryDate:dd.MM.yyyy}") + ")", 8)))) diff --git a/Elwig/Helpers/Export/ElwigData.cs b/Elwig/Helpers/Export/ElwigData.cs index 147dc2f..b579220 100644 --- a/Elwig/Helpers/Export/ElwigData.cs +++ b/Elwig/Helpers/Export/ElwigData.cs @@ -638,6 +638,7 @@ namespace Elwig.Helpers.Export { ["zwstid"] = m.ZwstId, ["lfbis_nr"] = m.LfbisNr, ["ustid_nr"] = m.UstIdNr, + ["ooc_id"] = m.OrganicOperatorId, ["org_auth_code"] = m.OrganicAuthorityCode, ["juridical_pers"] = m.IsJuridicalPerson, ["volllieferant"] = m.IsVollLieferant, @@ -711,6 +712,7 @@ namespace Elwig.Helpers.Export { ZwstId = json["zwstid"]?.AsValue().GetValue(), LfbisNr = json["lfbis_nr"]?.AsValue().GetValue(), UstIdNr = json["ustid_nr"]?.AsValue().GetValue(), + OrganicOperatorId = json["ooc_id"]?.AsValue().GetValue(), OrganicAuthorityCode = json["org_auth_code"]?.AsValue().GetValue(), IsJuridicalPerson = json["juridical_pers"]?.AsValue().GetValue() ?? false, IsVollLieferant = json["volllieferant"]?.AsValue().GetValue() ?? false, diff --git a/Elwig/Helpers/Validator.cs b/Elwig/Helpers/Validator.cs index befc722..ef1b521 100644 --- a/Elwig/Helpers/Validator.cs +++ b/Elwig/Helpers/Validator.cs @@ -623,6 +623,37 @@ namespace Elwig.Helpers { return new(true, null); } + public static ValidationResult CheckOrganicOperatorId(TextBox input, bool required) { + string text = ""; + int pos = input.CaretIndex; + for (int i = 0, v = 0; i < input.Text.Length; i++) { + char ch = input.Text[i]; + if (char.IsAsciiDigit(ch)) { + if (v == 3 && text[^1] != '-') + text += "-"; + v++; + text += ch; + } + + if (i == input.CaretIndex - 1) { + pos = text.Length; + } else if (v >= 10) { + break; + } + } + + input.Text = text; + input.CaretIndex = pos; + + if (text.Length == 0) { + return required ? new(false, "OOC-ID ist nicht optional") : new(true, null); + } else if (!text.StartsWith("040-") || text.Length != 11) { + return new(false, "OOC-ID ist ungültig"); + } + + return new(true, null); + } + public static ValidationResult CheckOrganicAuthorityCode(TextBox input, bool required) { string text = ""; int pos = input.CaretIndex; diff --git a/Elwig/Models/Entities/Member.cs b/Elwig/Models/Entities/Member.cs index afa460c..8eda41f 100644 --- a/Elwig/Models/Entities/Member.cs +++ b/Elwig/Models/Entities/Member.cs @@ -96,6 +96,9 @@ namespace Elwig.Models.Entities { [Column("ustid_nr")] public string? UstIdNr { get; set; } + [Column("ooc_id")] + public string? OrganicOperatorId { get; set; } + [Column("org_auth_code")] public string? OrganicAuthorityCode { get; set; } diff --git a/Elwig/Resources/Sql/41-42.sql b/Elwig/Resources/Sql/41-42.sql index 428c4fc..710e01e 100644 --- a/Elwig/Resources/Sql/41-42.sql +++ b/Elwig/Resources/Sql/41-42.sql @@ -1,3 +1,8 @@ -- schema version 41 to 42 +ALTER TABLE member ADD COLUMN ooc_id TEXT CHECK (ooc_id REGEXP '^[0-9]{3}-[0-9]{7}$') DEFAULT NULL; ALTER TABLE member ADD COLUMN org_auth_code TEXT CHECK (org_auth_code REGEXP '^[A-Z]{2}-[A-ZÖØ]{3}-[0-9]{2,3}(-[A-Z]{2})?$') DEFAULT NULL; + +UPDATE member SET org_auth_code = UPPER(SUBSTR(a.name, -11, 10)) FROM member m JOIN member_billing_address a ON a.mgnr = m.mgnr WHERE a.name LIKE '%AT-BIO-___)'; +UPDATE member SET org_auth_code = UPPER(SUBSTR(a.name, -10, 10)) FROM member m JOIN member_billing_address a ON a.mgnr = m.mgnr WHERE a.name LIKE '%AT-BIO-___'; +UPDATE member SET org_auth_code = UPPER(suffix) WHERE suffix LIKE 'AT-BIO-___'; diff --git a/Elwig/Services/MemberService.cs b/Elwig/Services/MemberService.cs index 3624c4f..13155f5 100644 --- a/Elwig/Services/MemberService.cs +++ b/Elwig/Services/MemberService.cs @@ -106,6 +106,7 @@ namespace Elwig.Services { vm.UstIdNr = m.UstIdNr; vm.LfbisNr = m.LfbisNr; + vm.OrganicOperatorId = m.OrganicOperatorId; vm.OrganicAuthorityCode = m.OrganicAuthorityCode; vm.IsBuchführend = m.IsBuchführend; vm.IsOrganic = m.IsOrganic; @@ -556,6 +557,7 @@ namespace Elwig.Services { UstIdNr = string.IsNullOrWhiteSpace(vm.UstIdNr) ? null : vm.UstIdNr, LfbisNr = string.IsNullOrWhiteSpace(vm.LfbisNr) ? null : vm.LfbisNr, + OrganicOperatorId = string.IsNullOrWhiteSpace(vm.OrganicOperatorId) ? null : vm.OrganicOperatorId, OrganicAuthorityCode = string.IsNullOrWhiteSpace(vm.OrganicAuthorityCode) ? null : vm.OrganicAuthorityCode, IsBuchführend = vm.IsBuchführend, IsOrganic = vm.IsOrganic, diff --git a/Elwig/ViewModels/MemberAdminViewModel.cs b/Elwig/ViewModels/MemberAdminViewModel.cs index ea882f5..6fa4555 100644 --- a/Elwig/ViewModels/MemberAdminViewModel.cs +++ b/Elwig/ViewModels/MemberAdminViewModel.cs @@ -118,6 +118,8 @@ namespace Elwig.ViewModels { [ObservableProperty] private string? _lfbisNr; [ObservableProperty] + private string? _organicOperatorId; + [ObservableProperty] private string? _organicAuthorityCode; [ObservableProperty] private bool _isBuchführend; diff --git a/Elwig/Windows/AdministrationWindow.cs b/Elwig/Windows/AdministrationWindow.cs index d1f6d4d..91b9565 100644 --- a/Elwig/Windows/AdministrationWindow.cs +++ b/Elwig/Windows/AdministrationWindow.cs @@ -576,6 +576,14 @@ namespace Elwig.Windows { InputLostFocus((TextBox)sender, Validator.CheckLfbisNr); } + protected void OrganicOperatorIdInput_TextChanged(object sender, TextChangedEventArgs? evt) { + InputTextChanged((TextBox)sender, Validator.CheckOrganicOperatorId); + } + + protected void OrganicOperatorIdInput_LostFocus(object sender, RoutedEventArgs? evt) { + InputLostFocus((TextBox)sender, Validator.CheckOrganicOperatorId); + } + protected void OrganicAuthorityCodeInput_TextChanged(object sender, TextChangedEventArgs? evt) { InputTextChanged((TextBox)sender, Validator.CheckOrganicAuthorityCode); } diff --git a/Elwig/Windows/MemberAdminWindow.xaml b/Elwig/Windows/MemberAdminWindow.xaml index 2a6299e..12a0ceb 100644 --- a/Elwig/Windows/MemberAdminWindow.xaml +++ b/Elwig/Windows/MemberAdminWindow.xaml @@ -547,31 +547,40 @@ - - - + + + + + -