From 4738cde9e4fa64b1a005aa98a4bcb711c44a17f1 Mon Sep 17 00:00:00 2001 From: Lorenz Stechauner Date: Fri, 29 Dec 2023 13:14:32 +0100 Subject: [PATCH] Billing: Update EBICS exporter --- Elwig/Helpers/Billing/Transaction.cs | 32 ------- Elwig/Helpers/Export/Ebics.cs | 110 +++++++++++------------ Elwig/Helpers/Export/Elba.cs | 2 +- Elwig/Helpers/Export/IBankingExporter.cs | 2 +- Elwig/Models/Dtos/Transaction.cs | 26 ++++++ 5 files changed, 79 insertions(+), 93 deletions(-) delete mode 100644 Elwig/Helpers/Billing/Transaction.cs create mode 100644 Elwig/Models/Dtos/Transaction.cs diff --git a/Elwig/Helpers/Billing/Transaction.cs b/Elwig/Helpers/Billing/Transaction.cs deleted file mode 100644 index 8a84371..0000000 --- a/Elwig/Helpers/Billing/Transaction.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Elwig.Models.Entities; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Elwig.Helpers.Billing { - public class Transaction { - - public readonly Member Member; - public readonly long AmountCent; - public readonly string Currency; - public readonly int Nr; - - public Transaction(Member m, decimal amount, string currency, int nr) { - Member = m; - AmountCent = (long)Math.Round(amount * 100); - Currency = currency; - Nr = nr; - } - - public static IEnumerable FromPaymentVariant(PaymentVar variant) { - var last = variant.Season.PaymentVariants.Where(v => v.TransferDate != null).OrderBy(v => v.TransferDate).LastOrDefault(); - var dict = last?.MemberPayments.ToDictionary(m => m.MgNr, m => m.Amount) ?? new(); - return variant.Credits - .OrderBy(c => c.MgNr) - .Select(c => new Transaction(c.Member, c.Amount, variant.Season.CurrencyCode, c.TgNr)) - .ToList(); - } - - public static string FormatAmountCent(long cents) => $"{cents / 100}.{cents % 100:00}"; - } -} diff --git a/Elwig/Helpers/Export/Ebics.cs b/Elwig/Helpers/Export/Ebics.cs index cdbf74f..8abb5b5 100644 --- a/Elwig/Helpers/Export/Ebics.cs +++ b/Elwig/Helpers/Export/Ebics.cs @@ -1,4 +1,4 @@ -using Elwig.Helpers.Billing; +using Elwig.Models.Dtos; using Elwig.Models.Entities; using System; using System.Collections.Generic; @@ -7,32 +7,24 @@ using System.Linq; using System.Threading.Tasks; namespace Elwig.Helpers.Export { - public class Ebics : IBankingExporter { + public class Ebics(PaymentVar variant, string filename) : IBankingExporter { public static string FileExtension => "xml"; - private readonly StreamWriter _writer; - private readonly DateOnly _date; - private readonly int _year; - private readonly string _name; - private readonly int _nr; - - public Ebics(PaymentVar variant, string filename) { - _writer = new(filename, false, Utils.UTF8); - _date = variant.TransferDate ?? DateOnly.Parse("2021-01-10"); //throw new ArgumentException("TransferDate has to be set in PaymentVar"); - _year = variant.Year; - _name = variant.Name; - _nr = variant.AvNr; - } + private readonly StreamWriter Writer = new(filename, false, Utils.UTF8); + private readonly DateOnly Date = variant.TransferDate ?? throw new ArgumentException("TransferDate has to be set in PaymentVar"); + private readonly int Year = variant.Year; + private readonly string Name = variant.Name; + private readonly int AvNr = variant.AvNr; public void Dispose() { GC.SuppressFinalize(this); - _writer.Dispose(); + Writer.Dispose(); } public ValueTask DisposeAsync() { GC.SuppressFinalize(this); - return _writer.DisposeAsync(); + return Writer.DisposeAsync(); } public void Export(IEnumerable transactions, IProgress? progress = null) { @@ -43,66 +35,66 @@ namespace Elwig.Helpers.Export { progress?.Report(0.0); var nbOfTxs = transactions.Count(); int count = nbOfTxs + 2, i = 0; - var ctrlSum = Transaction.FormatAmountCent(transactions.Sum(tx => tx.AmountCent)); - var msgId = $"ELWIG-{App.Client.NameToken}-{_year}-AV{_nr:00}"; + var ctrlSum = transactions.Sum(tx => tx.Amount); + var msgId = $"ELWIG-{App.Client.NameToken}-{Year}-AV{AvNr:00}"; var pmtInfId = $"{msgId}-1"; - await _writer.WriteLineAsync($""" + await Writer.WriteLineAsync($""" - - - {msgId} - {DateTime.UtcNow:o} - {nbOfTxs} - {ctrlSum} - {App.Client.NameFull} - - - {pmtInfId} - TRF - {nbOfTxs} - {ctrlSum} -
{_date:yyyy-MM-dd}
- {App.Client.NameFull} - {App.Client.Iban?.Replace(" ", "")} - {App.Client.Bic ?? "NOTPROVIDED"} + + + {msgId} + {DateTime.UtcNow:o} + {nbOfTxs} + {Transaction.FormatAmount(ctrlSum)} + {App.Client.NameFull} + + + {pmtInfId} + TRF + {nbOfTxs} + {Transaction.FormatAmount(ctrlSum)} +
{Date:yyyy-MM-dd}
+ {App.Client.NameFull} + {App.Client.Iban?.Replace(" ", "")} + {App.Client.Bic ?? "NOTPROVIDED"} """); progress?.Report(100.0 * ++i / count); foreach (var tx in transactions) { var a = (IAddress?)tx.Member.BillingAddress ?? tx.Member; var (a1, a2) = Utils.SplitAddress(a.Address); - var id = $"ELWIG-{App.Client.NameToken}-{_year}-TG{tx.Nr:0000}"; - var info = $"{_name} - Traubengutschrift {_year}/{tx.Nr:000}"; - await _writer.WriteLineAsync($""" - - {id} - {Transaction.FormatAmountCent(tx.AmountCent)} - - {a.Name} - - {a1}{a2} - {a.PostalDest.AtPlz?.Plz}{a.PostalDest.AtPlz?.Ort.Name} - {a.PostalDest.Country.Alpha2} - - - {tx.Member.Iban} - {tx.Member.Bic ?? "NOTPROVIDED"} - {info} - + var id = $"ELWIG-{App.Client.NameToken}-{Year}-TG{tx.Nr:0000}"; + var info = $"{Name} - Traubengutschrift Nr. {Year}/{tx.Nr:000}"; + await Writer.WriteLineAsync($""" + + {id} + {Transaction.FormatAmount(tx.Amount)} + + {a.Name} + + {a1}{a2} + {a.PostalDest.AtPlz?.Plz}{a.PostalDest.AtPlz?.Ort.Name} + {a.PostalDest.Country.Alpha2} + + + {tx.Member.Iban} + {tx.Member.Bic ?? "NOTPROVIDED"} + {info} + """); progress?.Report(100.0 * ++i / count); } - await _writer.WriteLineAsync(""" -
-
+ await Writer.WriteLineAsync(""" +
+
"""); - await _writer.FlushAsync(); + await Writer.FlushAsync(); progress?.Report(100.0); } } diff --git a/Elwig/Helpers/Export/Elba.cs b/Elwig/Helpers/Export/Elba.cs index 8894332..8f9d9f1 100644 --- a/Elwig/Helpers/Export/Elba.cs +++ b/Elwig/Helpers/Export/Elba.cs @@ -1,4 +1,4 @@ -using Elwig.Helpers.Billing; +using Elwig.Models.Dtos; using System; namespace Elwig.Helpers.Export { diff --git a/Elwig/Helpers/Export/IBankingExporter.cs b/Elwig/Helpers/Export/IBankingExporter.cs index 30a89e0..2df4b2e 100644 --- a/Elwig/Helpers/Export/IBankingExporter.cs +++ b/Elwig/Helpers/Export/IBankingExporter.cs @@ -1,4 +1,4 @@ -using Elwig.Helpers.Billing; +using Elwig.Models.Dtos; namespace Elwig.Helpers.Export { /// diff --git a/Elwig/Models/Dtos/Transaction.cs b/Elwig/Models/Dtos/Transaction.cs new file mode 100644 index 0000000..860bc39 --- /dev/null +++ b/Elwig/Models/Dtos/Transaction.cs @@ -0,0 +1,26 @@ +using Elwig.Models.Entities; +using System.Collections.Generic; +using System.Linq; + +namespace Elwig.Models.Dtos { + public class Transaction(Member member, decimal amount, string currency, int nr) { + + public readonly Member Member = member; + public readonly decimal Amount = amount; + public readonly string Currency = currency; + public readonly int Nr = nr; + + public Transaction(Credit c) : this(c.Member, c.Amount, c.Variant.Season.CurrencyCode, c.TgNr) { } + + public static IEnumerable FromPaymentVariant(PaymentVar variant) { + return variant.Credits + .OrderBy(c => c.TgNr) + .Select(c => new Transaction(c)) + .ToList(); + } + + public static string FormatAmountCent(long cents) => $"{cents / 100}.{cents % 100:00}"; + + public static string FormatAmount(decimal amount) => FormatAmountCent((int)(amount * 100)); + } +}