diff --git a/MainWindow.axaml b/MainWindow.axaml index d715e29..705d694 100644 --- a/MainWindow.axaml +++ b/MainWindow.axaml @@ -150,51 +150,69 @@ - - - - - + + + + + + + + Speichere Unverarbeitete in neuem Verteiler diff --git a/MainWindow.axaml.cs b/MainWindow.axaml.cs index 564c199..ba5dbb1 100644 --- a/MainWindow.axaml.cs +++ b/MainWindow.axaml.cs @@ -247,10 +247,16 @@ public partial class MainWindow : Window progressWindow.Show(_instance); var processor = new CombineAddresses(progressWindow); - var result = await processor.Perform(address_lists, type); + var result = await processor.Perform(address_lists, type, CbMergeExportUnmerged.IsChecked); - result.owner_id = owner_id; - Settings._instance.addressSets.addresses.Add(result); + if(result.Item1 != null) + result.Item1.owner_id = owner_id; + if(result.Item2 != null) + result.Item2.owner_id = owner_id; + if(result.Item1 != null) + Settings._instance.addressSets.addresses.Add(result.Item1); + if(result.Item2 != null) + Settings._instance.addressSets.addresses.Add(result.Item2); Settings.Save(); progressWindow.Close(); diff --git a/Tasks/CombineAddresses.cs b/Tasks/CombineAddresses.cs index 403b547..bddfd9b 100644 --- a/Tasks/CombineAddresses.cs +++ b/Tasks/CombineAddresses.cs @@ -16,14 +16,14 @@ public class CombineAddresses _progress = progressWindow; } - public async Task Perform(List address_lists, string type) + public async Task<(KasAddressList,KasAddressList)> Perform(List address_lists, string type, bool? exportUnused) { var res = await Task.Run(async () => { - if (type == "difference") return Difference(address_lists); - if (type == "union") return Union(address_lists); - if (type == "intersection") return Intersection(address_lists); - if (type == "symdiff") return SymmetricDifference(address_lists); + if (type == "difference") return Difference(address_lists, exportUnused); + if (type == "union") return Union(address_lists, exportUnused); + if (type == "intersection") return Intersection(address_lists, exportUnused); + if (type == "symdiff") return SymmetricDifference(address_lists, exportUnused); return null; }); @@ -48,7 +48,7 @@ public class CombineAddresses // } // }); // return result; - return null; + return (null,null); } @@ -91,11 +91,11 @@ public class CombineAddresses return false; } - public async Task Difference(List address_lists, + public async Task<(KasAddressList,KasAddressList)> Difference(List address_lists, bool? return_unused, Progress? progress = null) { if (address_lists == null || address_lists.Count == 0) - return new KasAddressList("difference"); + return (new KasAddressList("difference"),null); progress ??= new Progress { @@ -107,14 +107,17 @@ public class CombineAddresses var restUnion = new List(); for (var i = 1; i < address_lists.Count; i++) restUnion.AddRange(address_lists[i].KasPersons); - var result = new KasAddressList("difference"); + var second_result = new KasAddressList("difference_rest"); foreach (var person in address_lists[0].KasPersons) { var isDouble = restUnion.Any(p => CompareAddresses(person, p)); if (!isDouble) result.KasPersons.Add(person); + else + second_result.KasPersons.Add(person); + progress.Increment(); if (progress.LogAction == null) continue; @@ -122,17 +125,18 @@ public class CombineAddresses $"Person mit refsid {person.refsid} verglichen mit {restUnion.Count} Personen des Restes."; await Dispatcher.UIThread.InvokeAsync(() => progress.LogAction?.Invoke(logMessage)); } - - return result; + if(return_unused == true) return (result,second_result); + else return (result, null); } - public async Task Union(List address_lists, Progress progress = null) + public async Task<(KasAddressList,KasAddressList)> Union(List address_lists, bool? return_unused, Progress progress = null) { var result = new KasAddressList("union"); + var second_result = new KasAddressList("union_rest"); if (address_lists == null || address_lists.Count == 0) - return result; + return (result,null); var total = address_lists.Sum(l => l.KasPersons.Count); var processed = 0; @@ -142,6 +146,8 @@ public class CombineAddresses { if (!result.KasPersons.Any(existing => CompareAddresses(existing, person))) result.KasPersons.Add(person); + else + second_result.KasPersons.Add(person); processed++; var percent = processed / (double)total * 100; @@ -155,7 +161,8 @@ public class CombineAddresses Dispatcher.UIThread.Post(() => progress.LogAction?.Invoke(logMessage)); } - return result; + if(return_unused == true) return (result,second_result); + else return (result, null); } @@ -164,12 +171,13 @@ public class CombineAddresses return null; } - public async Task Intersection(List address_lists, Progress progress = null) + public async Task<(KasAddressList,KasAddressList)> Intersection(List address_lists, bool? return_unused, Progress progress = null) { var result = new KasAddressList("intersection"); + var second_result = new KasAddressList("intersection_rest"); if (address_lists == null || address_lists.Count == 0) - return result; + return (result,null); // Nur die erste Liste als Ausgangspunkt verwenden var baseList = address_lists[0]; @@ -186,6 +194,8 @@ public class CombineAddresses if (isInAll) result.KasPersons.Add(person); + else + second_result.KasPersons.Add(person); processed++; var percent = processed / (double)total * 100; @@ -202,16 +212,18 @@ public class CombineAddresses } } - return result; + if(return_unused == true) return (result,second_result); + else return (result, null); } - public async Task SymmetricDifference(List address_lists, Progress progress = null) + public async Task<(KasAddressList,KasAddressList)> SymmetricDifference(List address_lists, bool? return_unused, Progress progress = null) { var result = new KasAddressList("symmetric_difference"); + var second_result = new KasAddressList("symmetric_rest"); if (address_lists == null || address_lists.Count == 0) - return result; + return (result, null); var total = address_lists.Sum(l => l.KasPersons.Count); var processed = 0; @@ -254,8 +266,11 @@ public class CombineAddresses foreach (var (person, count) in allPersons) if (count == 1) result.KasPersons.Add(person); + else + second_result.KasPersons.Add(person); - return result; + if(return_unused == true) return (result,second_result); + else return (result, null); }