diff --git a/Elwig/Documents/BusinessDocument.cs b/Elwig/Documents/BusinessDocument.cs index d863956..b62ccbc 100644 --- a/Elwig/Documents/BusinessDocument.cs +++ b/Elwig/Documents/BusinessDocument.cs @@ -32,7 +32,7 @@ namespace Elwig.Documents { get { IAddress addr = (Member.BillingAddress != null && UseBillingAddress) ? Member.BillingAddress : Member; var plz = addr.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 string.Join("\n", ((string?[])[Member.BillingAddress?.FullName, Member.AdministrativeName, Member.ForTheAttentionOf, addr.Address, $"{plz?.Plz} {plz?.Ort.Name.Split(",")[0]}", addr.PostalDest.Country.Name]).Where(s => !string.IsNullOrWhiteSpace(s))); } } diff --git a/Elwig/Documents/CreditNote.cs b/Elwig/Documents/CreditNote.cs index f850ac6..4a8ac16 100644 --- a/Elwig/Documents/CreditNote.cs +++ b/Elwig/Documents/CreditNote.cs @@ -33,7 +33,7 @@ namespace Elwig.Documents { bool considerCustomModifiers, Dictionary? underDeliveries = null ) : - base($"{Name} {(p.Credit != null ? $"Nr. {p.Credit.Year}/{p.Credit.TgNr:000}" : p.Member.Name)} – {p.Variant.Name}", p.Member) { + base($"{Name} {(p.Credit != null ? $"Nr. {p.Credit.Year}/{p.Credit.TgNr:000}" : p.Member.FullName)} – {p.Variant.Name}", p.Member) { UseBillingAddress = true; ShowDateAndLocation = true; Data = data; diff --git a/Elwig/Documents/Document.cs b/Elwig/Documents/Document.cs index a381f62..cd87083 100644 --- a/Elwig/Documents/Document.cs +++ b/Elwig/Documents/Document.cs @@ -158,7 +158,7 @@ namespace Elwig.Documents { public void Show() { if (_pdfFile == null) throw new InvalidOperationException("Pdf file has not been generated yet"); - Pdf.Show(_pdfFile.NewReference(), Title + (this is BusinessDocument b ? $" - {b.Member.Name}" : "")); + Pdf.Show(_pdfFile.NewReference(), Title + (this is BusinessDocument b ? $" - {b.Member.FullName}" : "")); } public MimePart AsEmailAttachment(string filename) { diff --git a/Elwig/Documents/Letterhead.cs b/Elwig/Documents/Letterhead.cs index f95277d..e839a83 100644 --- a/Elwig/Documents/Letterhead.cs +++ b/Elwig/Documents/Letterhead.cs @@ -2,7 +2,7 @@ using Elwig.Models.Entities; namespace Elwig.Documents { public class Letterhead : BusinessDocument { - public Letterhead(Member m) : base($"Briefkopf {m.Name}", m, true) { + public Letterhead(Member m) : base($"Briefkopf {m.FullName}", m, true) { Aside = ""; } } diff --git a/Elwig/Documents/MemberDataSheet.cshtml b/Elwig/Documents/MemberDataSheet.cshtml index 9c0a79f..b32dc86 100644 --- a/Elwig/Documents/MemberDataSheet.cshtml +++ b/Elwig/Documents/MemberDataSheet.cshtml @@ -18,21 +18,31 @@ Persönliche Daten - Titel (vorangestellt) - Vorname - Nachname - Titel (nachgestellt) + @if (Model.Member.IsJuridicalPerson) { + Name + Zu Handen + } else { + Titel (vorangestellt) + Vorname + Nachname + Titel (nachgestellt) + } - @Model.Member.Prefix - @Model.Member.GivenName @Model.Member.MiddleName - @Model.Member.FamilyName - @Model.Member.Suffix + @if (Model.Member.IsJuridicalPerson) { + @Model.Member.Name + @Model.Member.ForTheAttentionOf + } else { + @Model.Member.Prefix + @Model.Member.GivenName @Model.Member.MiddleName + @Model.Member.Name + @Model.Member.Suffix + } Mitglieds-Nr.: @Model.Member.MgNr - Geburtsjahr/-tag: + @(Model.Member.IsJuridicalPerson ? "Gründungsjahr/-tag" : "Geburtsjahr/-tag"): @(string.Join('.', Model.Member.Birthday?.Split('-')?.Reverse() ?? Array.Empty())) @@ -50,7 +60,7 @@ Rechnungsadresse (optional) Name: - @Model.Member.BillingAddress?.Name + @Model.Member.BillingAddress?.FullName Adresse: diff --git a/Elwig/Helpers/AppDbUpdater.cs b/Elwig/Helpers/AppDbUpdater.cs index 631ba88..3af451e 100644 --- a/Elwig/Helpers/AppDbUpdater.cs +++ b/Elwig/Helpers/AppDbUpdater.cs @@ -9,7 +9,7 @@ namespace Elwig.Helpers { public static class AppDbUpdater { // Don't forget to update value in Tests/fetch-resources.bat! - public static readonly int RequiredSchemaVersion = 26; + public static readonly int RequiredSchemaVersion = 27; private static int VersionOffset = 0; diff --git a/Elwig/Helpers/Export/Bki.cs b/Elwig/Helpers/Export/Bki.cs index 007fbc6..9f36ad4 100644 --- a/Elwig/Helpers/Export/Bki.cs +++ b/Elwig/Helpers/Export/Bki.cs @@ -29,7 +29,7 @@ namespace Elwig.Helpers.Export { using var cnx = await AppDbContext.ConnectAsync(); using var cmd = cnx.CreateCommand(); cmd.CommandText = $""" - SELECT lfbis_nr, family_name, name, billing_name, address, plz, ort, area, + SELECT lfbis_nr, name, other_names, billing_name, address, plz, ort, area, date, weight, type, sortid, qualid, year, hkid, kmw, oe FROM v_bki_delivery WHERE year = {year} diff --git a/Elwig/Helpers/Export/Ebics.cs b/Elwig/Helpers/Export/Ebics.cs index 41528a0..9e77bb3 100644 --- a/Elwig/Helpers/Export/Ebics.cs +++ b/Elwig/Helpers/Export/Ebics.cs @@ -83,7 +83,7 @@ namespace Elwig.Helpers.Export { {id} {Transaction.FormatAmount(tx.Amount)} - {SecurityElement.Escape(a.Name[..Math.Min(140, a.Name.Length)])} + {SecurityElement.Escape(a.FullName[..Math.Min(140, a.FullName.Length)])} """); if (ShowAddresses != AddressMode.Omit) { var full = ShowAddresses == AddressMode.Full; diff --git a/Elwig/Helpers/Export/ElwigData.cs b/Elwig/Helpers/Export/ElwigData.cs index d8766b7..68129b5 100644 --- a/Elwig/Helpers/Export/ElwigData.cs +++ b/Elwig/Helpers/Export/ElwigData.cs @@ -401,11 +401,12 @@ namespace Elwig.Helpers.Export { return new JsonObject { ["mgnr"] = m.MgNr, ["predecessor_mgnr"] = m.PredecessorMgNr, + ["name"] = m.Name, ["prefix"] = m.Prefix, ["given_name"] = m.GivenName, ["middle_names"] = m.MiddleName, - ["family_name"] = m.FamilyName, ["suffix"] = m.Suffix, + ["attn"] = m.ForTheAttentionOf, ["birthday"] = m.Birthday, ["entry_date"] = m.EntryDate != null ? $"{m.EntryDate:yyyy-MM-dd}" : null, ["exit_date"] = m.ExitDate != null ? $"{m.ExitDate:yyyy-MM-dd}" : null, @@ -414,6 +415,7 @@ namespace Elwig.Helpers.Export { ["zwstid"] = m.ZwstId, ["lfbis_nr"] = m.LfbisNr, ["ustid_nr"] = m.UstIdNr, + ["juridical_pers"] = m.IsJuridicalPerson, ["volllieferant"] = m.IsVollLieferant, ["buchführend"] = m.IsBuchführend, ["organic"] = m.IsOrganic, @@ -431,7 +433,7 @@ namespace Elwig.Helpers.Export { ["country"] = m.CountryNum, }, ["billing_address"] = m.BillingAddress != null ? new JsonObject { - ["name"] = m.BillingAddress.Name, + ["name"] = m.BillingAddress.FullName, ["address"] = m.BillingAddress.Address, ["postal_dest"] = m.BillingAddress.PostalDestId, ["country"] = m.BillingAddress.CountryNum, @@ -460,11 +462,12 @@ namespace Elwig.Helpers.Export { return (new Member { MgNr = mgnr, PredecessorMgNr = json["predecessor_mgnr"]?.AsValue().GetValue(), + Name = json["name"]!.AsValue().GetValue(), Prefix = json["prefix"]?.AsValue().GetValue(), - GivenName = json["given_name"]!.AsValue().GetValue(), + GivenName = json["given_name"]?.AsValue().GetValue(), MiddleName = json["middle_names"]?.AsValue().GetValue(), - FamilyName = json["family_name"]!.AsValue().GetValue(), Suffix = json["suffix"]?.AsValue().GetValue(), + ForTheAttentionOf = json["attn"]?.AsValue().GetValue(), Birthday = json["birthday"]?.AsValue().GetValue(), EntryDateString = json["entry_date"]?.AsValue().GetValue(), ExitDateString = json["exit_date"]?.AsValue().GetValue(), @@ -473,6 +476,7 @@ namespace Elwig.Helpers.Export { ZwstId = json["zwstid"]?.AsValue().GetValue(), LfbisNr = json["lfbis_nr"]?.AsValue().GetValue(), UstIdNr = json["ustid_nr"]?.AsValue().GetValue(), + IsJuridicalPerson = json["juridical_pers"]?.AsValue().GetValue() ?? false, IsVollLieferant = json["volllieferant"]?.AsValue().GetValue() ?? false, IsBuchführend = json["buchführend"]?.AsValue().GetValue() ?? false, IsOrganic = json["organic"]?.AsValue().GetValue() ?? false, @@ -490,7 +494,7 @@ namespace Elwig.Helpers.Export { Comment = json["comment"]?.AsValue().GetValue(), }, json["billing_address"] is JsonObject a ? new BillingAddr { MgNr = mgnr, - Name = a["name"]!.AsValue().GetValue(), + FullName = a["name"]!.AsValue().GetValue(), CountryNum = a["country"]!.AsValue().GetValue(), PostalDestId = a["postal_dest"]!.AsValue().GetValue(), Address = a["address"]!.AsValue().GetValue(), diff --git a/Elwig/Models/Dtos/AreaComUnderDeliveyData.cs b/Elwig/Models/Dtos/AreaComUnderDeliveyData.cs index 9a4334e..9680901 100644 --- a/Elwig/Models/Dtos/AreaComUnderDeliveyData.cs +++ b/Elwig/Models/Dtos/AreaComUnderDeliveyData.cs @@ -35,7 +35,7 @@ namespace Elwig.Models.Dtos { private static async Task> FromDbSet(DbSet table, int year) { return await table.FromSqlRaw($""" - SELECT m.mgnr, m.family_name AS name_1, + SELECT m.mgnr, m.name AS name_1, COALESCE(m.prefix || ' ', '') || m.given_name || COALESCE(' ' || m.middle_names, '') || COALESCE(' ' || m.suffix, '') AS name_2, p.plz, o.name AS ort, m.address, diff --git a/Elwig/Models/Dtos/CreditNoteData.cs b/Elwig/Models/Dtos/CreditNoteData.cs index 914302d..db9a9e9 100644 --- a/Elwig/Models/Dtos/CreditNoteData.cs +++ b/Elwig/Models/Dtos/CreditNoteData.cs @@ -50,7 +50,7 @@ namespace Elwig.Models.Dtos { private static async Task> FromDbSet(DbSet table, int year, int avnr) { return await table.FromSqlRaw($""" - SELECT m.mgnr, m.family_name AS name_1, + SELECT m.mgnr, m.name AS name_1, COALESCE(m.prefix || ' ', '') || m.given_name || COALESCE(' ' || m.middle_names, '') || COALESCE(' ' || m.suffix, '') AS name_2, p.plz, o.name AS ort, m.address, m.iban, c.tgnr, s.year, s.precision, diff --git a/Elwig/Models/Dtos/DeliveryJournalData.cs b/Elwig/Models/Dtos/DeliveryJournalData.cs index 5fec093..fcb4420 100644 --- a/Elwig/Models/Dtos/DeliveryJournalData.cs +++ b/Elwig/Models/Dtos/DeliveryJournalData.cs @@ -88,7 +88,7 @@ namespace Elwig.Models.Dtos { Time = d.Time; DeliveryBranch = d.Branch.Name; MgNr = m.MgNr; - Name1 = m.FamilyName; + Name1 = m.Name; Name2 = m.AdministrativeName2; AdministrativeName = m.AdministrativeName; MemberBranch = m.Branch?.Name; diff --git a/Elwig/Models/Dtos/MemberDeliveryPerVariantData.cs b/Elwig/Models/Dtos/MemberDeliveryPerVariantData.cs index a627ed8..3d843ec 100644 --- a/Elwig/Models/Dtos/MemberDeliveryPerVariantData.cs +++ b/Elwig/Models/Dtos/MemberDeliveryPerVariantData.cs @@ -37,7 +37,7 @@ namespace Elwig.Models.Dtos { private static async Task> FromDbSet(DbSet table, int year) { return await table.FromSqlRaw($""" - SELECT m.mgnr, m.family_name AS name_1, + SELECT m.mgnr, m.name AS name_1, COALESCE(m.prefix || ' ', '') || m.given_name || COALESCE(' ' || m.middle_names, '') || COALESCE(' ' || m.suffix, '') AS name_2, p.plz, o.name AS ort, m.address, diff --git a/Elwig/Models/Dtos/MemberListData.cs b/Elwig/Models/Dtos/MemberListData.cs index 44c7f63..0dcfeb9 100644 --- a/Elwig/Models/Dtos/MemberListData.cs +++ b/Elwig/Models/Dtos/MemberListData.cs @@ -91,7 +91,7 @@ namespace Elwig.Models.Dtos { public MemberListRow(Member m, int? areaCom = null) { MgNr = m.MgNr; - Name1 = m.FamilyName; + Name1 = m.Name; Name2 = m.AdministrativeName2; DefaultKg = m.DefaultKg?.Name; Branch = m.Branch?.Name; @@ -100,7 +100,7 @@ namespace Elwig.Models.Dtos { Plz = m.PostalDest.AtPlz!.Plz; Locality = m.PostalDest.AtPlz!.Ort.Name; if (m.BillingAddress is BillingAddr a) { - BillingName = a.Name; + BillingName = a.FullName; BillingAddress = a.Address; BillingPlz = a.PostalDest.AtPlz!.Plz; BillingLocality = a.PostalDest.AtPlz!.Ort.Name; diff --git a/Elwig/Models/Dtos/OverUnderDeliveryData.cs b/Elwig/Models/Dtos/OverUnderDeliveryData.cs index 83dcc5f..15f63fb 100644 --- a/Elwig/Models/Dtos/OverUnderDeliveryData.cs +++ b/Elwig/Models/Dtos/OverUnderDeliveryData.cs @@ -26,7 +26,7 @@ namespace Elwig.Models.Dtos { public static async Task ForSeason(DbSet table, int year) { var rows = await table.FromSqlRaw($""" - SELECT m.mgnr, m.family_name AS name_1, + SELECT m.mgnr, m.name AS name_1, COALESCE(m.prefix || ' ', '') || m.given_name || COALESCE(' ' || m.middle_names, '') || COALESCE(' ' || m.suffix, '') AS name_2, p.plz, o.name AS ort, m.address, m.business_shares, diff --git a/Elwig/Models/Entities/BillingAddr.cs b/Elwig/Models/Entities/BillingAddr.cs index 3cb6842..667e8ae 100644 --- a/Elwig/Models/Entities/BillingAddr.cs +++ b/Elwig/Models/Entities/BillingAddr.cs @@ -8,7 +8,7 @@ namespace Elwig.Models.Entities { public int MgNr { get; set; } [Column("name")] - public required string Name { get; set; } + public required string FullName { get; set; } [Column("country")] public int CountryNum { get; set; } diff --git a/Elwig/Models/Entities/Delivery.cs b/Elwig/Models/Entities/Delivery.cs index 2979a31..929e95d 100644 --- a/Elwig/Models/Entities/Delivery.cs +++ b/Elwig/Models/Entities/Delivery.cs @@ -118,7 +118,7 @@ namespace Elwig.Models.Entities { public int SearchScore(IEnumerable keywords) { var list = new string?[] { LsNr, Time?.ToString("HH:mm"), - Member.FamilyName, Member.MiddleName, Member.GivenName, Member.BillingAddress?.Name, + Member.Name, Member.MiddleName, Member.GivenName, Member.BillingAddress?.FullName, Comment }.ToList(); list.AddRange(Parts.Select(p => p.Comment).Distinct()); diff --git a/Elwig/Models/Entities/DeliveryAncmt.cs b/Elwig/Models/Entities/DeliveryAncmt.cs index ac4dbcd..05f5e89 100644 --- a/Elwig/Models/Entities/DeliveryAncmt.cs +++ b/Elwig/Models/Entities/DeliveryAncmt.cs @@ -48,8 +48,8 @@ namespace Elwig.Models.Entities { public int SearchScore(IEnumerable keywords) { return Utils.GetSearchScore([ Schedule.Description, - Member.FamilyName, Member.MiddleName, Member.GivenName, - Member.BillingAddress?.Name, + Member.Name, Member.MiddleName, Member.GivenName, + Member.BillingAddress?.FullName, ], keywords); } } diff --git a/Elwig/Models/Entities/Member.cs b/Elwig/Models/Entities/Member.cs index 71667d9..d7a83fb 100644 --- a/Elwig/Models/Entities/Member.cs +++ b/Elwig/Models/Entities/Member.cs @@ -14,11 +14,14 @@ namespace Elwig.Models.Entities { [Column("predecessor_mgnr")] public int? PredecessorMgNr { get; set; } + [Column("name")] + public required string Name { get; set; } + [Column("prefix")] public string? Prefix { get; set; } [Column("given_name")] - public required string GivenName { get; set; } + public string? GivenName { get; set; } [Column("middle_names")] public string? MiddleName { get; set; } @@ -28,30 +31,22 @@ namespace Elwig.Models.Entities { set => MiddleName = (value.Length > 0) ? string.Join(" ", value) : null; } - [Column("family_name")] - public required string FamilyName { get; set; } - [Column("suffix")] public string? Suffix { get; set; } - public string Name => - (Prefix != null ? Prefix + " " : "") + - GivenName + " " + - (MiddleName != null ? MiddleName + " " : "") + - FamilyName + - (Suffix != null ? " " + Suffix : ""); + [Column("attn")] + public string? ForTheAttentionOf { get; set; } - public string ShortName => GivenName + " " + FamilyName; - - public string AdministrativeName => AdministrativeName1 + " " + AdministrativeName2; - - public string AdministrativeName1 => FamilyName.Replace('ß', 'ẞ').ToUpper(); - - public string AdministrativeName2 => - (Prefix != null ? Prefix + " " : "") + - GivenName + - (MiddleName != null ? " " + MiddleName : "") + - (Suffix != null ? " " + Suffix : ""); + [NotMapped] + public string FullName => IsJuridicalPerson ? Name : string.Join(" ", ((string?[])[Prefix, GivenName, MiddleName, Name, Suffix]).Where(s => !string.IsNullOrWhiteSpace(s))); + [NotMapped] + public string ShortName => (!string.IsNullOrWhiteSpace(GivenName) ? $"{GivenName} " : "") + Name; + [NotMapped] + public string AdministrativeName => AdministrativeName1 + (!string.IsNullOrWhiteSpace(AdministrativeName2) ? $" {AdministrativeName2}" : ""); + [NotMapped] + public string AdministrativeName1 => IsJuridicalPerson ? Name : Name.Replace('ß', 'ẞ').ToUpper(); + [NotMapped] + public string? AdministrativeName2 => IsJuridicalPerson ? null : string.Join(" ", ((string?[])[Prefix, GivenName, MiddleName, Suffix]).Where(s => !string.IsNullOrWhiteSpace(s))); [Column("birthday")] public string? Birthday { get; set; } @@ -87,6 +82,9 @@ namespace Elwig.Models.Entities { [Column("ustid_nr")] public string? UstIdNr { get; set; } + [Column("juridical_pers")] + public bool IsJuridicalPerson { get; set; } + [Column("volllieferant")] public bool IsVollLieferant { get; set; } @@ -185,8 +183,8 @@ namespace Elwig.Models.Entities { public int SearchScore(IEnumerable keywords) { return Utils.GetSearchScore([ - FamilyName, MiddleName, GivenName, - BillingAddress?.Name, + Name, MiddleName, GivenName, + BillingAddress?.FullName, Comment, ], keywords); } diff --git a/Elwig/Models/IAddress.cs b/Elwig/Models/IAddress.cs index 4d01ef7..be7c772 100644 --- a/Elwig/Models/IAddress.cs +++ b/Elwig/Models/IAddress.cs @@ -2,7 +2,7 @@ using Elwig.Models.Entities; namespace Elwig.Models { public interface IAddress { - string Name { get; } + string FullName { get; } string Address { get; } PostalDest PostalDest { get; } } diff --git a/Elwig/Resources/Sql/25-26.sql b/Elwig/Resources/Sql/25-26.sql index fa06c51..926efaa 100644 --- a/Elwig/Resources/Sql/25-26.sql +++ b/Elwig/Resources/Sql/25-26.sql @@ -1,4 +1,4 @@ --- schema version 24 to 25 +-- schema version 25 to 26 CREATE TABLE delivery_schedule ( year INTEGER NOT NULL, diff --git a/Elwig/Resources/Sql/26-27.sql b/Elwig/Resources/Sql/26-27.sql new file mode 100644 index 0000000..0bc1d7d --- /dev/null +++ b/Elwig/Resources/Sql/26-27.sql @@ -0,0 +1,48 @@ +-- schema version 26 to 27 + +PRAGMA writable_schema = ON; + +ALTER TABLE member RENAME COLUMN family_name TO name; +ALTER TABLE member ADD COLUMN attn TEXT DEFAULT NULL; +ALTER TABLE member ADD COLUMN juridical_pers INTEGER NOT NULL CHECK (juridical_pers IN (TRUE, FALSE)) DEFAULT FALSE; + +UPDATE sqlite_schema SET sql = REPLACE(sql, 'given_name TEXT NOT NULL', 'given_name TEXT DEFAULT NULL') +WHERE type = 'table' AND name = 'member'; + +DROP VIEW v_bki_member; +CREATE VIEW v_bki_member AS +SELECT s.year, m.mgnr, m.lfbis_nr, m.name, + (COALESCE(m.prefix || ' ', '') || m.given_name || COALESCE(' ' || m.middle_names, '') || COALESCE(' ' || m.suffix, '')) AS other_names, + a.name AS billing_name, COALESCE(a.address, m.address) AS address, + COALESCE(a.country, m.country) AS country, COALESCE(a.postal_dest, m.postal_dest) AS postal_dest, + SUM(IIF(c.year_from <= s.year AND (c.year_to IS NULL OR c.year_to >= s.year), c.area, 0)) AS area +FROM season s, member m + LEFT JOIN member_billing_address a ON a.mgnr = m.mgnr + LEFT JOIN area_commitment c ON c.mgnr = m.mgnr +GROUP BY s.year, m.mgnr; + +DROP VIEW v_bki_delivery; +CREATE VIEW v_bki_delivery AS +SELECT m.lfbis_nr, m.name, m.other_names, m.billing_name, + m.address, plz.plz, IIF(INSTR(o.name, ',') = 0, o.name, SUBSTR(o.name, 1, INSTR(o.name, ',') - 1)) AS ort, + d.date, d.weight, v.type, v.sortid, d.qualid, d.year, d.hkid, d.kmw, d.oe, + m.area +FROM v_delivery d + JOIN v_bki_member m ON (m.year, m.mgnr) = (d.year, d.mgnr) + JOIN postal_dest pd ON (pd.country, pd.id) = (m.country, m.postal_dest) + LEFT JOIN AT_plz_dest ap ON (ap.country, ap.id) = (pd.country, pd.id) + LEFT JOIN AT_plz plz ON plz.plz = ap.plz + LEFT JOIN AT_ort o ON o.okz = ap.okz + JOIN wine_variety v ON v.sortid = d.sortid +ORDER BY d.date, d.time; + +PRAGMA schema_version = 2601; +PRAGMA writable_schema = OFF; + +UPDATE member +SET name = a.name, juridical_pers = TRUE +FROM member_billing_address a +WHERE a.mgnr = member.mgnr AND member.name = ''; + +DELETE FROM member_billing_address +WHERE mgnr IN (SELECT mgnr FROM member WHERE name = member_billing_address.name) diff --git a/Elwig/Services/DeliveryAncmtService.cs b/Elwig/Services/DeliveryAncmtService.cs index b947cb7..cd880e5 100644 --- a/Elwig/Services/DeliveryAncmtService.cs +++ b/Elwig/Services/DeliveryAncmtService.cs @@ -145,7 +145,7 @@ namespace Elwig.Services { .OrderBy(a => a.Schedule.DateString) .ThenBy(a => a.Schedule.Branch.Name) .ThenBy(a => a.Schedule.Description) - .ThenBy(a => a.Member.FamilyName) + .ThenBy(a => a.Member.Name) .ThenBy(a => a.Member.GivenName) .ThenBy(a => a.Member.MgNr); diff --git a/Elwig/Services/MemberService.cs b/Elwig/Services/MemberService.cs index 1acdf9d..263f58e 100644 --- a/Elwig/Services/MemberService.cs +++ b/Elwig/Services/MemberService.cs @@ -55,11 +55,13 @@ namespace Elwig.Services { vm.IsMemberSelected = true; vm.MgNrString = $"{m.MgNr}"; vm.PredecessorMgNrString = $"{m.PredecessorMgNr}"; + vm.IsJuridicalPerson = m.IsJuridicalPerson; vm.EnableMemberReferenceButton = m.PredecessorMgNr != null; vm.Prefix = m.Prefix; vm.GivenName = m.GivenName; - vm.FamilyName = m.FamilyName; + vm.Name = m.Name; vm.Suffix = m.Suffix; + vm.ForTheAttentionOf = m.ForTheAttentionOf; vm.Birthday = (m.Birthday != null) ? string.Join(".", m.Birthday.Split("-").Reverse()) : null; if (m.Birthday?.Length == 10) { vm.Age = Utils.GetAge(DateOnly.ParseExact(m.Birthday, "yyyy-MM-dd")).ToString(); @@ -109,7 +111,7 @@ namespace Elwig.Services { var billingAddr = m.BillingAddress; if (billingAddr != null) { - vm.BillingName = billingAddr.Name; + vm.BillingName = billingAddr.FullName; vm.BillingAddress = billingAddr.Address; if (billingAddr.PostalDest.AtPlz is AT_PlzDest b) { vm.BillingPlzString = $"{b.Plz}"; @@ -150,8 +152,12 @@ namespace Elwig.Services { vm.StatusDeliveriesThisSeasonToolTip = d2Grid; var c = m.ActiveAreaCommitments(ctx, Utils.CurrentLastSeason); - var s = await ctx.Seasons.FindAsync(await ctx.Seasons.MaxAsync(s => s.Year)); - var (text, grid) = await AreaComService.GenerateToolTip(c, s?.MaxKgPerHa ?? 10_000); + int maxKgPerHa = 10_000; + try { + var s = await ctx.Seasons.FindAsync(await ctx.Seasons.MaxAsync(s => s.Year)); + if (s != null) maxKgPerHa = s.MaxKgPerHa; + } catch { } + var (text, grid) = await AreaComService.GenerateToolTip(c, maxKgPerHa); vm.StatusAreaCommitmentInfo = $"{Utils.CurrentLastSeason}"; vm.StatusAreaCommitment = text; vm.StatusAreaCommitmentToolTip = grid; @@ -392,14 +398,14 @@ namespace Elwig.Services { } else if (vm.MemberListOrderByName) { query = query .OrderBy(m => m.Branch!.Name) - .ThenBy(m => m.FamilyName) + .ThenBy(m => m.Name) .ThenBy(m => m.GivenName) .ThenBy(m => m.MgNr); } else if (vm.MemberListOrderByOrt) { query = query .OrderBy(m => m.Branch!.Name) .ThenBy(m => m.DefaultWbKg!.AtKg.Name) - .ThenBy(m => m.FamilyName) + .ThenBy(m => m.Name) .ThenBy(m => m.GivenName) .ThenBy(m => m.MgNr); } @@ -497,10 +503,12 @@ namespace Elwig.Services { var m = new Member { MgNr = oldMgNr ?? newMgNr, PredecessorMgNr = vm.PredecessorMgNr, - Prefix = string.IsNullOrEmpty(vm.Prefix) ? null : vm.Prefix, - GivenName = vm.GivenName!, - FamilyName = vm.FamilyName!, - Suffix = string.IsNullOrEmpty(vm.Suffix) ? null : vm.Suffix, + IsJuridicalPerson = vm.IsJuridicalPerson, + Prefix = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.Prefix) ? null : vm.Prefix, + GivenName = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.GivenName) ? null : vm.GivenName, + Name = vm.Name!, + Suffix = vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.Suffix) ? null : vm.Suffix, + ForTheAttentionOf = !vm.IsJuridicalPerson || string.IsNullOrWhiteSpace(vm.ForTheAttentionOf) ? null : vm.ForTheAttentionOf, Birthday = string.IsNullOrEmpty(vm.Birthday) ? null : string.Join("-", vm.Birthday!.Split(".").Reverse()), IsDeceased = vm.IsDeceased, CountryNum = 40, // Austria AT AUT @@ -540,7 +548,7 @@ namespace Elwig.Services { var p = vm.BillingOrt; ctx.Add(new BillingAddr { MgNr = m.MgNr, - Name = vm.BillingName, + FullName = vm.BillingName, Address = vm.BillingAddress ?? "", CountryNum = p.CountryNum, PostalDestId = p.Id, diff --git a/Elwig/ViewModels/MemberAdminViewModel.cs b/Elwig/ViewModels/MemberAdminViewModel.cs index 840ae32..0380b51 100644 --- a/Elwig/ViewModels/MemberAdminViewModel.cs +++ b/Elwig/ViewModels/MemberAdminViewModel.cs @@ -38,7 +38,7 @@ namespace Elwig.ViewModels { [ObservableProperty] private bool _enableSearchInputs = true; [ObservableProperty] - public IEnumerable _memberHasDeliveries = [ .. Enumerable.Range(0, 9999).Select(i => false) ]; + private IEnumerable _memberHasDeliveries = [ .. Enumerable.Range(0, 9999).Select(i => false) ]; [ObservableProperty] private bool _memberListOrderByMgNr; @@ -54,14 +54,18 @@ namespace Elwig.ViewModels { private string? _predecessorMgNrString; public int? PredecessorMgNr => int.TryParse(PredecessorMgNrString, out var mgnr) ? mgnr : null; [ObservableProperty] + private bool _isJuridicalPerson; + [ObservableProperty] private string? _prefix; [ObservableProperty] private string? _givenName; [ObservableProperty] - private string? _familyName; + private string? _name; [ObservableProperty] private string? _suffix; [ObservableProperty] + private string? _forTheAttentionOf; + [ObservableProperty] private string? _birthday; [ObservableProperty] private string? _age; @@ -176,5 +180,9 @@ namespace Elwig.ViewModels { private Visibility _controlButtonsVisibility = Visibility.Visible; [ObservableProperty] private Visibility _editingButtonsVisibility = Visibility.Hidden; + [ObservableProperty] + private Visibility _personalNameVisibility = Visibility.Visible; + [ObservableProperty] + private Visibility _juridicalNameVisibility = Visibility.Hidden; } } diff --git a/Elwig/Windows/AdministrationWindow.cs b/Elwig/Windows/AdministrationWindow.cs index d4f96a3..009d391 100644 --- a/Elwig/Windows/AdministrationWindow.cs +++ b/Elwig/Windows/AdministrationWindow.cs @@ -159,7 +159,10 @@ namespace Elwig.Windows { protected void ValidateRequiredInputs() { foreach (var input in RequiredInputs) { - if (input is TextBox tb && tb.Text.Length == 0) { + if (input is Control c && c.Visibility != Visibility.Visible) { + ControlUtils.ClearInputState(input); + Valid[input] = true; + } else if (input is TextBox tb && tb.Text.Length == 0) { ControlUtils.SetInputInvalid(input); Valid[input] = false; } else if (input is ComboBox cb && cb.SelectedItem == null && cb.ItemsSource != null && cb.ItemsSource.Cast().Any()) { diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs index 7d106c3..c7bb3eb 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs @@ -434,7 +434,7 @@ namespace Elwig.Windows { .Where(m => m.IsActive || !IsCreating) .Include(m => m.PostalDest.AtPlz!.Ort) .Include(m => m.DefaultWbKg!.AtKg) - .OrderBy(m => m.FamilyName) + .OrderBy(m => m.Name) .ThenBy(m => m.GivenName) .ToListAsync()); ControlUtils.RenewItemsSource(BranchInput, await ctx.Branches.OrderBy(b => b.Name).ToListAsync()); @@ -764,7 +764,7 @@ namespace Elwig.Windows { .Where(m => m.IsActive || !ViewModel.IsReceipt) .Include(m => m.PostalDest.AtPlz!.Ort) .Include(m => m.DefaultWbKg!.AtKg) - .OrderBy(m => m.FamilyName) + .OrderBy(m => m.Name) .ThenBy(m => m.GivenName) .ToListAsync()); if (DeliveryList.SelectedItem is not Delivery d) { @@ -810,7 +810,7 @@ namespace Elwig.Windows { .Where(m => m.IsActive || !ViewModel.IsReceipt) .Include(m => m.PostalDest.AtPlz!.Ort) .Include(m => m.DefaultWbKg!.AtKg) - .OrderBy(m => m.FamilyName) + .OrderBy(m => m.Name) .ThenBy(m => m.GivenName) .ToListAsync()); IsCreating = true; diff --git a/Elwig/Windows/DeliveryAncmtAdminWindow.xaml b/Elwig/Windows/DeliveryAncmtAdminWindow.xaml index 8c22afc..e53e7cd 100644 --- a/Elwig/Windows/DeliveryAncmtAdminWindow.xaml +++ b/Elwig/Windows/DeliveryAncmtAdminWindow.xaml @@ -288,7 +288,7 @@ -