102 lines
4.6 KiB
C#
102 lines
4.6 KiB
C#
using Elwig.Models.Dtos;
|
|
using Elwig.Models.Entities;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Elwig.Helpers.Export {
|
|
public class Ebics(PaymentVar variant, string filename) : IBankingExporter {
|
|
|
|
public static string FileExtension => "xml";
|
|
|
|
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();
|
|
}
|
|
|
|
public ValueTask DisposeAsync() {
|
|
GC.SuppressFinalize(this);
|
|
return Writer.DisposeAsync();
|
|
}
|
|
|
|
public void Export(IEnumerable<Transaction> transactions, IProgress<double>? progress = null) {
|
|
ExportAsync(transactions, progress).GetAwaiter().GetResult();
|
|
}
|
|
|
|
public async Task ExportAsync(IEnumerable<Transaction> transactions, IProgress<double>? progress = null) {
|
|
progress?.Report(0.0);
|
|
var nbOfTxs = transactions.Count();
|
|
int count = nbOfTxs + 2, i = 0;
|
|
var ctrlSum = transactions.Sum(tx => tx.Amount);
|
|
var msgId = $"ELWIG-{App.Client.NameToken}-{Year}-AV{AvNr:00}";
|
|
var pmtInfId = $"{msgId}-1";
|
|
|
|
await Writer.WriteLineAsync($"""
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09"
|
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.001.09 pain.001.001.09.xsd">
|
|
<CstmrCdtTrfInitn>
|
|
<GrpHdr>
|
|
<MsgId>{msgId}</MsgId>
|
|
<CreDtTm>{DateTime.UtcNow:o}</CreDtTm>
|
|
<NbOfTxs>{nbOfTxs}</NbOfTxs>
|
|
<CtrlSum>{Transaction.FormatAmount(ctrlSum)}</CtrlSum>
|
|
<InitgPty><Nm>{App.Client.NameFull}</Nm></InitgPty>
|
|
</GrpHdr>
|
|
<PmtInf>
|
|
<PmtInfId>{pmtInfId}</PmtInfId>
|
|
<PmtMtd>TRF</PmtMtd>
|
|
<NbOfTxs>{nbOfTxs}</NbOfTxs>
|
|
<CtrlSum>{Transaction.FormatAmount(ctrlSum)}</CtrlSum>
|
|
<ReqdExctnDt><Dt>{Date:yyyy-MM-dd}</Dt></ReqdExctnDt>
|
|
<Dbtr><Nm>{App.Client.NameFull}</Nm></Dbtr>
|
|
<DbtrAcct><Id><IBAN>{App.Client.Iban?.Replace(" ", "")}</IBAN></Id></DbtrAcct>
|
|
<DbtrAgt><FinInstnId><BICFI>{App.Client.Bic ?? "NOTPROVIDED"}</BICFI></FinInstnId></DbtrAgt>
|
|
""");
|
|
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 Nr. {Year}/{tx.Nr:000}";
|
|
await Writer.WriteLineAsync($"""
|
|
<CdtTrfTxInf>
|
|
<PmtId><EndToEndId>{id}</EndToEndId></PmtId>
|
|
<Amt><InstdAmt Ccy="{tx.Currency}">{Transaction.FormatAmount(tx.Amount)}</InstdAmt></Amt>
|
|
<Cdtr>
|
|
<Nm>{a.Name}</Nm>
|
|
<PstlAdr>
|
|
<StrtNm>{a1}</StrtNm><BldgNb>{a2}</BldgNb>
|
|
<PstCd>{a.PostalDest.AtPlz?.Plz}</PstCd><TwnNm>{a.PostalDest.AtPlz?.Ort.Name}</TwnNm>
|
|
<Ctry>{a.PostalDest.Country.Alpha2}</Ctry>
|
|
</PstlAdr>
|
|
</Cdtr>
|
|
<CdtrAcct><Id><IBAN>{tx.Member.Iban}</IBAN></Id></CdtrAcct>
|
|
<CdtrAgt><FinInstnId><BICFI>{tx.Member.Bic ?? "NOTPROVIDED"}</BICFI></FinInstnId></CdtrAgt>
|
|
<RmtInf><Ustrd>{info}</Ustrd></RmtInf>
|
|
</CdtTrfTxInf>
|
|
""");
|
|
progress?.Report(100.0 * ++i / count);
|
|
}
|
|
|
|
await Writer.WriteLineAsync("""
|
|
</PmtInf>
|
|
</CstmrCdtTrfInitn>
|
|
</Document>
|
|
""");
|
|
await Writer.FlushAsync();
|
|
progress?.Report(100.0);
|
|
}
|
|
}
|
|
}
|