diff --git a/MainWindow.axaml b/MainWindow.axaml index 86b8308..659eed5 100644 --- a/MainWindow.axaml +++ b/MainWindow.axaml @@ -223,6 +223,10 @@ + + + + Speichere Unverarbeitete in neuem Verteiler diff --git a/MainWindow.axaml.cs b/MainWindow.axaml.cs index 1328265..104f74a 100644 --- a/MainWindow.axaml.cs +++ b/MainWindow.axaml.cs @@ -471,14 +471,14 @@ public partial class MainWindow : Window } } - private async void StartCombine(List address_lists, int owner_id, string type) + private async void StartCombine(List address_lists, int owner_id, string type, CombineAddresses.CombineType comb_type) { var progressWindow = new ProgressWindow(); progressWindow.Show(_instance); var processor = new CombineAddresses(progressWindow); - var result = await processor.Perform(address_lists, type, CbMergeExportUnmerged.IsChecked); + var result = await processor.Perform(address_lists, type, comb_type, CbMergeExportUnmerged.IsChecked); if (result.Item1 != null) result.Item1.owner_id = owner_id; @@ -769,7 +769,7 @@ public partial class MainWindow : Window Convert.ToInt32(item.ToString().Split(" - ")[0]))); try { - StartCombine(list, Convert.ToInt32(LstCustomers.SelectedItem.ToString().Split(" - ")[0]), "difference"); + StartCombine(list, Convert.ToInt32(LstCustomers.SelectedItem.ToString().Split(" - ")[0]), "difference", GetCombiningTyp()); } catch { @@ -785,7 +785,7 @@ public partial class MainWindow : Window Convert.ToInt32(item.ToString().Split(" - ")[0]))); try { - StartCombine(list, Convert.ToInt32(LstCustomers.SelectedItem.ToString().Split(" - ")[0]), "union"); + StartCombine(list, Convert.ToInt32(LstCustomers.SelectedItem.ToString().Split(" - ")[0]), "union", GetCombiningTyp()); } catch { @@ -802,7 +802,7 @@ public partial class MainWindow : Window Convert.ToInt32(item.ToString().Split(" - ")[0]))); try { - StartCombine(list, Convert.ToInt32(LstCustomers.SelectedItem.ToString().Split(" - ")[0]), "intersection"); + StartCombine(list, Convert.ToInt32(LstCustomers.SelectedItem.ToString().Split(" - ")[0]), "intersection", GetCombiningTyp()); } catch { @@ -810,6 +810,19 @@ public partial class MainWindow : Window } } + public CombineAddresses.CombineType GetCombiningTyp() + { + if (RbComprefsid.IsChecked == true) + { + return CombineAddresses.CombineType.refsid; + } else if (RbCompfinAd.IsChecked == true) + { + return CombineAddresses.CombineType.final_adress; + } + + return CombineAddresses.CombineType.none; + } + private void BtnCombineSymmetricDifference_OnClick(object? sender, RoutedEventArgs e) { var list = new List(); @@ -817,7 +830,7 @@ public partial class MainWindow : Window list.Add(Settings._instance.addressSets.GetAddressSetByID( Convert.ToInt32(item.ToString().Split(" - ")[0]))); - StartCombine(list, Convert.ToInt32(LstCustomers.SelectedItem.ToString().Split(" - ")[0]), "symdiff"); + StartCombine(list, Convert.ToInt32(LstCustomers.SelectedItem.ToString().Split(" - ")[0]), "symdiff", GetCombiningTyp()); } private async void BtnGenerateLabels_OnClick(object? sender, RoutedEventArgs e) diff --git a/Tasks/CombineAddresses.cs b/Tasks/CombineAddresses.cs index d160526..1a7c861 100644 --- a/Tasks/CombineAddresses.cs +++ b/Tasks/CombineAddresses.cs @@ -15,14 +15,21 @@ public class CombineAddresses { _progress = progressWindow; } + + public enum CombineType + { + refsid, + final_adress, + none + } - public async Task<(KasAddressList, KasAddressList)> Perform(List address_lists, string type, + public async Task<(KasAddressList, KasAddressList)> Perform(List address_lists, string type, CombineType comb_type, bool? exportUnused) { - if (type == "difference") return await Difference(address_lists, exportUnused); - if (type == "union") return await Union(address_lists, exportUnused); - if (type == "intersection") return await Intersection(address_lists, exportUnused); - if (type == "symdiff") return await SymmetricDifference(address_lists, exportUnused); + if (type == "difference") return await Difference(address_lists, comb_type, exportUnused); + if (type == "union") return await Union(address_lists, comb_type, exportUnused); + if (type == "intersection") return await Intersection(address_lists, comb_type, exportUnused); + if (type == "symdiff") return await SymmetricDifference(address_lists, comb_type, exportUnused); return (null, null); } @@ -35,11 +42,12 @@ public class CombineAddresses /// Second address to compare /// If true, only a refsid-check will be done /// - public bool CompareAddresses(KasPerson first, KasPerson second, bool only_refsid = false) + public bool CompareAddresses(KasPerson first, KasPerson second, CombineType comb_type) { // A refsid of 0 means "missing", so it must not collapse unrelated entries. - if (first.refsid != 0 && second.refsid != 0 && first.refsid == second.refsid) return true; - if (!only_refsid) + if(comb_type == CombineType.refsid) + if (first.refsid != 0 && second.refsid != 0 && first.refsid == second.refsid) return true; + if (comb_type == CombineType.final_adress) if (first.name == second.name && first.anrede == second.anrede && first.anredzus == second.anredzus && @@ -68,7 +76,7 @@ public class CombineAddresses return false; } - public async Task<(KasAddressList, KasAddressList)> Difference(List address_lists, + public async Task<(KasAddressList, KasAddressList)> Difference(List address_lists, CombineType comb_type, bool? return_unused, Progress? progress = null) { @@ -92,7 +100,7 @@ public class CombineAddresses foreach (var person in address_lists[0].KasPersons) { - var isDouble = restUnion.Any(p => CompareAddresses(person, p)); + var isDouble = restUnion.Any(p => CompareAddresses(person, p, comb_type)); if (!isDouble) result.KasPersons.Add(person); else @@ -111,7 +119,7 @@ public class CombineAddresses } - public async Task<(KasAddressList, KasAddressList)> Union(List address_lists, bool? return_unused, + public async Task<(KasAddressList, KasAddressList)> Union(List address_lists, CombineType comb_type, bool? return_unused, Progress progress = null) { var result = new KasAddressList(await KasAddressList.GenerateName("union")); @@ -128,7 +136,7 @@ public class CombineAddresses foreach (var list in address_lists) foreach (var person in list.KasPersons) { - if (!result.KasPersons.Any(existing => CompareAddresses(existing, person))) + if (!result.KasPersons.Any(existing => CompareAddresses(existing, person, comb_type))) result.KasPersons.Add(person); else second_result.KasPersons.Add(person); @@ -155,7 +163,7 @@ public class CombineAddresses return null; } - public async Task<(KasAddressList, KasAddressList)> Intersection(List address_lists, + public async Task<(KasAddressList, KasAddressList)> Intersection(List address_lists, CombineType comb_type, bool? return_unused, Progress progress = null) { var result = new KasAddressList(await KasAddressList.GenerateName("intersection")); @@ -176,7 +184,7 @@ public class CombineAddresses { // Prüfen, ob Person in *allen* anderen Listen vorkommt var isInAll = otherLists.All(list => - list.KasPersons.Any(existing => CompareAddresses(existing, person))); + list.KasPersons.Any(existing => CompareAddresses(existing, person, comb_type))); if (isInAll) result.KasPersons.Add(person); @@ -203,7 +211,7 @@ public class CombineAddresses } - public async Task<(KasAddressList, KasAddressList)> SymmetricDifference(List address_lists, + public async Task<(KasAddressList, KasAddressList)> SymmetricDifference(List address_lists, CombineType comb_type, bool? return_unused, Progress progress = null) { var result = new KasAddressList(await KasAddressList.GenerateName("symmetric_difference")); @@ -223,7 +231,7 @@ public class CombineAddresses foreach (var person in list.KasPersons) { // Prüfen, ob schon vorhanden - var existing = allPersons.FirstOrDefault(p => CompareAddresses(p.person, person)); + var existing = allPersons.FirstOrDefault(p => CompareAddresses(p.person, person, comb_type)); if (existing.person != null) { // Falls schon drin → Vorkommen erhöhen