|
1 | 1 | package name.abuchen.portfolio.datatransfer.pdf.genobroker; |
2 | 2 |
|
3 | | -import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.check; |
4 | 3 | import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.dividend; |
5 | 4 | import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasAmount; |
6 | 5 | import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasCurrencyCode; |
|
24 | 23 | import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.withFailureMessage; |
25 | 24 | import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransactions; |
26 | 25 | import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransfers; |
27 | | -import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countItemsWithFailureMessage; |
28 | 26 | import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countBuySell; |
| 27 | +import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countItemsWithFailureMessage; |
29 | 28 | import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countSecurities; |
30 | 29 | import static org.hamcrest.CoreMatchers.hasItem; |
31 | 30 | import static org.hamcrest.CoreMatchers.is; |
|
38 | 37 | import org.junit.Test; |
39 | 38 |
|
40 | 39 | import name.abuchen.portfolio.Messages; |
41 | | -import name.abuchen.portfolio.datatransfer.ImportAction.Status; |
42 | 40 | import name.abuchen.portfolio.datatransfer.actions.AssertImportActions; |
43 | | -import name.abuchen.portfolio.datatransfer.actions.CheckCurrenciesAction; |
44 | 41 | import name.abuchen.portfolio.datatransfer.pdf.GenoBrokerPDFExtractor; |
45 | 42 | import name.abuchen.portfolio.datatransfer.pdf.PDFInputFile; |
46 | | -import name.abuchen.portfolio.model.Account; |
47 | | -import name.abuchen.portfolio.model.AccountTransaction; |
48 | 43 | import name.abuchen.portfolio.model.Client; |
49 | | -import name.abuchen.portfolio.model.Portfolio; |
50 | | -import name.abuchen.portfolio.model.PortfolioTransaction; |
51 | 44 | import name.abuchen.portfolio.model.Security; |
52 | 45 |
|
53 | 46 | @SuppressWarnings("nls") |
@@ -112,7 +105,7 @@ public void testWertpapierKauf02() |
112 | 105 |
|
113 | 106 | // check buy sell transaction |
114 | 107 | assertThat(results, hasItem(purchase( // |
115 | | - hasDate("2023-07-19T08:18"), hasShares(500), // |
| 108 | + hasDate("2023-07-19T08:18"), hasShares(500.00), // |
116 | 109 | hasSource("Kauf02.txt"), // |
117 | 110 | hasNote("Auftragsnummer: 422576/44.00 | Limit 10,00 EUR"), // |
118 | 111 | hasAmount("EUR", 4714.55), hasGrossValue("EUR", 4704.50), // |
@@ -145,7 +138,7 @@ public void testWertpapierKauf03() |
145 | 138 |
|
146 | 139 | // check buy sell transaction |
147 | 140 | assertThat(results, hasItem(purchase( // |
148 | | - hasDate("2023-08-03T12:00"), hasShares(2100), // |
| 141 | + hasDate("2023-08-03T12:00"), hasShares(2100.00), // |
149 | 142 | hasSource("Kauf03.txt"), // |
150 | 143 | hasNote("Auftragsnummer: 896962/04.00"), // |
151 | 144 | hasAmount("EUR", 506.62), hasGrossValue("EUR", 506.62), // |
@@ -180,16 +173,11 @@ public void testWertpapierKauf03WithSecurityInEUR() |
180 | 173 |
|
181 | 174 | // check buy sell transaction |
182 | 175 | assertThat(results, hasItem(purchase( // |
183 | | - hasDate("2023-08-03T12:00"), hasShares(2100), // |
| 176 | + hasDate("2023-08-03T12:00"), hasShares(2100.00), // |
184 | 177 | hasSource("Kauf03.txt"), // |
185 | 178 | hasNote("Auftragsnummer: 896962/04.00"), // |
186 | 179 | hasAmount("EUR", 506.62), hasGrossValue("EUR", 506.62), // |
187 | | - hasTaxes("EUR", 0.00), hasFees("EUR", 0.00), // |
188 | | - check(tx -> { |
189 | | - var c = new CheckCurrenciesAction(); |
190 | | - var s = c.process((PortfolioTransaction) tx, new Portfolio()); |
191 | | - assertThat(s, is(Status.OK_STATUS)); |
192 | | - })))); |
| 180 | + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); |
193 | 181 | } |
194 | 182 |
|
195 | 183 | @Test |
@@ -218,7 +206,7 @@ public void testWertpapierKauf04() |
218 | 206 |
|
219 | 207 | // check buy sell transaction |
220 | 208 | assertThat(results, hasItem(purchase( // |
221 | | - hasDate("2025-06-10T15:33"), hasShares(2000), // |
| 209 | + hasDate("2025-06-10T15:33"), hasShares(2000.00), // |
222 | 210 | hasSource("Kauf04.txt"), // |
223 | 211 | hasNote("Auftragsnummer: 625571/30.00 | Limit billigst"), // |
224 | 212 | hasAmount("EUR", 4222.17), hasGrossValue("EUR", 4156.80), // |
@@ -252,16 +240,44 @@ public void testWertpapierKauf04WithSecurityInEUR() |
252 | 240 |
|
253 | 241 | // check buy sell transaction |
254 | 242 | assertThat(results, hasItem(purchase( // |
255 | | - hasDate("2025-06-10T15:33"), hasShares(2000), // |
| 243 | + hasDate("2025-06-10T15:33"), hasShares(2000.00), // |
256 | 244 | hasSource("Kauf04.txt"), // |
257 | 245 | hasNote("Auftragsnummer: 625571/30.00 | Limit billigst"), // |
258 | 246 | hasAmount("EUR", 4222.17), hasGrossValue("EUR", 4156.80), // |
259 | | - hasTaxes("EUR", 0.00), hasFees("EUR", 9.95 + 21.65 + 8.77 + 25.00), // |
260 | | - check(tx -> { |
261 | | - var c = new CheckCurrenciesAction(); |
262 | | - var s = c.process((PortfolioTransaction) tx, new Portfolio()); |
263 | | - assertThat(s, is(Status.OK_STATUS)); |
264 | | - })))); |
| 247 | + hasTaxes("EUR", 0.00), hasFees("EUR", 9.95 + 21.65 + 8.77 + 25.00)))); |
| 248 | + } |
| 249 | + |
| 250 | + @Test |
| 251 | + public void testWertpapierKauf05() |
| 252 | + { |
| 253 | + var extractor = new GenoBrokerPDFExtractor(new Client()); |
| 254 | + |
| 255 | + List<Exception> errors = new ArrayList<>(); |
| 256 | + |
| 257 | + var results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf05.txt"), errors); |
| 258 | + |
| 259 | + assertThat(errors, empty()); |
| 260 | + assertThat(countSecurities(results), is(1L)); |
| 261 | + assertThat(countBuySell(results), is(1L)); |
| 262 | + assertThat(countAccountTransactions(results), is(0L)); |
| 263 | + assertThat(countAccountTransfers(results), is(0L)); |
| 264 | + assertThat(countItemsWithFailureMessage(results), is(0L)); |
| 265 | + assertThat(results.size(), is(2)); |
| 266 | + new AssertImportActions().check(results, "EUR"); |
| 267 | + |
| 268 | + // check security |
| 269 | + assertThat(results, hasItem(security( // |
| 270 | + hasIsin("DE0005552004"), hasWkn("555200"), hasTicker(null), // |
| 271 | + hasName("DEUTSCHE POST AG NAMENS-AKTIEN O.N."), // |
| 272 | + hasCurrencyCode("EUR")))); |
| 273 | + |
| 274 | + // check buy sell transaction |
| 275 | + assertThat(results, hasItem(purchase( // |
| 276 | + hasDate("2025-12-11T16:14"), hasShares(200.00), // |
| 277 | + hasSource("Kauf05.txt"), // |
| 278 | + hasNote("Auftragsnummer: 210741/20.00 | Limit billigst"), // |
| 279 | + hasAmount("EUR", 9391.91), hasGrossValue("EUR", 9374.00), // |
| 280 | + hasTaxes("EUR", 0.00), hasFees("EUR", 17.81 + 0.10)))); |
265 | 281 | } |
266 | 282 |
|
267 | 283 | @Test |
@@ -290,7 +306,7 @@ public void testWertpapierVerkauf01() |
290 | 306 |
|
291 | 307 | // check buy sell transaction |
292 | 308 | assertThat(results, hasItem(sale( // |
293 | | - hasDate("2023-07-25T16:48"), hasShares(2100), // |
| 309 | + hasDate("2023-07-25T16:48"), hasShares(2100.00), // |
294 | 310 | hasSource("Verkauf01.txt"), // |
295 | 311 | hasNote("Auftragsnummer: 433499/69.01 | Limit bestens"), // |
296 | 312 | hasAmount("EUR", 6319.37), hasGrossValue("EUR", 6331.50), // |
@@ -323,7 +339,7 @@ public void testWertpapierVerkauf02() |
323 | 339 |
|
324 | 340 | // check buy sell transaction |
325 | 341 | assertThat(results, hasItem(sale( // |
326 | | - hasDate("2023-09-05T13:10"), hasShares(500), // |
| 342 | + hasDate("2023-09-05T13:10"), hasShares(500.00), // |
327 | 343 | hasSource("Verkauf02.txt"), // |
328 | 344 | hasNote("Auftragsnummer: 498470/51.00 | Limit bestens"), // |
329 | 345 | hasAmount("EUR", 4759.31), hasGrossValue("EUR", 4779.50), // |
@@ -356,7 +372,7 @@ public void testDividende01() |
356 | 372 |
|
357 | 373 | // check dividend transaction |
358 | 374 | assertThat(results, hasItem(dividend( // |
359 | | - hasDate("2023-07-14T00:00"), hasShares(1000), // |
| 375 | + hasDate("2023-07-14T00:00"), hasShares(1000.00), // |
360 | 376 | hasSource("Dividende01.txt"), // |
361 | 377 | hasNote("Abrechnungsnr.: 60007000"), // |
362 | 378 | hasAmount("EUR", 445.94), hasGrossValue("EUR", 615.87), // |
@@ -389,7 +405,7 @@ public void testDividende02() |
389 | 405 |
|
390 | 406 | // check dividend transaction |
391 | 407 | assertThat(results, hasItem(dividend( // |
392 | | - hasDate("2023-07-10T00:00"), hasShares(2100), // |
| 408 | + hasDate("2023-07-10T00:00"), hasShares(2100.00), // |
393 | 409 | hasSource("Dividende02.txt"), // |
394 | 410 | hasNote("Abrechnungsnr.: 000000000"), // |
395 | 411 | hasAmount("EUR", 6107.09), hasGrossValue("EUR", 9475.70), // |
@@ -423,7 +439,7 @@ public void testDividende03() |
423 | 439 |
|
424 | 440 | // check dividend transaction |
425 | 441 | assertThat(results, hasItem(dividend( // |
426 | | - hasDate("2023-08-29T00:00"), hasShares(600), // |
| 442 | + hasDate("2023-08-29T00:00"), hasShares(600.00), // |
427 | 443 | hasSource("Dividende03.txt"), // |
428 | 444 | hasNote("Abrechnungsnr.: 74014833940"), // |
429 | 445 | hasAmount("EUR", 236.34), hasGrossValue("EUR", 486.03), // |
@@ -458,18 +474,11 @@ public void testDividende03WithSecurityInEUR() |
458 | 474 |
|
459 | 475 | // check dividends transaction |
460 | 476 | assertThat(results, hasItem(dividend( // |
461 | | - hasDate("2023-08-29T00:00"), hasShares(600), // |
| 477 | + hasDate("2023-08-29T00:00"), hasShares(600.00), // |
462 | 478 | hasSource("Dividende03.txt"), // |
463 | 479 | hasNote("Abrechnungsnr.: 74014833940"), // |
464 | 480 | hasAmount("EUR", 236.34), hasGrossValue("EUR", 486.03), // |
465 | | - hasTaxes("EUR", 121.51 + 121.50 + 6.68), hasFees("EUR", 0.00), // |
466 | | - check(tx -> { |
467 | | - var c = new CheckCurrenciesAction(); |
468 | | - var account = new Account(); |
469 | | - account.setCurrencyCode("EUR"); |
470 | | - var s = c.process((AccountTransaction) tx, account); |
471 | | - assertThat(s, is(Status.OK_STATUS)); |
472 | | - })))); |
| 481 | + hasTaxes("EUR", 121.51 + 121.50 + 6.68), hasFees("EUR", 0.00)))); |
473 | 482 | } |
474 | 483 |
|
475 | 484 | @Test |
@@ -498,7 +507,7 @@ public void testDividende04() |
498 | 507 |
|
499 | 508 | // check dividend transaction |
500 | 509 | assertThat(results, hasItem(dividend( // |
501 | | - hasDate("2023-09-13T00:00"), hasShares(23), // |
| 510 | + hasDate("2023-09-13T00:00"), hasShares(23.00), // |
502 | 511 | hasSource("Dividende04.txt"), // |
503 | 512 | hasNote("Abrechnungsnr.: 75555439660"), // |
504 | 513 | hasAmount("EUR", 24.01), hasGrossValue("EUR", 32.26), // |
@@ -537,14 +546,7 @@ public void testDividende04WithSecurityInEUR() |
537 | 546 | hasSource("Dividende04.txt"), // |
538 | 547 | hasNote("Abrechnungsnr.: 75555439660"), // |
539 | 548 | hasAmount("EUR", 24.01), hasGrossValue("EUR", 32.26), // |
540 | | - hasTaxes("EUR", 4.84 + 3.23 + 0.18), hasFees("EUR", 0.00), // |
541 | | - check(tx -> { |
542 | | - var c = new CheckCurrenciesAction(); |
543 | | - var account = new Account(); |
544 | | - account.setCurrencyCode("EUR"); |
545 | | - var s = c.process((AccountTransaction) tx, account); |
546 | | - assertThat(s, is(Status.OK_STATUS)); |
547 | | - })))); |
| 549 | + hasTaxes("EUR", 4.84 + 3.23 + 0.18), hasFees("EUR", 0.00)))); |
548 | 550 | } |
549 | 551 |
|
550 | 552 | @Test |
@@ -573,7 +575,7 @@ public void testDividende05() |
573 | 575 |
|
574 | 576 | // check dividend transaction |
575 | 577 | assertThat(results, hasItem(dividend( // |
576 | | - hasDate("2023-12-29T00:00"), hasShares(30), // |
| 578 | + hasDate("2023-12-29T00:00"), hasShares(30.00), // |
577 | 579 | hasSource("Dividende05.txt"), // |
578 | 580 | hasNote("Abrechnungsnr.: 86249245170"), // |
579 | 581 | hasAmount("EUR", 6.03), hasGrossValue("EUR", 7.50), // |
@@ -608,18 +610,11 @@ public void testDividende05WithSecurityInEUR() |
608 | 610 |
|
609 | 611 | // check dividends transaction |
610 | 612 | assertThat(results, hasItem(dividend( // |
611 | | - hasDate("2023-12-29T00:00"), hasShares(30), // |
| 613 | + hasDate("2023-12-29T00:00"), hasShares(30.00), // |
612 | 614 | hasSource("Dividende05.txt"), // |
613 | 615 | hasNote("Abrechnungsnr.: 86249245170"), // |
614 | 616 | hasAmount("EUR", 6.03), hasGrossValue("EUR", 7.50), // |
615 | | - hasTaxes("EUR", 1.29 + 0.07 + 0.11), hasFees("EUR", 0.00), // |
616 | | - check(tx -> { |
617 | | - var c = new CheckCurrenciesAction(); |
618 | | - var account = new Account(); |
619 | | - account.setCurrencyCode("EUR"); |
620 | | - var s = c.process((AccountTransaction) tx, account); |
621 | | - assertThat(s, is(Status.OK_STATUS)); |
622 | | - })))); |
| 617 | + hasTaxes("EUR", 1.29 + 0.07 + 0.11), hasFees("EUR", 0.00)))); |
623 | 618 | } |
624 | 619 |
|
625 | 620 | @Test |
@@ -648,7 +643,7 @@ public void testDividende06() |
648 | 643 |
|
649 | 644 | // check dividend transaction |
650 | 645 | assertThat(results, hasItem(dividend( // |
651 | | - hasDate("2024-04-30T00:00"), hasShares(75), // |
| 646 | + hasDate("2024-04-30T00:00"), hasShares(75.00), // |
652 | 647 | hasSource("Dividende06.txt"), // |
653 | 648 | hasNote("Abrechnungsnr.: 08172459718"), // |
654 | 649 | hasAmount("EUR", 255.00), hasGrossValue("EUR", 255.00), // |
@@ -681,7 +676,7 @@ public void testDividende07() |
681 | 676 |
|
682 | 677 | // check dividend transaction |
683 | 678 | assertThat(results, hasItem(dividend( // |
684 | | - hasDate("2024-04-30T00:00"), hasShares(23), // |
| 679 | + hasDate("2024-04-30T00:00"), hasShares(23.00), // |
685 | 680 | hasSource("Dividende07.txt"), // |
686 | 681 | hasNote("Abrechnungsnr.: 20967773045"), // |
687 | 682 | hasAmount("EUR", 309.07), hasGrossValue("EUR", 345.00 + 216.60), // |
|
0 commit comments