diff --git a/Elwig/Helpers/Export/ElwigData.cs b/Elwig/Helpers/Export/ElwigData.cs index 68129b5..9794780 100644 --- a/Elwig/Helpers/Export/ElwigData.cs +++ b/Elwig/Helpers/Export/ElwigData.cs @@ -39,6 +39,7 @@ namespace Elwig.Helpers.Export { Dictionary currentDids; Dictionary currentLsNrs; Dictionary> currentWbRde; + Dictionary kgs; using (var ctx = new AppDbContext()) { branches = await ctx.Branches.ToDictionaryAsync(b => b.ZwstId); @@ -50,6 +51,7 @@ namespace Elwig.Helpers.Export { currentWbRde = await ctx.WbRde .GroupBy(r => r.KgNr) .ToDictionaryAsync(g => g.Key, g => g.ToList()); + kgs = await ctx.Katastralgemeinden.Include(k => k.WbKg).ToDictionaryAsync(k => k.KgNr); } var data = new List<( @@ -101,9 +103,9 @@ namespace Elwig.Helpers.Export { string? line; while ((line = await reader.ReadLineAsync()) != null) { var obj = JsonNode.Parse(line)!.AsObject(); - var (m, b, telNrs, emailAddrs) = obj.ToMember(); + var (m, b, telNrs, emailAddrs) = obj.ToMember(kgs); r.Members.Add(m); - if (b != null) data[^1].BillingAddresses.Add(b); + if (b != null) r.BillingAddresses.Add(b); r.TelephoneNumbers.AddRange(telNrs); r.EmailAddresses.AddRange(emailAddrs); } @@ -115,9 +117,12 @@ namespace Elwig.Helpers.Export { string? line; while ((line = await reader.ReadLineAsync()) != null) { var obj = JsonNode.Parse(line)!.AsObject(); - var (areaCom, wbrd) = obj.ToAreaCom(currentWbRde); + var (areaCom, wbrd) = obj.ToAreaCom(kgs, currentWbRde); r.AreaCommitments.Add(areaCom); - if (wbrd != null) r.Riede.Add(wbrd); + if (wbrd != null) { + currentWbRde[wbrd.KgNr].Add(wbrd); + r.Riede.Add(wbrd); + } } } @@ -223,6 +228,7 @@ namespace Elwig.Helpers.Export { importedMembers.Add((meta.FileName, meta.ZwstId, meta.Device, n, o, members.Count - n - o, meta.MemberFilters)); } if (areaCommitments.Count > 0) { + ctx.AddRange(riede); var imported = areaCommitments.Where(c => (importNewMembers && !duplicateMgNrs.Contains(c.MgNr)) || (importDuplicateMembers && duplicateMgNrs.Contains(c.MgNr))).ToList(); importedAreaComs.Add((meta.FileName, meta.ZwstId, meta.Device, imported.Count, areaCommitments.Count - imported.Count, meta.AreaComFilters)); } @@ -457,12 +463,16 @@ namespace Elwig.Helpers.Export { }; } - public static (Member, BillingAddr?, List, List) ToMember(this JsonNode json) { + public static (Member, BillingAddr?, List, List) ToMember(this JsonNode json, Dictionary kgs) { var mgnr = json["mgnr"]!.AsValue().GetValue(); + var kgnr = json["default_kgnr"]?.AsValue().GetValue(); + if (kgnr != null && !kgs.Values.Any(k => k.WbKg?.KgNr == kgnr)) { + throw new ArgumentException($"Für KG {(kgs.TryGetValue(kgnr.Value, out var k) ? k.Name : "?")} ({kgnr:00000}) ist noch keine Großlage festgelegt!\n(Stammdaten → Herkunftshierarchie)"); + } return (new Member { MgNr = mgnr, PredecessorMgNr = json["predecessor_mgnr"]?.AsValue().GetValue(), - Name = json["name"]!.AsValue().GetValue(), + Name = json["name"]?.AsValue().GetValue() ?? json["family_name"]!.AsValue().GetValue(), Prefix = json["prefix"]?.AsValue().GetValue(), GivenName = json["given_name"]?.AsValue().GetValue(), MiddleName = json["middle_names"]?.AsValue().GetValue(), @@ -488,7 +498,7 @@ namespace Elwig.Helpers.Export { CountryNum = json["address"]!["country"]!.AsValue().GetValue(), PostalDestId = json["address"]!["postal_dest"]!.AsValue().GetValue(), Address = json["address"]!["address"]!.AsValue().GetValue(), - DefaultKgNr = json["default_kgnr"]?.AsValue().GetValue(), + DefaultKgNr = kgnr, ContactViaPost = json["contact_postal"]?.AsValue().GetValue() ?? false, ContactViaEmail = json["contact_email"]?.AsValue().GetValue() ?? false, Comment = json["comment"]?.AsValue().GetValue(), @@ -528,13 +538,13 @@ namespace Elwig.Helpers.Export { }; } - public static (AreaCom, WbRd?) ToAreaCom(this JsonNode json, Dictionary> riede) { + public static (AreaCom, WbRd?) ToAreaCom(this JsonNode json, Dictionary kgs, Dictionary> riede) { var kgnr = json["kgnr"]!.AsValue().GetValue(); var ried = json["ried"]?.AsValue().GetValue(); WbRd? rd = null; bool newRd = false; if (ried != null) { - var rde = riede[kgnr] ?? throw new ArgumentException($"KG {kgnr:00000} is no WbKg"); + var rde = riede[kgnr] ?? throw new ArgumentException($"Für KG {(kgs.TryGetValue(kgnr, out var k) ? k.Name : "?")} ({kgnr:00000}) ist noch keine Großlage festgelegt!\n(Stammdaten → Herkunftshierarchie)"); rd = rde.FirstOrDefault(r => r.Name == ried); if (rd == null) { newRd = true;