diff --git a/Elwig/Helpers/ClientParameters.cs b/Elwig/Helpers/ClientParameters.cs index c560c24..2101ae4 100644 --- a/Elwig/Helpers/ClientParameters.cs +++ b/Elwig/Helpers/ClientParameters.cs @@ -66,6 +66,9 @@ namespace Elwig.Helpers { public string? TextEmailSubject; public string? TextEmailBody; + public int ExportEbicsVersion; + public int ExportEbicsAddress; + public ClientParameters(AppDbContext ctx) : this(ctx.ClientParameters.ToDictionary(e => e.Param, e => e.Value)) { } public ClientParameters(Dictionary parameters) { @@ -128,6 +131,13 @@ namespace Elwig.Helpers { if (TextEmailSubject == "") TextEmailSubject = null; TextEmailBody = parameters.GetValueOrDefault("TEXT_EMAIL_BODY"); if (TextEmailBody == "") TextEmailBody = null; + + ExportEbicsVersion = int.TryParse(parameters.GetValueOrDefault("EXPORT_EBICS_VERSION"), out var v) ? v : 9; + switch (parameters.GetValueOrDefault("EXPORT_EBICS_ADDRESS", "FULL")?.ToUpper()) { + case "OMIT": ExportEbicsAddress = 0; break; + case "LINES": ExportEbicsAddress = 1; break; + case "FULL": ExportEbicsAddress = 2; break; + } } catch { throw new KeyNotFoundException(); } @@ -155,6 +165,12 @@ namespace Elwig.Helpers { case 1: orderingMemberList = "NAME"; break; case 2: orderingMemberList = "KG"; break; } + string exportEbicsAddress = "FULL"; + switch (ExportEbicsAddress) { + case 0: exportEbicsAddress = "OMIT"; break; + case 1: exportEbicsAddress = "LINES"; break; + case 2: exportEbicsAddress = "FULL"; break; + } return [ ("CLIENT_NAME_TOKEN", NameToken), ("CLIENT_NAME_SHORT", NameShort), @@ -180,7 +196,9 @@ namespace Elwig.Helpers { ("TEXT_DELIVERYCONFIRMATION", TextDeliveryConfirmation), ("TEXT_CREDITNOTE", TextCreditNote), ("TEXT_EMAIL_SUBJECT", TextEmailSubject), - ("TEXT_EMAIL_BODY", TextEmailBody) + ("TEXT_EMAIL_BODY", TextEmailBody), + ("EXPORT_EBICS_VERSION", ExportEbicsVersion.ToString()), + ("EXPORT_EBICS_ADDRESS", exportEbicsAddress), ]; } diff --git a/Elwig/Helpers/Export/Ebics.cs b/Elwig/Helpers/Export/Ebics.cs index f566da7..7aa0876 100644 --- a/Elwig/Helpers/Export/Ebics.cs +++ b/Elwig/Helpers/Export/Ebics.cs @@ -9,7 +9,9 @@ using System.Security; using System.Threading.Tasks; namespace Elwig.Helpers.Export { - public class Ebics(PaymentVar variant, string filename, int version) : IBankingExporter { + public class Ebics(PaymentVar variant, string filename, int version, Ebics.AddressMode mode = Ebics.AddressMode.Full) : IBankingExporter { + + public enum AddressMode { Omit = 0, Lines = 1, Full = 2 } public static string FileExtension => "xml"; @@ -19,6 +21,7 @@ namespace Elwig.Helpers.Export { private readonly string Name = variant.Name; private readonly int AvNr = variant.AvNr; private readonly int Version = version; + private readonly AddressMode ShowAddresses = mode; public void Dispose() { GC.SuppressFinalize(this); @@ -78,11 +81,18 @@ namespace Elwig.Helpers.Export { {Transaction.FormatAmount(tx.Amount)} {SecurityElement.Escape(a.Name[..Math.Min(140, a.Name.Length)])} - - {a1?[..Math.Min(70, a1.Length)]}{SecurityElement.Escape(a2?[..Math.Min(16, a2.Length)])} - {a.PostalDest.AtPlz?.Plz}{SecurityElement.Escape(a.PostalDest.AtPlz?.Ort.Name)} - {a.PostalDest.Country.Alpha2} - + """); + if (ShowAddresses != AddressMode.Omit) { + var full = ShowAddresses == AddressMode.Full; + await Writer.WriteLineAsync($""" + + {a.PostalDest.Country.Alpha2} + {(full ? $"{SecurityElement.Escape(a1?[..Math.Min(70, a1.Length)])} {SecurityElement.Escape(a2?[..Math.Min(16, a2.Length)])}" : $"{a.Address[..Math.Min(70, a.Address.Length)]}")} + <{(full ? "PstCd" : "AdrLine")}>{a.PostalDest.AtPlz?.Plz}{(full ? " " : " ")}{SecurityElement.Escape(a.PostalDest.AtPlz?.Ort.Name)} + + """); + } + await Writer.WriteLineAsync($""" {tx.Member.Iban!} {SecurityElement.Escape(info)} diff --git a/Elwig/Windows/BaseDataWindow.xaml b/Elwig/Windows/BaseDataWindow.xaml index e2260af..e68acd6 100644 --- a/Elwig/Windows/BaseDataWindow.xaml +++ b/Elwig/Windows/BaseDataWindow.xaml @@ -526,8 +526,8 @@ - - + + - + + + + + + diff --git a/Elwig/Windows/BaseDataWindow.xaml.cs b/Elwig/Windows/BaseDataWindow.xaml.cs index f85bb57..0a71c1a 100644 --- a/Elwig/Windows/BaseDataWindow.xaml.cs +++ b/Elwig/Windows/BaseDataWindow.xaml.cs @@ -94,6 +94,8 @@ namespace Elwig.Windows { ParameterAllowAttrIntoLowerInput.IsEnabled = false; ParameterAvoidUnderDeliveriesInput.IsEnabled = false; ParameterHonorGebundenInput.IsEnabled = false; + ParameterExportEbicsVersion.IsEnabled = false; + ParameterExportEbicsAddress.IsEnabled = false; } new protected void UnlockInputs() { @@ -146,6 +148,8 @@ namespace Elwig.Windows { ParameterAllowAttrIntoLowerInput.IsEnabled = true; ParameterAvoidUnderDeliveriesInput.IsEnabled = true; ParameterHonorGebundenInput.IsEnabled = true; + ParameterExportEbicsVersion.IsEnabled = true; + ParameterExportEbicsAddress.IsEnabled = true; } private void Window_Loaded(object sender, RoutedEventArgs evt) { @@ -373,6 +377,8 @@ namespace Elwig.Windows { ParameterAllowAttrIntoLowerInput.IsChecked = s?.Billing_AllowAttrsIntoLower ?? false; ParameterAvoidUnderDeliveriesInput.IsChecked = s?.Billing_AvoidUnderDeliveries ?? false; ParameterHonorGebundenInput.IsChecked = s?.Billing_HonorGebunden ?? false; + ParameterExportEbicsVersion.SelectedIndex = p.ExportEbicsVersion - 3; + ParameterExportEbicsAddress.SelectedIndex = p.ExportEbicsAddress; FinishInputFilling(); } @@ -400,6 +406,9 @@ namespace Elwig.Windows { p.TextDeliveryConfirmation = TextElementDeliveryConfirmation.Text.Length > 0 ? TextElementDeliveryConfirmation.Text : null; p.TextCreditNote = TextElementCreditNote.Text.Length > 0 ? TextElementCreditNote.Text : null; + p.ExportEbicsVersion = ParameterExportEbicsVersion.SelectedIndex + 3; + p.ExportEbicsAddress = ParameterExportEbicsAddress.SelectedIndex; + await p.UpdateValues(); } diff --git a/Elwig/Windows/PaymentVariantsWindow.xaml.cs b/Elwig/Windows/PaymentVariantsWindow.xaml.cs index 4618dec..dcb7062 100644 --- a/Elwig/Windows/PaymentVariantsWindow.xaml.cs +++ b/Elwig/Windows/PaymentVariantsWindow.xaml.cs @@ -424,7 +424,7 @@ namespace Elwig.Windows { Menu_EbicsSave.IsEnabled = false; Mouse.OverrideCursor = Cursors.AppStarting; try { - using var e = new Ebics(v, d.FileName, 9); + using var e = new Ebics(v, d.FileName, App.Client.ExportEbicsVersion, (Ebics.AddressMode)App.Client.ExportEbicsAddress); await e.ExportAsync(Transaction.FromPaymentVariant(v)); } catch (Exception exc) { MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);