Skip to content

Commit faae7a5

Browse files

File tree

4 files changed

+176
-0
lines changed

4 files changed

+176
-0
lines changed

name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/kbcgroupnv/KBCGroupNVPDFExtractorTest.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package name.abuchen.portfolio.datatransfer.pdf.kbcgroupnv;
22

3+
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.deposit;
34
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.dividend;
45
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasAmount;
56
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasCurrencyCode;
67
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasDate;
78
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasFees;
9+
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasForexGrossValue;
810
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasGrossValue;
911
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasIsin;
1012
import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasName;
@@ -225,4 +227,67 @@ public void testRekeninguittreksel01()
225227
assertThat(results, hasItem(removal(hasDate("2024-09-04"), hasAmount("EUR", 32339.70), //
226228
hasSource("Rekeninguittreksel01.txt"), hasNote("Overschrijving naar klant"))));
227229
}
230+
231+
@Test
232+
public void testRekeninguittreksel02()
233+
{
234+
KBCGroupNVPDFExtractor extractor = new KBCGroupNVPDFExtractor(new Client());
235+
236+
List<Exception> errors = new ArrayList<>();
237+
238+
List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Rekeninguittreksel02.txt"),
239+
errors);
240+
241+
assertThat(errors, empty());
242+
assertThat(countSecurities(results), is(0L));
243+
assertThat(countBuySell(results), is(0L));
244+
assertThat(countAccountTransactions(results), is(1L));
245+
assertThat(results.size(), is(1));
246+
new AssertImportActions().check(results, CurrencyUnit.EUR);
247+
248+
// assert transaction
249+
assertThat(results, hasItem(deposit(hasDate("2022-08-18"), hasAmount("EUR", 50000.00), //
250+
hasSource("Rekeninguittreksel02.txt"), hasNote("Provisionering rekening klant"))));
251+
}
252+
253+
@Test
254+
public void testRekeninguittreksel03()
255+
{
256+
KBCGroupNVPDFExtractor extractor = new KBCGroupNVPDFExtractor(new Client());
257+
258+
List<Exception> errors = new ArrayList<>();
259+
260+
List<Item> results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Rekeninguittreksel03.txt"),
261+
errors);
262+
263+
assertThat(errors, empty());
264+
assertThat(countSecurities(results), is(1L));
265+
assertThat(countBuySell(results), is(1L));
266+
assertThat(countAccountTransactions(results), is(2L));
267+
assertThat(results.size(), is(4));
268+
new AssertImportActions().check(results, "EUR", "USD");
269+
270+
// check security
271+
assertThat(results, hasItem(security( //
272+
hasIsin("IE00BKM4GZ66"), hasWkn(null), hasTicker(null), //
273+
hasName("ISHARES PLC CORE MSC E.M.IM UC"), //
274+
hasCurrencyCode("EUR"))));
275+
276+
// check buy sell transaction
277+
assertThat(results, hasItem(sale( //
278+
hasDate("2023-06-12T11:55:21"), hasShares(2300.00), //
279+
hasSource("Rekeninguittreksel03.txt"), //
280+
hasNote("Borderel 017462864"), //
281+
hasAmount("USD", 69606.12), hasGrossValue("USD", 69743.43), //
282+
hasForexGrossValue("EUR", 64918.22), //
283+
hasTaxes("USD", (78.06 / 0.932651)), hasFees("USD", (50.00 / 0.932651)))));
284+
285+
// assert transaction
286+
assertThat(results, hasItem(deposit(hasDate("2023-06-12"), hasAmount("EUR", 45000.00), //
287+
hasSource("Rekeninguittreksel03.txt"), hasNote("Provisionering rekening klant"))));
288+
289+
// assert transaction
290+
assertThat(results, hasItem(deposit(hasDate("2023-06-12"), hasAmount("EUR", 132673.91), //
291+
hasSource("Rekeninguittreksel03.txt"), hasNote("Provisionering rekening klant"))));
292+
}
228293
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
PDFBox Version: 1.8.17
2+
Portfolio Performance Version: 0.71.2
3+
-----------------------------------------
4+
mYWICNAN-ffIFTWit rjpnOt TWYfCFpM-koyXdfc
5+
tNlrzb
6+
Overzicht transacties en rekeninguittreksels voor klantnummer 0964124
7+
18/08/2022
8+
EUR-REKENING - 6
9+
Rekeninguittreksel Nr 5 Vorig Saldo: 2.450,91 EUR
10+
18/08/2022 Provisionering rekening klant Valuta 17/08/2022 50.000,00 EUR
11+
Mededeling: wXFGAEmx-yDDlwpCK V + C
12+
Nieuw Saldo 52.450,91 EUR
13+
Dit deposito komt in aanmerking voor depositobescherming. Meer info: www.kbc.be/depositobescherming
14+
YaNvmsru-GHhLuMii XOzWOG wrbkcVpO-fwqfYhz GjWQoo Pagina 1
15+
0964124
16+
_______________________________________________________________________________________
17+
KBC BANK NV Documentreferte: 6
18+
Havenlaan 2, 1080 Brussels, Belgium VAT BE 0462.920.226
19+
Account N° BE77 4096 5474 0142 - BIC KREDBEBB
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
PDFBox Version: 1.8.17
2+
Portfolio Performance Version: 0.71.2
3+
-----------------------------------------
4+
IPWFSVCs-rZgJERYI GMQcGr cymcYnij-SynWcel
5+
HRYvzB
6+
Overzicht transacties en rekeninguittreksels voor klantnummer 0964124
7+
12/06/2023
8+
EUR-REKENING - 30
9+
Rekeninguittreksel Nr 25 Vorig Saldo: 2.284,27 EUR
10+
12/06/2023 Provisionering rekening klant Valuta 12/06/2023 45.000,00 EUR
11+
eQpiFBGUAS: hCMysjNX-inibtnxb V + C
12+
12/06/2023 Provisionering rekening klant Valuta 12/06/2023 132.673,91 EUR
13+
Mededeling: CFRyrSqp-vVYKXZKc V + C
14+
Nieuw Saldo 179.958,18 EUR
15+
Dit deposito komt in aanmerking voor depositobescherming. Meer info: www.kbc.be/depositobescherming
16+
pmzhGIum-CtGGMNMT WQzXXw vJoLnahg-iZkkhOk BWaUyO Pagina 1
17+
0964124
18+
_______________________________________________________________________________________
19+
KBC BANK NV Documentreferte: 30
20+
Havenlaan 2, 1080 Brussels, Belgium VAT BE 0462.920.226
21+
Account N° BE77 4096 5474 0142 - BIC KREDBEBB
22+
USD-REKENING - 1
23+
Borderel 017462864 Limit order
24+
12/06/2023 11:55:21 Valuta 14/06/2023 MSEU
25+
Uw Verkoop Online van 2.300 ISHARES PLC CORE MSC E.M.IM UC aan 28,281 65.046,30 EUR
26+
EUR
27+
Makelaarsloon 50,00 EUR
28+
Beurstaks 78,06 EUR
29+
Netto 64.918,24 EUR
30+
1 USD = 0,932651 EUR
31+
Netto credit 69.606,12 USD
32+
Wettelijke fiscale informatie Basisbedrag beurstaks 65.046,30 EUR
33+
Beurstaks 0,12% 78,06 EUR
34+
Waardecode IE00BKM4GZ66
35+
eJopUQSI-ZCowhiKu CQoHLc qDJXdQrR-SQNJxQD HhjKWM Pagina 2
36+
0964124
37+
_______________________________________________________________________________________
38+
KBC BANK NV Documentreferte: 30
39+
Havenlaan 2, 1080 Brussels, Belgium VAT BE 0462.920.226
40+
Account N° BE77 4096 5474 0142 - BIC KREDBEBB

name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/KBCGroupNVPDFExtractor.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
package name.abuchen.portfolio.datatransfer.pdf;
22

3+
import static name.abuchen.portfolio.datatransfer.ExtractorUtils.checkAndSetGrossUnit;
34
import static name.abuchen.portfolio.util.TextUtil.trim;
45

56
import java.math.BigDecimal;
67

8+
import name.abuchen.portfolio.datatransfer.ExtrExchangeRate;
9+
import name.abuchen.portfolio.datatransfer.ExtractorUtils;
710
import name.abuchen.portfolio.datatransfer.pdf.PDFParser.Block;
811
import name.abuchen.portfolio.datatransfer.pdf.PDFParser.DocumentType;
912
import name.abuchen.portfolio.datatransfer.pdf.PDFParser.Transaction;
1013
import name.abuchen.portfolio.model.AccountTransaction;
1114
import name.abuchen.portfolio.model.BuySellEntry;
1215
import name.abuchen.portfolio.model.Client;
1316
import name.abuchen.portfolio.model.PortfolioTransaction;
17+
import name.abuchen.portfolio.money.Money;
1418
import name.abuchen.portfolio.money.Values;
1519

1620
@SuppressWarnings("nls")
@@ -196,13 +200,32 @@ private void addBuySellTransaction()
196200
t.setAmount(asAmount(v.get("amount")));
197201
})
198202

203+
// @formatter:off
204+
// 1 USD = 0,932651 EUR
205+
// Netto credit 69.606,12 USD
206+
// @formatter:on
207+
.section("termCurrency", "exchangeRate", "baseCurrency", "gross").optional() //
208+
.match("^[\\.,\\d]+ (?<baseCurrency>[\\w]{3}) = (?<exchangeRate>[\\.,\\d]+) (?<termCurrency>[\\w]{3})$") //
209+
.match("^Netto (debit|credit) (\\-)?(?<gross>[\\.,\\d]+) [\\w]{3}$") //
210+
.assign((t, v) -> {
211+
ExtrExchangeRate rate = asExchangeRate(v);
212+
type.getCurrentContext().putType(rate);
213+
214+
Money gross = Money.of(rate.getBaseCurrency(), asAmount(v.get("gross")));
215+
Money fxGross = rate.convert(rate.getTermCurrency(), gross);
216+
217+
checkAndSetGrossUnit(gross, fxGross, t, type.getCurrentContext());
218+
})
219+
199220
// @formatter:off
200221
// Borderel 275825809 Limit order
201222
// @formatter:on
202223
.section("note").optional() //
203224
.match("^(?<note>Borderel [\\d]+).*$") //
204225
.assign((t, v) -> t.setNote(trim(v.get("note"))))
205226

227+
.conclude(ExtractorUtils.fixGrossValueBuySell())
228+
206229
.wrap(BuySellEntryItem::new);
207230

208231
addTaxesSectionsTransaction(pdfTransaction, type);
@@ -281,11 +304,40 @@ private void addAccountStatementTransaction()
281304
final DocumentType type = new DocumentType("Rekeninguittreksel Nr");
282305
this.addDocumentTyp(type);
283306

307+
// @formatter:off
308+
// 18/08/2022 Provisionering rekening klant Valuta 17/08/2022 50.000,00 EUR
309+
// @formatter:on
310+
Block depositBlock = new Block("^[\\d]{2}\\/[\\d]{2}\\/[\\d]{4} Provisionering rekening klant.*$");
311+
type.addBlock(depositBlock);
312+
depositBlock.setMaxSize(1);
313+
depositBlock.set(new Transaction<AccountTransaction>()
314+
315+
.subject(() -> {
316+
AccountTransaction accountTransaction = new AccountTransaction();
317+
accountTransaction.setType(AccountTransaction.Type.DEPOSIT);
318+
return accountTransaction;
319+
})
320+
321+
.section("date", "note", "amount", "currency") //
322+
.match("^(?<date>[\\d]{2}\\/[\\d]{2}\\/[\\d]{4}) " //
323+
+ "(?<note>Provisionering rekening klant) " //
324+
+ "Valuta [\\d]{2}\\/[\\d]{2}\\/[\\d]{4} " //
325+
+ "(?<amount>[\\.,\\d]+) (?<currency>[\\w]{3})$") //
326+
.assign((t, v) -> {
327+
t.setDateTime(asDate(v.get("date")));
328+
t.setCurrencyCode(asCurrencyCode(v.get("currency")));
329+
t.setAmount(asAmount(v.get("amount")));
330+
t.setNote(v.get("note"));
331+
})
332+
333+
.wrap(TransactionItem::new));
334+
284335
// @formatter:off
285336
// 04/09/2024 Overschrijving naar klant Valuta 04/09/2024 -32.339,70 EUR
286337
// @formatter:on
287338
Block removalBlock = new Block("^[\\d]{2}\\/[\\d]{2}\\/[\\d]{4} Overschrijving naar klant.*$");
288339
type.addBlock(removalBlock);
340+
removalBlock.setMaxSize(1);
289341
removalBlock.set(new Transaction<AccountTransaction>()
290342

291343
.subject(() -> {

0 commit comments

Comments
 (0)