6 Commits

13 changed files with 991 additions and 1191 deletions
+9 -3
View File
@@ -45,8 +45,9 @@ public class Settings
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Log($"Error while reading settings. Generating new... {ex.Message}", Logger.LogType.Warning); Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
Console.WriteLine("Error while reading settings. Generating new...");
_instance = new Settings(); _instance = new Settings();
} }
} }
@@ -69,6 +70,9 @@ public class PdfExportSettings
public double fontSize { get; set; } = 9; public double fontSize { get; set; } = 9;
public double smallFontSize { get; set; } = 6; public double smallFontSize { get; set; } = 6;
public bool exportRunningSheets { get; set; } = true;
public double rsNumGrouped { get; set; } = 25;
public double rsPlzStartpoint { get; set; } = 2;
} }
public class Global public class Global
@@ -122,7 +126,9 @@ public class Global
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Log($"Error while reading global settings. Generating new... {ex.Message}", Logger.LogType.Warning); Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
Console.WriteLine("Error while reading global settings. Generating new...");
_instance = new Global(); _instance = new Global();
Save(); Save();
} }
-40
View File
@@ -1,40 +0,0 @@
using System;
using System.IO;
using Newtonsoft.Json;
namespace Logof_Client;
public static class Logger
{
public static void Log(string text, LogType logType = LogType.Info)
{
try
{
string config_path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"logofclient");
if (!Directory.Exists(config_path))
Directory.CreateDirectory(config_path);
string log_path = Path.Combine(config_path, $"log-{DateTime.Now:dd-MM-yy}.log");
if(!File.Exists(log_path))
File.Create(log_path).Close();
string line = $"[{DateTime.Now:dd.MM.yyyy - hh:mm:ss}]: ({logType.ToString()}) {text}";
Console.WriteLine(line);
File.AppendAllLines(log_path, [line]);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
public enum LogType
{
Error,
Warning,
Info
}
}
+9
View File
@@ -254,6 +254,7 @@
<Label Grid.Column="0" Content="Zellenrand rechts (mm)"></Label> <Label Grid.Column="0" Content="Zellenrand rechts (mm)"></Label>
<NumericUpDown Grid.Column="1" x:Name="NudExpMargCellPaddingRight" Minimum="0" Maximum="20" Value="5"></NumericUpDown> <NumericUpDown Grid.Column="1" x:Name="NudExpMargCellPaddingRight" Minimum="0" Maximum="20" Value="5"></NumericUpDown>
</Grid> </Grid>
<CheckBox Content="Laufzettel erstellen" x:Name="CbExpRnsEnable"></CheckBox>
</StackPanel> </StackPanel>
<StackPanel Grid.Column="1" Orientation="Vertical" Spacing="10"> <StackPanel Grid.Column="1" Orientation="Vertical" Spacing="10">
@@ -273,6 +274,10 @@
<Label Content="Zellenabstand links"></Label> <Label Content="Zellenabstand links"></Label>
<NumericUpDown Grid.Column="1" x:Name="TbExpMargMarginLeft" Minimum="0" Maximum="20" Value="0"></NumericUpDown> <NumericUpDown Grid.Column="1" x:Name="TbExpMargMarginLeft" Minimum="0" Maximum="20" Value="0"></NumericUpDown>
</Grid> </Grid>
<Grid ColumnDefinitions="*,*">
<Label Grid.Column="0" Content="Anzahl gruppierter Sendungen"></Label>
<NumericUpDown Grid.Column="1" x:Name="NudExpRnsPlzcount" Minimum="1" Maximum="10000" Value="25"></NumericUpDown>
</Grid>
</StackPanel> </StackPanel>
<StackPanel Grid.Column="2" Orientation="Vertical" Spacing="10"> <StackPanel Grid.Column="2" Orientation="Vertical" Spacing="10">
@@ -292,6 +297,10 @@
<Label Grid.Column="0" Content="Schriftgröße (klein)"></Label> <Label Grid.Column="0" Content="Schriftgröße (klein)"></Label>
<NumericUpDown Grid.Column="1" x:Name="NudExpMargSmallFontSize" Minimum="3" Maximum="30" Value="6"></NumericUpDown> <NumericUpDown Grid.Column="1" x:Name="NudExpMargSmallFontSize" Minimum="3" Maximum="30" Value="6"></NumericUpDown>
</Grid> </Grid>
<Grid ColumnDefinitions="*,*">
<Label Grid.Column="0" Content="Gruppierpunkt"></Label>
<NumericUpDown Grid.Column="1" x:Name="NudExpRnsPlzStartpoint" Minimum="1" Maximum="10" Value="2"></NumericUpDown>
</Grid>
</StackPanel> </StackPanel>
</Grid> </Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
+193 -279
View File
@@ -24,18 +24,14 @@ public partial class MainWindow : Window
public MainWindow() public MainWindow()
{ {
Logger.Log("Welcome to logofclient");
Logger.Log($"Session on {DateTime.Now:G}");
Logger.Log("Initializing...");
InitializeComponent(); InitializeComponent();
//Hide(); //Hide();
var s = new StartupWindow(); var s = new StartupWindow();
//s.Show(); //s.Show();
_instance = this; _instance = this;
WindowState = WindowState.Maximized; WindowState = WindowState.Maximized;
Logger.Log("Loading settings...");
Global.Load(); Global.Load();
Settings.Load(); Settings.Load();
LoadPdfExportOptions(); LoadPdfExportOptions();
@@ -44,7 +40,6 @@ public partial class MainWindow : Window
RefreshCountryView(); RefreshCountryView();
// Initialize wiki integration // Initialize wiki integration
Logger.Log("Building wiki...");
_wikiService = new WikiService(); _wikiService = new WikiService();
try try
{ {
@@ -59,9 +54,8 @@ public partial class MainWindow : Window
if (!string.IsNullOrWhiteSpace(Global._instance.wiki_storage_path)) if (!string.IsNullOrWhiteSpace(Global._instance.wiki_storage_path))
TbWikiPath.Text = Global._instance.wiki_storage_path; TbWikiPath.Text = Global._instance.wiki_storage_path;
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while setting paths: {ex.Message}", Logger.LogType.Error);
} }
try try
@@ -70,14 +64,12 @@ public partial class MainWindow : Window
BtnFontPath.Click += BtnFontPath_Click; BtnFontPath.Click += BtnFontPath_Click;
BtnConfigPath.Click += BtnConfigPath_Click; BtnConfigPath.Click += BtnConfigPath_Click;
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while adding click functions?: {ex.Message}", Logger.LogType.Error);
} }
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while doing wiki stuff: {ex.Message}", Logger.LogType.Error);
} }
//Thread.Sleep(3000); //Thread.Sleep(3000);
@@ -128,7 +120,24 @@ public partial class MainWindow : Window
Settings.Save(); Settings.Save();
//await MessageBox.Show(_instance, $"{result.Count} Einträge fehlerhaft.", "Fertig"); //await MessageBox.Show(_instance, $"{result.Count} Einträge fehlerhaft.", "Fertig");
} }
// private async void StartAddressRepair(Uri path)
// {
// var addresses = DataImport.ImportKasAddressList(path); // Ihr Code hier
// var progressWindow = new ProgressWindow();
//
// progressWindow.Show(_instance);
//
// var processor = new AddressRepair(progressWindow);
// //var result = await processor.Perform(addresses.Item2, errors);
//
//
// progressWindow.Close();
//
//
// //new ResultWindow(result, addresses.Item2).Show();
// //await MessageBox.Show(_instance, $"{result.Count} Einträge fehlerhaft.", "Fertig");
// }
private void MnuExit_OnClick(object? sender, RoutedEventArgs e) private void MnuExit_OnClick(object? sender, RoutedEventArgs e)
{ {
@@ -147,7 +156,7 @@ public partial class MainWindow : Window
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Log($"Error while starting process: {ex.Message}", Logger.LogType.Error); Console.WriteLine($"Fehler beim Öffnen des Links: {ex.Message}");
} }
} }
@@ -163,7 +172,7 @@ public partial class MainWindow : Window
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Log($"Error while starting process: {ex.Message}", Logger.LogType.Error); Console.WriteLine($"Fehler beim Öffnen des Links: {ex.Message}");
} }
} }
@@ -179,7 +188,7 @@ public partial class MainWindow : Window
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Log($"Error while starting process: {ex.Message}", Logger.LogType.Error); Console.WriteLine($"Fehler beim Öffnen des Links: {ex.Message}");
} }
} }
@@ -223,13 +232,13 @@ public partial class MainWindow : Window
var rendered = MarkdownRenderer.Render(text ?? string.Empty); var rendered = MarkdownRenderer.Render(text ?? string.Empty);
PreviewPanel.Children.Add(rendered); PreviewPanel.Children.Add(rendered);
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while rendering markdown: {ex.Message}", Logger.LogType.Error); // fallback: plain text
PreviewPanel.Children.Clear(); PreviewPanel.Children.Clear();
PreviewPanel.Children.Add(new TextBlock { Text = text ?? string.Empty }); PreviewPanel.Children.Add(new TextBlock { Text = text ?? string.Empty });
} }
EditButton.IsEnabled = true; EditButton.IsEnabled = true;
} }
else else
@@ -241,24 +250,18 @@ public partial class MainWindow : Window
public void PopulateNavTree(string? expandToPath = null, string? selectPath = null) public void PopulateNavTree(string? expandToPath = null, string? selectPath = null)
{ {
try var roots = _wikiService.GetRootItems();
{ var nodes = new List<TreeViewItem>();
var roots = _wikiService.GetRootItems(); foreach (var r in roots) nodes.Add(BuildNode(r));
var nodes = new List<TreeViewItem>(); NavTree.ItemsSource = nodes;
foreach (var r in roots) nodes.Add(BuildNode(r));
NavTree.ItemsSource = nodes;
if (!string.IsNullOrWhiteSpace(expandToPath)) if (!string.IsNullOrWhiteSpace(expandToPath))
ExpandAndFindNode(nodes, expandToPath, out _); ExpandAndFindNode(nodes, expandToPath, out _);
if (!string.IsNullOrWhiteSpace(selectPath) && if (!string.IsNullOrWhiteSpace(selectPath) &&
ExpandAndFindNode(nodes, selectPath, out var selectedNode) && ExpandAndFindNode(nodes, selectPath, out var selectedNode) &&
selectedNode != null) selectedNode != null)
NavTree.SelectedItem = selectedNode; NavTree.SelectedItem = selectedNode;
}catch (Exception ex)
{
Logger.Log($"Error while populating nav tree: {ex.Message}", Logger.LogType.Error);
}
} }
private TreeViewItem BuildNode(WikiItem item) private TreeViewItem BuildNode(WikiItem item)
@@ -273,23 +276,16 @@ public partial class MainWindow : Window
private string GetSelectedWikiTargetDirectory() private string GetSelectedWikiTargetDirectory()
{ {
try var wikiRoot = Global._instance.wiki_storage_path;
if (NavTree.SelectedItem is TreeViewItem treeItem && treeItem.Tag is WikiItem selectedItem)
{ {
var wikiRoot = Global._instance.wiki_storage_path; if (selectedItem.IsFolder) return selectedItem.Path;
if (NavTree.SelectedItem is TreeViewItem treeItem && treeItem.Tag is WikiItem selectedItem)
{
if (selectedItem.IsFolder) return selectedItem.Path;
var parentDir = Path.GetDirectoryName(selectedItem.Path); var parentDir = Path.GetDirectoryName(selectedItem.Path);
if (!string.IsNullOrWhiteSpace(parentDir)) return parentDir; if (!string.IsNullOrWhiteSpace(parentDir)) return parentDir;
}
return wikiRoot;
}catch (Exception ex)
{
Logger.Log($"Error while getting selected wiki target directory: {ex.Message}", Logger.LogType.Error);
} }
return null; return wikiRoot;
} }
private static bool PathsEqual(string left, string right) private static bool PathsEqual(string left, string right)
@@ -348,9 +344,8 @@ public partial class MainWindow : Window
UseShellExecute = true UseShellExecute = true
}); });
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while starting process: {ex.Message}", Logger.LogType.Error);
} }
} }
@@ -448,9 +443,8 @@ public partial class MainWindow : Window
{ {
LstSettingsCustomers.SelectedIndex = LstSettingsCustomers.Items.Count - 1; LstSettingsCustomers.SelectedIndex = LstSettingsCustomers.Items.Count - 1;
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while setting selected item: {ex.Message}", Logger.LogType.Error);
} }
} }
@@ -521,25 +515,17 @@ public partial class MainWindow : Window
{ {
LstSettingsCustomers.SelectedIndex = index; LstSettingsCustomers.SelectedIndex = index;
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while setting selected index: {ex.Message}", Logger.LogType.Error);
} }
} }
private void TbSettingsCustomerDescription_OnTextChanged(object? sender, TextChangedEventArgs e) private void TbSettingsCustomerDescription_OnTextChanged(object? sender, TextChangedEventArgs e)
{ {
try if (LstSettingsCustomers.SelectedIndex == null || LstSettingsCustomers.SelectedIndex == -1) return;
{ foreach (var customer in Settings._instance.customers.customers)
if (LstSettingsCustomers.SelectedIndex == null || LstSettingsCustomers.SelectedIndex == -1) return; if (customer.ID == Settings._instance.customers.current.ID)
foreach (var customer in Settings._instance.customers.customers) customer.description = TbSettingsCustomerDescription.Text;
if (customer.ID == Settings._instance.customers.current.ID)
customer.description = TbSettingsCustomerDescription.Text;
} catch (Exception ex)
{
Logger.Log($"Error while changing customer description: {ex.Message}", Logger.LogType.Error);
}
//Settings.Save(); //Settings.Save();
} }
@@ -559,72 +545,63 @@ public partial class MainWindow : Window
private async void BtnCustomerAddressSetImport_OnClick(object? sender, RoutedEventArgs e) private async void BtnCustomerAddressSetImport_OnClick(object? sender, RoutedEventArgs e)
{ {
try MakeCalcManVisible();
{ var opts = new FilePickerOpenOptions();
MakeCalcManVisible(); opts.Title = "Address-Set importieren...";
var opts = new FilePickerOpenOptions(); opts.AllowMultiple = false;
opts.Title = "Address-Set importieren...";
opts.AllowMultiple = false; var type = new FilePickerFileType("CSV-Dateien (*.csv)");
type.Patterns = new[] { "*.csv" };
var type = new FilePickerFileType("CSV-Dateien (*.csv)"); opts.FileTypeFilter = new[] { type };
type.Patterns = new[] { "*.csv" };
opts.FileTypeFilter = new[] { type }; var paths = await StorageProvider.OpenFilePickerAsync(opts);
var paths = await StorageProvider.OpenFilePickerAsync(opts); if (paths?.Count <= 0) return;
if (paths?.Count <= 0) return; if (LstCustomers.SelectedIndex < 0) return;
if (LstCustomers.SelectedIndex < 0) return;
var selected_path = paths[0].Path;
var selected_path = paths[0].Path; foreach (var customer in Settings._instance.customers.customers)
if (customer == ((Customer)LstCustomers.SelectedItems[0]))
foreach (var customer in Settings._instance.customers.customers) {
if (customer == ((Customer)LstCustomers.SelectedItems[0])) if (customer.patch == null)
{ {
if (customer.patch == null) var got = await DataImport.ImportKasAddressList(selected_path, null, customer.separator);
{ if (!got.Item1)
var got = await DataImport.ImportKasAddressList(selected_path, null, customer.separator); {
if (!got.Item1) Console.WriteLine("Error while importing. Please try another file.");
{ }
Console.WriteLine("Error while importing. Please try another file."); else
} {
else got.Item2.SetOwner(customer.ID);
{ Settings._instance.addressSets.addresses.Add(got.Item2);
got.Item2.SetOwner(customer.ID); }
Settings._instance.addressSets.addresses.Add(got.Item2);
} //var customer_id = int.Parse(LstCustomers.SelectedItem.ToString().Split(" - ")[0]);
RefreshAddressSetListItems(customer.ID);
//var customer_id = int.Parse(LstCustomers.SelectedItem.ToString().Split(" - ")[0]); }
RefreshAddressSetListItems(customer.ID); else
} {
else var got = await DataImport.ImportKasAddressList(selected_path, customer.patch, customer.separator);
{ if (!got.Item1)
var got = await DataImport.ImportKasAddressList(selected_path, customer.patch, customer.separator); {
if (!got.Item1) Console.WriteLine("Error while importing. Please try another file.");
{ }
Console.WriteLine("Error while importing. Please try another file."); else
} {
else got.Item2.SetOwner(customer.ID);
{ Settings._instance.addressSets.addresses.Add(got.Item2);
got.Item2.SetOwner(customer.ID); }
Settings._instance.addressSets.addresses.Add(got.Item2);
} //var customer_id = int.Parse(LstCustomers.SelectedItem.ToString().Split(" - ")[0]);
RefreshAddressSetListItems(customer.ID);
//var customer_id = int.Parse(LstCustomers.SelectedItem.ToString().Split(" - ")[0]); }
RefreshAddressSetListItems(customer.ID); }
}
}
Settings.Save();
Settings.Save();
}
catch (Exception ex)
{
Logger.Log($"Error while importing: {ex.Message}", Logger.LogType.Error);
}
} }
public void RefreshAddressSetListItems(int customer_id) public void RefreshAddressSetListItems(int customer_id)
@@ -670,38 +647,31 @@ public partial class MainWindow : Window
private async void BtnSettingsImportCustomerAddressPatch_OnClick(object? sender, RoutedEventArgs e) private async void BtnSettingsImportCustomerAddressPatch_OnClick(object? sender, RoutedEventArgs e)
{ {
try if (LstSettingsCustomers.SelectedIndex == null || LstSettingsCustomers.SelectedIndex == -1) return;
{
if (LstSettingsCustomers.SelectedIndex == null || LstSettingsCustomers.SelectedIndex == -1) return; var opts = new FilePickerOpenOptions();
opts.Title = "Address-Patch für " + LstSettingsCustomers.SelectedItems[0] + "importieren...";
var opts = new FilePickerOpenOptions(); opts.AllowMultiple = false;
opts.Title = "Address-Patch für " + LstSettingsCustomers.SelectedItems[0] + "importieren...";
opts.AllowMultiple = false; var type = new FilePickerFileType("ADPAC-Dateien (*.adpac)");
type.Patterns = new[] { "*.adpac" };
var type = new FilePickerFileType("ADPAC-Dateien (*.adpac)"); opts.FileTypeFilter = new[] { type };
type.Patterns = new[] { "*.adpac" };
opts.FileTypeFilter = new[] { type }; var paths = await StorageProvider.OpenFilePickerAsync(opts);
var paths = await StorageProvider.OpenFilePickerAsync(opts); if (paths?.Count <= 0) return;
if (paths?.Count <= 0) return; //if (LstSettingsCustomers.SelectedIndex < 0) return;
//if (LstSettingsCustomers.SelectedIndex < 0) return;
var selected_path = paths[0].Path;
var selected_path = paths[0].Path; foreach (var customer in Settings._instance.customers.customers)
if (customer.ID == ((Customer)LstSettingsCustomers.SelectedItems[0]).ID)
foreach (var customer in Settings._instance.customers.customers) customer.patch = AddressPatch.Import(selected_path);
if (customer.ID == ((Customer)LstSettingsCustomers.SelectedItems[0]).ID)
customer.patch = AddressPatch.Import(selected_path);
Settings.Save();
Settings.Save();
} catch (Exception ex)
{
Logger.Log($"Error while importing customer address patch: {ex.Message}", Logger.LogType.Error);
}
} }
private void TbSettingsCustomerCsvSeparator_OnTextChanged(object? sender, TextChangedEventArgs e) private void TbSettingsCustomerCsvSeparator_OnTextChanged(object? sender, TextChangedEventArgs e)
@@ -719,14 +689,11 @@ public partial class MainWindow : Window
catch (FormatException ex) catch (FormatException ex)
{ {
MessageBox.Show(this, "Error while converting: " + ex.Message, "Could not parse"); MessageBox.Show(this, "Error while converting: " + ex.Message, "Could not parse");
Logger.Log($"Error while converting: {ex.Message}", Logger.LogType.Error);
} }
catch (Exception ex) catch (Exception ex)
{ {
MessageBox.Show(this, "Unknown Error: " + ex.Message, "Error"); MessageBox.Show(this, "Unknown Error: " + ex.Message, "Error");
Logger.Log($"Error while converting: {ex.Message}", Logger.LogType.Error);
} }
} }
private void BtnCombineDifference_OnClick(object? sender, RoutedEventArgs e) private void BtnCombineDifference_OnClick(object? sender, RoutedEventArgs e)
@@ -736,10 +703,11 @@ public partial class MainWindow : Window
list.Add((KasAddressList)item); list.Add((KasAddressList)item);
try try
{ {
StartCombine(list, Convert.ToInt32(LstCustomers.SelectedItem), "difference", GetCombiningTyp()); StartCombine(list, Convert.ToInt32((LstCustomers.SelectedItem as Customer).ID), "difference", GetCombiningTyp());
}catch (Exception ex) }
catch
{ {
Logger.Log($"Error while combining (difference): {ex.Message}", Logger.LogType.Error);
} }
} }
@@ -752,9 +720,9 @@ public partial class MainWindow : Window
{ {
StartCombine(list, Convert.ToInt32((LstCustomers.SelectedItem as Customer).ID), "union", GetCombiningTyp()); StartCombine(list, Convert.ToInt32((LstCustomers.SelectedItem as Customer).ID), "union", GetCombiningTyp());
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while combining (union): {ex.Message}", Logger.LogType.Error);
} }
} }
@@ -766,11 +734,11 @@ public partial class MainWindow : Window
list.Add((KasAddressList)item); list.Add((KasAddressList)item);
try try
{ {
StartCombine(list, Convert.ToInt32(LstCustomers.SelectedItem.ToString().Split(" - ")[0]), "intersection", GetCombiningTyp()); StartCombine(list, Convert.ToInt32((LstCustomers.SelectedItem as Customer).ID), "intersection", GetCombiningTyp());
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Log($"Error while combining (intersection): {ex.Message}", Logger.LogType.Error); Console.WriteLine("Error while trying to start intersection: " + ex.Message);
} }
} }
@@ -793,7 +761,7 @@ public partial class MainWindow : Window
foreach (var item in LstCustomerAdressSets.SelectedItems) foreach (var item in LstCustomerAdressSets.SelectedItems)
list.Add((KasAddressList)item); list.Add((KasAddressList)item);
StartCombine(list, Convert.ToInt32(LstCustomers.SelectedItem.ToString().Split(" - ")[0]), "symdiff", GetCombiningTyp()); StartCombine(list, Convert.ToInt32((LstCustomers.SelectedItem as Customer).ID), "symdiff", GetCombiningTyp());
} }
private async void BtnGenerateLabels_OnClick(object? sender, RoutedEventArgs e) private async void BtnGenerateLabels_OnClick(object? sender, RoutedEventArgs e)
@@ -806,94 +774,52 @@ public partial class MainWindow : Window
private async void BtnStartGenerateLabels_OnClick(object? sender, RoutedEventArgs e) private async void BtnStartGenerateLabels_OnClick(object? sender, RoutedEventArgs e)
{ {
try SavePdfExportOptions();
var saveDialog = new SaveFileDialog
{ {
SavePdfExportOptions(); DefaultExtension = "pdf",
Filters = { new FileDialogFilter { Name = "PDF-Dateien", Extensions = { "pdf" } } }
};
var filePath = await saveDialog.ShowAsync(this);
var saveDialog = new SaveFileDialog if (!string.IsNullOrEmpty(filePath))
{
DefaultExtension = "pdf",
Filters =
{
new FileDialogFilter
{
Name = "PDF-Dateien",
Extensions = { "pdf" }
}
}
};
var filePath = await saveDialog.ShowAsync(this);
Console.WriteLine($"RAW: {filePath}");
if (!string.IsNullOrWhiteSpace(filePath))
{
if (filePath.StartsWith("file://"))
{
filePath = new Uri(filePath).LocalPath;
}
Console.WriteLine($"PATH: {filePath}");
var builder = new PdfBuilder(Settings._instance.pdfExport);
builder.CreateAddressLabelPdfFromAddressSetWithPlaceholder(
((KasAddressList)LstCustomerAdressSets.SelectedItem).ID,
"Company Logo/Info",
filePath
);
Console.WriteLine("PDF OK");
}
}
catch (Exception ex)
{ {
Logger.Log($"Error while generating labels: {ex.Message}", Logger.LogType.Error); var builder = new PdfBuilder(Settings._instance.pdfExport);
builder.CreateAddressLabelPdfFromAddressSetWithPlaceholder((
(KasAddressList)LstCustomerAdressSets.SelectedItem).ID,
"Company Logo/Info",
filePath
);
//return true;
} }
} }
private void HookPdfExportOptionEvents() private void HookPdfExportOptionEvents()
{ {
try var controls = GetPdfExportControls();
{ foreach (var control in controls) control.ValueChanged += PdfExportOption_OnValueChanged;
var controls = GetPdfExportControls();
foreach (var control in controls) control.ValueChanged += PdfExportOption_OnValueChanged;
}
catch (Exception ex)
{
Logger.Log($"Error while hooking pdf export margins: {ex.Message}", Logger.LogType.Error);
}
} }
private void LoadPdfExportOptions() private void LoadPdfExportOptions()
{ {
try var options = Settings._instance.pdfExport ?? new PdfExportSettings();
{
var options = Settings._instance.pdfExport ?? new PdfExportSettings();
NudExpMargCellPaddingTop.Value = (decimal)options.cellPaddingTopMm; NudExpMargCellPaddingTop.Value = (decimal)options.cellPaddingTopMm;
NudExpMargCellPaddingBot.Value = (decimal)options.cellPaddingBottomMm; NudExpMargCellPaddingBot.Value = (decimal)options.cellPaddingBottomMm;
NudExpMargCellPaddingLeft.Value = (decimal)options.cellPaddingLeftMm; NudExpMargCellPaddingLeft.Value = (decimal)options.cellPaddingLeftMm;
NudExpMargCellPaddingRight.Value = (decimal)options.cellPaddingRightMm; NudExpMargCellPaddingRight.Value = (decimal)options.cellPaddingRightMm;
TbExpMargMarginTop.Value = (decimal)options.pageMarginTopMm; TbExpMargMarginTop.Value = (decimal)options.pageMarginTopMm;
TbExpMargMarginBottom.Value = (decimal)options.pageMarginBottomMm; TbExpMargMarginBottom.Value = (decimal)options.pageMarginBottomMm;
TbExpMargMarginLeft.Value = (decimal)options.pageMarginLeftMm; TbExpMargMarginLeft.Value = (decimal)options.pageMarginLeftMm;
TbExpMargMarginRight.Value = (decimal)options.pageMarginRightMm; TbExpMargMarginRight.Value = (decimal)options.pageMarginRightMm;
TbExpMargRowsPerPage.Value = options.rowsPerPage; TbExpMargRowsPerPage.Value = options.rowsPerPage;
NudExpMargColumnsPerPage.Value = options.columnsPerPage; NudExpMargColumnsPerPage.Value = options.columnsPerPage;
NudExpMargFontSize.Value = (decimal)options.fontSize; NudExpMargFontSize.Value = (decimal)options.fontSize;
NudExpMargSmallFontSize.Value = (decimal)options.smallFontSize; NudExpMargSmallFontSize.Value = (decimal)options.smallFontSize;
}
catch (Exception ex)
{
Logger.Log($"Error while loading PDF Export Options: {ex.Message}", Logger.LogType.Error);
}
} }
private void SavePdfExportOptions() private void SavePdfExportOptions()
@@ -974,7 +900,6 @@ public partial class MainWindow : Window
public void RefreshCountryView() public void RefreshCountryView()
{ {
if (_suppressCountryRefresh) return; if (_suppressCountryRefresh) return;
try try
{ {
@@ -989,9 +914,8 @@ public partial class MainWindow : Window
{ {
CountryList.Items.Clear(); CountryList.Items.Clear();
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while clearing country list: {ex.Message}", Logger.LogType.Error);
} }
foreach (var c in Global._instance.countries) CountryList.Items.Add(c.name); foreach (var c in Global._instance.countries) CountryList.Items.Add(c.name);
@@ -999,19 +923,17 @@ public partial class MainWindow : Window
{ {
CountryList.SelectedIndex = country_index; CountryList.SelectedIndex = country_index;
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while setting selected item: {ex.Message}", Logger.LogType.Error);
} }
try try
{ {
_selectedCountry = Country.GetByName(CountryList.SelectedItems[0].ToString()); _selectedCountry = Country.GetByName(CountryList.SelectedItems[0].ToString());
} }
catch (Exception ex) catch
{ {
_selectedCountry = null; _selectedCountry = null;
Logger.Log($"Error while getting country: {ex.Message}", Logger.LogType.Error);
} }
if (_selectedCountry == null) return; if (_selectedCountry == null) return;
@@ -1025,9 +947,8 @@ public partial class MainWindow : Window
{ {
LbSettingsAlternatives.SelectedIndex = alt_index; LbSettingsAlternatives.SelectedIndex = alt_index;
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while setting selected item: {ex.Message}", Logger.LogType.Error);
} }
} }
finally finally
@@ -1043,9 +964,9 @@ public partial class MainWindow : Window
{ {
_selectedCountry.alternatives.Remove(selected.ToString()); _selectedCountry.alternatives.Remove(selected.ToString());
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while removing alternatives: {ex.Message}", Logger.LogType.Error); Console.WriteLine("Error while removing country alternative");
} }
RefreshCountryView(); RefreshCountryView();
@@ -1120,7 +1041,6 @@ public partial class MainWindow : Window
catch (Exception ex) catch (Exception ex)
{ {
MessageBox.Show(this, ex.StackTrace, "Fehler"); MessageBox.Show(this, ex.StackTrace, "Fehler");
Logger.Log($"Error while adding wiki file: {ex.Message}", Logger.LogType.Error);
} }
} }
@@ -1144,39 +1064,34 @@ public partial class MainWindow : Window
catch (Exception ex) catch (Exception ex)
{ {
MessageBox.Show(this, ex.StackTrace, "Fehler"); MessageBox.Show(this, ex.StackTrace, "Fehler");
Logger.Log($"Error while adding wiki folder: {ex.Message}", Logger.LogType.Error);
} }
} }
private async void MnIAdSetRename_OnClick(object? sender, RoutedEventArgs e) private async void MnIAdSetRename_OnClick(object? sender, RoutedEventArgs e)
{ {
var id = (LstCustomerAdressSets.SelectedItems[0] as KasAddressList).ID;
var cus_id = ((Customer)LstCustomers.SelectedItems[0]).ID;
var curr_set = new KasAddressList("");
foreach (var set in Settings._instance.addressSets.addresses)
if (set.ID == id)
{
curr_set = set;
}
if (LstCustomerAdressSets.SelectedItems.Count > 0) if (LstCustomerAdressSets.SelectedItems.Count > 0)
try try
{ {
var result = await NamingWindow.Show(this, curr_set.Name); var result = await NamingWindow.Show(this);
if (result != null) if (result != null)
{ {
curr_set.Name = result; var id = KasAddressList.GetIDByAddressSetListItem(LstCustomerAdressSets.SelectedItems[0]
Settings.Save(); .ToString());
RefreshAddressSetListItems(cus_id); var cus_id = ((Customer)LstCustomers.SelectedItems[0]).ID;
foreach (var set in Settings._instance.addressSets.addresses)
if (set.ID == id)
{
set.Name = result;
Settings.Save();
RefreshAddressSetListItems(cus_id);
break;
}
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
MessageBox.Show(this, ex.StackTrace, "Fehler"); MessageBox.Show(this, ex.StackTrace, "Fehler");
Logger.Log($"Error while renaming address set: {ex.Message}", Logger.LogType.Error);
} }
} }
@@ -1190,7 +1105,6 @@ public partial class MainWindow : Window
catch (Exception ex) catch (Exception ex)
{ {
MessageBox.Show(this, "Unknown Error: " + ex.Message, "Error"); MessageBox.Show(this, "Unknown Error: " + ex.Message, "Error");
Logger.Log($"Error while deleting customer: {ex.Message}", Logger.LogType.Error);
} }
RefreshCustomerItems(); RefreshCustomerItems();
} }
@@ -1217,9 +1131,9 @@ public partial class MainWindow : Window
TbSettingsCustomerCsvSeparator.Text = div; TbSettingsCustomerCsvSeparator.Text = div;
Settings.Save(); Settings.Save();
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while changing CSV divider: {ex.Message}", Logger.LogType.Error); Console.WriteLine("Error while parsing");
} }
} }
+1 -1
View File
@@ -52,7 +52,7 @@ public partial class NamingWindow : Window
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Log("Error while showing naming window: " + ex.Message, Logger.LogType.Warning); Console.WriteLine("Error while showing naming window: " + ex.Message);
return Task.FromResult<string>(null!); return Task.FromResult<string>(null!);
} }
} }
+42 -66
View File
@@ -28,25 +28,16 @@ public partial class ResultWindow : Window
private void GenerateView(List<KasPerson> result) private void GenerateView(List<KasPerson> result)
{ {
try // Filter to only show persons with errors
{ var result_with_errors = result.Where(p => p.PersonError != null).ToList();
LblResultCount.Content = $"{result_with_errors.Count}/{ur_result.Count} Ergebnisse";
// TbResults.Text = "";
// Filter to only show persons with errors // foreach (var person in result_with_errors) TbResults.Text += person.PersonError.GetString()+"\n";
var result_with_errors = result.Where(p => p.PersonError != null).ToList(); LbResults.Items.Clear();
LblResultCount.Content = $"{result_with_errors.Count}/{ur_result.Count} Ergebnisse"; foreach (var person in result_with_errors) LbResults.Items.Add(person.PersonError.ToString(person));
// StkResults.Children.Clear();
// TbResults.Text = ""; // foreach (var person in result_with_errors) StkResults.Children.Add(CreatePersonGrid(person));
// foreach (var person in result_with_errors) TbResults.Text += person.PersonError.GetString()+"\n";
LbResults.Items.Clear();
foreach (var person in result_with_errors) LbResults.Items.Add(person.PersonError.ToString(person));
// StkResults.Children.Clear();
// foreach (var person in result_with_errors) StkResults.Children.Add(CreatePersonGrid(person));
}
catch (Exception ex)
{
Logger.Log("Error while generating result view: " + ex.Message, Logger.LogType.Warning);
}
} }
private Grid CreatePersonGrid(KasPerson person) private Grid CreatePersonGrid(KasPerson person)
@@ -115,52 +106,44 @@ public partial class ResultWindow : Window
private void Load(List<KasPerson> result) private void Load(List<KasPerson> result)
{ {
try var knownErrors = new List<AddressCheck.ErrorTypes>();
var knownWarnings = new List<AddressCheck.WarningTypes>();
foreach (var person in result)
{ {
var knownErrors = new List<AddressCheck.ErrorTypes>(); if (person.PersonError == null) continue;
var knownWarnings = new List<AddressCheck.WarningTypes>();
foreach (var person in result) foreach (var errtyp in person.PersonError.errors)
{ if (!knownErrors.Contains(errtyp))
if (person.PersonError == null) continue; knownErrors.Add(errtyp);
foreach (var errtyp in person.PersonError.errors) foreach (var wartyp in person.PersonError.warnings)
if (!knownErrors.Contains(errtyp)) if (!knownWarnings.Contains(wartyp))
knownErrors.Add(errtyp); knownWarnings.Add(wartyp);
foreach (var wartyp in person.PersonError.warnings)
if (!knownWarnings.Contains(wartyp))
knownWarnings.Add(wartyp);
}
foreach (var errtype in knownErrors)
{
var cb = new CheckBox();
cb.IsChecked = true;
cb.Content = errtype.ToString();
//cb.Click += (sender, e) => UpdateFilter();
errortypecheckboxes.Add(cb);
StpFilterOptions.Children.Add(cb);
}
foreach (var wartype in knownWarnings)
{
var cb = new CheckBox();
cb.IsChecked = true;
cb.Content = wartype.ToString();
//cb.Click += (sender, e) => UpdateFilter();
warningtypecheckboxes.Add(cb);
StpFilterOptions.Children.Add(cb);
}
GenerateView(result);
} }
catch (Exception ex)
foreach (var errtype in knownErrors)
{ {
Logger.Log("Error while showing naming window: " + ex.Message, Logger.LogType.Warning); var cb = new CheckBox();
cb.IsChecked = true;
cb.Content = errtype.ToString();
//cb.Click += (sender, e) => UpdateFilter();
errortypecheckboxes.Add(cb);
StpFilterOptions.Children.Add(cb);
} }
foreach (var wartype in knownWarnings)
{
var cb = new CheckBox();
cb.IsChecked = true;
cb.Content = wartype.ToString();
//cb.Click += (sender, e) => UpdateFilter();
warningtypecheckboxes.Add(cb);
StpFilterOptions.Children.Add(cb);
}
GenerateView(result);
} }
private void BtnUpdateFilter_OnClick(object? sender, RoutedEventArgs e) private void BtnUpdateFilter_OnClick(object? sender, RoutedEventArgs e)
@@ -169,9 +152,7 @@ public partial class ResultWindow : Window
private void UpdateFilter() private void UpdateFilter()
{ {
try var temp_result = new List<KasPerson>();
{
var temp_result = new List<KasPerson>();
var checkedErrors = new HashSet<AddressCheck.ErrorTypes>(); var checkedErrors = new HashSet<AddressCheck.ErrorTypes>();
var checkedWarnings = new HashSet<AddressCheck.WarningTypes>(); var checkedWarnings = new HashSet<AddressCheck.WarningTypes>();
@@ -230,11 +211,6 @@ public partial class ResultWindow : Window
// foreach (var person in temp_result) TbResults.Text += person.PersonError.GetString() +"\n"; // foreach (var person in temp_result) TbResults.Text += person.PersonError.GetString() +"\n";
// StkResults.Children.Clear(); // StkResults.Children.Clear();
// foreach (var person in temp_result) StkResults.Children.Add(CreatePersonGrid(person)); // foreach (var person in temp_result) StkResults.Children.Add(CreatePersonGrid(person));
} catch (Exception ex)
{
Logger.Log("Error while updating filter: " + ex.Message, Logger.LogType.Warning);
}
} }
+216 -229
View File
@@ -39,240 +39,227 @@ public class AddressCheck
public async Task<List<KasPerson>> Perform(int id) public async Task<List<KasPerson>> Perform(int id)
{ {
try // Find the index of the address set with the given id
{ var adset_index = -1;
// Find the index of the address set with the given id for (var i = 0; i < Settings._instance.addressSets.addresses.Count; i++)
var adset_index = -1; if (Settings._instance.addressSets.addresses[i].ID == id)
for (var i = 0; i < Settings._instance.addressSets.addresses.Count; i++)
if (Settings._instance.addressSets.addresses[i].ID == id)
{
adset_index = i;
break;
}
if (adset_index == -1) return new List<KasPerson>();
var adset = Settings._instance.addressSets.addresses[adset_index];
var total = adset.KasPersons.Count;
var current = 0;
await Task.Run(async () =>
{ {
foreach (var person in adset.KasPersons) adset_index = i;
{ break;
var errors = new List<ErrorTypes>(); }
var warnings = new List<WarningTypes>();
var hasFaults = false;
var address_component_count = 2; // cause anrede and name are first if (adset_index == -1) return new List<KasPerson>();
// PLZ-Prüfung var adset = Settings._instance.addressSets.addresses[adset_index];
if (person.plz == "" || person.plz == null) var total = adset.KasPersons.Count;
{ var current = 0;
hasFaults = true;
warnings.Add(WarningTypes.NoPLZ);
}
else
{
if (!AddressCreator.CheckPLZ(person.plz, person.land))
{
hasFaults = true;
errors.Add(ErrorTypes.PlzNotUsable);
}
// if ((person.plz < 10000 && string.IsNullOrWhiteSpace(person.land)) ||
// (person.plz < 10000 && person.land == "GER") ||
// (person.plz < 10000 && person.land == "DE"))
// {
// hasFaults = true;
// errors.Add(ErrorTypes.PlzTooShort);
// }
// else if ((person.plz > 99999 && string.IsNullOrWhiteSpace(person.land)) ||
// (person.plz > 99999 && person.land == "GER") ||
// (person.plz > 99999 && person.land == "DE"))
// {
// hasFaults = true;
// errors.Add(ErrorTypes.PlzTooLong);
// }
}
await Task.Run(async () =>
// PPLZ-Prüfung
if (person.pplz == "" || person.pplz == null)
{
hasFaults = true;
warnings.Add(WarningTypes.NoPPLZ);
}
else
{
if (!AddressCreator.CheckPLZ(person.pplz, person.land))
{
hasFaults = true;
errors.Add(ErrorTypes.PPlzNotUsable);
}
// if ((person.pplz < 10000 && string.IsNullOrWhiteSpace(person.land)) ||
// (person.pplz < 10000 && person.land == "GER") ||
// (person.pplz < 10000 && person.land == "DE"))
// {
// hasFaults = true;
// errors.Add(ErrorTypes.PPlzTooShort);
// }
// else if ((person.pplz > 99999 && string.IsNullOrWhiteSpace(person.land)) ||
// (person.pplz > 99999 && person.land == "GER") ||
// (person.pplz > 99999 && person.land == "DE"))
// {
// hasFaults = true;
// errors.Add(ErrorTypes.PPlzTooLong);
// }
}
if (warnings.Contains(WarningTypes.NoPLZ) && warnings.Contains(WarningTypes.NoPPLZ))
{
hasFaults = true;
errors.Add(ErrorTypes.NoPLZorPPLZ);
}
// Ort-Prüfung
if (string.IsNullOrWhiteSpace(person.ort))
{
hasFaults = true;
warnings.Add(WarningTypes.NoCity);
}
else
{
address_component_count++;
}
// Street-Number
var street = person.strasse.ToCharArray();
var intcount = 0;
foreach (var c in street)
{
int maybe;
if (int.TryParse(c.ToString(), out maybe)) intcount++;
}
if (intcount == 0)
{
hasFaults = true;
warnings.Add(WarningTypes.NoStreetNumber);
}
// Last-Name
if (string.IsNullOrWhiteSpace(person.name))
{
hasFaults = true;
warnings.Add(WarningTypes.NoLastName);
}
// First-Name
if (string.IsNullOrWhiteSpace(person.vorname))
{
hasFaults = true;
warnings.Add(WarningTypes.NoFirstName);
}
// Street-Check
if (string.IsNullOrWhiteSpace(person.strasse))
{
hasFaults = true;
warnings.Add(WarningTypes.NoStreet);
}
else
{
address_component_count++;
}
// Address-Component-Count
if (!string.IsNullOrWhiteSpace(person.strasse2)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.land)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.name1)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.name2)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.name3)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.name4)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.name5)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.funktion)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.funktion2)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.funktionad)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.abteilung)) address_component_count++;
// Double-Refsid or DoubleAddresses
foreach (var person2 in adset.KasPersons)
{
if (adset.KasPersons.IndexOf(person) == adset.KasPersons.IndexOf(person2)) continue;
if (person.refsid == person2.refsid) // trifft auf Patch-Addressen nicht zu
{
hasFaults = true;
warnings.Add(WarningTypes.DoubledRefsid);
}
if (person.name == person2.name &&
person.strasse == person2.strasse &&
person.vorname == person2.vorname &&
person.ort == person2.ort &&
person.funktion == person2.funktion &&
person.funktion2 == person2.funktion2 &&
person.funktionad == person2.funktionad &&
person.abteilung == person2.abteilung &&
person.name1 == person2.name1 &&
person.name2 == person2.name2 &&
person.name3 == person2.name3 &&
person.name4 == person2.name4 &&
person.name5 == person2.name5) //
{
hasFaults = true;
errors.Add(ErrorTypes.MayBeSameAddress);
}
}
// Adressen-Länge
if (address_component_count > 10)
{
hasFaults = true;
warnings.Add(WarningTypes.FullAddressTooLong);
}
if (hasFaults)
lock (Settings._instance.addressSets.addresses)
{
// Directly set PersonError in the address set
var person_index = adset.KasPersons.IndexOf(person);
if (person_index >= 0)
Settings._instance.addressSets.addresses[adset_index].KasPersons[person_index]
.PersonError =
new KasPersonError((errors, warnings));
}
// Fortschritt aktualisieren
Interlocked.Increment(ref current);
var percent = current / (double)total * 100;
await Dispatcher.UIThread.InvokeAsync(() =>
{
if (hasFaults)
_progress.AddToLog($"Person mit id {person.id} ist fehlerhaft",
Convert.ToInt32(percent).ToString());
_progress.ChangePercentage(percent);
});
}
});
Settings.Save();
// Return only the persons with errors from the address set
return Settings._instance.addressSets.addresses[adset_index].KasPersons
.Where(p => p.PersonError != null)
.ToList();
}
catch (Exception ex)
{ {
Logger.Log($"Error while performing address check: {ex.Message}", Logger.LogType.Error); foreach (var person in adset.KasPersons)
} {
var errors = new List<ErrorTypes>();
var warnings = new List<WarningTypes>();
var hasFaults = false;
return null; var address_component_count = 2; // cause anrede and name are first
// PLZ-Prüfung
if (person.plz == "" || person.plz == null)
{
hasFaults = true;
warnings.Add(WarningTypes.NoPLZ);
}
else
{
if (!AddressCreator.CheckPLZ(person.plz, person.land))
{
hasFaults = true;
errors.Add(ErrorTypes.PlzNotUsable);
}
// if ((person.plz < 10000 && string.IsNullOrWhiteSpace(person.land)) ||
// (person.plz < 10000 && person.land == "GER") ||
// (person.plz < 10000 && person.land == "DE"))
// {
// hasFaults = true;
// errors.Add(ErrorTypes.PlzTooShort);
// }
// else if ((person.plz > 99999 && string.IsNullOrWhiteSpace(person.land)) ||
// (person.plz > 99999 && person.land == "GER") ||
// (person.plz > 99999 && person.land == "DE"))
// {
// hasFaults = true;
// errors.Add(ErrorTypes.PlzTooLong);
// }
}
// PPLZ-Prüfung
if (person.pplz == "" || person.pplz == null)
{
hasFaults = true;
warnings.Add(WarningTypes.NoPPLZ);
}
else
{
if (!AddressCreator.CheckPLZ(person.pplz, person.land))
{
hasFaults = true;
errors.Add(ErrorTypes.PPlzNotUsable);
}
// if ((person.pplz < 10000 && string.IsNullOrWhiteSpace(person.land)) ||
// (person.pplz < 10000 && person.land == "GER") ||
// (person.pplz < 10000 && person.land == "DE"))
// {
// hasFaults = true;
// errors.Add(ErrorTypes.PPlzTooShort);
// }
// else if ((person.pplz > 99999 && string.IsNullOrWhiteSpace(person.land)) ||
// (person.pplz > 99999 && person.land == "GER") ||
// (person.pplz > 99999 && person.land == "DE"))
// {
// hasFaults = true;
// errors.Add(ErrorTypes.PPlzTooLong);
// }
}
if (warnings.Contains(WarningTypes.NoPLZ) && warnings.Contains(WarningTypes.NoPPLZ))
{
hasFaults = true;
errors.Add(ErrorTypes.NoPLZorPPLZ);
}
// Ort-Prüfung
if (string.IsNullOrWhiteSpace(person.ort))
{
hasFaults = true;
warnings.Add(WarningTypes.NoCity);
}
else
{
address_component_count++;
}
// Street-Number
var street = person.strasse.ToCharArray();
var intcount = 0;
foreach (var c in street)
{
int maybe;
if (int.TryParse(c.ToString(), out maybe)) intcount++;
}
if (intcount == 0)
{
hasFaults = true;
warnings.Add(WarningTypes.NoStreetNumber);
}
// Last-Name
if (string.IsNullOrWhiteSpace(person.name))
{
hasFaults = true;
warnings.Add(WarningTypes.NoLastName);
}
// First-Name
if (string.IsNullOrWhiteSpace(person.vorname))
{
hasFaults = true;
warnings.Add(WarningTypes.NoFirstName);
}
// Street-Check
if (string.IsNullOrWhiteSpace(person.strasse))
{
hasFaults = true;
warnings.Add(WarningTypes.NoStreet);
}
else
{
address_component_count++;
}
// Address-Component-Count
if (!string.IsNullOrWhiteSpace(person.strasse2)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.land)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.name1)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.name2)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.name3)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.name4)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.name5)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.funktion)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.funktion2)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.funktionad)) address_component_count++;
if (!string.IsNullOrWhiteSpace(person.abteilung)) address_component_count++;
// Double-Refsid or DoubleAddresses
foreach (var person2 in adset.KasPersons)
{
if (adset.KasPersons.IndexOf(person) == adset.KasPersons.IndexOf(person2)) continue;
if (person.refsid == person2.refsid) // trifft auf Patch-Addressen nicht zu
{
hasFaults = true;
warnings.Add(WarningTypes.DoubledRefsid);
}
if (person.name == person2.name &&
person.strasse == person2.strasse &&
person.vorname == person2.vorname &&
person.ort == person2.ort &&
person.funktion == person2.funktion &&
person.funktion2 == person2.funktion2 &&
person.funktionad == person2.funktionad &&
person.abteilung == person2.abteilung &&
person.name1 == person2.name1 &&
person.name2 == person2.name2 &&
person.name3 == person2.name3 &&
person.name4 == person2.name4 &&
person.name5 == person2.name5) //
{
hasFaults = true;
errors.Add(ErrorTypes.MayBeSameAddress);
}
}
// Adressen-Länge
if (address_component_count > 10)
{
hasFaults = true;
warnings.Add(WarningTypes.FullAddressTooLong);
}
if (hasFaults)
lock (Settings._instance.addressSets.addresses)
{
// Directly set PersonError in the address set
var person_index = adset.KasPersons.IndexOf(person);
if (person_index >= 0)
Settings._instance.addressSets.addresses[adset_index].KasPersons[person_index].PersonError =
new KasPersonError((errors, warnings));
}
// Fortschritt aktualisieren
Interlocked.Increment(ref current);
var percent = current / (double)total * 100;
await Dispatcher.UIThread.InvokeAsync(() =>
{
if (hasFaults)
_progress.AddToLog($"Person mit id {person.id} ist fehlerhaft", Convert.ToInt32(percent).ToString());
_progress.ChangePercentage(percent);
});
}
});
Settings.Save();
// Return only the persons with errors from the address set
return Settings._instance.addressSets.addresses[adset_index].KasPersons
.Where(p => p.PersonError != null)
.ToList();
} }
} }
+180 -208
View File
@@ -43,195 +43,177 @@ public static class AddressCreator
public static string? CreateFinalMarkdownString(int id) public static string? CreateFinalMarkdownString(int id)
{ {
// Maximum seven lines of information // Maximum seven lines of information
try
// find the address
KasPerson? address = null;
var string_address = "";
var address_line_count = 0;
foreach (var set in Settings._instance.addressSets.addresses)
{ {
// find the address var temp = set.KasPersons.FirstOrDefault(obj => obj.id == id);
KasPerson? address = null; if (temp != null)
var string_address = ""; {
var address_line_count = 0; address = temp;
foreach (var set in Settings._instance.addressSets.addresses) break;
{ }
var temp = set.KasPersons.FirstOrDefault(obj => obj.id == id);
if (temp != null)
{
address = temp;
break;
}
}
// no address found
if (address == null) return null;
// let's get started: we start from the bottom
// if the country is not Germany, set it; try to map via Global countries alternatives -> translation
var trimmedLand = (address.land ?? "").Trim();
var trimmedLowerLand = trimmedLand.ToLower();
var isGermany = trimmedLowerLand == "germany" || trimmedLowerLand == "ger" ||
trimmedLowerLand == "" || trimmedLowerLand == "de" ||
trimmedLowerLand == "deutschland";
if (!isGermany)
{
var countryToShow = trimmedLand; // default: use raw land value
if (!string.IsNullOrEmpty(trimmedLand))
// search for matching country via alternatives using for-loops
for (var ci = 0; ci < Global._instance.countries.Count; ci++)
{
var country = Global._instance.countries[ci];
for (var ai = 0; ai < country.alternatives.Count; ai++)
try
{
var alt = (country.alternatives[ai] ?? "").Trim();
if (string.Equals(alt, trimmedLand, StringComparison.OrdinalIgnoreCase))
{
countryToShow = string.IsNullOrWhiteSpace(country.translation)
? country.name
: country.translation;
goto CountryFound;
}
}
catch
{
// ignore malformed alternative
}
}
CountryFound:
string_address = "**" + countryToShow + "**"; // Needs to be bold
address_line_count++;
}
// Alternative A: pplz valid and city existing
if (!string.IsNullOrEmpty(address.ort) && CheckPLZ(address.pplz, address.land))
{
string_address = address.pplz + " " + address.ort + "\n" + string_address;
address_line_count++;
if (!string.IsNullOrWhiteSpace(address.postfach))
{
string_address = "Postfach " + address.postfach.Trim() + "\n" + string_address;
address_line_count++;
}
else if (!string.IsNullOrWhiteSpace(address.strasse.Trim()))
{
string_address = address.strasse.Trim() + "\n" + string_address;
address_line_count++;
}
var nameline = CreateNameLine(address.anredzus, address.anrede, address.titel, address.vorname,
address.adel, address.name, address.namezus);
if (!string.IsNullOrWhiteSpace(nameline))
{
string_address = nameline + "\n" + string_address;
address_line_count++;
}
// REIHENFOLGE
var nameattribs = new[]
{ address.name1, address.name2, address.name3, address.name4, address.name5, address.abteilung };
var names = "";
for (var i = 0; i < nameattribs.Length; i++)
try
{
if (address_line_count >= 7) break;
if (!string.IsNullOrWhiteSpace(nameattribs[i]))
{
names += "\n" + nameattribs[i];
address_line_count++;
}
}
catch
{
Console.WriteLine("ERROR 15821");
}
string_address = names + "\n" + string_address;
} // Alternative B: plz valid and city existing
else if (!string.IsNullOrEmpty(address.ort) && CheckPLZ(address.plz, address.land))
{
string_address = address.plz + " " + address.ort + "\n" + string_address;
address_line_count++;
if (!string.IsNullOrWhiteSpace(address.strasse))
{
string_address = address.strasse.Trim() + "\n" + string_address;
address_line_count++;
}
else if (!string.IsNullOrWhiteSpace(address.postfach.Trim()))
{
string_address = "Postfach " + address.postfach.Trim() + "\n" + string_address;
address_line_count++;
}
var nameline = CreateNameLine(address.anredzus, address.anrede, address.titel, address.vorname,
address.adel, address.name, address.namezus);
if (!string.IsNullOrWhiteSpace(nameline))
{
string_address = nameline + "\n" + string_address;
address_line_count++;
}
var nameattribs = new[]
{ address.name1, address.name2, address.name3, address.name4, address.name5, address.abteilung };
var names = "";
for (var i = 0; i < nameattribs.Length; i++)
try
{
if (address_line_count >= 7) break;
if (!string.IsNullOrWhiteSpace(nameattribs[i]))
{
names += "\n" + nameattribs[i];
address_line_count++;
}
}
catch
{
Console.WriteLine("ERROR 15821");
}
string_address = names + "\n" + string_address;
} // Error-Handling?
if (address_line_count > 1) return string_address;
return null;
}
catch (Exception ex)
{
Logger.Log($"Error while creating markdown string: {ex.Message}", Logger.LogType.Error);
} }
// no address found
if (address == null) return null;
// let's get started: we start from the bottom
// if the country is not Germany, set it; try to map via Global countries alternatives -> translation
var trimmedLand = (address.land ?? "").Trim();
var trimmedLowerLand = trimmedLand.ToLower();
var isGermany = trimmedLowerLand == "germany" || trimmedLowerLand == "ger" ||
trimmedLowerLand == "" || trimmedLowerLand == "de" ||
trimmedLowerLand == "deutschland";
if (!isGermany)
{
var countryToShow = trimmedLand; // default: use raw land value
if (!string.IsNullOrEmpty(trimmedLand))
// search for matching country via alternatives using for-loops
for (var ci = 0; ci < Global._instance.countries.Count; ci++)
{
var country = Global._instance.countries[ci];
for (var ai = 0; ai < country.alternatives.Count; ai++)
try
{
var alt = (country.alternatives[ai] ?? "").Trim();
if (string.Equals(alt, trimmedLand, StringComparison.OrdinalIgnoreCase))
{
countryToShow = string.IsNullOrWhiteSpace(country.translation)
? country.name
: country.translation;
goto CountryFound;
}
}
catch
{
// ignore malformed alternative
}
}
CountryFound:
string_address = "**" + countryToShow + "**"; // Needs to be bold
address_line_count++;
}
// Alternative A: pplz valid and city existing
if (!string.IsNullOrEmpty(address.ort) && CheckPLZ(address.pplz, address.land))
{
string_address = address.pplz + " " + address.ort + "\n" + string_address;
address_line_count++;
if (!string.IsNullOrWhiteSpace(address.postfach))
{
string_address = "Postfach " + address.postfach.Trim() + "\n" + string_address;
address_line_count++;
}
else if (!string.IsNullOrWhiteSpace(address.strasse.Trim()))
{
string_address = address.strasse.Trim() + "\n" + string_address;
address_line_count++;
}
var nameline = CreateNameLine(address.anredzus, address.anrede, address.titel, address.vorname,
address.adel, address.name, address.namezus);
if (!string.IsNullOrWhiteSpace(nameline))
{
string_address = nameline + "\n" + string_address;
address_line_count++;
}
// REIHENFOLGE
var nameattribs = new[]
{ address.name1, address.name2, address.name3, address.name4, address.name5, address.abteilung };
var names = "";
for (var i = 0; i < nameattribs.Length; i++)
try
{
if (address_line_count >= 7) break;
if (!string.IsNullOrWhiteSpace(nameattribs[i]))
{
names += "\n" + nameattribs[i];
address_line_count++;
}
}
catch
{
Console.WriteLine("ERROR 15821");
}
string_address = names + "\n" + string_address;
} // Alternative B: plz valid and city existing
else if (!string.IsNullOrEmpty(address.ort) && CheckPLZ(address.plz, address.land))
{
string_address = address.plz + " " + address.ort + "\n" + string_address;
address_line_count++;
if (!string.IsNullOrWhiteSpace(address.strasse))
{
string_address = address.strasse.Trim() + "\n" + string_address;
address_line_count++;
}
else if (!string.IsNullOrWhiteSpace(address.postfach.Trim()))
{
string_address = "Postfach " + address.postfach.Trim() + "\n" + string_address;
address_line_count++;
}
var nameline = CreateNameLine(address.anredzus, address.anrede, address.titel, address.vorname,
address.adel, address.name, address.namezus);
if (!string.IsNullOrWhiteSpace(nameline))
{
string_address = nameline + "\n" + string_address;
address_line_count++;
}
var nameattribs = new[]
{ address.name1, address.name2, address.name3, address.name4, address.name5, address.abteilung };
var names = "";
for (var i = 0; i < nameattribs.Length; i++)
try
{
if (address_line_count >= 7) break;
if (!string.IsNullOrWhiteSpace(nameattribs[i]))
{
names += "\n" + nameattribs[i];
address_line_count++;
}
}
catch
{
Console.WriteLine("ERROR 15821");
}
string_address = names + "\n" + string_address;
} // Error-Handling?
if (address_line_count > 1) return string_address;
return null; return null;
} }
public static string CreateNameLine(string anredezus, string anrede, string titel, string vorname, string adel, public static string CreateNameLine(string anredezus, string anrede, string titel, string vorname, string adel,
string name, string namezus) string name, string namezus)
{ {
try if (!string.IsNullOrWhiteSpace(anredezus))
{
if (!string.IsNullOrWhiteSpace(anredezus))
return string.Join(" ",
new[] { anredezus, titel, vorname, adel, name }
.Where(s => !string.IsNullOrWhiteSpace(s))
)
+ (string.IsNullOrWhiteSpace(namezus) ? "" : $" ({namezus.Trim()})");
// else
return string.Join(" ", return string.Join(" ",
new[] { anrede, titel, vorname, adel, name } new[] { anredezus, titel, vorname, adel, name }
.Where(s => !string.IsNullOrWhiteSpace(s)) .Where(s => !string.IsNullOrWhiteSpace(s))
) )
+ (string.IsNullOrWhiteSpace(namezus) ? "" : $" ({namezus.Trim()})"); + (string.IsNullOrWhiteSpace(namezus) ? "" : $" ({namezus.Trim()})");
}
catch (Exception ex)
{
Logger.Log($"Error while performing address name line creation: {ex.Message}", Logger.LogType.Error);
}
return null; // else
return string.Join(" ",
new[] { anrede, titel, vorname, adel, name }
.Where(s => !string.IsNullOrWhiteSpace(s))
)
+ (string.IsNullOrWhiteSpace(namezus) ? "" : $" ({namezus.Trim()})");
} }
/// <summary> /// <summary>
@@ -242,39 +224,29 @@ public static class AddressCreator
/// <returns>true or faslse, depending on result :+1:</returns> /// <returns>true or faslse, depending on result :+1:</returns>
public static bool CheckPLZ(string plz, string land) public static bool CheckPLZ(string plz, string land)
{ {
try if (string.IsNullOrWhiteSpace(plz)) return false;
{
if (string.IsNullOrWhiteSpace(plz)) return false;
var trimmedPlz = plz.Trim();
var trimmedLand = land.ToLower().Trim();
// Check if it's a German country code
var isGermany = trimmedLand == "germany" || trimmedLand == "ger" || trimmedLand == "de" ||
trimmedLand == "deutschland" || trimmedLand == "";
if (isGermany)
// For Germany (including empty land), accept numeric postal codes with 5 digits
try
{
var iplz = Convert.ToInt32(trimmedPlz);
if (trimmedPlz.Length == 5) return true;
return false;
}
catch
{
return false;
}
// For non-German countries, accept any non-empty postal code
return true;
}
catch (Exception ex)
{
Logger.Log($"Error while performing address plz check: {ex.Message}", Logger.LogType.Error);
}
return false; var trimmedPlz = plz.Trim();
var trimmedLand = land.ToLower().Trim();
// Check if it's a German country code
var isGermany = trimmedLand == "germany" || trimmedLand == "ger" || trimmedLand == "de" ||
trimmedLand == "deutschland" || trimmedLand == "";
if (isGermany)
// For Germany (including empty land), accept numeric postal codes with 5 digits
try
{
var iplz = Convert.ToInt32(trimmedPlz);
if (trimmedPlz.Length == 5) return true;
return false;
}
catch
{
return false;
}
// For non-German countries, accept any non-empty postal code
return true;
} }
} }
+45 -67
View File
@@ -3,7 +3,6 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Text; using System.Text;
using Logof_Client;
public class AddressPatch public class AddressPatch
{ {
@@ -59,82 +58,61 @@ public class AddressPatch
public static AddressPatch Import(Uri filename) public static AddressPatch Import(Uri filename)
{ {
try var patch = new AddressPatch();
// Alle Zeilen aus der Datei laden
var lines = File.ReadAllLines(filename.LocalPath);
// Alle Properties der Klasse (Strings und bools)
var properties = typeof(AddressPatch).GetProperties(BindingFlags.Public | BindingFlags.Instance);
// Nur die Properties, die mit _is enden (also die String-Werte)
var stringProps = properties.Where(p => p.PropertyType == typeof(string) && p.Name.EndsWith("_is"));
foreach (var prop in stringProps)
{ {
var patch = new AddressPatch(); // Beispiel: prop.Name = "name_is"
var baseName = prop.Name.Substring(0, prop.Name.Length - 3); // "name"
// Alle Zeilen aus der Datei laden
var lines = File.ReadAllLines(filename.LocalPath); // In der Datei wird nach "name:" gesucht (ohne _is)
var line = lines.FirstOrDefault(l => l.StartsWith(baseName + ":"));
// Alle Properties der Klasse (Strings und bools) if (line != null)
var properties = typeof(AddressPatch).GetProperties(BindingFlags.Public | BindingFlags.Instance); {
// Wert extrahieren (alles nach dem Doppelpunkt)
// Nur die Properties, die mit _is enden (also die String-Werte) var value = line.Substring(line.IndexOf(':') + 1).Trim();
var stringProps = properties.Where(p => p.PropertyType == typeof(string) && p.Name.EndsWith("_is"));
// Wert im Patch-Objekt setzen
foreach (var prop in stringProps) prop.SetValue(patch, value);
{
// Beispiel: prop.Name = "name_is" // Passendes has_ Feld aktivieren, z.B. "has_name"
var baseName = prop.Name.Substring(0, prop.Name.Length - 3); // "name" var hasProp = properties.FirstOrDefault(p => p.Name == "has_" + baseName);
if (hasProp != null && hasProp.PropertyType == typeof(bool)) hasProp.SetValue(patch, true);
// In der Datei wird nach "name:" gesucht (ohne _is) }
var line = lines.FirstOrDefault(l => l.StartsWith(baseName + ":"));
if (line != null)
{
// Wert extrahieren (alles nach dem Doppelpunkt)
var value = line.Substring(line.IndexOf(':') + 1).Trim();
// Wert im Patch-Objekt setzen
prop.SetValue(patch, value);
// Passendes has_ Feld aktivieren, z.B. "has_name"
var hasProp = properties.FirstOrDefault(p => p.Name == "has_" + baseName);
if (hasProp != null && hasProp.PropertyType == typeof(bool)) hasProp.SetValue(patch, true);
}
}
return patch;
}
catch (Exception ex)
{
Logger.Log($"Error while importing address patch: {ex.Message}", Logger.LogType.Error);
} }
return null; return patch;
} }
public override string ToString() public override string ToString()
{ {
try var properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
var stringProps = properties.Where(p => p.PropertyType == typeof(string) && p.Name.EndsWith("_is"));
var lines = new StringBuilder();
foreach (var prop in stringProps)
{ {
var properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); // passendes has_ Feld
var stringProps = properties.Where(p => p.PropertyType == typeof(string) && p.Name.EndsWith("_is")); var hasProp =
properties.FirstOrDefault(p => p.Name == "has_" + prop.Name.Substring(0, prop.Name.Length - 3));
var lines = new StringBuilder(); if (hasProp != null && (bool)hasProp.GetValue(this))
{
foreach (var prop in stringProps) var value = (string)prop.GetValue(this);
{ lines.AppendLine($"{prop.Name} => {value}");
// passendes has_ Feld }
var hasProp =
properties.FirstOrDefault(p => p.Name == "has_" + prop.Name.Substring(0, prop.Name.Length - 3));
if (hasProp != null && (bool)hasProp.GetValue(this))
{
var value = (string)prop.GetValue(this);
lines.AppendLine($"{prop.Name} => {value}");
}
}
return lines.ToString().TrimEnd();
}
catch (Exception ex)
{
Logger.Log($"Error while parsing: {ex.Message}", Logger.LogType.Error);
} }
return "Error while parsing"; return lines.ToString().TrimEnd();
} }
} }
+9 -11
View File
@@ -1,4 +1,3 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace Logof_Client; namespace Logof_Client;
@@ -10,16 +9,15 @@ public class AddressRepair(ProgressWindow progressWindow)
public KasAddressList Perform(KasAddressList all_addresses, public KasAddressList Perform(KasAddressList all_addresses,
List<(int, List<AddressCheck.ErrorTypes>)> failed_addresses) List<(int, List<AddressCheck.ErrorTypes>)> failed_addresses)
{ {
try // foreach (var k in all_addresses.KasPersons)
{ // foreach (var p in failed_addresses)
// {
} // if (k.refsid != p.Item1) continue;
catch (Exception ex) //
{ // if (p.Item1.Contains(AddressCheck.WarningTypes.DoubledRefsid))
Logger.Log($"Error while performing address repair: {ex.Message}", Logger.LogType.Error); // {
} // }
// }
return null;
return null; return null;
} }
+60 -65
View File
@@ -12,73 +12,68 @@ public class AddressShortener(ProgressWindow progressWindow)
public async Task Perform(KasAddressList list) public async Task Perform(KasAddressList list)
{ {
try // find doubled addresses by refsid
List<int> doubled_ids = new List<int>();
for (int i = 0; i < list.KasPersons.Count; i++)
{ {
List<int> doubled_ids = new List<int>(); var address = list.KasPersons[i];
for (int i = 0; i < list.KasPersons.Count; i++) for (int j = 0; j < list.KasPersons.Count; j++)
{ {
var address = list.KasPersons[i]; if (i == j) continue;
for (int j = 0; j < list.KasPersons.Count; j++) var sec_address = list.KasPersons[j];
{
if (i == j) continue; if (address.refsid == sec_address.refsid && !doubled_ids.Contains(address.refsid) && address.refsid != 0)
var sec_address = list.KasPersons[j]; {
doubled_ids.Add(address.refsid);
if (address.refsid == sec_address.refsid && !doubled_ids.Contains(address.refsid) && address.refsid != 0) }
{ }
doubled_ids.Add(address.refsid);
}
}
}
// delete doubled addresses by refsid
foreach (int id in doubled_ids)
{
// does this remove both of the doubled addresses?
list.KasPersons.Remove(list.KasPersons.FirstOrDefault(x => x.refsid == id));
}
List<int> toRemove = new List<int>();
foreach (var address in list.KasPersons)
{
try
{
if (address.PersonError.errors.Contains(AddressCheck.ErrorTypes.NoPLZorPPLZ))
{
toRemove.Add(address.id);
}
else if (address.PersonError.errors.Contains(AddressCheck.ErrorTypes.PlzNotUsable) &&
address.PersonError.errors.Contains(AddressCheck.ErrorTypes.PPlzNotUsable))
{
toRemove.Add(address.id);
} else if (address.PersonError.errors.Contains(AddressCheck.ErrorTypes.PlzNotUsable) &&
address.PersonError.warnings.Contains(AddressCheck.WarningTypes.NoPPLZ))
{
toRemove.Add(address.id);
}
else if (address.PersonError.errors.Contains(AddressCheck.ErrorTypes.PPlzNotUsable) &&
address.PersonError.warnings.Contains(AddressCheck.WarningTypes.NoPLZ))
{
toRemove.Add(address.id);
}
}
catch
{
Console.WriteLine("PersonError not accessible: " + address.id);
}
}
// delete doubled addresses by refsid
foreach (int id in toRemove)
{
// does this remove both of the doubled addresses?
list.KasPersons.Remove(list.KasPersons.Find(x => x.id == id));
}
}
catch (Exception ex)
{
Logger.Log($"Error while performing address shortener: {ex.Message}", Logger.LogType.Error);
} }
// delete doubled addresses by refsid
foreach (int id in doubled_ids)
{
// does this remove both of the doubled addresses?
list.KasPersons.Remove(list.KasPersons.FirstOrDefault(x => x.refsid == id));
}
List<int> toRemove = new List<int>();
foreach (var address in list.KasPersons)
{
try
{
if (address.PersonError.errors.Contains(AddressCheck.ErrorTypes.NoPLZorPPLZ))
{
toRemove.Add(address.id);
}
else if (address.PersonError.errors.Contains(AddressCheck.ErrorTypes.PlzNotUsable) &&
address.PersonError.errors.Contains(AddressCheck.ErrorTypes.PPlzNotUsable))
{
toRemove.Add(address.id);
} else if (address.PersonError.errors.Contains(AddressCheck.ErrorTypes.PlzNotUsable) &&
address.PersonError.warnings.Contains(AddressCheck.WarningTypes.NoPPLZ))
{
toRemove.Add(address.id);
}
else if (address.PersonError.errors.Contains(AddressCheck.ErrorTypes.PPlzNotUsable) &&
address.PersonError.warnings.Contains(AddressCheck.WarningTypes.NoPLZ))
{
toRemove.Add(address.id);
}
}
catch
{
Console.WriteLine("PersonError not accessible: " + address.id);
}
}
// delete doubled addresses by refsid
foreach (int id in toRemove)
{
// does this remove both of the doubled addresses?
list.KasPersons.Remove(list.KasPersons.Find(x => x.id == id));
}
//return null;
} }
} }
+161 -222
View File
@@ -26,48 +26,28 @@ public class CombineAddresses
public async Task<(KasAddressList, KasAddressList)> Perform(List<KasAddressList> address_lists, string type, CombineType comb_type, public async Task<(KasAddressList, KasAddressList)> Perform(List<KasAddressList> address_lists, string type, CombineType comb_type,
bool? exportUnused, bool? deleteOld) bool? exportUnused, bool? deleteOld)
{ {
try var result = await Execute(address_lists,type,comb_type,exportUnused);
if (deleteOld == true)
{ {
var result = await Execute(address_lists,type,comb_type,exportUnused); foreach (var list in address_lists)
{
if (deleteOld == true) Settings._instance.addressSets.addresses.Remove(list);
{ }
foreach (var list in address_lists)
{
Settings._instance.addressSets.addresses.Remove(list);
}
}
return result;
}
catch (Exception ex)
{
Logger.Log($"Error while performing address combining: {ex.Message}", Logger.LogType.Error);
} }
return (null,null); return result;
} }
private async Task<(KasAddressList, KasAddressList)> Execute(List<KasAddressList> address_lists, string type, CombineType comb_type, private async Task<(KasAddressList, KasAddressList)> Execute(List<KasAddressList> address_lists, string type, CombineType comb_type,
bool? exportUnused) bool? exportUnused)
{ {
try if (type == "difference") return await Difference(address_lists, comb_type, exportUnused);
{ if (type == "union") return await Union(address_lists, comb_type, exportUnused);
if (type == "difference") return await Difference(address_lists, comb_type, exportUnused); if (type == "intersection") return await Intersection(address_lists, comb_type, exportUnused);
if (type == "union") return await Union(address_lists, comb_type, exportUnused); if (type == "symdiff") return await SymmetricDifference(address_lists, comb_type, exportUnused);
if (type == "intersection") return await Intersection(address_lists, comb_type, exportUnused); return (null, null);
if (type == "symdiff") return await SymmetricDifference(address_lists, comb_type, exportUnused);
return (null, null);
}
catch (Exception ex)
{
Logger.Log($"Error while executing address combining: {ex.Message}", Logger.LogType.Error);
}
return (null,null);
} }
@@ -80,7 +60,6 @@ public class CombineAddresses
/// <returns></returns> /// <returns></returns>
public bool CompareAddresses(KasPerson first, KasPerson second, CombineType comb_type) public bool CompareAddresses(KasPerson first, KasPerson second, CombineType comb_type)
{ {
// A refsid of 0 means "missing", so it must not collapse unrelated entries. // A refsid of 0 means "missing", so it must not collapse unrelated entries.
if(comb_type == CombineType.refsid) if(comb_type == CombineType.refsid)
if (first.refsid != 0 && second.refsid != 0 && first.refsid == second.refsid) return true; if (first.refsid != 0 && second.refsid != 0 && first.refsid == second.refsid) return true;
@@ -117,101 +96,81 @@ public class CombineAddresses
bool? return_unused, bool? return_unused,
Progress? progress = null) Progress? progress = null)
{ {
try if (address_lists == null || address_lists.Count == 0)
return (new KasAddressList(await KasAddressList.GenerateName("difference")), null);
progress ??= new Progress
{ {
if (address_lists == null || address_lists.Count == 0) TotalPersons = address_lists.Sum(l => l.KasPersons.Count),
return (new KasAddressList(await KasAddressList.GenerateName("difference")), null); ComparedPersons = 0
};
progress ??= new Progress
{ // Vereinigung aller Listen außer der ersten
TotalPersons = address_lists.Sum(l => l.KasPersons.Count), var restUnion = new List<KasPerson>();
ComparedPersons = 0 for (var i = 1; i < address_lists.Count; i++)
}; restUnion.AddRange(address_lists[i].KasPersons);
var result = new KasAddressList(await KasAddressList.GenerateName("difference"));
// Vereinigung aller Listen außer der ersten var second_result = new KasAddressList("none");
var restUnion = new List<KasPerson>(); if(return_unused == true)
for (var i = 1; i < address_lists.Count; i++) second_result = new KasAddressList(await KasAddressList.GenerateName("difference_rest", false));
restUnion.AddRange(address_lists[i].KasPersons);
var result = new KasAddressList(await KasAddressList.GenerateName("difference")); foreach (var person in address_lists[0].KasPersons)
var second_result = new KasAddressList("none");
if(return_unused == true)
second_result = new KasAddressList(await KasAddressList.GenerateName("difference_rest", false));
foreach (var person in address_lists[0].KasPersons)
{
var isDouble = restUnion.Any(p => CompareAddresses(person, p, comb_type));
if (!isDouble)
result.KasPersons.Add(person);
else
second_result.KasPersons.Add(person);
progress.Increment();
if (progress.LogAction == null) continue;
var logMessage =
$"Person mit id {person.id} verglichen mit {restUnion.Count} Personen des Restes.";
await Dispatcher.UIThread.InvokeAsync(() => progress.LogAction?.Invoke(logMessage));
}
if (return_unused == true) return (result, second_result);
return (result, null);
}
catch (Exception ex)
{ {
Logger.Log($"Error while performing difference-combining: {ex.Message}", Logger.LogType.Error); var isDouble = restUnion.Any(p => CompareAddresses(person, p, comb_type));
if (!isDouble)
result.KasPersons.Add(person);
else
second_result.KasPersons.Add(person);
progress.Increment();
if (progress.LogAction == null) continue;
var logMessage =
$"Person mit id {person.id} verglichen mit {restUnion.Count} Personen des Restes.";
await Dispatcher.UIThread.InvokeAsync(() => progress.LogAction?.Invoke(logMessage));
} }
return (null,null); if (return_unused == true) return (result, second_result);
return (result, null);
} }
public async Task<(KasAddressList, KasAddressList)> Union(List<KasAddressList> address_lists, CombineType comb_type, bool? return_unused, public async Task<(KasAddressList, KasAddressList)> Union(List<KasAddressList> address_lists, CombineType comb_type, bool? return_unused,
Progress progress = null) Progress progress = null)
{ {
try var result = new KasAddressList(await KasAddressList.GenerateName("union"));
{ var second_result = new KasAddressList("none");
var result = new KasAddressList(await KasAddressList.GenerateName("union")); if(return_unused == true)
var second_result = new KasAddressList("none"); second_result = new KasAddressList(await KasAddressList.GenerateName("union_rest", false));
if(return_unused == true)
second_result = new KasAddressList(await KasAddressList.GenerateName("union_rest", false)); if (address_lists == null || address_lists.Count == 0)
if (address_lists == null || address_lists.Count == 0)
return (result, null);
var total = address_lists.Sum(l => l.KasPersons.Count);
var processed = 0;
foreach (var list in address_lists)
foreach (var person in list.KasPersons)
{
if (!result.KasPersons.Any(existing => CompareAddresses(existing, person, comb_type)))
result.KasPersons.Add(person);
else
second_result.KasPersons.Add(person);
processed++;
var percent = processed / (double)total * 100;
var logMessage =
$"{percent:F1}%: Person mit {person.id} hinzugefügt (aktuell {result.KasPersons.Count} Einträge)";
if (progress == null) continue;
if (Dispatcher.UIThread.CheckAccess())
progress.LogAction?.Invoke(logMessage);
else
Dispatcher.UIThread.Post(() => progress.LogAction?.Invoke(logMessage));
}
if (return_unused == true) return (result, second_result);
return (result, null); return (result, null);
}
catch (Exception ex) var total = address_lists.Sum(l => l.KasPersons.Count);
var processed = 0;
foreach (var list in address_lists)
foreach (var person in list.KasPersons)
{ {
Logger.Log($"Error while performing union-combining: {ex.Message}", Logger.LogType.Error); if (!result.KasPersons.Any(existing => CompareAddresses(existing, person, comb_type)))
result.KasPersons.Add(person);
else
second_result.KasPersons.Add(person);
processed++;
var percent = processed / (double)total * 100;
var logMessage =
$"{percent:F1}%: Person mit {person.id} hinzugefügt (aktuell {result.KasPersons.Count} Einträge)";
if (progress == null) continue;
if (Dispatcher.UIThread.CheckAccess())
progress.LogAction?.Invoke(logMessage);
else
Dispatcher.UIThread.Post(() => progress.LogAction?.Invoke(logMessage));
} }
return (null,null); if (return_unused == true) return (result, second_result);
return (result, null);
} }
@@ -223,127 +182,107 @@ public class CombineAddresses
public async Task<(KasAddressList, KasAddressList)> Intersection(List<KasAddressList> address_lists, CombineType comb_type, public async Task<(KasAddressList, KasAddressList)> Intersection(List<KasAddressList> address_lists, CombineType comb_type,
bool? return_unused, Progress progress = null) bool? return_unused, Progress progress = null)
{ {
try var result = new KasAddressList(await KasAddressList.GenerateName("intersection"));
{ var second_result = new KasAddressList("none");
var result = new KasAddressList(await KasAddressList.GenerateName("intersection")); if(return_unused == true) second_result = new KasAddressList(await KasAddressList.GenerateName("intersection_rest", false));
var second_result = new KasAddressList("none");
if(return_unused == true) second_result = new KasAddressList(await KasAddressList.GenerateName("intersection_rest", false)); if (address_lists == null || address_lists.Count == 0)
if (address_lists == null || address_lists.Count == 0)
return (result, null);
// Nur die erste Liste als Ausgangspunkt verwenden
var baseList = address_lists[0];
var otherLists = address_lists.Skip(1).ToList();
var total = baseList.KasPersons.Count;
var processed = 0;
foreach (var person in baseList.KasPersons)
{
// Prüfen, ob Person in *allen* anderen Listen vorkommt
var isInAll = otherLists.All(list =>
list.KasPersons.Any(existing => CompareAddresses(existing, person, comb_type)));
if (isInAll)
result.KasPersons.Add(person);
else
second_result.KasPersons.Add(person);
processed++;
var percent = processed / (double)total * 100;
var logMessage =
$"{percent:F1}%: Person mit {person.id} geprüft {(isInAll ? "in allen enthalten" : "nicht überall vorhanden")}";
// Sicher und nicht blockierend loggen
if (progress != null)
{
if (Dispatcher.UIThread.CheckAccess())
progress.LogAction?.Invoke(logMessage);
else
Dispatcher.UIThread.Post(() => progress.LogAction?.Invoke(logMessage));
}
}
if (return_unused == true) return (result, second_result);
return (result, null); return (result, null);
}
catch (Exception ex) // Nur die erste Liste als Ausgangspunkt verwenden
var baseList = address_lists[0];
var otherLists = address_lists.Skip(1).ToList();
var total = baseList.KasPersons.Count;
var processed = 0;
foreach (var person in baseList.KasPersons)
{ {
Logger.Log($"Error while performing intersection-combining: {ex.Message}", Logger.LogType.Error); // Prüfen, ob Person in *allen* anderen Listen vorkommt
var isInAll = otherLists.All(list =>
list.KasPersons.Any(existing => CompareAddresses(existing, person, comb_type)));
if (isInAll)
result.KasPersons.Add(person);
else
second_result.KasPersons.Add(person);
processed++;
var percent = processed / (double)total * 100;
var logMessage =
$"{percent:F1}%: Person mit {person.id} geprüft {(isInAll ? "in allen enthalten" : "nicht überall vorhanden")}";
// Sicher und nicht blockierend loggen
if (progress != null)
{
if (Dispatcher.UIThread.CheckAccess())
progress.LogAction?.Invoke(logMessage);
else
Dispatcher.UIThread.Post(() => progress.LogAction?.Invoke(logMessage));
}
} }
return (null,null); if (return_unused == true) return (result, second_result);
return (result, null);
} }
public async Task<(KasAddressList, KasAddressList)> SymmetricDifference(List<KasAddressList> address_lists, CombineType comb_type, public async Task<(KasAddressList, KasAddressList)> SymmetricDifference(List<KasAddressList> address_lists, CombineType comb_type,
bool? return_unused, Progress progress = null) bool? return_unused, Progress progress = null)
{ {
try var result = new KasAddressList(await KasAddressList.GenerateName("symmetric_difference"));
{ var second_result = new KasAddressList("none");
var result = new KasAddressList(await KasAddressList.GenerateName("symmetric_difference")); if(return_unused == true) second_result = new KasAddressList(await KasAddressList.GenerateName("symmetric_rest", false));
var second_result = new KasAddressList("none");
if(return_unused == true) second_result = new KasAddressList(await KasAddressList.GenerateName("symmetric_rest", false)); if (address_lists == null || address_lists.Count == 0)
if (address_lists == null || address_lists.Count == 0)
return (result, null);
var total = address_lists.Sum(l => l.KasPersons.Count);
var processed = 0;
// Wir sammeln alle Personen + zählen, wie oft sie vorkommen
var allPersons = new List<(KasPerson person, int count)>();
foreach (var list in address_lists)
foreach (var person in list.KasPersons)
{
// Prüfen, ob schon vorhanden
var existing = allPersons.FirstOrDefault(p => CompareAddresses(p.person, person, comb_type));
if (existing.person != null)
{
// Falls schon drin → Vorkommen erhöhen
var index = allPersons.IndexOf(existing);
allPersons[index] = (existing.person, existing.count + 1);
}
else
{
// Neu hinzufügen
allPersons.Add((person, 1));
}
processed++;
var percent = processed / (double)total * 100;
var logMessage =
$"{percent:F1}%: Person mit {person.id} verarbeitet (Zwischengröße {allPersons.Count})";
if (progress != null)
{
if (Dispatcher.UIThread.CheckAccess())
progress.LogAction?.Invoke(logMessage);
else
Dispatcher.UIThread.Post(() => progress.LogAction?.Invoke(logMessage));
}
}
// Nur diejenigen übernehmen, die *genau einmal* vorkamen
foreach (var (person, count) in allPersons)
if (count == 1)
result.KasPersons.Add(person);
else
second_result.KasPersons.Add(person);
if (return_unused == true) return (result, second_result);
return (result, null); return (result, null);
}
catch (Exception ex) var total = address_lists.Sum(l => l.KasPersons.Count);
var processed = 0;
// Wir sammeln alle Personen + zählen, wie oft sie vorkommen
var allPersons = new List<(KasPerson person, int count)>();
foreach (var list in address_lists)
foreach (var person in list.KasPersons)
{ {
Logger.Log($"Error while performing symdiff-combining: {ex.Message}", Logger.LogType.Error); // Prüfen, ob schon vorhanden
var existing = allPersons.FirstOrDefault(p => CompareAddresses(p.person, person, comb_type));
if (existing.person != null)
{
// Falls schon drin → Vorkommen erhöhen
var index = allPersons.IndexOf(existing);
allPersons[index] = (existing.person, existing.count + 1);
}
else
{
// Neu hinzufügen
allPersons.Add((person, 1));
}
processed++;
var percent = processed / (double)total * 100;
var logMessage =
$"{percent:F1}%: Person mit {person.id} verarbeitet (Zwischengröße {allPersons.Count})";
if (progress != null)
{
if (Dispatcher.UIThread.CheckAccess())
progress.LogAction?.Invoke(logMessage);
else
Dispatcher.UIThread.Post(() => progress.LogAction?.Invoke(logMessage));
}
} }
return (null,null); // Nur diejenigen übernehmen, die *genau einmal* vorkamen
foreach (var (person, count) in allPersons)
if (count == 1)
result.KasPersons.Add(person);
else
second_result.KasPersons.Add(person);
if (return_unused == true) return (result, second_result);
return (result, null);
} }
} }
+66
View File
@@ -104,7 +104,17 @@ public class PdfBuilder
addresses.Add(addr); addresses.Add(addr);
} }
if (addresses.Count == 0)
{
MessageBox.Show(MainWindow._instance, "Keine validen Adressen konnten generiert werden. Abbruch.", "Fehler");
return;
}
CreateAddressLabelPdfWithPlaceholder(addresses, placeholderText, outputPath); CreateAddressLabelPdfWithPlaceholder(addresses, placeholderText, outputPath);
if (_settings.exportRunningSheets)
{
ExportRunningSheets(addressSetId, outputPath);
}
} }
/// <summary> /// <summary>
@@ -387,4 +397,60 @@ public class PdfBuilder
if (left < 0 || top < 0 || right < 0 || bottom < 0) if (left < 0 || top < 0 || right < 0 || bottom < 0)
throw new ArgumentException("Margins cannot be negative"); throw new ArgumentException("Margins cannot be negative");
} }
public void ExportRunningSheets(int setID, string path)
{
if (path.EndsWith(".pdf"))
{
path = path.Substring(0, path.Length - 4);
path = path + "-Laufzettel.pdf";
}
else
{
path = path + "-Laufzettel.pdf";
}
CreateRunningSheets(setID, path);
}
public void CreateRunningSheets(int setID, string path)
{
KasAddressList list = Settings._instance.addressSets.GetAddressSetByID(setID);
var document = new PdfDocument();
document.Info.Title = $"Laufzettel für {list.Name}";
document.Info.Subject = "powered by logofclient";
document.Info.Author = "logofclient";
int margin = 50;
List<(int, int)> grouped_nums = GroupAddresses(setID);
var page = document.AddPage();
page.Size = PageSize.A4;
var gfx = XGraphics.FromPdfPage(page);
var width = page.Width.Point-margin;
var height = page.Height.Point-margin;
gfx.DrawLine(XPens.Black, margin, margin, margin, height);
gfx.DrawLine(XPens.Black, margin, margin, width, margin);
gfx.DrawLine(XPens.Black, width, margin, margin, height);
gfx.DrawLine(XPens.Black, margin, height, width, margin);
var font = new XFont("Times New Roman", 20, XFontStyleEx.BoldItalic);
gfx.DrawString($"Versand {list.Name}", font, XBrushes.Black,
new XRect(0, 0, page.Width.Point, page.Height.Point), XStringFormats.Center);
document.Save(path);
}
public List<(int, int)> GroupAddresses(int setID)
{
return null;
}
} }