6 Commits

19 changed files with 1721 additions and 1941 deletions
+20 -17
View File
@@ -12,8 +12,8 @@ public class Settings
public Customers customers = new(); public Customers customers = new();
public PdfExportSettings pdfExport { get; set; } = new(); public PdfExportSettings pdfExport { get; set; } = new();
// public string settingsPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), public string settingsPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
// "logofclient", "config.json"); "logofclient", "config.json");
public Settings() public Settings()
{ {
@@ -23,29 +23,31 @@ public class Settings
public static void Save() public static void Save()
{ {
if (!Directory.Exists(Global._instance.config_path)) if (!Directory.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"logofclient")))
Directory.CreateDirectory(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Directory.CreateDirectory(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"logofclient")); "logofclient"));
// if (!string.IsNullOrEmpty(Global._instance.config_path)) _instance.settingsPath = Global._instance.config_path; if (!string.IsNullOrEmpty(Global._instance.config_path)) _instance.settingsPath = Global._instance.config_path;
var json = JsonConvert.SerializeObject(_instance); var json = JsonConvert.SerializeObject(_instance);
File.WriteAllText(Path.Combine(Global._instance.config_path,"config.json"), json); File.WriteAllText(_instance.settingsPath, json);
} }
public static void Load() public static void Load()
{ {
//if (!string.IsNullOrEmpty(Global._instance.config_path)) _instance.settingsPath = Global._instance.config_path; if (!string.IsNullOrEmpty(Global._instance.config_path)) _instance.settingsPath = Global._instance.config_path;
try try
{ {
var contents = File.ReadAllText(Path.Combine(Global._instance.config_path, "config.json")); var contents = File.ReadAllText(_instance.settingsPath);
_instance = JsonConvert.DeserializeObject<Settings>(contents); _instance = JsonConvert.DeserializeObject<Settings>(contents);
MainWindow._instance.RefreshCustomerItems(); MainWindow._instance.RefreshCustomerItems();
} }
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();
} }
} }
@@ -68,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
@@ -79,15 +84,11 @@ public class Global
_instance = this; _instance = this;
} }
public string config_path { get; } = Path.Combine( public string config_path { get; set; } = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"logofclient"); "logofclient",
"config.json");
public void SetConfigPath(string path)
{
Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData));
}
public string wiki_storage_path { get; set; } = Path.Combine( public string wiki_storage_path { get; set; } = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"logofclient", "logofclient",
@@ -125,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
}
}
+10 -1
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">
@@ -389,7 +398,7 @@
<StackPanel Grid.Column="1" Orientation="Vertical" Spacing="5"> <StackPanel Grid.Column="1" Orientation="Vertical" Spacing="5">
<StackPanel Orientation="Horizontal" Spacing="5"> <StackPanel Orientation="Horizontal" Spacing="5">
<TextBox x:Name="TbConfigPath" HorizontalAlignment="Stretch" <TextBox x:Name="TbConfigPath" HorizontalAlignment="Stretch"
Watermark="/home/username/.config/logofclient/" /> Watermark="/home/username/.config/logofclient/config.json" />
<Button x:Name="BtnConfigPath" HorizontalAlignment="Right"> <Button x:Name="BtnConfigPath" HorizontalAlignment="Right">
<Button.Content> <Button.Content>
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
+63 -149
View File
@@ -24,9 +24,6 @@ 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();
@@ -35,7 +32,6 @@ public partial class MainWindow : Window
_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);
@@ -129,6 +121,23 @@ public partial class MainWindow : Window
//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,9 +232,9 @@ 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 });
} }
@@ -240,8 +249,6 @@ 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 roots = _wikiService.GetRootItems();
var nodes = new List<TreeViewItem>(); var nodes = new List<TreeViewItem>();
@@ -255,10 +262,6 @@ public partial class MainWindow : Window
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)
@@ -272,8 +275,6 @@ public partial class MainWindow : Window
} }
private string GetSelectedWikiTargetDirectory() private string GetSelectedWikiTargetDirectory()
{
try
{ {
var wikiRoot = Global._instance.wiki_storage_path; var wikiRoot = Global._instance.wiki_storage_path;
if (NavTree.SelectedItem is TreeViewItem treeItem && treeItem.Tag is WikiItem selectedItem) if (NavTree.SelectedItem is TreeViewItem treeItem && treeItem.Tag is WikiItem selectedItem)
@@ -283,13 +284,8 @@ public partial class MainWindow : Window
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);
} }
} }
@@ -401,8 +396,8 @@ public partial class MainWindow : Window
if (folder == null || folder.Count == 0) return; if (folder == null || folder.Count == 0) return;
var chosen = folder[0].Path; var chosen = folder[0].Path;
Global._instance.SetConfigPath(chosen.ToString()); TbConfigPath.Text = chosen.ToString();
TbConfigPath.Text = Global._instance.config_path; Global._instance.config_path = chosen.ToString();
Global.Save(); Global.Save();
MessageBox.Show(this, "Bitte starten Sie das Programm neu, um die Änderungen wirksam zu machen.", "Achtung"); MessageBox.Show(this, "Bitte starten Sie das Programm neu, um die Änderungen wirksam zu machen.", "Achtung");
@@ -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; if (LstSettingsCustomers.SelectedIndex == null || LstSettingsCustomers.SelectedIndex == -1) return;
foreach (var customer in Settings._instance.customers.customers) foreach (var customer in Settings._instance.customers.customers)
if (customer.ID == Settings._instance.customers.current.ID) if (customer.ID == Settings._instance.customers.current.ID)
customer.description = TbSettingsCustomerDescription.Text; customer.description = TbSettingsCustomerDescription.Text;
} catch (Exception ex)
{
Logger.Log($"Error while changing customer description: {ex.Message}", Logger.LogType.Error);
}
//Settings.Save(); //Settings.Save();
} }
@@ -558,8 +544,6 @@ 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(); MakeCalcManVisible();
var opts = new FilePickerOpenOptions(); var opts = new FilePickerOpenOptions();
@@ -618,13 +602,6 @@ public partial class MainWindow : Window
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)
@@ -669,8 +646,6 @@ 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;
@@ -697,11 +672,6 @@ public partial class MainWindow : Window
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)
@@ -805,72 +773,36 @@ 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(); SavePdfExportOptions();
var saveDialog = new SaveFileDialog var saveDialog = new SaveFileDialog
{ {
DefaultExtension = "pdf", DefaultExtension = "pdf",
Filters = Filters = { new FileDialogFilter { Name = "PDF-Dateien", Extensions = { "pdf" } } }
{
new FileDialogFilter
{
Name = "PDF-Dateien",
Extensions = { "pdf" }
}
}
}; };
var filePath = await saveDialog.ShowAsync(this); var filePath = await saveDialog.ShowAsync(this);
Console.WriteLine($"RAW: {filePath}"); if (!string.IsNullOrEmpty(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); var builder = new PdfBuilder(Settings._instance.pdfExport);
builder.CreateAddressLabelPdfFromAddressSetWithPlaceholder( builder.CreateAddressLabelPdfFromAddressSetWithPlaceholder((
((KasAddressList)LstCustomerAdressSets.SelectedItem).ID, (KasAddressList)LstCustomerAdressSets.SelectedItem).ID,
"Company Logo/Info", "Company Logo/Info",
filePath filePath
); );
//return true;
Console.WriteLine("PDF OK");
}
}
catch (Exception ex)
{
Logger.Log($"Error while generating labels: {ex.Message}", Logger.LogType.Error);
} }
} }
private void HookPdfExportOptionEvents() private void HookPdfExportOptionEvents()
{
try
{ {
var controls = GetPdfExportControls(); var controls = GetPdfExportControls();
foreach (var control in controls) control.ValueChanged += PdfExportOption_OnValueChanged; 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();
@@ -889,12 +821,6 @@ public partial class MainWindow : Window
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]
.ToString());
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(); Settings.Save();
RefreshAddressSetListItems(cus_id); 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!);
} }
} }
-24
View File
@@ -28,10 +28,6 @@ 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 // Filter to only show persons with errors
var result_with_errors = result.Where(p => p.PersonError != null).ToList(); var result_with_errors = result.Where(p => p.PersonError != null).ToList();
LblResultCount.Content = $"{result_with_errors.Count}/{ur_result.Count} Ergebnisse"; LblResultCount.Content = $"{result_with_errors.Count}/{ur_result.Count} Ergebnisse";
@@ -43,11 +39,6 @@ public partial class ResultWindow : Window
// StkResults.Children.Clear(); // StkResults.Children.Clear();
// foreach (var person in result_with_errors) StkResults.Children.Add(CreatePersonGrid(person)); // 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)
{ {
@@ -114,8 +105,6 @@ 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 knownErrors = new List<AddressCheck.ErrorTypes>();
var knownWarnings = new List<AddressCheck.WarningTypes>(); var knownWarnings = new List<AddressCheck.WarningTypes>();
@@ -156,20 +145,12 @@ public partial class ResultWindow : Window
GenerateView(result); GenerateView(result);
} }
catch (Exception ex)
{
Logger.Log("Error while showing naming window: " + ex.Message, Logger.LogType.Warning);
}
}
private void BtnUpdateFilter_OnClick(object? sender, RoutedEventArgs e) private void BtnUpdateFilter_OnClick(object? sender, RoutedEventArgs e)
{ {
} }
private void UpdateFilter() private void UpdateFilter()
{
try
{ {
var temp_result = new List<KasPerson>(); var temp_result = new List<KasPerson>();
@@ -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);
}
} }
+2 -15
View File
@@ -38,8 +38,6 @@ 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 // Find the index of the address set with the given id
var adset_index = -1; var adset_index = -1;
@@ -240,8 +238,7 @@ public class AddressCheck
// Directly set PersonError in the address set // Directly set PersonError in the address set
var person_index = adset.KasPersons.IndexOf(person); var person_index = adset.KasPersons.IndexOf(person);
if (person_index >= 0) if (person_index >= 0)
Settings._instance.addressSets.addresses[adset_index].KasPersons[person_index] Settings._instance.addressSets.addresses[adset_index].KasPersons[person_index].PersonError =
.PersonError =
new KasPersonError((errors, warnings)); new KasPersonError((errors, warnings));
} }
@@ -251,8 +248,7 @@ public class AddressCheck
await Dispatcher.UIThread.InvokeAsync(() => await Dispatcher.UIThread.InvokeAsync(() =>
{ {
if (hasFaults) if (hasFaults)
_progress.AddToLog($"Person mit id {person.id} ist fehlerhaft", _progress.AddToLog($"Person mit id {person.id} ist fehlerhaft", Convert.ToInt32(percent).ToString());
Convert.ToInt32(percent).ToString());
_progress.ChangePercentage(percent); _progress.ChangePercentage(percent);
}); });
@@ -265,14 +261,5 @@ public class AddressCheck
return Settings._instance.addressSets.addresses[adset_index].KasPersons return Settings._instance.addressSets.addresses[adset_index].KasPersons
.Where(p => p.PersonError != null) .Where(p => p.PersonError != null)
.ToList(); .ToList();
} }
catch (Exception ex)
{
Logger.Log($"Error while performing address check: {ex.Message}", Logger.LogType.Error);
}
return null;
}
} }
+1 -29
View File
@@ -43,8 +43,7 @@ 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 // find the address
KasPerson? address = null; KasPerson? address = null;
var string_address = ""; var string_address = "";
@@ -198,18 +197,9 @@ public static class AddressCreator
if (address_line_count > 1) return string_address; if (address_line_count > 1) return string_address;
return null; return null;
} }
catch (Exception ex)
{
Logger.Log($"Error while creating markdown string: {ex.Message}", Logger.LogType.Error);
}
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(" ", return string.Join(" ",
@@ -225,14 +215,6 @@ public static class AddressCreator
) )
+ (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;
}
/// <summary> /// <summary>
/// Returns true if a plz (or pplz) is valid /// Returns true if a plz (or pplz) is valid
@@ -241,8 +223,6 @@ public static class AddressCreator
/// <param name="land">country, to check the plz</param> /// <param name="land">country, to check the plz</param>
/// <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;
@@ -269,12 +249,4 @@ public static class AddressCreator
// For non-German countries, accept any non-empty postal code // For non-German countries, accept any non-empty postal code
return true; return true;
} }
catch (Exception ex)
{
Logger.Log($"Error while performing address plz check: {ex.Message}", Logger.LogType.Error);
}
return false;
}
} }
-22
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
{ {
@@ -58,8 +57,6 @@ public class AddressPatch
public bool has_funktionad { get; set; } public bool has_funktionad { get; set; }
public static AddressPatch Import(Uri filename) public static AddressPatch Import(Uri filename)
{
try
{ {
var patch = new AddressPatch(); var patch = new AddressPatch();
@@ -95,20 +92,9 @@ public class AddressPatch
return patch; return patch;
} }
catch (Exception ex)
{
Logger.Log($"Error while importing address patch: {ex.Message}", Logger.LogType.Error);
}
return null;
}
public override string ToString() public override string ToString()
{
try
{ {
var properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance); var properties = GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
var stringProps = properties.Where(p => p.PropertyType == typeof(string) && p.Name.EndsWith("_is")); var stringProps = properties.Where(p => p.PropertyType == typeof(string) && p.Name.EndsWith("_is"));
@@ -129,12 +115,4 @@ public class AddressPatch
return lines.ToString().TrimEnd(); return lines.ToString().TrimEnd();
} }
catch (Exception ex)
{
Logger.Log($"Error while parsing: {ex.Message}", Logger.LogType.Error);
}
return "Error while parsing";
}
} }
+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;
} }
+2 -7
View File
@@ -12,8 +12,7 @@ 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>(); List<int> doubled_ids = new List<int>();
for (int i = 0; i < list.KasPersons.Count; i++) for (int i = 0; i < list.KasPersons.Count; i++)
{ {
@@ -74,11 +73,7 @@ public class AddressShortener(ProgressWindow progressWindow)
// does this remove both of the doubled addresses? // does this remove both of the doubled addresses?
list.KasPersons.Remove(list.KasPersons.Find(x => x.id == id)); 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);
}
//return null;
} }
} }
-61
View File
@@ -25,8 +25,6 @@ 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); var result = await Execute(address_lists,type,comb_type,exportUnused);
@@ -39,21 +37,11 @@ public class CombineAddresses
} }
return result; return result;
}
catch (Exception ex)
{
Logger.Log($"Error while performing address combining: {ex.Message}", Logger.LogType.Error);
}
return (null,null);
} }
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 == "difference") return await Difference(address_lists, comb_type, exportUnused);
if (type == "union") return await Union(address_lists, comb_type, exportUnused); if (type == "union") return await Union(address_lists, comb_type, exportUnused);
@@ -61,14 +49,6 @@ public class CombineAddresses
if (type == "symdiff") return await SymmetricDifference(address_lists, comb_type, exportUnused); if (type == "symdiff") return await SymmetricDifference(address_lists, comb_type, exportUnused);
return (null, null); return (null, null);
} }
catch (Exception ex)
{
Logger.Log($"Error while executing address combining: {ex.Message}", Logger.LogType.Error);
}
return (null,null);
}
/// <summary> /// <summary>
@@ -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;
@@ -116,8 +95,6 @@ public class CombineAddresses
public async Task<(KasAddressList, KasAddressList)> Difference(List<KasAddressList> address_lists, CombineType comb_type, public async Task<(KasAddressList, KasAddressList)> Difference(List<KasAddressList> address_lists, CombineType comb_type,
bool? return_unused, bool? return_unused,
Progress? progress = null) Progress? progress = null)
{
try
{ {
if (address_lists == null || address_lists.Count == 0) if (address_lists == null || address_lists.Count == 0)
return (new KasAddressList(await KasAddressList.GenerateName("difference")), null); return (new KasAddressList(await KasAddressList.GenerateName("difference")), null);
@@ -156,20 +133,10 @@ public class CombineAddresses
if (return_unused == true) return (result, second_result); if (return_unused == true) return (result, second_result);
return (result, null); return (result, null);
} }
catch (Exception ex)
{
Logger.Log($"Error while performing difference-combining: {ex.Message}", Logger.LogType.Error);
}
return (null,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 result = new KasAddressList(await KasAddressList.GenerateName("union"));
var second_result = new KasAddressList("none"); var second_result = new KasAddressList("none");
@@ -205,14 +172,6 @@ public class CombineAddresses
if (return_unused == true) return (result, second_result); if (return_unused == true) return (result, second_result);
return (result, null); return (result, null);
} }
catch (Exception ex)
{
Logger.Log($"Error while performing union-combining: {ex.Message}", Logger.LogType.Error);
}
return (null,null);
}
public async Task<KasAddressList> MoveDuplicatesToNew() public async Task<KasAddressList> MoveDuplicatesToNew()
@@ -222,8 +181,6 @@ 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 result = new KasAddressList(await KasAddressList.GenerateName("intersection"));
var second_result = new KasAddressList("none"); var second_result = new KasAddressList("none");
@@ -268,20 +225,10 @@ public class CombineAddresses
if (return_unused == true) return (result, second_result); if (return_unused == true) return (result, second_result);
return (result, null); return (result, null);
} }
catch (Exception ex)
{
Logger.Log($"Error while performing intersection-combining: {ex.Message}", Logger.LogType.Error);
}
return (null,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 result = new KasAddressList(await KasAddressList.GenerateName("symmetric_difference"));
var second_result = new KasAddressList("none"); var second_result = new KasAddressList("none");
@@ -337,14 +284,6 @@ public class CombineAddresses
if (return_unused == true) return (result, second_result); if (return_unused == true) return (result, second_result);
return (result, null); return (result, null);
} }
catch (Exception ex)
{
Logger.Log($"Error while performing symdiff-combining: {ex.Message}", Logger.LogType.Error);
}
return (null,null);
}
} }
-11
View File
@@ -1,4 +1,3 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
@@ -65,8 +64,6 @@ public class CsvBuilder
} }
private string EscapeCsvField(string? value) private string EscapeCsvField(string? value)
{
try
{ {
var field = value ?? string.Empty; var field = value ?? string.Empty;
var mustQuote = field.Contains(Separator) || field.Contains('"') || field.Contains('\r') || field.Contains('\n'); var mustQuote = field.Contains(Separator) || field.Contains('"') || field.Contains('\r') || field.Contains('\n');
@@ -75,12 +72,4 @@ public class CsvBuilder
return "\"" + field.Replace("\"", "\"\"") + "\""; return "\"" + field.Replace("\"", "\"\"") + "\"";
} }
catch (Exception ex)
{
Logger.Log($"Error while escapting csv field: {ex.Message}",Logger.LogType.Warning);
}
return "";
}
} }
+2 -29
View File
@@ -19,8 +19,6 @@ public class DataImport
} }
private static async Task<(bool, KasAddressList)> ImportKasAddressListWithoutPatch(Uri pathToCsv, char separator) private static async Task<(bool, KasAddressList)> ImportKasAddressListWithoutPatch(Uri pathToCsv, char separator)
{
try
{ {
if (!File.Exists(pathToCsv.LocalPath)) if (!File.Exists(pathToCsv.LocalPath))
{ {
@@ -85,7 +83,7 @@ public class DataImport
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Log($"Error while creating new kas person (import): {ex.Message}",Logger.LogType.Error); Console.WriteLine($"Error while parsing line: {line} - {ex.Message}");
Console.WriteLine(ex.StackTrace); Console.WriteLine(ex.StackTrace);
return (false, null); return (false, null);
} }
@@ -93,18 +91,9 @@ public class DataImport
return (true, imported); return (true, imported);
} }
catch (Exception ex)
{
Logger.Log($"Error while importing kas address list without patch: {ex.Message}",Logger.LogType.Error);
}
return (false, null);
}
private static async Task<(bool, KasAddressList)> ImportKasAddressListWithPatch(Uri pathToCsv, AddressPatch patch, private static async Task<(bool, KasAddressList)> ImportKasAddressListWithPatch(Uri pathToCsv, AddressPatch patch,
char separator) char separator)
{
try
{ {
if (!File.Exists(pathToCsv.LocalPath)) if (!File.Exists(pathToCsv.LocalPath))
{ {
@@ -228,19 +217,13 @@ public class DataImport
} }
catch (Exception ex) catch (Exception ex)
{ {
Logger.Log($"Error while creating kas person (import, patch): {ex.Message}",Logger.LogType.Error); Console.WriteLine($"Error while parsing line: {line} - {ex.Message}");
Console.WriteLine(ex.StackTrace); Console.WriteLine(ex.StackTrace);
return (false, null); return (false, null);
} }
} }
return (true, imported); return (true, imported);
}
catch (Exception ex)
{
Logger.Log($"Error while importing kas address list with patch: {ex.Message}",Logger.LogType.Error);
}
// int GenerateNewRefsid() // int GenerateNewRefsid()
// { // {
@@ -253,7 +236,6 @@ public class DataImport
// last_refsid = biggest + 1; // last_refsid = biggest + 1;
// return last_refsid; // return last_refsid;
// } // }
return (false, null);
} }
@@ -263,8 +245,6 @@ public class DataImport
} }
private static string[] ParseCsvLine(string line, char separator) private static string[] ParseCsvLine(string line, char separator)
{
try
{ {
var fields = new List<string>(); var fields = new List<string>();
var current = new StringBuilder(); var current = new StringBuilder();
@@ -300,11 +280,4 @@ public class DataImport
fields.Add(current.ToString().Trim()); fields.Add(current.ToString().Trim());
return fields.ToArray(); return fields.ToArray();
} }
catch (Exception ex)
{
Logger.Log($"Error while persing csv line: {ex.Message}",Logger.LogType.Error);
}
return [];
}
} }
+65 -92
View File
@@ -17,8 +17,6 @@ public class PdfBuilder
private readonly XFont _smallFont; private readonly XFont _smallFont;
public PdfBuilder(PdfExportSettings? settings = null) public PdfBuilder(PdfExportSettings? settings = null)
{
try
{ {
EnsureFontResolverRegistered(); EnsureFontResolverRegistered();
_settings = settings ?? new PdfExportSettings(); _settings = settings ?? new PdfExportSettings();
@@ -34,9 +32,8 @@ public class PdfBuilder
chosenFamily = StripStyleSuffix(Path.GetFileNameWithoutExtension(first)) ?? chosenFamily; chosenFamily = StripStyleSuffix(Path.GetFileNameWithoutExtension(first)) ?? chosenFamily;
} }
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while searching for fonts: {ex.Message}",Logger.LogType.Error);
chosenFamily = "Arial"; chosenFamily = "Arial";
} }
@@ -44,32 +41,15 @@ public class PdfBuilder
_regularFont = new XFont(chosenFamily, _settings.fontSize, XFontStyleEx.Regular); _regularFont = new XFont(chosenFamily, _settings.fontSize, XFontStyleEx.Regular);
_smallFont = new XFont(chosenFamily, _settings.smallFontSize, XFontStyleEx.Regular); _smallFont = new XFont(chosenFamily, _settings.smallFontSize, XFontStyleEx.Regular);
} }
catch (Exception ex)
{
Logger.Log($"Error while font resolving: {ex.Message}",Logger.LogType.Error);
}
}
private static void EnsureFontResolverRegistered() private static void EnsureFontResolverRegistered()
{
try
{ {
if (GlobalFontSettings.FontResolver != null) return; if (GlobalFontSettings.FontResolver != null) return;
//var fontsDir = Path.Combine(AppContext.BaseDirectory, "fonts"); //var fontsDir = Path.Combine(AppContext.BaseDirectory, "fonts");
GlobalFontSettings.FontResolver = new StableFontResolver(Global._instance.font_path); GlobalFontSettings.FontResolver = new StableFontResolver(Global._instance.font_path);
} }
catch (Exception ex)
{
Logger.Log($"Error while ensuring font resolver register state: {ex.Message}",Logger.LogType.Error);
}
}
private static string StripStyleSuffix(string name) private static string StripStyleSuffix(string name)
{
try
{ {
if (string.IsNullOrEmpty(name)) return name; if (string.IsNullOrEmpty(name)) return name;
var idx = name.IndexOf('-'); var idx = name.IndexOf('-');
@@ -78,14 +58,6 @@ public class PdfBuilder
return name.Substring(0, idx); return name.Substring(0, idx);
return name; return name;
} }
catch (Exception ex)
{
Logger.Log($"Error while stripping style suffix: {ex.Message}",Logger.LogType.Error);
}
return null;
}
/// <summary> /// <summary>
@@ -96,8 +68,6 @@ public class PdfBuilder
/// <param name="outputPath">Path where the PDF should be saved</param> /// <param name="outputPath">Path where the PDF should be saved</param>
public void CreateAddressLabelPdfFromAddressSetWithPlaceholder(int addressSetId, string placeholderText, public void CreateAddressLabelPdfFromAddressSetWithPlaceholder(int addressSetId, string placeholderText,
string outputPath) string outputPath)
{
try
{ {
// Find the AddressSet by ID // Find the AddressSet by ID
var addressSet = Settings._instance.addressSets.GetAddressSetByID(addressSetId); var addressSet = Settings._instance.addressSets.GetAddressSetByID(addressSetId);
@@ -134,13 +104,17 @@ public class PdfBuilder
addresses.Add(addr); addresses.Add(addr);
} }
CreateAddressLabelPdfWithPlaceholder(addresses, placeholderText, outputPath); if (addresses.Count == 0)
}
catch (Exception ex)
{ {
Logger.Log($"Error while creating address label pdf from address set with placeholder: {ex.Message}",Logger.LogType.Error); MessageBox.Show(MainWindow._instance, "Keine validen Adressen konnten generiert werden. Abbruch.", "Fehler");
return;
} }
CreateAddressLabelPdfWithPlaceholder(addresses, placeholderText, outputPath);
if (_settings.exportRunningSheets)
{
ExportRunningSheets(addressSetId, outputPath);
}
} }
/// <summary> /// <summary>
@@ -150,8 +124,6 @@ public class PdfBuilder
/// <param name="placeholderText">Text for the first cell (top-left)</param> /// <param name="placeholderText">Text for the first cell (top-left)</param>
/// <param name="outputPath">Path where the PDF should be saved</param> /// <param name="outputPath">Path where the PDF should be saved</param>
public void CreateAddressLabelPdfWithPlaceholder(List<string> addresses, string placeholderText, string outputPath) public void CreateAddressLabelPdfWithPlaceholder(List<string> addresses, string placeholderText, string outputPath)
{
try
{ {
if (addresses == null || addresses.Count == 0) if (addresses == null || addresses.Count == 0)
throw new ArgumentException("Addresses array cannot be null or empty"); throw new ArgumentException("Addresses array cannot be null or empty");
@@ -174,12 +146,6 @@ public class PdfBuilder
document.Save(outputPath); document.Save(outputPath);
} }
catch (Exception ex)
{
Logger.Log($"Error while creating address label pdf with placeholder: {ex.Message}",Logger.LogType.Error);
}
}
private void DrawPage(XGraphics gfx, List<string> addresses, ref int addressIndex) private void DrawPage(XGraphics gfx, List<string> addresses, ref int addressIndex)
{ {
@@ -202,8 +168,6 @@ public class PdfBuilder
private void DrawPageWithPlaceholder(XGraphics gfx, List<string> addresses, ref int addressIndex, private void DrawPageWithPlaceholder(XGraphics gfx, List<string> addresses, ref int addressIndex,
ref bool isFirstCell, string placeholderText) ref bool isFirstCell, string placeholderText)
{
try
{ {
for (var row = 0; row < _settings.rowsPerPage; row++) for (var row = 0; row < _settings.rowsPerPage; row++)
for (var col = 0; col < _settings.columnsPerPage; col++) for (var col = 0; col < _settings.columnsPerPage; col++)
@@ -228,16 +192,8 @@ public class PdfBuilder
} }
} }
} }
catch (Exception ex)
{
Logger.Log($"Error while drawing page with placholder: {ex.Message}",Logger.LogType.Error);
}
}
private void DrawCell(XGraphics gfx, double x, double y, string? address) private void DrawCell(XGraphics gfx, double x, double y, string? address)
{
try
{ {
var cellWidthPoints = MmToPoints(GetCellWidthMm()); var cellWidthPoints = MmToPoints(GetCellWidthMm());
var cellHeightPoints = MmToPoints(GetCellHeightMm()); var cellHeightPoints = MmToPoints(GetCellHeightMm());
@@ -249,16 +205,8 @@ public class PdfBuilder
// Draw address content if available // Draw address content if available
if (!string.IsNullOrEmpty(address)) DrawMarkdownText(gfx, address, x, y, cellWidthPoints, cellHeightPoints); if (!string.IsNullOrEmpty(address)) DrawMarkdownText(gfx, address, x, y, cellWidthPoints, cellHeightPoints);
} }
catch (Exception ex)
{
Logger.Log($"Error while drawing cell: {ex.Message}",Logger.LogType.Error);
}
}
private void DrawEmptyCell(XGraphics gfx, double x, double y) private void DrawEmptyCell(XGraphics gfx, double x, double y)
{
try
{ {
var cellWidthPoints = MmToPoints(GetCellWidthMm()); var cellWidthPoints = MmToPoints(GetCellWidthMm());
var cellHeightPoints = MmToPoints(GetCellHeightMm()); var cellHeightPoints = MmToPoints(GetCellHeightMm());
@@ -266,16 +214,8 @@ public class PdfBuilder
var rect = new XRect(x, y, cellWidthPoints, cellHeightPoints); var rect = new XRect(x, y, cellWidthPoints, cellHeightPoints);
gfx.DrawRectangle(XPens.Black, rect); gfx.DrawRectangle(XPens.Black, rect);
} }
catch (Exception ex)
{
Logger.Log($"Error while drawing empty cell: {ex.Message}",Logger.LogType.Error);
}
}
private void DrawMarkdownText(XGraphics gfx, string text, double x, double y, double cellWidth, double cellHeight) private void DrawMarkdownText(XGraphics gfx, string text, double x, double y, double cellWidth, double cellHeight)
{
try
{ {
var paddingLeftPoints = MmToPoints(_settings.cellPaddingLeftMm); var paddingLeftPoints = MmToPoints(_settings.cellPaddingLeftMm);
var paddingRightPoints = MmToPoints(_settings.cellPaddingRightMm); var paddingRightPoints = MmToPoints(_settings.cellPaddingRightMm);
@@ -310,16 +250,8 @@ public class PdfBuilder
currentY += lineHeight; currentY += lineHeight;
} }
} }
catch (Exception ex)
{
Logger.Log($"Error while drawing markdown text: {ex.Message}",Logger.LogType.Error);
}
}
private void DrawLineWithMarkdown(XGraphics gfx, string line, double x, double y, double maxWidth) private void DrawLineWithMarkdown(XGraphics gfx, string line, double x, double y, double maxWidth)
{
try
{ {
if (string.IsNullOrWhiteSpace(line)) return; if (string.IsNullOrWhiteSpace(line)) return;
var currentX = x; var currentX = x;
@@ -409,16 +341,8 @@ public class PdfBuilder
i = textEnd; i = textEnd;
} }
} }
catch (Exception ex)
{
Logger.Log($"Error while drawing markdown line: {ex.Message}",Logger.LogType.Error);
}
}
private string TruncateTextToWidth(XGraphics gfx, string text, XFont font, double maxWidth) private string TruncateTextToWidth(XGraphics gfx, string text, XFont font, double maxWidth)
{
try
{ {
if (string.IsNullOrEmpty(text)) if (string.IsNullOrEmpty(text))
return text; return text;
@@ -433,13 +357,6 @@ public class PdfBuilder
return string.Empty; return string.Empty;
} }
catch (Exception ex)
{
Logger.Log($"Error while truncating text to width: {ex.Message}",Logger.LogType.Error);
}
return null;
}
/// <summary> /// <summary>
/// Converts millimeters to points (1 mm = 2.834645669 points) /// Converts millimeters to points (1 mm = 2.834645669 points)
@@ -480,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;
}
} }
+2 -29
View File
@@ -62,15 +62,13 @@ public class StableFontResolver : IFontResolver
} }
} }
} }
catch (Exception ex) catch
{ {
Logger.Log($"Error while initializing FontResolver: {ex.Message}",Logger.LogType.Error); // ignore resolver init errors
} }
} }
private static string NormalizeStyle(string s) private static string NormalizeStyle(string s)
{
try
{ {
if (string.IsNullOrEmpty(s)) return "Regular"; if (string.IsNullOrEmpty(s)) return "Regular";
s = s.ToLowerInvariant(); s = s.ToLowerInvariant();
@@ -80,17 +78,8 @@ public class StableFontResolver : IFontResolver
if (s.Contains("regular") || s == "r") return "Regular"; if (s.Contains("regular") || s == "r") return "Regular";
return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(s); return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(s);
} }
catch (Exception ex)
{
Logger.Log($"Error while normalizing style: {ex.Message}",Logger.LogType.Error);
}
return null;
}
public FontResolverInfo ResolveTypeface(string familyName, bool isBold, bool isItalic) public FontResolverInfo ResolveTypeface(string familyName, bool isBold, bool isItalic)
{
try
{ {
// If requested family exists, pick corresponding style if available // If requested family exists, pick corresponding style if available
string familyToUse = null; string familyToUse = null;
@@ -111,17 +100,8 @@ public class StableFontResolver : IFontResolver
// Face name format: Family#Style // Face name format: Family#Style
return new FontResolverInfo($"{familyToUse}#{style}"); return new FontResolverInfo($"{familyToUse}#{style}");
} }
catch (Exception ex)
{
Logger.Log($"Error while resolving typeface: {ex.Message}",Logger.LogType.Error);
}
return null;
}
public byte[] GetFont(string faceName) public byte[] GetFont(string faceName)
{
try
{ {
if (string.IsNullOrEmpty(faceName)) return null; if (string.IsNullOrEmpty(faceName)) return null;
@@ -153,11 +133,4 @@ public class StableFontResolver : IFontResolver
return null; return null;
} }
catch (Exception ex)
{
Logger.Log($"Error while getting font: {ex.Message}",Logger.LogType.Error);
}
return [];
}
} }
+1 -6
View File
@@ -10,8 +10,6 @@ public partial class EditorWindow : Window
public string filename = ""; public string filename = "";
public EditorWindow(string filename = "") public EditorWindow(string filename = "")
{
try
{ {
InitializeComponent(); InitializeComponent();
this.filename = filename; this.filename = filename;
@@ -26,8 +24,6 @@ public partial class EditorWindow : Window
MessageBox.Show(null, "Die Datei existiert nicht", "Fehler"); MessageBox.Show(null, "Die Datei existiert nicht", "Fehler");
Close(); Close();
} }
} catch (Exception ex) { Logger.Log($"Error while : {ex.Message}",Logger.LogType.Error);}
} }
private void BtnSave_OnClick(object? sender, RoutedEventArgs e) private void BtnSave_OnClick(object? sender, RoutedEventArgs e)
@@ -42,7 +38,6 @@ public partial class EditorWindow : Window
MessageBox.Show(null, MessageBox.Show(null,
"Es ist ein Fehler aufgetreten. Bitte senden Sie ihn über git.mypapercloud.de/fierke/logofclient ein:\n" + "Es ist ein Fehler aufgetreten. Bitte senden Sie ihn über git.mypapercloud.de/fierke/logofclient ein:\n" +
ex.StackTrace, "Fehler"); ex.StackTrace, "Fehler");
Logger.Log($"Error while : {ex.Message}",Logger.LogType.Error);
} }
} }
@@ -60,7 +55,7 @@ public partial class EditorWindow : Window
try try
{ {
File.Delete(filename); File.Delete(filename);
} catch (Exception ex) { Logger.Log($"Error while : {ex.Message}",Logger.LogType.Error);} } catch {}
MainWindow._instance.PopulateNavTree(); MainWindow._instance.PopulateNavTree();
Close(); Close();
-11
View File
@@ -1,4 +1,3 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Media; using Avalonia.Media;
@@ -12,8 +11,6 @@ namespace Logof_Client.Wiki;
public static class MarkdownRenderer public static class MarkdownRenderer
{ {
public static Control Render(string markdown) public static Control Render(string markdown)
{
try
{ {
var panel = new StackPanel { Spacing = 6 }; var panel = new StackPanel { Spacing = 6 };
if (string.IsNullOrWhiteSpace(markdown)) return panel; if (string.IsNullOrWhiteSpace(markdown)) return panel;
@@ -96,14 +93,9 @@ public static class MarkdownRenderer
} }
return panel; return panel;
} catch (Exception ex) { Logger.Log($"Error while : {ex.Message}",Logger.LogType.Error);}
return new Panel();
} }
private static string GetInlineText(ContainerInline? container) private static string GetInlineText(ContainerInline? container)
{
try
{ {
if (container == null) return string.Empty; if (container == null) return string.Empty;
var sb = new StringBuilder(); var sb = new StringBuilder();
@@ -133,8 +125,5 @@ public static class MarkdownRenderer
} }
return sb.ToString(); return sb.ToString();
} catch (Exception ex) { Logger.Log($"Error while : {ex.Message}",Logger.LogType.Error);}
return null;
} }
} }
+157
View File
@@ -0,0 +1,157 @@
\documentclass[a4paper]{article}
\usepackage{graphicx}
\usepackage[left=3cm,right=3cm,top=3cm, bottom=3cm]{geometry}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage[headsepline, footsepline]{scrlayer-scrpage}
\usepackage{enumerate}
\usepackage{dsfont}
\usepackage[]{mathtools}
\usepackage[]{mathbbol}
\usepackage{multicol}
\usepackage{enumitem}
\usepackage[hidelinks]{hyperref}
\usepackage[]{circuitikz}
\usepackage{tcolorbox} % Für schöne Boxen
\usetikzlibrary{circuits.logic.IEC}
\usepackage{tikz}
\usepackage{tkz-graph}
\usepackage{listings}
\usepackage{xcolor}
\setlist{itemsep=0.3em, topsep=0.5em, parsep=0pt}
\newcommand{\bpf}[1]{%
\par\vspace{0.8\baselineskip}% Abstand vor der Überschrift
\noindent\textbf{#1}% Fettgedruckte Überschrift
\par\vspace{0.3\baselineskip}% Abstand nach der Überschrift
}
\renewcommand{\contentsname}{Inhaltsverzeichnis}
\renewcommand{\figurename}{Grafik}
\renewcommand{\partname}{Teil}
\renewcommand{\epsilon}{\varepsilon}
\definecolor{darkgrey}{HTML}{232327}
% Zählerdefinition mit AUTOMATISCHEM SUBSECTION-RESET
\newcounter{commoncounter}[subsection]
\renewcommand{\thecommoncounter}{\thesubsection.\arabic{commoncounter}}
% Zähler direkt bei Dokumentstart initialisieren
\AtBeginDocument{\setcounter{commoncounter}{0}}
% BOX-DEFINITIONEN mit korrigierter Zählerlogik
\newtcolorbox{definitionbox}[1][]{
before title={\refstepcounter{commoncounter}}, % KRITISCH: vor dem Titel!
title={Definition \thecommoncounter: #1},
colback=white,
colframe=white!75!darkgrey,
fonttitle=\bfseries,
boxrule=0.6mm,
coltitle=black,
rounded corners,
before skip=10pt,
after skip=10pt
}
\newtcolorbox{examplebox}[1][]{
before title={\refstepcounter{commoncounter}}, % KRITISCH: vor dem Titel!
title={Beispiel \thecommoncounter: #1},
colback=white,
colframe=white!75!orange,
fonttitle=\bfseries,
boxrule=0.6mm,
coltitle=black,
rounded corners,
before skip=10pt,
after skip=10pt
}
\newtcolorbox{satzbox}[1][]{
before title={\refstepcounter{commoncounter}}, % KRITISCH: vor dem Titel!
title={Satz \thecommoncounter: #1},
colback=white,
colframe=white!75!blue,
fonttitle=\bfseries,
boxrule=0.6mm,
coltitle=black,
rounded corners,
before skip=10pt,
after skip=10pt
}
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codeblue}{rgb}{0,0,0.8}
\definecolor{codered}{rgb}{0.8,0,0}
\definecolor{lightgray}{rgb}{0.95,0.95,0.95}
\lstdefinestyle{CSharpStyle}{
language=Python,
basicstyle=\ttfamily\small, % Monospace-Schrift
keywordstyle=\color{blue}\bfseries, % Schlüsselwörter fett und blau
stringstyle=\color{red}, % Strings rot
commentstyle=\color{codegreen}, % Kommentare grün
backgroundcolor=\color{lightgray}, % Hintergrundfarbe
numbers=left, % Zeilennummern links
numbersep=10px, % Abstand zwischen Zeilennummern und Code
numberstyle=\color{gray}\texttt,
stepnumber=1, % Zeilennummerierung Schrittweite 1
frame=single, % Rahmen um den Code
tabsize=4, % Tabulatorgröße
breaklines=true, % Zeilenumbruch aktivieren
captionpos=none,
showstringspaces=false,
xleftmargin=15pt, % Linker Rand für den Code (verschiebt alles nach rechts)
}
% Umgebung für Listings mit Titel und Zähler
\newenvironment{codeexample}[1][]{
\refstepcounter{commoncounter} % Zähler erhöhen
\lstset{
style=CSharpStyle,
caption={Listing \thecommoncounter: #1}, % Titel mit Zähler
label={listing:\thecommoncounter}
}
}{}
\setlength{\parindent}{0pt}
\title{\includegraphics[width=0.3\textwidth]{../assets/icon.png}\vspace{15pt}\\Logof Client\\
Handbuch}
\author{Elias Fierke}
\pagestyle{scrheadings}
\date{Oktober 2025}
\begin{document}
\ohead{Oktober 2025}
\ofoot{Seite {\pagemark} von \pageref{LastPage}}
\ihead{Logof Client Handbuch}
\maketitle
\tableofcontents
\newpage
\part{Einführung}
\newpage
\part{Installation}
\newpage
\part{Adress-Verwaltung}
\label{LastPage}
\end{document}