From edf36781540a1c72840cef484fe714f3429954b9 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Tue, 25 Aug 2026 18:14:32 +0200 Subject: [PATCH] =?UTF-8?q?Export/ElwigData:=20Fix=20detection=20of=20KGs?= =?UTF-8?q?=20without=20Gro=C3=9Flage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Elwig/Helpers/Export/ElwigData.cs | 37 +++++++++++++++-------- Elwig/Windows/DeliveryAdminWindow.xaml.cs | 2 +- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/Elwig/Helpers/Export/ElwigData.cs b/Elwig/Helpers/Export/ElwigData.cs index 32f6c83..9da5241 100644 --- a/Elwig/Helpers/Export/ElwigData.cs +++ b/Elwig/Helpers/Export/ElwigData.cs @@ -10,7 +10,6 @@ using System.IO.Compression; using System.Linq; using System.Text.Json.Nodes; using System.Threading.Tasks; -using System.Windows; namespace Elwig.Helpers.Export { public static class ElwigData { @@ -36,14 +35,16 @@ namespace Elwig.Helpers.Export { public static async Task Import(IEnumerable filenames, ImportMode mode) { try { Dictionary branches; + Dictionary kgs; Dictionary currentDids; Dictionary currentLsNrs; Dictionary> currentWbRde; - Dictionary kgs; + Dictionary currentWbKgs; List currentWbGls; using (var ctx = new AppDbContext()) { branches = await ctx.FetchBranches().ToDictionaryAsync(b => b.ZwstId); + kgs = await ctx.Katastralgemeinden.ToDictionaryAsync(k => k.KgNr); currentDids = await ctx.Deliveries .GroupBy(d => d.Year) .ToDictionaryAsync(g => g.Key, g => g.Max(d => d.DId)); @@ -52,8 +53,8 @@ namespace Elwig.Helpers.Export { currentWbRde = await ctx.WbRde .GroupBy(r => r.KgNr) .ToDictionaryAsync(g => g.Key, g => g.ToList()); + currentWbKgs = await ctx.WbKgs.ToDictionaryAsync(k => k.KgNr); currentWbGls = await ctx.WbGls.ToListAsync(); - kgs = await ctx.Katastralgemeinden.Include(k => k.WbKg).ToDictionaryAsync(k => k.KgNr); } var data = new List<( @@ -122,6 +123,7 @@ namespace Elwig.Helpers.Export { var obj = JsonNode.Parse(line)!.AsObject(); var (k, g) = obj.ToWbKg(currentWbGls); r.WbKgs.Add(k); + currentWbKgs[k.KgNr] = k; if (g != null) { currentWbGls[g.GlNr] = g; r.WbGls.Add(g); @@ -135,7 +137,7 @@ namespace Elwig.Helpers.Export { string? line; while ((line = await reader.ReadLineAsync()) != null) { var obj = JsonNode.Parse(line)!.AsObject(); - var (m, b, telNrs, emailAddrs, timestamps) = obj.ToMember(kgs); + var (m, b, telNrs, emailAddrs, timestamps) = obj.ToMember(kgs, currentWbKgs); r.Members.Add(m); if (b != null) r.BillingAddresses.Add(b); r.TelephoneNumbers.AddRange(telNrs); @@ -163,7 +165,7 @@ namespace Elwig.Helpers.Export { string? line; while ((line = await reader.ReadLineAsync()) != null) { var obj = JsonNode.Parse(line)!.AsObject(); - var (contract, areaCom, wbrd, timestamps) = obj.ToAreaCom(currentWbRde); + var (contract, areaCom, wbrd, timestamps) = obj.ToAreaCom(kgs, currentWbKgs, currentWbRde); r.Contracts.Add(contract); r.AreaCommitments.Add(areaCom); if (wbrd != null) { @@ -182,7 +184,7 @@ namespace Elwig.Helpers.Export { string? line; while ((line = await reader.ReadLineAsync()) != null) { var obj = JsonNode.Parse(line)!.AsObject(); - var (contract, areaComs, wbrd, timestamps) = obj.ToAreaComContract(currentWbRde); + var (contract, areaComs, wbrd, timestamps) = obj.ToAreaComContract(kgs, currentWbKgs, currentWbRde); r.Contracts.Add(contract); r.AreaCommitments.AddRange(areaComs.Select(v => v.Item1)); if (wbrd != null) { @@ -203,7 +205,7 @@ namespace Elwig.Helpers.Export { string? line; while ((line = await reader.ReadLineAsync()) != null) { var obj = JsonNode.Parse(line)!.AsObject(); - var (d, parts, mods, rde, timestamps) = obj.ToDelivery(currentLsNrs, currentDids, kgs, currentWbRde); + var (d, parts, mods, rde, timestamps) = obj.ToDelivery(currentLsNrs, currentDids, kgs, currentWbKgs, currentWbRde); r.Deliveries.Add(d); r.DeliveryParts.AddRange(parts.Select(p => p.Item1)); r.Modifiers.AddRange(mods); @@ -680,11 +682,11 @@ namespace Elwig.Helpers.Export { }; } - public static (Member, BillingAddr?, List, List, (DateTime CreatedAt, DateTime ModifiedAt)?) ToMember(this JsonNode json, Dictionary kgs) { + public static (Member, BillingAddr?, List, List, (DateTime CreatedAt, DateTime ModifiedAt)?) ToMember(this JsonNode json, Dictionary kgs, Dictionary currentWbKgs) { 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)"); + if (kgnr != null && !currentWbKgs.Values.Any(k => k.KgNr == kgnr)) { + throw new KeyNotFoundException($"Für KG {(kgs.TryGetValue(kgnr.Value, out var k) ? k.Name : "?")} ({kgnr:00000}) ist noch keine Großlage festgelegt!\n(Stammdaten \u2192 Herkunftshierarchie)"); } var createdAt = json["created_at"]?.AsValue().GetValue(); var modifiedAt = json["modified_at"]?.AsValue().GetValue(); @@ -815,10 +817,13 @@ namespace Elwig.Helpers.Export { }; } - public static (AreaComContract, List<(AreaCom, (DateTime CreatedAt, DateTime ModifiedAt)?)>, WbRd?, (DateTime CreatedAt, DateTime ModifiedAt)?) ToAreaComContract(this JsonNode json, Dictionary> riede) { + public static (AreaComContract, List<(AreaCom, (DateTime CreatedAt, DateTime ModifiedAt)?)>, WbRd?, (DateTime CreatedAt, DateTime ModifiedAt)?) ToAreaComContract(this JsonNode json, Dictionary kgs, Dictionary currentWbKgs, Dictionary> riede) { var kgnr = json["kgnr"]!.AsValue().GetValue(); var ried = json["ried"]?.AsValue().GetValue(); var fbnr = json["fbnr"]!.AsValue()!.GetValue(); + if (!currentWbKgs.Values.Any(k => k.KgNr == kgnr)) { + throw new KeyNotFoundException($"Für KG {(kgs.TryGetValue(kgnr, out var k) ? k.Name : "?")} ({kgnr:00000}) ist noch keine Großlage festgelegt!\n(Stammdaten \u2192 Herkunftshierarchie)"); + } WbRd? rd = null; bool newRd = false; if (ried != null) { @@ -866,9 +871,12 @@ namespace Elwig.Helpers.Export { DateTime.ParseExact(modifiedAt, "yyyy-MM-ddTHH:mm:ssK", CultureInfo.InvariantCulture, DateTimeStyles.None))); } - public static (AreaComContract, AreaCom, WbRd?, (DateTime CreatedAt, DateTime ModifiedAt)?) ToAreaCom(this JsonNode json, Dictionary> riede) { + public static (AreaComContract, AreaCom, WbRd?, (DateTime CreatedAt, DateTime ModifiedAt)?) ToAreaCom(this JsonNode json, Dictionary kgs, Dictionary currentWbKgs, Dictionary> riede) { var kgnr = json["kgnr"]!.AsValue().GetValue(); var ried = json["ried"]?.AsValue().GetValue(); + if (!currentWbKgs.Values.Any(k => k.KgNr == kgnr)) { + throw new KeyNotFoundException($"Für KG {(kgs.TryGetValue(kgnr, out var k) ? k.Name : "?")} ({kgnr:00000}) ist noch keine Großlage festgelegt!\n(Stammdaten \u2192 Herkunftshierarchie)"); + } WbRd? rd = null; bool newRd = false; if (ried != null) { @@ -957,7 +965,7 @@ namespace Elwig.Helpers.Export { return obj; } - public static (Delivery, List<(DeliveryPart, (DateTime CreatedAt, DateTime ModifiedAt)?)>, List, List, (DateTime CreatedAt, DateTime ModifiedAt)?) ToDelivery(this JsonNode json, Dictionary currentLsNrs, Dictionary currentDids, Dictionary kgs, Dictionary> riede) { + public static (Delivery, List<(DeliveryPart, (DateTime CreatedAt, DateTime ModifiedAt)?)>, List, List, (DateTime CreatedAt, DateTime ModifiedAt)?) ToDelivery(this JsonNode json, Dictionary currentLsNrs, Dictionary currentDids, Dictionary kgs, Dictionary currentWbKgs, Dictionary> riede) { var year = json["year"]!.AsValue().GetValue(); var lsnr = json["lsnr"]!.AsValue().GetValue(); var did = currentLsNrs.GetValueOrDefault(lsnr, -1); @@ -983,6 +991,9 @@ namespace Elwig.Helpers.Export { }, [.. json["parts"]!.AsArray().Select(p => p!.AsObject()).Select(p => { var kgnr = p["kgnr"]?.AsValue().GetValue(); var ried = p["ried"]?.AsValue().GetValue(); + if (kgnr != null && !currentWbKgs.Values.Any(k => k.KgNr == kgnr)) { + throw new KeyNotFoundException($"Für KG {(kgs.TryGetValue(kgnr.Value, out var k) ? k.Name : "?")} ({kgnr:00000}) ist noch keine Großlage festgelegt!\n(Stammdaten \u2192 Herkunftshierarchie)"); + } WbRd? rd = null; if (ried != null && kgnr != null) { var rde = riede.GetValueOrDefault(kgnr.Value, []); diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs index 56065c4..7a064a4 100644 --- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs +++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs @@ -139,7 +139,7 @@ namespace Elwig.Windows { if (await ctx.FetchSeasons(Utils.CurrentYear).SingleOrDefaultAsync() == null) { InteractionService.ShowWarning("Saison noch nicht erstellt", "Die Saison für das aktuelle Jahr wurde noch nicht erstellt. Neue Lieferungen können nicht abgespeichert werden.\n\n" + - "(Stammdaten -> Saisons -> Neu anlegen...)"); + "(Stammdaten \u2192 Saisons \u2192 Neu anlegen...)"); } } }