diff --git a/name.abuchen.portfolio.bootstrap/META-INF/MANIFEST.MF b/name.abuchen.portfolio.bootstrap/META-INF/MANIFEST.MF index 1ef53169b8..517c784cff 100644 --- a/name.abuchen.portfolio.bootstrap/META-INF/MANIFEST.MF +++ b/name.abuchen.portfolio.bootstrap/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Portfolio Performance Bootstrap Bundle-SymbolicName: name.abuchen.portfolio.bootstrap;singleton:=true -Bundle-Version: 0.68.3.qualifier +Bundle-Version: 0.68.4.qualifier Import-Package: jakarta.inject Bundle-RequiredExecutionEnvironment: JavaSE-17 Require-Bundle: org.eclipse.emf.common, diff --git a/name.abuchen.portfolio.bootstrap/OSGI-INF/l10n/bundle.properties b/name.abuchen.portfolio.bootstrap/OSGI-INF/l10n/bundle.properties index 509969ce2d..4ef7dd9e3b 100644 --- a/name.abuchen.portfolio.bootstrap/OSGI-INF/l10n/bundle.properties +++ b/name.abuchen.portfolio.bootstrap/OSGI-INF/l10n/bundle.properties @@ -57,7 +57,7 @@ command.saveAs.name = Save &as command.saveAs.passwordProtected = Password protected (AES-256) command.saveAs.passwordProtected.tooltip = Stores your file in a compressed binary format encrypted with AES-256. command.saveAs.xml = XML -command.saveAs.xml.tooltip = Saves the file in the XML format (Extensible Markup Language) as a plain text file. Note: the mobile app does not support the XML format. +command.saveAs.xml.tooltip = Saves the file in the XML format (Extensible Markup Language) as a plain text file. Note: The mobile app does not support the XML format. command.saveAs.zip = XML compressed command.saveAs.zip.tooltip = Saves the file in the XML format (Extensible Markup Language) as a compressed text file. command.saveErrorLog.label = Save error log... diff --git a/name.abuchen.portfolio.bootstrap/OSGI-INF/l10n/bundle_de.properties b/name.abuchen.portfolio.bootstrap/OSGI-INF/l10n/bundle_de.properties index 088ef1fe47..509ff77acc 100644 --- a/name.abuchen.portfolio.bootstrap/OSGI-INF/l10n/bundle_de.properties +++ b/name.abuchen.portfolio.bootstrap/OSGI-INF/l10n/bundle_de.properties @@ -2,7 +2,7 @@ category.name = Portfolio Performance command.about.name = \u00DC&ber Portfolio Performance -command.clearRecentFiles.name = Eintr\u00E4ge l\u00F6schen +command.clearRecentFiles.name = Liste l\u00F6schen command.clearRecentFiles.tooltip = L\u00F6scht alle Eintr\u00E4ge in der Liste der zuletzt verwendeten Dateien. command.close.name = Datei &schlie\u00DFen command.consistencyChecks.name = &Plausibilit\u00E4tspr\u00FCfung... @@ -21,7 +21,7 @@ command.import.pdf.create-text.tooltip = Wandelt das PDF-Dokument in ein r command.import.pdf.import-pdf = PDF-Bankdokumente command.import.xml.ib = Interactive Brokers: Kontoumsatz-Flex-Query command.import.xml.ib.tooltip = XML mit Bartransaktionen, Trades, Kapitalma\u00DFnahmen, ... -command.import.xml.import-xml = XML Dokumente (experimentell) +command.import.xml.import-xml = XML-Dokumente (experimentell) command.importWithCSVConfiguration.name = Vorlagen command.newFile.mnemonic = N command.newFile.name = &Neu... @@ -33,7 +33,7 @@ command.openbrowser.changelog.name = \u00C4nderungsprotokoll command.openbrowser.changelog.tooltip = https://www.portfolio-performance.info/portfolio/versions.html command.openbrowser.faq.tooltip = https://forum.portfolio-performance.info/c/faq command.openbrowser.forum.tooltip = https://forum.portfolio-performance.info -command.openbrowser.gitHub.name = Source Code auf GitHub +command.openbrowser.gitHub.name = Quelltext auf GitHub command.openbrowser.gitHub.tooltip = https://github.com/portfolio-performance/portfolio command.openbrowser.how-tos.tooltip = https://forum.portfolio-performance.info/c/how-to command.openbrowser.newandnoteworthy.name = Neues && Nennenswertes @@ -41,7 +41,7 @@ command.openbrowser.newandnoteworthy.tooltip = https://forum.portfolio-performan command.openbrowser.translationTeams.name = \u00DCbersetzungs-Teams beitreten command.openbrowser.translationTeams.tooltip = https://poeditor.com/join/project?hash=4lYKLpEWOY command.preferences.name = &Einstellungen... -command.preferences.tooltip = Sprache, HTTP-Proxy, Online-Aktualisierung und weitere Einstellungen vornehmen +command.preferences.tooltip = Sprache, HTTP-Proxy, Online-Aktualisierung und weitere Einstellungen konfigurieren command.quit.name = &Beenden command.quit.tooltip = Auf Wiedersehen und bis zum n\u00E4chsten Mal! command.save.mnemonic = S @@ -53,7 +53,7 @@ command.saveAs.name = Speichern &unter command.saveAs.passwordProtected = Passwortgesch\u00FCtzt (AES-256) command.saveAs.passwordProtected.tooltip = Speichert Deine Datei in einem komprimierten Bin\u00E4rformat, das mit AES-256 verschl\u00FCsselt ist. command.saveAs.xml = XML -command.saveAs.xml.tooltip = Speichert die Datei im XML-Format (Extensible Markup Language) als reine Textdatei. Hinweis: die mobile App unterst\u00FCtzt das XML-Format nicht. +command.saveAs.xml.tooltip = Speichert die Datei im XML-Format (Extensible Markup Language) als reine Textdatei. Hinweis: Die mobile App unterst\u00FCtzt das XML-Format nicht. command.saveAs.zip = XML komprimiert command.saveAs.zip.tooltip = Speichert die Datei im XML Format (Extensible Markup Language) als komprimierte Textdatei. command.saveErrorLog.label = Fehlerprotokoll speichern... diff --git a/name.abuchen.portfolio.bootstrap/OSGI-INF/l10n/bundle_nl.properties b/name.abuchen.portfolio.bootstrap/OSGI-INF/l10n/bundle_nl.properties index 6f9bf3df65..cec9c0971a 100644 --- a/name.abuchen.portfolio.bootstrap/OSGI-INF/l10n/bundle_nl.properties +++ b/name.abuchen.portfolio.bootstrap/OSGI-INF/l10n/bundle_nl.properties @@ -5,16 +5,16 @@ command.about.name = &Over Portfolio Performance command.clearRecentFiles.name = Lijst wissen command.clearRecentFiles.tooltip = Wist alle vermeldingen uit de lijst met recent gebruikte bestanden. command.close.name = &Bestand sluiten -command.consistencyChecks.name = &Consistentiecheck... -command.consistencyChecks.tooltip = De consistentiecheck onderzoekt het bestand op inconsistenties. Problemen kunnen worden veroorzaakt door fouten in het programma of als het XML-bestand rechtstreeks wordt bewerkt. -command.csv = CSV-bestand (door komma's gescheiden waarden) -command.errorlog.clearlog = Wis vermeldingen uit foutenlogboek -command.errorlog.openlog = &Open het volledige foutenlogboek +command.consistencyChecks.name = &Consistentiecontrole uitvoeren +command.consistencyChecks.tooltip = De consistentiecontrole onderzoekt het bestand op inconsistenties. Problemen kunnen worden veroorzaakt door fouten in het programma of als een XML-bestand handmatig werd bewerkt. +command.csv = CSV-bestand +command.errorlog.clearlog = Wis vermeldingen uit het foutenlog +command.errorlog.openlog = &Open het volledige foutenlog command.export.name = &Exporteren command.export.xml = XML-bestand command.fix.restoresourceattribute = Oplossing: herstel het 'source'-attribuut van een andere bestandsversie command.forceClearPersistedState.name = &Debug: GUI resetten naar standaardinstellingen... -command.forceClearPersistedState.tooltip = Normaal slaat Portfolio Performance de lay-out en status van de geopende bestanden op. Met deze opdracht wordt de status en opmaak van de gebruikersinterface opnieuw ingesteld naar de standaardwaarden. +command.forceClearPersistedState.tooltip = Normaal slaat Portfolio Performance de lay-out en status van de geopende bestanden op. Met deze opdracht wordt de status en opmaak van de gebruikersinterface ingesteld naar de standaardwaarden. command.import.name = &Importeren command.import.pdf.create-text = Debug: maak tekst uit PDF... command.import.pdf.create-text.tooltip = Converteert het PDF-document naar een plat tekstbestand. Met behulp van dit bestand kan een extra PDF-importer worden ontwikkeld of een bestaande worden aangepast aan nieuwe lay-outs. Portfolio Performance maakt gebruik van het platte-tekstformaat, zodat het gemakkelijker is om persoonlijke gegevens zoals naam en adres te bewerken. @@ -29,7 +29,7 @@ command.openFile.mnemonic = O command.openFile.name = &Openen... command.openRecentFile.name = &Recent geopend command.openWithLastView.name = Begin altijd met de laatste weergave -command.openbrowser.changelog.name = Changelog +command.openbrowser.changelog.name = Wijzigingslog command.openbrowser.changelog.tooltip = https://github.com/portfolio-performance/portfolio/releases command.openbrowser.faq.tooltip = https://forum.portfolio-performance.info/c/faq command.openbrowser.forum.tooltip = https://forum.portfolio-performance.info @@ -46,7 +46,7 @@ command.quit.name = &Afsluiten command.quit.tooltip = Tot ziens! command.save.mnemonic = S command.save.name = &Opslaan -command.saveAll.name = A&IIes opslaan +command.saveAll.name = &AIIes opslaan command.saveAs.binary = Binair command.saveAs.binary.tooltip = Slaat je bestand op in een gecomprimeerd binair formaat. command.saveAs.name = Opslaan &als @@ -56,12 +56,12 @@ command.saveAs.xml = XML command.saveAs.xml.tooltip = Slaat het bestand op in de XML-indeling (Extensible Markup Language) als een gewoon tekstbestand. Opmerking: de mobiele app ondersteunt het XML-formaat niet. command.saveAs.zip = XML gecomprimeerd command.saveAs.zip.tooltip = Slaat het bestand op in de XML-indeling (Extensible Markup Language) als een gecomprimeerd tekstbestand. -command.saveErrorLog.label = Foutenlogboek bewaren... -command.showErrorView.label = &Foutenlogboek tonen -command.showErrorView.tooltip = Het foutenlogboek bevat details en stacktraces voor fouten die zijn opgetreden tijdens de huidige uitvoering van het programma. +command.saveErrorLog.label = Foutenlog bewaren... +command.showErrorView.label = &Foutenlog tonen +command.showErrorView.tooltip = Het foutenlog bevat details en stacktraces voor fouten die zijn opgetreden tijdens de uitvoering van Portfolio Perfomance command.switchCurrency.name = Valuta command.tools.name = Gereedschap -command.update.name = Controleren op &Updates... +command.update.name = Controleren op &updates command.updateQuotes.label = Update koersen command.updateQuotes.name = Update &koersen command.updateQuotes.tooltip = Update de koersen van alle effecten. Standaard worden alle nieuwe koersen elke 30 minuten bijgewerkt en worden alle historische koersen elke 6 uur bijgewerkt. @@ -80,7 +80,7 @@ menu.view.label = &Bekijken menu.view.options.discreet-mode.label = Discrete modus menu.view.options.label = Opties -part.errorlog = Foutenlogboek +part.errorlog = Foutenlog part.portfolio = Portfolio-bestand part.textviewer = Text Viewer part.welcome = Welkom diff --git a/name.abuchen.portfolio.bootstrap/pom.xml b/name.abuchen.portfolio.bootstrap/pom.xml index e1cdca79f2..139bbb4fbc 100644 --- a/name.abuchen.portfolio.bootstrap/pom.xml +++ b/name.abuchen.portfolio.bootstrap/pom.xml @@ -6,7 +6,7 @@ name.abuchen.portfolio portfolio-app - 0.68.3-SNAPSHOT + 0.68.4-SNAPSHOT ../portfolio-app diff --git a/name.abuchen.portfolio.bootstrap/src/name/abuchen/portfolio/bootstrap/messages_de.properties b/name.abuchen.portfolio.bootstrap/src/name/abuchen/portfolio/bootstrap/messages_de.properties index 020eaee649..b5b05ee4e2 100644 --- a/name.abuchen.portfolio.bootstrap/src/name/abuchen/portfolio/bootstrap/messages_de.properties +++ b/name.abuchen.portfolio.bootstrap/src/name/abuchen/portfolio/bootstrap/messages_de.properties @@ -19,4 +19,4 @@ SaveHandlerMsgSelectFileToSave = Welche Dateien sollen gespeichert werden? SaveHandlerPrompt = ''{0}'' wurde ge\u00E4ndert. Sollen die \u00C4nderungen gespeichert werden? -SaveHandlerTitle = Datei Speichern +SaveHandlerTitle = Datei speichern diff --git a/name.abuchen.portfolio.feature/feature.xml b/name.abuchen.portfolio.feature/feature.xml index e46d930d02..d365ad7347 100644 --- a/name.abuchen.portfolio.feature/feature.xml +++ b/name.abuchen.portfolio.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/name.abuchen.portfolio.feature/pom.xml b/name.abuchen.portfolio.feature/pom.xml index 92ce57225f..cdc2bd4a36 100644 --- a/name.abuchen.portfolio.feature/pom.xml +++ b/name.abuchen.portfolio.feature/pom.xml @@ -6,7 +6,7 @@ name.abuchen.portfolio portfolio-app - 0.68.3-SNAPSHOT + 0.68.4-SNAPSHOT ../portfolio-app diff --git a/name.abuchen.portfolio.junit/META-INF/MANIFEST.MF b/name.abuchen.portfolio.junit/META-INF/MANIFEST.MF index 5a4db197b8..df5e4007ba 100644 --- a/name.abuchen.portfolio.junit/META-INF/MANIFEST.MF +++ b/name.abuchen.portfolio.junit/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Test Helper Classes Bundle-SymbolicName: name.abuchen.portfolio.junit -Bundle-Version: 0.68.3.qualifier +Bundle-Version: 0.68.4.qualifier Export-Package: name.abuchen.portfolio.junit Require-Bundle: name.abuchen.portfolio;bundle-version="0.59.6", org.hamcrest.core;bundle-version="1.3.0", diff --git a/name.abuchen.portfolio.junit/pom.xml b/name.abuchen.portfolio.junit/pom.xml index ab4cffcde1..a78407f261 100644 --- a/name.abuchen.portfolio.junit/pom.xml +++ b/name.abuchen.portfolio.junit/pom.xml @@ -7,7 +7,7 @@ name.abuchen.portfolio portfolio-app - 0.68.3-SNAPSHOT + 0.68.4-SNAPSHOT ../portfolio-app diff --git a/name.abuchen.portfolio.tests/META-INF/MANIFEST.MF b/name.abuchen.portfolio.tests/META-INF/MANIFEST.MF index 51ce1b25d0..171fab10a0 100644 --- a/name.abuchen.portfolio.tests/META-INF/MANIFEST.MF +++ b/name.abuchen.portfolio.tests/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Portfolio Performance Tests Bundle-SymbolicName: name.abuchen.portfolio.tests -Bundle-Version: 0.68.3.qualifier +Bundle-Version: 0.68.4.qualifier Fragment-Host: name.abuchen.portfolio Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-Vendor: Andreas Buchen diff --git a/name.abuchen.portfolio.tests/pom.xml b/name.abuchen.portfolio.tests/pom.xml index 7572f2e5d8..7c168d4591 100644 --- a/name.abuchen.portfolio.tests/pom.xml +++ b/name.abuchen.portfolio.tests/pom.xml @@ -7,7 +7,7 @@ name.abuchen.portfolio portfolio-app - 0.68.3-SNAPSHOT + 0.68.4-SNAPSHOT ../portfolio-app diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/BaaderBankPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/BaaderBankPDFExtractorTest.java index bbf503725b..69cd410ce2 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/BaaderBankPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/BaaderBankPDFExtractorTest.java @@ -20,6 +20,7 @@ import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTicker; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasWkn; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.interest; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.outboundDelivery; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.purchase; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.sale; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security; @@ -2324,6 +2325,168 @@ public void testWertpapierVerkauf17() hasTaxes("EUR", 0.00), hasFees("EUR", 4.00 + 3.32)))); } + @Test + public void testWertpapierVerkauf18() + { + BaaderBankPDFExtractor extractor = new BaaderBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf18.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("DE000HB2KBG9"), hasWkn("HB2KBG"), hasTicker(null), // + hasName("UniCredit Bank AG HVB Inline 18.05.22 BASF 45-70"), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(sale( // + hasDate("2022-05-25T00:00"), hasShares(6), // + hasSource("Verkauf18.txt"), // + hasNote("Vorgangs-Nr.: 8679954 | Ablauf der Optionsfrist"), // + hasAmount("EUR", 60.00), hasGrossValue("EUR", 60.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + } + + @Test + public void testWertpapierVerkauf19() + { + BaaderBankPDFExtractor extractor = new BaaderBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf19.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("US60468T1051"), hasWkn("A1W1XV"), hasTicker(null), // + hasName("Mirati Therapeutics Inc. Registered Shares DL -,01"), // + hasCurrencyCode("USD")))); + + // check buy sell transaction + assertThat(results, hasItem(sale( // + hasDate("2024-01-25T00:00"), hasShares(4), // + hasSource("Verkauf19.txt"), // + hasNote("Vorgangs-Nr.: 25742277 | Obligatorische Barabfindung"), // + hasAmount("EUR", 212.68), hasGrossValue("EUR", 212.68), // + hasForexGrossValue("USD", 232.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + } + + @Test + public void testWertpapierVerkauf19WithSecurityInEUR() + { + Security security = new Security("Mirati Therapeutics Inc. Registered Shares DL -,01", CurrencyUnit.EUR); + security.setIsin("US60468T1051"); + security.setWkn("A1W1XV"); + + Client client = new Client(); + client.addSecurity(security); + + BaaderBankPDFExtractor extractor = new BaaderBankPDFExtractor(client); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf19.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(1)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check buy sell transaction + assertThat(results, hasItem(sale( // + hasDate("2024-01-25T00:00"), hasShares(4), // + hasSource("Verkauf19.txt"), // + hasNote("Vorgangs-Nr.: 25742277 | Obligatorische Barabfindung"), // + hasAmount("EUR", 212.68), hasGrossValue("EUR", 212.68), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00), // + check(tx -> { + CheckCurrenciesAction c = new CheckCurrenciesAction(); + Status s = c.process((PortfolioTransaction) tx, new Portfolio()); + assertThat(s, is(Status.OK_STATUS)); + })))); + } + + @Test + public void testWertpapierVerkauf20() + { + BaaderBankPDFExtractor extractor = new BaaderBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf20.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("DE0001104875"), hasWkn("110487"), hasTicker(null), // + hasName("Bundesrep.Deutschland Bundesschatzanw. v.22(24)"), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(sale( // + hasDate("2024-03-15T00:00"), hasShares(2080), // + hasSource("Verkauf20.txt"), // + hasNote("Vorgangs-Nr.: 06501068"), // + hasAmount("EUR", 206626.75), hasGrossValue("EUR", 208000.00), // + hasTaxes("EUR", 1301.66 + 71.59), hasFees("EUR", 0.00)))); + } + + @Test + public void testCryptoKauf01() + { + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "CryptoKauf01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin(null), hasWkn(null), hasTicker("BTC"), // + hasName("Bitcoin"), // + hasCurrencyCode("EUR"), // + hasFeed(CoinGeckoQuoteFeed.ID), // + hasFeedProperty(CoinGeckoQuoteFeed.COINGECKO_COIN_ID, "bitcoin")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2024-01-02T11:04:16"), hasShares(0.0024), // + hasSource("CryptoKauf01.txt"), // + hasNote("Vorgangs-Nr.: KRY 000000123456"), // + hasAmount("EUR", 101.75), hasGrossValue("EUR", 100.75), // + hasTaxes("EUR", 0.00), hasFees("EUR", 1.00)))); + } + @Test public void testVorabpauschale01() { @@ -4801,146 +4964,35 @@ public void testEinbuchung01() } @Test - public void testAusbuchung01() - { - BaaderBankPDFExtractor extractor = new BaaderBankPDFExtractor(new Client()); - - List errors = new ArrayList<>(); - - List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Ausbuchung01.txt"), errors); - - assertThat(errors, empty()); - assertThat(results.size(), is(2)); - new AssertImportActions().check(results, CurrencyUnit.EUR); - - // check security - Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security.getIsin(), is("DE000HB2KBG9")); - assertThat(security.getWkn(), is("HB2KBG")); - assertNull(security.getTickerSymbol()); - assertThat(security.getName(), is("UniCredit Bank AG HVB Inline 18.05.22 BASF 45-70")); - assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); - - // check buy sell transaction - BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-05-25T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(6))); - assertThat(entry.getSource(), is("Ausbuchung01.txt")); - assertThat(entry.getNote(), is("Vorgangs-Nr.: 8679954 | Ablauf der Optionsfrist")); - - assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(60.00)))); - assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(60.00)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - } - - @Test - public void testAusbuchung02() + public void testFusion01() { BaaderBankPDFExtractor extractor = new BaaderBankPDFExtractor(new Client()); List errors = new ArrayList<>(); - List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Ausbuchung02.txt"), errors); - - assertThat(errors, empty()); - assertThat(countSecurities(results), is(1L)); - assertThat(countBuySell(results), is(1L)); - assertThat(countAccountTransactions(results), is(0L)); - assertThat(results.size(), is(2)); - new AssertImportActions().check(results, CurrencyUnit.EUR); - - // check security - assertThat(results, hasItem(security( // - hasIsin("US60468T1051"), hasWkn("A1W1XV"), hasTicker(null), // - hasName("Mirati Therapeutics Inc. Registered Shares DL -,01"), // - hasCurrencyCode("USD")))); - - // check buy sell transaction - assertThat(results, hasItem(sale( // - hasDate("2024-01-25T00:00"), hasShares(4), // - hasSource("Ausbuchung02.txt"), // - hasNote("Vorgangs-Nr.: 25742277 | Obligatorische Barabfindung"), // - hasAmount("EUR", 212.68), hasGrossValue("EUR", 212.68), // - hasForexGrossValue("USD", 232.00), // - hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); - } - - @Test - public void testAusbuchung02WithSecurityInEUR() - { - Security security = new Security("Mirati Therapeutics Inc. Registered Shares DL -,01", CurrencyUnit.EUR); - security.setIsin("US60468T1051"); - security.setWkn("A1W1XV"); - - Client client = new Client(); - client.addSecurity(security); - - BaaderBankPDFExtractor extractor = new BaaderBankPDFExtractor(client); - - List errors = new ArrayList<>(); - - List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Ausbuchung02.txt"), errors); - - assertThat(errors, empty()); - assertThat(countSecurities(results), is(0L)); - assertThat(countBuySell(results), is(1L)); - assertThat(countAccountTransactions(results), is(0L)); - assertThat(results.size(), is(1)); - new AssertImportActions().check(results, CurrencyUnit.EUR); - - // check buy sell transaction - assertThat(results, hasItem(sale( // - hasDate("2024-01-25T00:00"), hasShares(4), // - hasSource("Ausbuchung02.txt"), // - hasNote("Vorgangs-Nr.: 25742277 | Obligatorische Barabfindung"), // - hasAmount("EUR", 212.68), hasGrossValue("EUR", 212.68), // - hasTaxes("EUR", 0.00), hasFees("EUR", 0.00), // - check(tx -> { - CheckCurrenciesAction c = new CheckCurrenciesAction(); - Status s = c.process((PortfolioTransaction) tx, new Portfolio()); - assertThat(s, is(Status.OK_STATUS)); - })))); - } - - @Test - public void testCryptoKauf01() - { - List errors = new ArrayList<>(); - - List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "CryptoKauf01.txt"), errors); + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Fusion01.txt"), errors); assertThat(errors, empty()); assertThat(countSecurities(results), is(1L)); - assertThat(countBuySell(results), is(1L)); - assertThat(countAccountTransactions(results), is(0L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); assertThat(results.size(), is(2)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security assertThat(results, hasItem(security( // - hasIsin(null), hasWkn(null), hasTicker("BTC"), // - hasName("Bitcoin"), // - hasCurrencyCode("EUR"), // - hasFeed(CoinGeckoQuoteFeed.ID), // - hasFeedProperty(CoinGeckoQuoteFeed.COINGECKO_COIN_ID, "bitcoin")))); + hasIsin("LU1861134382"), hasWkn("A2JSDA"), hasTicker(null), // + hasName("AIS-AM.WORLD SRI PAB Act.Nom. UCITS ETF DR (C)o.N."), // + hasCurrencyCode("EUR")))); - // check buy sell transaction - assertThat(results, hasItem(purchase( // - hasDate("2024-01-02T11:04:16"), hasShares(0.0024), // - hasSource("CryptoKauf01.txt"), // - hasNote("Vorgangs-Nr.: KRY 000000123456"), // - hasAmount("EUR", 101.75), hasGrossValue("EUR", 100.75), // - hasTaxes("EUR", 0.00), hasFees("EUR", 1.00)))); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + outboundDelivery( // + hasDate("2024-01-18T00:00"), hasShares(277.691), // + hasSource("Fusion01.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); } } diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/Fusion01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/Fusion01.txt new file mode 100644 index 0000000000..aec8b48905 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/Fusion01.txt @@ -0,0 +1,112 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.67.2 +----------------------------------------- +Baader Bank AG Weihenstephaner Straße 4 85716 Unterschleißheim Smartbroker AG +T 00800 00 586336* F +49 89 5150 2442 service@baaderbank.de Ritterstraße 11 +10969 Berlin +Seite 1/3 +Berlin +jeMVIIzt aNwIf 24.01.2024 +ARNIKdlQYjj 38 +zcnjpkah ZQeWF +89600 VxYlpiW PF 02 +Stamm-Nr.: 5767509 Portfolio: 8 +Depot-Nr.: 8332124336 +Vorgangs-Nr.: 48619947 +Referenz-Nr.: 033294508 +Buchungsanzeige +Fusion / Zusammenlegung +Ausbuchung aus Depot 1686005753 per 18.01.2024 +Nominale ISIN: LU1861134382 WKN: A2JSDA +STK 277,691 AIS-AM.WORLD SRI PAB +Act.Nom. UCITS ETF DR (C)o.N. +Einbuchung in Depot 1837966841 per 18.01.2024 +Nominale ISIN: IE000Y77LGG9 WKN: ETF143 +STK 277,691 Am.ETF-MSCI W.SRI CL.N.Z.AM.P. +Bear.Shs EUR Acc. oN +Verhältnis: 1 : 1 +Kapitalertragsteuer EUR 338,76 - +Solidaritätszuschlag EUR 18,63 - +Zu Lasten Konto 6960880181 Valuta: 18.01.2024 EUR 357,39 +Bitte beachten Sie Ihre eventuelle Meldepflicht nach § 67 AWV. +Einkünfte aus Kapitalvermögen im Sinne von § 20 EStG sind einkommensteuerpflichtig. +Dieses Dokument wurde maschinell erstellt und wird nicht unterschrieben. +smartbrokerplus.de +Brauchen Sie Unterstützung? Dann kontaktieren Sie bitte den Service von SMARTBROKER+ über das Kontaktformular in der SMARTBROKER+ App. + +Herausgeberin und verantwortlich für den Inhalt ist die Baader Bank Aktiengesellschaft • Weihenstephaner Straße 4 • 85716 Unterschleißheim • Deutschland +Vorstand: Nico Baader (Vorsitzender), Oliver Riedel (stv. Vorsitzender) • Vorsitzender des Aufsichtsrates: Helmut Schreyer • Amtsgericht München HRB +121537 • Sitz der Gesellschaft: Unterschleißheim • StNr. 143/107/04009 • USt-IdNr. DE114123893 • LEI: 529900JFOPPEDUR61H13 • T 00800 00 586336* +service@baaderbank.de UMTA-053.048 + +* Kostenfreie Telefonnummer aus dem (inter-) nationalen Festnetz. Für Anrufe aus anderen Netzen können Gebühren anfallen. +Fusion / Zusammenlegung +Fortsetzung: Seite 2/3 +Darstellung der steuerlichen Berechnungsgrundlagen: +Merkposten / Steuertöpfe vorher Erhöhung/Reduktion nachher +Kapitalertragsteuer EUR 238,62 EUR 338,76 EUR 577,38 +Bemessungsgrundlagen Steuerpflicht brutto Steuerpflicht netto +Veräußerungsergebnis vor Teilfreistellung Aktienfonds EUR 1.935,78 EUR 1.355,05 +Veräußerungsergebnis Teilfreistellung 30% EUR 580,73 - EUR 0,00 +Bemessungsgrundlage zur Kapitalertragsteuer EUR 1.355,05 EUR 1.355,05 +Bemessungsgrundlage zur Kapitalertragsteuer +Kapitalertragsteuer 25,00 % +EUR 338,76 - EUR 338,76 - +Solidaritätszuschlag 5,50 % +EUR 18,63 - EUR 18,63 - +Ausbuchung +Stück 277,691 AIS-AM.WORLD SRI PAB +ISIN: LU1861134382 +Kurs: EUR 86,8289 +Berücksichtigte Anschaffungsgeschäfte (alle ermittelten Beträge in EUR) +Geschäfts- +Geschäft Nr. Datum Whg./St. Nominal/Stück Anschaff.-kosten ant. Veräußer.-erlös ant. Ergebnis +WP-Einlief. mit AK 241612678 30.06.2021 STK 15 1.126,50 1.302,43 175,93 +WP-Einlief. mit AK 241612678 01.07.2021 STK 10,911 825,00 947,39 122,39 +WP-Einlief. mit AK 241612678 08.07.2021 STK 25 1.887,50 2.170,72 283,22 +WP-Einlief. mit AK 241612678 02.08.2021 STK 10,663 825,00 925,86 100,86 +WP-Einlief. mit AK 241612678 01.09.2021 STK 10,31 825,00 895,21 70,21 +WP-Einlief. mit AK 241612678 01.10.2021 STK 10,749 825,00 933,32 108,32 +WP-Einlief. mit AK 241612678 01.11.2021 STK 9,731 825,00 844,93 19,93 +WP-Einlief. mit AK 241612678 01.12.2021 STK 9,647 825,00 837,64 12,64 +WP-Einlief. mit AK 241612678 03.01.2022 STK 9,318 825,00 809,07 15,93 - +WP-Einlief. mit AK 241612678 01.02.2022 STK 9,999 825,00 868,20 43,20 +WP-Einlief. mit AK 241612678 01.03.2022 STK 10,282 825,00 892,77 67,77 +WP-Einlief. mit AK 241612678 01.04.2022 STK 9,855 825,00 855,70 30,70 +WP-Einlief. mit AK 241612678 02.05.2022 STK 10,296 825,00 893,99 68,99 +WP-Einlief. mit AK 241612678 01.06.2022 STK 10,603 825,00 920,65 95,65 +WP-Einlief. mit AK 241612678 01.07.2022 STK 11,418 825,00 991,41 166,41 +WP-Einlief. mit AK 241612678 01.09.2022 STK 10,603 825,00 920,65 95,65 +WP-Einlief. mit AK 241612678 01.11.2022 STK 10,691 825,00 928,29 103,29 +WP-Einlief. mit AK 241612678 01.12.2022 STK 10,447 825,00 907,10 82,10 +WP-Einlief. mit AK 241612678 02.01.2023 STK 11,168 825,00 969,70 144,70 +WP-Einlief. mit AK 241612678 19.07.2023 STK 61 5.136,81 5.296,56 159,75 +smartbrokerplus.de +Brauchen Sie Unterstützung? Dann kontaktieren Sie bitte den Service von SMARTBROKER+ über das Kontaktformular in der SMARTBROKER+ App. + +Herausgeberin und verantwortlich für den Inhalt ist die Baader Bank Aktiengesellschaft • Weihenstephaner Straße 4 • 85716 Unterschleißheim • Deutschland +Vorstand: Nico Baader (Vorsitzender), Oliver Riedel (stv. Vorsitzender) • Vorsitzender des Aufsichtsrates: Helmut Schreyer • Amtsgericht München HRB +121537 • Sitz der Gesellschaft: Unterschleißheim • StNr. 143/107/04009 • USt-IdNr. DE114123893 • LEI: 529900JFOPPEDUR61H13 • T 00800 00 586336* +service@baaderbank.de UMTA-053.048 + +* Kostenfreie Telefonnummer aus dem (inter-) nationalen Festnetz. Für Anrufe aus anderen Netzen können Gebühren anfallen. +Fusion / Zusammenlegung +Fortsetzung: Seite 3/3 +Einbuchung +Stück 277,691 Am.ETF-MSCI W.SRI CL.N.Z.AM.P. +ISIN: IE000Y77LGG9 +Kurs: EUR 86,8289 +Berücksichtigte Anschaffungsgeschäfte (alle ermittelten Beträge in EUR) +Geschäfts- +Geschäft Nr. Datum Whg./St. Nominal/Stück Anschaff.-kosten +WP Einbuchung CA 24330822 18.01.2024 STK 277,691 24.111,60 +Dieses Dokument wurde maschinell erstellt und wird nicht unterschrieben. +smartbrokerplus.de +Brauchen Sie Unterstützung? Dann kontaktieren Sie bitte den Service von SMARTBROKER+ über das Kontaktformular in der SMARTBROKER+ App. + +Herausgeberin und verantwortlich für den Inhalt ist die Baader Bank Aktiengesellschaft • Weihenstephaner Straße 4 • 85716 Unterschleißheim • Deutschland +Vorstand: Nico Baader (Vorsitzender), Oliver Riedel (stv. Vorsitzender) • Vorsitzender des Aufsichtsrates: Helmut Schreyer • Amtsgericht München HRB +121537 • Sitz der Gesellschaft: Unterschleißheim • StNr. 143/107/04009 • USt-IdNr. DE114123893 • LEI: 529900JFOPPEDUR61H13 • T 00800 00 586336* +service@baaderbank.de UMTA-053.048 + +* Kostenfreie Telefonnummer aus dem (inter-) nationalen Festnetz. Für Anrufe aus anderen Netzen können Gebühren anfallen. \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/Ausbuchung01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/Verkauf18.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/Ausbuchung01.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/Verkauf18.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/Ausbuchung02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/Verkauf19.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/Ausbuchung02.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/Verkauf19.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/Verkauf20.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/Verkauf20.txt new file mode 100644 index 0000000000..2c6fab0819 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/baaderbank/Verkauf20.txt @@ -0,0 +1,69 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.2 +----------------------------------------- +Baader Bank AG Weihenstephaner Straße 4 85716 Unterschleißheim Smartbroker AG +T 00800 00 586336* F +49 89 5150 2442 service@baaderbank.de Ritterstraße 11 +10969 Berlin +Seite 1/2 +Berlin +caNLNg GAUobry 16.03.2024 +wFUBZu-kWKPuJECu-Vrj. 97 +daULWc yguOSUX +21207 FEcz PF 05 +Stamm-Nr.: 7655124 Portfolio: 5 +Depot-Nr.: 1395395862 +Vorgangs-Nr.: 06501068 +Referenz-Nr.: 219525965 +Gesamtrückzahlung +Ex-Tag: 15.03.2024 +Nominale ISIN: DE0001104875 WKN: 110487 Rückzahlung +EUR 208.000,00 Bundesrep.Deutschland 100,00 % +Bundesschatzanw. v.22(24) +Bruttobetrag EUR 208.000,00 +Kapitalertragsteuer EUR 1.301,66 - +Solidaritätszuschlag EUR 71,59 - +Zu Gunsten Konto 9718673525 Valuta: 15.03.2024 EUR 206.626,75 +Bitte beachten Sie Ihre eventuelle Meldepflicht nach § 67 AWV. +Einkünfte aus Kapitalvermögen im Sinne von § 20 EStG sind einkommensteuerpflichtig. +Dieses Dokument wurde maschinell erstellt und wird nicht unterschrieben. +smartbrokerplus.de +Brauchen Sie Unterstützung? Dann kontaktieren Sie bitte den Service von SMARTBROKER+ über das Kontaktformular in der SMARTBROKER+ App. + +Herausgeberin und verantwortlich für den Inhalt ist die Baader Bank Aktiengesellschaft • Weihenstephaner Straße 4 • 85716 Unterschleißheim • Deutschland +Vorstand: Nico Baader (Vorsitzender), Oliver Riedel (stv. Vorsitzender) • Vorsitzender des Aufsichtsrates: Helmut Schreyer • Amtsgericht München HRB +121537 • Sitz der Gesellschaft: Unterschleißheim • StNr. 143/107/04009 • USt-IdNr. DE114123893 • LEI: 529900JFOPPEDUR61H13 • T 00800 00 586336* +service@baaderbank.de ENDF-041.048 + +* Kostenfreie Telefonnummer aus dem (inter-) nationalen Festnetz. Für Anrufe aus anderen Netzen können Gebühren anfallen. +Gesamtrückzahlung +Fortsetzung: Seite 2/2 +Darstellung der steuerlichen Berechnungsgrundlagen: +Merkposten / Steuertöpfe vorher Erhöhung/Reduktion nachher +Kapitalertragsteuer EUR 685,93 EUR 1.301,66 EUR 1.987,59 +Bemessungsgrundlagen Steuerpflicht brutto Steuerpflicht netto +Gewinn / Verlust aus Wertpapierveräußerungen (ohne Aktien) EUR 5.206,62 EUR 5.206,62 +Bemessungsgrundlage zur Kapitalertragsteuer EUR 5.206,62 EUR 5.206,62 +Bemessungsgrundlage zur Kapitalertragsteuer +Kapitalertragsteuer 25,00 % +EUR 1.301,66 - EUR 1.301,66 - +Solidaritätszuschlag 5,50 % +EUR 71,59 - EUR 71,59 - +Ausbuchung +EUR 208.000,00 Bundesrep.Deutschland +ISIN: DE0001104875 +Berücksichtigte Anschaffungsgeschäfte (alle ermittelten Beträge in EUR) +Geschäfts- +Geschäft Nr. Datum Whg./St. Nominal/Stück Anschaff.-kosten ant. Veräußer.-erlös ant. Ergebnis +WP-Einlief. mit AK 241551125 20.04.2023 EUR 100.000,00 97.359,00 100.000,00 2.641,00 +WP-Einlief. mit AK 241551125 15.05.2023 EUR 70.000,00 68.327,00 70.000,00 1.673,00 +WP-Einlief. mit AK 241551125 02.06.2023 EUR 38.000,00 37.107,38 38.000,00 892,62 +Dieses Dokument wurde maschinell erstellt und wird nicht unterschrieben. +smartbrokerplus.de +Brauchen Sie Unterstützung? Dann kontaktieren Sie bitte den Service von SMARTBROKER+ über das Kontaktformular in der SMARTBROKER+ App. + +Herausgeberin und verantwortlich für den Inhalt ist die Baader Bank Aktiengesellschaft • Weihenstephaner Straße 4 • 85716 Unterschleißheim • Deutschland +Vorstand: Nico Baader (Vorsitzender), Oliver Riedel (stv. Vorsitzender) • Vorsitzender des Aufsichtsrates: Helmut Schreyer • Amtsgericht München HRB +121537 • Sitz der Gesellschaft: Unterschleißheim • StNr. 143/107/04009 • USt-IdNr. DE114123893 • LEI: 529900JFOPPEDUR61H13 • T 00800 00 586336* +service@baaderbank.de ENDF-041.048 + +* Kostenfreie Telefonnummer aus dem (inter-) nationalen Festnetz. Für Anrufe aus anderen Netzen können Gebühren anfallen. \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bigbank/BigbankPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bigbank/BigbankPDFExtractorTest.java new file mode 100644 index 0000000000..37c9463d39 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bigbank/BigbankPDFExtractorTest.java @@ -0,0 +1,93 @@ +package name.abuchen.portfolio.datatransfer.pdf.bigbank; + +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.deposit; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasAmount; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasDate; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasNote; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasSource; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.removal; +import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransactions; +import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countBuySell; +import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countSecurities; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.hasItem; +import static org.hamcrest.collection.IsEmptyCollection.empty; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +import name.abuchen.portfolio.datatransfer.Extractor.Item; +import name.abuchen.portfolio.datatransfer.actions.AssertImportActions; +import name.abuchen.portfolio.datatransfer.pdf.BigbankPDFExtractor; +import name.abuchen.portfolio.datatransfer.pdf.PDFInputFile; +import name.abuchen.portfolio.model.Client; +import name.abuchen.portfolio.money.CurrencyUnit; + +@SuppressWarnings("nls") +public class BigbankPDFExtractorTest +{ + @Test + public void testKontoauszug01() + { + BigbankPDFExtractor extractor = new BigbankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kontoauszug01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(3L)); + assertThat(results.size(), is(3)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // assert transaction + assertThat(results, hasItem(deposit(hasDate("2024-03-20"), hasAmount("EUR", 10.12), // + hasSource("Kontoauszug01.txt"), hasNote(null)))); + + // assert transaction + assertThat(results, hasItem(deposit(hasDate("2024-03-21"), hasAmount("EUR", 1500.34), // + hasSource("Kontoauszug01.txt"), hasNote(null)))); + + // assert transaction + assertThat(results, hasItem(removal(hasDate("2024-03-25"), hasAmount("EUR", 10.12), // + hasSource("Kontoauszug01.txt"), hasNote(null)))); + } + + @Test + public void testKontoauszug02() + { + BigbankPDFExtractor extractor = new BigbankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kontoauszug02.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(4L)); + assertThat(results.size(), is(4)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // assert transaction + assertThat(results, hasItem(deposit(hasDate("2024-03-20"), hasAmount("EUR", 10.00), // + hasSource("Kontoauszug02.txt"), hasNote(null)))); + + // assert transaction + assertThat(results, hasItem(deposit(hasDate("2024-03-21"), hasAmount("EUR", 10500.00), // + hasSource("Kontoauszug02.txt"), hasNote(null)))); + + // assert transaction + assertThat(results, hasItem(removal(hasDate("2024-03-25"), hasAmount("EUR", 10.00), // + hasSource("Kontoauszug02.txt"), hasNote(null)))); + + // assert transaction + assertThat(results, hasItem(removal(hasDate("2024-03-28"), hasAmount("EUR", 3500.00), // + hasSource("Kontoauszug02.txt"), hasNote(null)))); + } +} diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bigbank/Kontoauszug01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bigbank/Kontoauszug01.txt new file mode 100644 index 0000000000..5525d60791 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bigbank/Kontoauszug01.txt @@ -0,0 +1,31 @@ +``` +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.3 +----------------------------------------- + 26.03.2024 +tedj yGBqfR MusjIylOz +pnLTPRWhlvLQRQip 06 +2242 PyWc +vBRjZIShrz +Tagesgeldvertrag SD-ATC-55443596 +Kontoauszug von 01.03.2024 bis 25.03.2024 +IBAN: EE123456789101112131 +Anfangssaldo 01.03.2024 0,00 +Datum Gegenkonto Buchung Name Betrag in EUR +20.03.2024 AT123456789101112131 Einzahlung ffIpWotyu dJMdyU +10,12 +21.03.2024 AT123456789101112131 Einzahlung oDkoRVZEb TxDUxE +1 500,34 +25.03.2024 AT123456789101112131 Auszahlung sUBHAKqzf vNNKxT -10,12 +Endsaldo 25.03.2024 1 500,00 +Anfangssaldo 01.03.2024 0,00 +Summe Belastungen -10,12 +Summe Gutschriften +1 510,46 +Endsaldo 25.03.2024 1 500,34 +Dies ist ein automatisch generierter Kontoauszug. +BIGBANK AS Telefon 0810 900 629 +Riia 2, Tartu E-mail kundenservice@bigbank.at +51004 Reg. Nr. 10183757 +www.bigbank.at VAT. Nr. EE100041383 +1 / 1 +Powered by TCPDF (www.tcpdf.org) + +``` \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bigbank/Kontoauszug02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bigbank/Kontoauszug02.txt new file mode 100644 index 0000000000..a934e31e82 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/bigbank/Kontoauszug02.txt @@ -0,0 +1,32 @@ +``` +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.3 +----------------------------------------- + 01.04.2024 +tyFY kJRhzK MNFKoXDym +XYJuNusQOtCEvbPy 59 +3951 nzHW +qSUUJWYLLx +Tagesgeldvertrag SD-ATC-01331910 +Kontoauszug von 01.03.2024 bis 31.03.2024 +IBAN: EE123456789101112131 +Anfangssaldo 01.03.2024 0,00 +Datum Gegenkonto Buchung Name Betrag in EUR +20.03.2024 AT123456789101112131 Einzahlung EEVtAWeOf irRZwa +10,00 +21.03.2024 AT123456789101112131 Einzahlung eGuACSyzF yuNzvi +10 500,00 +25.03.2024 AT123456789101112131 Auszahlung rCVrxYZph CHeMVH -10,00 +28.03.2024 EE123456789101112132 Interne Belastung wMGSJi WajHthpvl -3 500,00 +Endsaldo 31.03.2024 7 000,00 +Anfangssaldo 01.03.2024 0,00 +Summe Belastungen -3 510,00 +Summe Gutschriften +10 510,00 +Endsaldo 31.03.2024 7 000,00 +Dies ist ein automatisch generierter Kontoauszug. +BIGBANK AS Telefon 0810 900 629 +Riia 2, Tartu E-mail kundenservice@bigbank.at +51004 Reg. Nr. 10183757 +www.bigbank.at VAT. Nr. EE100041383 +1 / 1 +Powered by TCPDF (www.tcpdf.org) + +``` \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/computershare/ComputershareExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/computershare/ComputershareExtractorTest.java index 76ffb92f84..9e49496ca0 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/computershare/ComputershareExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/computershare/ComputershareExtractorTest.java @@ -16,7 +16,6 @@ import static org.hamcrest.collection.IsEmptyCollection.empty; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import org.junit.Test; @@ -40,7 +39,6 @@ public void testDepotAuszugWithPurchase01() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Depotauszug01.txt"), errors); assertThat(errors, empty()); - System.out.println(Arrays.toString(results.toArray())); assertThat(results.size(), is(10)); // check security diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/creditsuisseag/CreditSuisseAGExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/creditsuisseag/CreditSuisseAGExtractorTest.java index 463f1037b2..d634a40d6c 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/creditsuisseag/CreditSuisseAGExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/creditsuisseag/CreditSuisseAGExtractorTest.java @@ -48,7 +48,7 @@ public void testWertpapierKauf01() Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security.getIsin(), is("US46284V1017")); - assertNull(security.getWkn()); + assertThat(security.getWkn(), is("26754105")); assertNull(security.getTickerSymbol()); assertThat(security.getName(), is("Registered Shs Iron Mountain Inc")); assertThat(security.getCurrencyCode(), is(CurrencyUnit.USD)); @@ -112,7 +112,7 @@ public void testWertpapierKauf02() Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security.getIsin(), is("XS1055787680")); - assertNull(security.getWkn()); + assertThat(security.getWkn(), is("24160639")); assertNull(security.getTickerSymbol()); assertThat(security.getName(), is("6.25 % Fixed Rate Notes Norddeutsche")); assertThat(security.getCurrencyCode(), is(CurrencyUnit.USD)); @@ -176,7 +176,7 @@ public void testWertpapierVerkauf01() Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security.getIsin(), is("GB00B03MLX29")); - assertNull(security.getWkn()); + assertThat(security.getWkn(), is("1987674")); assertNull(security.getTickerSymbol()); assertThat(security.getName(), is("Akt. -A- Royal Dutch Shell PLC")); assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); @@ -220,7 +220,7 @@ public void testWertpapierVerkauf02() Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security.getIsin(), is("US88163VAD10")); - assertNull(security.getWkn()); + assertThat(security.getWkn(), is("2429251")); assertNull(security.getTickerSymbol()); assertThat(security.getName(), is("6.15 % Notes Teva Pharmaceutical Finance")); assertThat(security.getCurrencyCode(), is(CurrencyUnit.USD)); @@ -283,7 +283,7 @@ public void testDividende01() Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security.getIsin(), is("XS1055787680")); - assertNull(security.getWkn()); + assertThat(security.getWkn(), is("24160639")); assertNull(security.getTickerSymbol()); assertThat(security.getName(), is("6.25 % FIXED RATE NOTES NORDDEUTSCHE")); assertThat(security.getCurrencyCode(), is(CurrencyUnit.USD)); @@ -326,7 +326,7 @@ public void testDividende02() Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() .orElseThrow(IllegalArgumentException::new).getSecurity(); assertThat(security.getIsin(), is("US46284V1017")); - assertNull(security.getWkn()); + assertThat(security.getWkn(), is("26754105")); assertNull(security.getTickerSymbol()); assertThat(security.getName(), is("REGISTERED SHS IRON MOUNTAIN INC")); assertThat(security.getCurrencyCode(), is(CurrencyUnit.USD)); diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dab/DABPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dab/DABPDFExtractorTest.java index 0f0fd320ac..72cc96b080 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dab/DABPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dab/DABPDFExtractorTest.java @@ -17,6 +17,7 @@ import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTicker; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasWkn; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.inboundDelivery; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.sale; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.taxRefund; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.taxes; @@ -1669,6 +1670,37 @@ public void testWertpapierVerkauf12WithSecurityInEUR() assertThat(s, is(Status.OK_STATUS)); } + @Test + public void testWertpapierVerkauf13() + { + DABPDFExtractor extractor = new DABPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf13.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("DE0001104875"), hasWkn(null), hasTicker(null), // + hasName("Bundesrep.Deutschland Bundesschatzanw. v.22(24)"), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(sale( // + hasDate("2024-03-15T00:00"), hasShares(100), // + hasSource("Verkauf13.txt"), // + hasNote("Abrechnungs-Nr. 12345678"), // + hasAmount("EUR", 9880.00), hasGrossValue("EUR", 10000.00), // + hasTaxes("EUR", 100.00 + 10.00 + 10.00), hasFees("EUR", 0.00)))); + } + @Test public void testMultipleWertpapierKaufVerkauf01() { diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dab/Verkauf13.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dab/Verkauf13.txt new file mode 100644 index 0000000000..db360df3ba --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/dab/Verkauf13.txt @@ -0,0 +1,50 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.1 +----------------------------------------- +BELEGDRUCK=J +ORIGINAL=1 +FAXVERSAND=N +EMAILVERSAND=N +DEPOTNUMMER=1234567890 +Gesamtfälligkeit DEPOTUNTERBEZEICHNUNG= +VERSANDARTENSCHLUESSEL=DRUCK +ADRESSZEILE1=Herr +ADRESSZEILE2=Vorname Nachname +ADRESSZEILE3=Musterstr. 10 +ADRESSZEILE4=12345 Stadt +Depot-Nr. Abrechnungs-Nr. ADRESSZEILE5= +1234567890 12345678 / 14.03.2024 ADRESSZEILE6= +BELEGNUMMER=123 +Herr SEITENNUMMER=1 +Vorname Nachname STEUERERSTATTUNG=N +Musterstr. 10 Depotinhaber +12345 Stadt Vorname Nachname +München, 14.03.2024 +Gutschriftsanzeige +Gattungsbezeichnung Fälligkeit näch. Zinstermin ISIN +Bundesrep.Deutschland Bundesschatzanw. 15.03.2024 DE0001104875 +v.22(24) +Nominal Einlösung zu: +EUR 10.000,000 100,0000 % +Verwahrart Girosammelverwahrung Kurswert EUR 10.000,00 +Kapitalertragsteuer EUR 100,00- +Solidaritätszuschlag EUR 10,00- +Kirchensteuer EUR 10,00- +Wert Konto-Nr. Betrag zu Ihren Gunsten +15.03.2024 1234567890 EUR 9.880,00 +Hinweise zur steuerlichen Verrechnung: vorher aktuell +Veräußerungsgewinn Sonstige EUR 800,00 +Aktienverlusttopf EUR 0,00 0,00 +allgemeiner Verlusttopf EUR 0,00 0,00 +Quellensteuertopf EUR 0,00 0,00 +zu versteuern EUR 800,00 +im laufenden Jahr einbehaltene Kapitalertragsteuer EUR 100,00 +im laufenden Jahr einbehaltener Solidaritätszuschlag EUR 10,00 +im laufenden Jahr einbehaltene Kirchensteuer EUR 10,00 +Kapitalertragsteuer, Solidaritätszuschlag und ggf. Kirchensteuer nach gemeldetem Kirchensteuersatz verrechnet mit dem +Finanzamt Frankfurt/M. V-Höchst, Steuernummer 012/345/67890. +Dieser Beleg wird maschinell erstellt und daher nicht unterschrieben. +BNP Paribas S.A. Niederlassung Deutschland > Standort: München > Landsberger Straße 300 > 80687 München > Postadresse: DAB BNP Paribas > Postfach 2547 > +90011 Nürnberg > Sitz: Nürnberg HRB Nürnberg 31129 > USt.-Ident-Nr.: DE191528929 > Sitz der Hauptniederlassung der BNP Paribas S.A.: 16, boulevard des Italiens +> 75009 Paris > Frankreich > Registergericht: R.C.S. Paris 662 042 449 > Président du Conseil d‘Administration: Jean Lemierre > Directeur Général: Jean-Laurent Bonnafé +3.18/ABREEREITILG/GDBTILAN/000429/140324/235925 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/hypothekarbanklenzburgag/HypothekarbankLenzburgAGPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/hypothekarbanklenzburgag/HypothekarbankLenzburgAGPDFExtractorTest.java new file mode 100644 index 0000000000..dfadbca41f --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/hypothekarbanklenzburgag/HypothekarbankLenzburgAGPDFExtractorTest.java @@ -0,0 +1,70 @@ +package name.abuchen.portfolio.datatransfer.pdf.hypothekarbanklenzburgag; + +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasAmount; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasCurrencyCode; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasDate; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasFees; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasGrossValue; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasIsin; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasName; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasNote; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasShares; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasSource; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTaxes; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTicker; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasWkn; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.purchase; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security; +import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransactions; +import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countBuySell; +import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countSecurities; +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsEmptyCollection.empty; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +import name.abuchen.portfolio.datatransfer.Extractor.Item; +import name.abuchen.portfolio.datatransfer.actions.AssertImportActions; +import name.abuchen.portfolio.datatransfer.pdf.HypothekarbankLenzburgAGPDFExtractor; +import name.abuchen.portfolio.datatransfer.pdf.PDFInputFile; +import name.abuchen.portfolio.model.Client; + +@SuppressWarnings("nls") +public class HypothekarbankLenzburgAGPDFExtractorTest +{ + @Test + public void testWertpapierKauf01() + { + HypothekarbankLenzburgAGPDFExtractor extractor = new HypothekarbankLenzburgAGPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, "CHF"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("IE000716YHJ7"), hasWkn("125615212"), hasTicker(null), // + hasName("Accum Shs USD Inve FTSE All"), // + hasCurrencyCode("CHF")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2024-03-14T00:00"), hasShares(720), // + hasSource("Kauf01.txt"), // + hasNote("Transaktion 61327806-0002"), // + hasAmount("CHF", 3974.14), hasGrossValue("CHF", 3948.48), // + hasTaxes("CHF", 5.92), hasFees("CHF", 19.74)))); + } +} diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/hypothekarbanklenzburgag/Kauf01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/hypothekarbanklenzburgag/Kauf01.txt new file mode 100644 index 0000000000..3224a23800 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/hypothekarbanklenzburgag/Kauf01.txt @@ -0,0 +1,31 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.2 +----------------------------------------- +Hypothekarbank Lenzburg AG +Bahnhofstrasse 2 | 5600 Lenzburg 1 +Telefon +41 62 885 11 11 | info@hbl.ch | www.hbl.ch +BC 8307 | HYPLCH22 | CHE-105.779.532 MWST +E-Post +Herr +Max Mustermann +Musterstrasse 1 +1234 Musterdorf +Ihr Betreuerteam: Service Center / Tel. +41 43 508 03 76 +Lenzburg, 14.03.2024 Seite 1 von 1 +Börse / Kauf Portfolio 314.391.703 +Transaktion 61327806-0002 +Wir haben am 14.03.2024 an der BX Swiss für Sie gekauft + 720 Accum Shs USD Inve FTSE All Depotstelle 3500 +Valor: 125615212 / IE000716YHJ7 +Menge 720 Kurs CHF 5.484 CHF 3'948.48 +Eidg. Umsatzabgabe CHF 5.92 +Eigene Kommission (NEON) CHF 19.74 +Belastung 314.391.304 Valuta 18.03.2024 CHF 3'974.14 +Neon Konto - neon +Die Titel buchen wir in Ihr Portfolio ein. +Dieser Auftrag erfolgte ohne Beratung durch die Bank. +Sofern für das gehandelte Finanzinstrument ein BIB vorhanden ist, wird Ihnen dieses auf unserer Internetseite unter +https://www.hbl.ch/de/private/anlegen/basisinformationsblatt/ zur Verfügung gestellt. +Freundliche Grüsse +Hypothekarbank Lenzburg AG +Anzeige ohne Unterschrift \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/jtdirektbank/JTDirektbankPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/jtdirektbank/JTDirektbankPDFExtractorTest.java index 02a501990d..c6d194da84 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/jtdirektbank/JTDirektbankPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/jtdirektbank/JTDirektbankPDFExtractorTest.java @@ -233,4 +233,53 @@ public void testKontoauszug05() assertThat(results, hasItem(interest(hasDate("2024-01-31"), hasAmount("EUR", 139.23), // hasSource("Kontoauszug05.txt"), hasNote(null)))); } + + @Test + public void testKontoauszug06() + { + JTDirektbankPDFExtractor extractor = new JTDirektbankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kontoauszug06.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(8L)); + assertThat(results.size(), is(8)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // assert transaction + assertThat(results, hasItem(removal(hasDate("2024-03-07"), hasAmount("EUR", 1650.00), // + hasSource("Kontoauszug06.txt"), hasNote("Überweisungsauftrag")))); + + // assert transaction + assertThat(results, hasItem(removal(hasDate("2024-03-08"), hasAmount("EUR", 1100.00), // + hasSource("Kontoauszug06.txt"), hasNote("Umbuchung")))); + + // assert transaction + assertThat(results, hasItem(removal(hasDate("2024-03-20"), hasAmount("EUR", 2650.00), // + hasSource("Kontoauszug06.txt"), hasNote("Überweisungsauftrag")))); + + // assert transaction + assertThat(results, hasItem(removal(hasDate("2024-03-28"), hasAmount("EUR", 1750.00), // + hasSource("Kontoauszug06.txt"), hasNote("Überweisungsauftrag")))); + + // assert transaction + assertThat(results, hasItem(deposit(hasDate("2024-03-15"), hasAmount("EUR", 3650.00), // + hasSource("Kontoauszug06.txt"), hasNote("Überweisungsgutschrift")))); + + // assert transaction + assertThat(results, hasItem(deposit(hasDate("2024-03-21"), hasAmount("EUR", 2700.00), // + hasSource("Kontoauszug06.txt"), hasNote("Überweisungsgutschrift")))); + + // assert transaction + assertThat(results, hasItem(deposit(hasDate("2024-03-26"), hasAmount("EUR", 2500.00), // + hasSource("Kontoauszug06.txt"), hasNote("Überweisungsgutschrift")))); + + // assert transaction + assertThat(results, hasItem(interest(hasDate("2024-03-28"), hasAmount("EUR", 12.67), // + hasSource("Kontoauszug06.txt"), hasNote(null)))); + } } diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/jtdirektbank/Kontoauszug06.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/jtdirektbank/Kontoauszug06.txt new file mode 100644 index 0000000000..58764526af --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/jtdirektbank/Kontoauszug06.txt @@ -0,0 +1,99 @@ +``` +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.3 +----------------------------------------- +J&T Tagesgeld +EUR-Konto Kontonummer 6480010 +J&T Direktbank - Postfach 232 +45952 Gladbeck Kontoauszug Nr. 3/2024 +erstellt am 28.03.2024 23:04 Blatt 1 von 2 +IBAN: DE30 1234 5678 9012 3456 78 BIC: JTBPDEFFXXX +Herrn +Max Muster +Musterstr. 2 +04668 Musterhausen +Bu-Tag Wert Vorgang +alter Kontostand vom 29.02.2024 4.510,07 H +07.03. 07.03. Überweisungsauftrag 1.650,00 S + Max Muster + Auszahlung 013 JT Direktbank TAN1:284241 IBAN: DE92500 + 300000054446078 BIC: GENODE51OBU +08.03. 08.03. Umbuchung 1.100,00 S + Max Muster + Auszahlung 014 JT Direktbank SecureGo plus IBAN: DE925 + 00300000054446078 BIC: GENODE51OBU +15.03. 15.03. Überweisungsgutschr. 3.650,00 H + Max Muster + Einzahlung 009 JT Direktbank +20.03. 20.03. Überweisungsauftrag 2.650,00 S + Max Muster + Auszahlung 015 JT Direktbank TAN1:498221 IBAN: DE92500 + 300000054446078 BIC: GENODE51OBU +21.03. 21.03. Überweisungsgutschr. 2.700,00 H + Max Muster + Einzahlung 010 JT Direktbank +26.03. 26.03. Überweisungsgutschr. 2.500,00 H + Max Muster + Einzahlung 011 JT Direktbank +28.03. 28.03. Überweisungsauftrag 1.750,00 S + Max Muster + Auszahlung 016 JT Direktbank TAN1:733405 IBAN: DE92500 + 300000054446078 BIC: GENODE51OBU +28.03. 31.03. Abschluss lt. Anlage 1 12,67 H + neuer Kontostand vom 28.03.2024 6.222,74 H +0189 +000 +K00002592 +5M Bitte beachten Sie die Hinweise auf der Rückseite oder am Ende des Dokuments +J&T Tagesgeld +EUR-Konto Kontonummer 6480010 +Max Muster +Kontoauszug Nr. 3/2024 +erstellt am 28.03.2024 23:04 Blatt 2 von 2 +Bu-Tag Wert Vorgang +Anlage 1 +Buchungstag: 28.03.2024 +Wert: 31.03.2024 +Kontoabschluss vom 01.03.2024 bis 31.03.2024 für Konto 6480010 + 3,50000% Habenzins bis 25.03. 9,57 H + 3,30000% Habenzins bis 31.03. 3,10 H +Rechnung Nr. 0006480010.20240331.002 +USt. IdNr. - DE 357997630 +USt.-befreite Finanzdienstleistung + Summe Abschlussposten in EUR 12,67 H +0189 +000 +K00002592 Bitte beachten Sie die Hinweise auf der Rückseite oder am Ende des Dokuments +Sehr geehrte Kundin, sehr geehrter Kunde, +Sie haben eine Bankmitteilung erhalten, z. B. einen Kontoauszug, einen Sparkontoauszug oder eine Dividendenabrechnung. Bitte +prüfen Sie diese genau: Ist alles korrekt? Falls nicht, sprechen Sie uns bitte an. Damit Sie immer gut informiert sind und wissen, wie +Sie Ihre Bankmitteilung "richtig lesen", haben wir diese nützlichen Hinweise für Sie zusammengestellt: +Falls in diesem Dokument Bankdienstleistungen aufgeführt sind, sind diese umsatzsteuerfrei - sofern nichts Abweichendes angegeben +ist. Der im Kontoauszug ausgewiesene Betrag muss nicht dem tatsächlichen Kontoguthaben entsprechen, weil z. B. die Wertstellung +einzelner Buchungen nicht berücksichtigt wurde oder noch Zinsen für eine Kontoüberziehung bei einer Verfügung anfallen können. +Rechnungsabschlüsse +Ihr Kontoauszug ist mit dem Hinweis "Rechnungsabschluss" versehen? +Dann haben wir für Ihr Konto einen Rechnungsabschluss durchgeführt, einschließlich Zinsen und Entgelte. Alle weiteren, nach dem +Erstellungsdatum dieser Mitteilung anfallenden Umsätze und Kontoauszüge werden erst in der folgenden Abrechnung +berücksichtigt - auch wenn sie sich auf den Abrechnungssaldo des abgelaufenen Abrechnungszeitraumes auswirken. +Korrekturen werden gekennzeichnet. Den Rechnungsabschluss können Sie beim Finanzamt vorlegen. +Einwendungen +Sie haben Einwendungen gegen den Rechnungsabschluss Ihres Kontokorrentkontos oder den Inhalt des Sparkontoauszugs? Dann +haben Sie nach Erhalt sechs Wochen Zeit, uns zu informieren. Sonst gilt der Rechnungsabschluss zum Kontokorrentkonto oder der +Sparkontoauszug als genehmigt. Wenn Sie ihre Einwendungen in Textform geltend machen, z. B. per E-Mail oder Brief, so genügt die +Absendung innerhalb von sechs Wochen nach Erhalt. +Einzugsaufträge +Einzugspapiere wie z. B. Schecks und Lastschriften werden unter dem Vorbehalt des Eingangs gutgeschrieben, und zwar auch +dann, wenn diese Papiere bei uns selbst zahlbar sind. +Schecks und Lastschriften sind erst eingelöst, wenn die Belastungsbuchung nicht spätestens am zweiten Bankarbeitstag - bei +Lastschriften im SEPA-Firmen-Lastschriftverfahren nicht spätestens am dritten Bankarbeitstag - nach ihrer Vornahme rückgängig +gemacht wird. Barschecks sind bereits mit Zahlung an den Scheckvorleger eingelöst. Schecks sind auch schon dann eingelöst, +wenn wir im Einzelfall eine Bezahltmeldung absenden. +Guthaben +Guthaben sind als Einlagen nach Maßgabe des Einlagensicherungsgesetzes entschädigungsfähig. Nähere Informationen können dem +"Informationsbogen für den Einleger" entnommen werden. +Sie haben noch Fragen? Dann kontaktieren Sie uns bitte. Wir sind gern für Sie da. +Mit freundlichen Grüßen +Ihre Bank + +``` \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/lgtbank/Kauf05.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/lgtbank/Kauf05.txt new file mode 100644 index 0000000000..3c81bbfb54 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/lgtbank/Kauf05.txt @@ -0,0 +1,44 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.2 +----------------------------------------- +LGT Bank (Schweiz) AG +Glärnischstrasse 36, Postfach, CH-8027 Zürich +Tel. +41 44 250 81 81 +lgt.ch@lgt.com, www.lgt.ch, BIC BLFLCHBB +CHE-109.346.830 MWST +Securities dealer no. 647613 +____________________ +P.P. Post CH AG_____C_H__-_8_0_2_7_ _Z_ü_r_ic_h_ PF 1909 A -PRIORITY_________________________________________________ +Liberty Freizügigkeitsstiftung +bei Liberty Vorsorge AG +Postfach 733 +6431 Schwyz +1 / 1 +Zürich, 26. Juli 2023 + +Abrechnung Kauf Portfolio: 1234457.000 +Auftragsnummer: 212706117 Kundenportfolio +Kunde: Liberty Freizügigkeitsstiftung XX - 1.1001.4567-01 +Titel Roche Holding AG +Inhaber-Genussschein +ISIN CH0012032048 +Valorennummer 1203204 +Wertpapierkennnummer 855167 +Abschlussdatum 26.07.2023 +Ausführungsplatz SIX Swiss Exchange, börslich +Auftragstyp Bestens +Anzahl 40 Stück +Kurs CHF 273.05 +Kurswert CHF 10'922.00 +Eidg. Umsatzabgabe CHF 8.19 +SIX Börsengebühr CHF 1.24 +SIX Meldegebühr CHF 0.20 +Belastung CHF Freizügigkeitskonto 2026457.031 CHF 10'931.63 +Valuta 28.07.2023 +Wir haben die Titel in das oben genannte Depot eingebucht. +Die Gutschrift im oben erwähnten Depot erfolgt vorbehaltlich der effektiven Lieferung. +Dieser Auftrag wurde als Gruppenauftrag ausgeführt. +Weitere Details zum durchgeführten Auftrag stellen wir Ihnen auf Anfrage gerne zur Verfügung. +2026457 00A T ZH I TRD1001 39509429 12:10 26.07.2023 %Media:XML-A4H +____ +____ \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/lgtbank/LGTBankPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/lgtbank/LGTBankPDFExtractorTest.java index 53fef4bba1..fa1701b7ea 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/lgtbank/LGTBankPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/lgtbank/LGTBankPDFExtractorTest.java @@ -165,7 +165,8 @@ public void testWertpapierKauf03() // check buy sell transaction assertThat(results, hasItem(purchase( // hasDate("2023-06-29T14:54:02"), hasShares(260), // - hasSource("Kauf03.txt"), hasNote("Auftragsnummer: 210796978 | Valorennummer 3176893"), // + hasSource("Kauf03.txt"), // + hasNote("Auftragsnummer: 210796978 | Valorennummer 3176893"), // hasAmount("CHF", 48502.01), hasGrossValue("CHF", 48465.46), // hasTaxes("CHF", 36.35), hasFees("CHF", 0.20)))); } @@ -195,11 +196,43 @@ public void testWertpapierKauf04() // check buy sell transaction assertThat(results, hasItem(purchase( // hasDate("2023-06-08T00:00"), hasShares(480), // - hasSource("Kauf04.txt"), hasNote("Auftragsnummer: 209174085 | Valorennummer 50139326"), // + hasSource("Kauf04.txt"), // + hasNote("Auftragsnummer: 209174085 | Valorennummer 50139326"), // hasAmount("USD", 50595.78), hasGrossValue("USD", 50520.00), // hasTaxes("USD", 75.78), hasFees("USD", 0.00)))); } + @Test + public void testWertpapierKauf05() + { + LGTBankPDFExtractor extractor = new LGTBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf05.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, "CHF"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("CH0012032048"), hasWkn("855167"), hasTicker(null), // + hasName("Roche Holding AG Inhaber-Genussschein"), // + hasCurrencyCode("CHF")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2023-07-26T00:00"), hasShares(40), // + hasSource("Kauf05.txt"), // + hasNote("Auftragsnummer: 212706117 | Valorennummer 1203204"), // + hasAmount("CHF", 10931.63), hasGrossValue("CHF", 10922.00), // + hasTaxes("CHF", 8.19), hasFees("CHF", 1.24 + 0.20)))); + } + @Test public void testWertpapierVerkauf01() { @@ -225,11 +258,74 @@ public void testWertpapierVerkauf01() // check buy sell transaction assertThat(results, hasItem(sale( // hasDate("2023-06-08T11:22:14"), hasShares(260), // - hasSource("Verkauf01.txt"), hasNote("Auftragsnummer: 209179086 | Valorennummer 41359963"), // + hasSource("Verkauf01.txt"), // + hasNote("Auftragsnummer: 209179086 | Valorennummer 41359963"), // hasAmount("USD", 8332.19), hasGrossValue("USD", 8344.70), // hasTaxes("USD", 12.51), hasFees("USD", 0.00)))); } + @Test + public void testWertpapierVerkauf02() + { + LGTBankPDFExtractor extractor = new LGTBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf02.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, "CHF"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("CH0031768937"), hasWkn("A0MW4N"), hasTicker(null), // + hasName("iShares ETF (CH) - iShares SLI(R) ETF (CH) Inhaber-Anteile -A-"), // + hasCurrencyCode("CHF")))); + + // check buy sell transaction + assertThat(results, hasItem(sale( // + hasDate("2023-07-04T00:00"), hasShares(260), // + hasSource("Verkauf02.txt"), // + hasNote("Auftragsnummer: 123295456 | Valorennummer 3176893"), // + hasAmount("CHF", 48591.42), hasGrossValue("CHF", 48636.90), // + hasTaxes("CHF", 36.48), hasFees("CHF", 8.80 + 0.20)))); + } + + @Test + public void testWertpapierVerkauf03() + { + LGTBankPDFExtractor extractor = new LGTBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf03.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, "CHF"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("CH0012005267"), hasWkn("904278"), hasTicker(null), // + hasName("Novartis AG Namen-Aktien"), // + hasCurrencyCode("CHF")))); + + // check buy sell transaction + assertThat(results, hasItem(sale( // + hasDate("2023-11-02T00:00"), hasShares(260), // + hasSource("Verkauf03.txt"), // + hasNote("Auftragsnummer: 219764567 | Valorennummer 1200526"), // + hasAmount("CHF", 21954.31), hasGrossValue("CHF", 21972.42), // + hasTaxes("CHF", 16.48), hasFees("CHF", 1.43 + 0.20)))); + } + @Test public void testDividende01() { @@ -295,10 +391,11 @@ public void testDividende02() hasName("Novartis AG Namen-Aktien"), // hasCurrencyCode("CHF")))); - // check dividende transaction + // check dividends transaction assertThat(results, hasItem(dividend( // hasDate("2023-03-13T00:00"), hasShares(760), // - hasSource("Dividende02.txt"), hasNote("Auftragsnummer: 200738771 | Ordentliche Dividende"), // + hasSource("Dividende02.txt"), // + hasNote("Auftragsnummer: 200738771 | Ordentliche Dividende"), // hasAmount("CHF", 1580.80), hasGrossValue("CHF", 2432.00), // hasTaxes("CHF", 851.20), hasFees("CHF", 0.00)))); } @@ -325,10 +422,11 @@ public void testDividende03() hasName("Schindler Holding AG Inhaber-Partizipationsschein"), // hasCurrencyCode("CHF")))); - // check dividende transaction + // check dividends transaction assertThat(results, hasItem(dividend( // hasDate("2023-04-03T00:00"), hasShares(130), // - hasSource("Dividende03.txt"), hasNote("Auftragsnummer: 330401346 | Ordentliche Dividende"), // + hasSource("Dividende03.txt"), // + hasNote("Auftragsnummer: 330401346 | Ordentliche Dividende"), // hasAmount("CHF", 338.00), hasGrossValue("CHF", 520.00), // hasTaxes("CHF", 182.00), hasFees("CHF", 0.00)))); } @@ -355,10 +453,11 @@ public void testDividende04() hasName("SGS Ltd Namen-Aktien"), // hasCurrencyCode("CHF")))); - // check dividende transaction + // check dividends transaction assertThat(results, hasItem(dividend( // hasDate("2023-04-03T00:00"), hasShares(12), // - hasSource("Dividende04.txt"), hasNote("Auftragsnummer: 303105603 | Ordentliche Dividende"), // + hasSource("Dividende04.txt"), // + hasNote("Auftragsnummer: 303105603 | Ordentliche Dividende"), // hasAmount("CHF", 624.00), hasGrossValue("CHF", 960.00), // hasTaxes("CHF", 336.00), hasFees("CHF", 0.00)))); } @@ -385,10 +484,11 @@ public void testDividende05() hasName("iShares ETF (CH) - iShares SLI(R) ETF (CH) Inhaber-Anteile -A-"), // hasCurrencyCode("CHF")))); - // check dividende transaction + // check dividends transaction assertThat(results, hasItem(dividend( // hasDate("2023-04-03T00:00"), hasShares(490), // - hasSource("Dividende05.txt"), hasNote("Auftragsnummer: 303107922 | Ordentliche Dividende"), // + hasSource("Dividende05.txt"), // + hasNote("Auftragsnummer: 303107922 | Ordentliche Dividende"), // hasAmount("CHF", 127.40), hasGrossValue("CHF", 196.00), // hasTaxes("CHF", 68.60), hasFees("CHF", 0.00)))); } diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/lgtbank/Verkauf02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/lgtbank/Verkauf02.txt new file mode 100644 index 0000000000..a7c991e93b --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/lgtbank/Verkauf02.txt @@ -0,0 +1,62 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.2 +----------------------------------------- +LGT Bank (Schweiz) AG +Glärnischstrasse 36, Postfach, CH-8027 Zürich +Tel. +41 44 250 81 81 +lgt.ch@lgt.com, www.lgt.ch, BIC BLFLCHBB +CHE-109.346.830 MWST +Securities dealer no. 647613 +____________________ +P__.P__. +Post CH AG +_C_H__-_8_0_2_7_ _Z_ü_r_ic_h_ PF 1909 A -PRIORITY_________________________________________________ +Liberty Freizügigkeitsstiftung +bei Liberty Vorsorge AG +Postfach 733 +6431 Schwyz +1 / 2 +Zürich, 4. Juli 2023 + +Abrechnung Verkauf Portfolio: 1236457.000 +Auftragsnummer: 123295456 Kundenportfolio +Kunde: Liberty Freizügigkeitsstiftung XX - 1.1001.1234-01 +Titel iShares ETF (CH) - iShares SLI(R) ETF (CH) +Inhaber-Anteile -A- +Verwaltungsgesellschaft / AIFM BlackRock Asset Management Schweiz AG +ISIN CH0031768937 +Valorennummer 3176893 +Wertpapierkennnummer A0MW4N +Auftragserteilung 04.07.2023 17:09:20 +Abschlussdatum 04.07.2023 +Ausführungsplatz SIX Swiss Exchange, börslich +Auftragstyp Bestens +Anzahl 260 Stück +Kurs CHF 187.065 +Kurswert CHF 48'636.90 +Eidg. Umsatzabgabe CHF -36.48 +SIX Börsengebühr CHF -8.80 +SIX Meldegebühr CHF -0.20 +Gutschrift CHF Freizügigkeitskonto 2026457.031 CHF 48'591.42 +Valuta 06.07.2023 +Wir entnehmen die Titel Ihrem oben genannten Depot. +Die Gutschrift auf oben erwähntem Konto erfolgt vorbehaltlich des effektiven Zahlungseinganges. +2026457 00A T ZH I TRD1001 39509429 18:10 04.07.2023 %Media:XML-A4H +____ +____ +LGT Bank (Schweiz) AG +Glärnischstrasse 36, Postfach, CH-8027 Zürich +Tel. +41 44 250 81 81 +lgt.ch@lgt.com, www.lgt.ch, BIC BLFLCHBB +CHE-109.346.830 MWST +Securities dealer no. 647613 +2 / 2 +Abrechnung Verkauf Kundenportfolio +Auftragsnummer: 211295144 Portfolio: 2026457.000 +Kunde: Liberty Freizügigkeitsstiftung MP - 1.1001.4097-01 +Ausführungsdetails +Whg. Anzahl Ausführungszeit Markt Kurs +CHF 63 04.07.2023 17:10:48 SIX Swiss Exchange 187.080000 +CHF 2 04.07.2023 17:10:49 SIX Swiss Exchange 187.080000 +CHF 195 04.07.2023 17:10:53 SIX Swiss Exchange 187.060000 +2026457 00A T ZH I TRD1001 39509429 18:10 04.07.2023 %Media:XML-A4H \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/lgtbank/Verkauf03.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/lgtbank/Verkauf03.txt new file mode 100644 index 0000000000..0b9b0b5356 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/lgtbank/Verkauf03.txt @@ -0,0 +1,45 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.2 +----------------------------------------- +LGT Bank (Schweiz) AG +Glärnischstrasse 36, Postfach, CH-8027 Zürich +Tel. +41 44 250 81 81 +lgt.ch@lgt.com, www.lgt.ch, BIC BLFLCHBB +CHE-109.346.830 MWST +Securities dealer no. 647613 +____________________ +P.P. Post CH AGCH-8027 Zürich PF 1909 -PRIORITY +__________________________________________________A__________________ +Liberty Freizügigkeitsstiftung +bei Liberty Vorsorge AG +Postfach 733 +6431 Schwyz +1 / 1 +Zürich, 2. November 2023 + +Abrechnung Verkauf Portfolio: 2024567.000 +Auftragsnummer: 219764567 Kundenportfolio +Kunde: Liberty Freizügigkeitsstiftung XX - 1.1001.1234-01 +Titel Novartis AG +Namen-Aktien +ISIN CH0012005267 +Valorennummer 1200526 +Wertpapierkennnummer 904278 +Abschlussdatum 02.11.2023 +Ausführungsplatz SIX Swiss Exchange +Auftragstyp Bestens +Anzahl 260 Stück +Kurs CHF 84.509301 +Kurswert CHF 21'972.42 +Eidg. Umsatzabgabe CHF -16.48 +SIX Börsengebühr CHF -1.43 +SIX Meldegebühr CHF -0.20 +Gutschrift CHF Freizügigkeitskonto 2024567.031 CHF 21'954.31 +Valuta 06.11.2023 +Wir haben die Titel dem oben genannten Portfolio entnommen. +Die Gutschrift erfolgt vorbehaltlich des effektiven Zahlungseinganges. +Dieser Auftrag wurde als Gruppenauftrag ausgeführt. +Weitere Details zum durchgeführten Auftrag stellen wir Ihnen auf Anfrage gerne zur Verfügung. +1234457 00A T ZH I TRD1001 39509429 19:13 02.11.2023 %Media:XML-A4H +____ +____ \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/merkurprivatbank/MerkurPrivatBankPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/merkurprivatbank/MerkurPrivatBankPDFExtractorTest.java index d75cc60a1b..cc05e5d783 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/merkurprivatbank/MerkurPrivatBankPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/merkurprivatbank/MerkurPrivatBankPDFExtractorTest.java @@ -171,6 +171,50 @@ public void testWertpapierVerkauf01() } + @Test + public void testWertpapierVerkauf02() + { + MerkurPrivatBankPDFExtractor extractor = new MerkurPrivatBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf02.txt"), errors); + + assertThat(errors, empty()); + assertThat(results.size(), is(2)); + + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security identification: + Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSecurity(); + assertThat(security.getIsin(), is("IE00BZ02LR44")); + assertThat(security.getWkn(), is("A2AQST")); + assertNull(security.getTickerSymbol()); + assertThat(security.getName(), is("XTR.(IE)-MSCI WORLD ESG REGISTERED SHARES 1C O.N.")); + assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); + + // check buy transaction + BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() + .orElseThrow(IllegalArgumentException::new).getSubject(); + + assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); + assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2024-03-22T20:15:51"))); + assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(3260.0))); + assertThat(entry.getSource(), is("Verkauf02.txt")); + assertThat(entry.getNote(), is("Auftragsnummer 749922/41.00")); + + assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(116003.09)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.00 + 0.06)))); + assertThat(entry.getPortfolioTransaction().getGrossValue(), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(119446.40)))); + assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), + is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3240.05 + 178.20)))); + + } + @Test public void testKontoauszug01() { diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/merkurprivatbank/Verkauf02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/merkurprivatbank/Verkauf02.txt new file mode 100644 index 0000000000..d92a1b7ec9 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/merkurprivatbank/Verkauf02.txt @@ -0,0 +1,45 @@ +``` +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.3 +----------------------------------------- + +Am Marktplatz 10 · 97762 Hammelburg Seite 1 von 2 +Depotnummer + 97545260 + Kundennummer 664797185 +KmMJsS MoJKA dygSGaw + Auftragsnummer 749922/41.00 +SYZzsN CwFkb WTtvZde Datum 25.03.2024 +tBpFxJnFU. 7 Ihr Berater Herr IBl NSupqHWijGs +90402 Nürnberg Telefon +49 951 980297-99 +Rechnungsnummer t22653-0000036053/24 +Umsatzsteuer-ID DE198159260 + +Wertpapier Abrechnung Verkauf +Auftrag vom 22.03.2024 20:15:37 Uhr +Nominale Wertpapierbezeichnung ISIN (WKN) +Stück 3.260 XTR.(IE)-MSCI WORLD ESG IE00BZ02LR44 (A2AQST) +REGISTERED SHARES 1C O.N. +Handels-/Ausführungsplatz Quotrix (Best Execution) +Börsensegment DUSD +Trailing-Stop-Order +Trailing-Stoplimit 36,70 EUR Trailing-Abstand 2,50 % +Schlusstag/-Zeit 22.03.2024 20:15:51 Auftraggeber uHatXF KrnLd zTIwZpW +Ausführungskurs 36,64 EUR Auftragserteilung/ -ort Online-Banking +Wertpapierrechnung Lagerland Irland +Kurswert 119.446,40 EUR +Provision 25,00- EUR +Übertragungs-/Liefergebühr 0,06- EUR +Ermittlung steuerrelevante Erträge +Veräußerungsgewinn (nach Teilfreistellung) 12.960,18 EUR +Berechnungsgrundlage für die Kapitalertragsteuer 12.960,18 EUR + +Steuerberechnung +Kapitalertragsteuer 25,00% auf 12.960,18 EUR 3.240,05- EUR +Solidaritätszuschlag 5,50% auf 3.240,05 EUR 178,20- EUR +Ausmachender Betrag 116.003,09 EUR + +Den Gegenwert buchen wir mit Valuta 26.03.2024 zu Gunsten des Kontos 2727799 (IBAN DE65 7013 0800 9999 9999 99), +BLZ 70130800 (BIC GENODEF1M06). +Die Wertpapiere entnehmen wir Ihrem Depotkonto. +6176.03251799.0000099OR07 diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/oldenburgischelandesbankag/Fusion01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/oldenburgischelandesbankag/Fusion01.txt new file mode 100644 index 0000000000..28e6cc3d7c --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/oldenburgischelandesbankag/Fusion01.txt @@ -0,0 +1,42 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.67.3 +----------------------------------------- +Oldenburg, 02.02.2024 +Es betreut Sie: +Ihr OLB Team +Postfach 26 05, 26016 Oldenburg 26121 Oldenburg +Tel.: 0441 221 2210 +mail@olb.de +Vom 02.02.2024 +Seite 1 von 1 +eThHpnL whuVmQn Depotnummer 9892965160 +WlsuCO-moidI-GkR. 101 Belegnummer 4578920 +33753 DVWvcgp +Steuerpflichtige Fondsfusion +AIS-AM.WORLD SRI PAB Act.Nom. UCITS ETF DR (C)o.N. +ISIN LU1861134382 +Anzahl/Nominale 255,212216 +Verwahrart / Lagerstelle Girosammelverwahrung +Ex-Tag 18. Januar 2024 +Verhältnis Neu/ Alt 1,00 : 1,00 +Altes Wertpapier AIS-AM.WORLD SRI PAB Act.Nom. UCITS ETF DR (C)o.N. +Alte ISIN LU1861134382 +Ausbuchung Stück/Nominal 255,212216 +Neues Wertpapier Am.ETF-MSCI W.SRI CL.N.Z.AM.P. Bear.Shs EUR Acc. oN +Neue ISIN IE000Y77LGG9 +Einbuchung Stück/Nominal 255,212216 +Ex-Tag 18. Januar 2024 +Kapitalertragsteuer EUR 271,80 +Solidaritätszuschlag EUR 14,94 +Ausmachender Betrag EUR 286,74 +Wir belasten Ihnen die Steuern am 01. Januar 0001 auf ihrem Konto DE12345678900000. +Bei Fragen wenden Sie sich bitte an den Kundenservice der Oldenburgische Landesbank AG. Sie finden die Kontaktdetails im Briefkopf +dieser Abrechnung. +Keine Steuerbescheinigung. Jahressteuerbescheinigung folgt. +Mit freundlichen Grüßen +Ihre OLB Bank +FNZ +Oldenburgische Landesbank AG | Stau 15/17 | 26122 Oldenburg +Vorsitzender des Aufsichtsrates: Axel Bartsch | Vorstand: Stefan Barth, Vorsitzender | Marc Ampaw | Aytac Aydin | Chris Eggert | Giacomo Petrobelli | Dr. Rainer Polster +Sitz der Gesellschaft: Oldenburg (Oldb) Registergericht: Oldenburg (Oldb) HR-Nummer: HRB 3003 +Informationen zur Nutzung Ihrer Daten erhalten Sie auf www.olb.de/dsgvo und in jeder OLB-Filiale. Auf Wunsch schicken wir die Informationen auch gerne per Post zu. diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/oldenburgischelandesbankag/OldenburgischeLandesbankAGPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/oldenburgischelandesbankag/OldenburgischeLandesbankAGPDFExtractorTest.java index 9505ac00ff..3a4705563b 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/oldenburgischelandesbankag/OldenburgischeLandesbankAGPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/oldenburgischelandesbankag/OldenburgischeLandesbankAGPDFExtractorTest.java @@ -17,6 +17,7 @@ import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTaxes; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTicker; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasWkn; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.inboundDelivery; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.purchase; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.sale; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security; @@ -178,37 +179,6 @@ public void testWertpapierVerkauf01() hasTaxes("EUR", 0.00), hasFees("EUR", 0.64)))); } - @Test - public void testWertpapierVerkauf02() - { - OldenburgischeLandesbankAGPDFExtractor extractor = new OldenburgischeLandesbankAGPDFExtractor(new Client()); - - List errors = new ArrayList<>(); - - List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf02.txt"), errors); - - assertThat(errors, empty()); - assertThat(countSecurities(results), is(1L)); - assertThat(countBuySell(results), is(1L)); - assertThat(countAccountTransactions(results), is(0L)); - assertThat(results.size(), is(2)); - new AssertImportActions().check(results, CurrencyUnit.EUR); - - // check security - assertThat(results, hasItem(security( // - hasIsin("DE000A0H0785"), hasWkn("A0H078"), hasTicker(null), // - hasName("iS.EO G.B.C.1.5-10.5y.U.ETF DE Inhaber-Anteile"), // - hasCurrencyCode("EUR")))); - - // check buy sell transaction - assertThat(results, hasItem(sale( // - hasDate("2024-02-29T00:00"), hasShares(0.082053), // - hasSource("Verkauf02.txt"), // - hasNote("Ord.-Ref.: 2194170"), // - hasAmount("EUR", 8.81), hasGrossValue("EUR", 8.81), // - hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); - } - @Test public void testWertpapierVerkauf01WithSecurityInEUR() { @@ -246,6 +216,37 @@ public void testWertpapierVerkauf01WithSecurityInEUR() })))); } + @Test + public void testWertpapierVerkauf02() + { + OldenburgischeLandesbankAGPDFExtractor extractor = new OldenburgischeLandesbankAGPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf02.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("DE000A0H0785"), hasWkn("A0H078"), hasTicker(null), // + hasName("iS.EO G.B.C.1.5-10.5y.U.ETF DE Inhaber-Anteile"), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(sale( // + hasDate("2024-02-29T00:00"), hasShares(0.082053), // + hasSource("Verkauf02.txt"), // + hasNote("Ord.-Ref.: 2194170"), // + hasAmount("EUR", 8.81), hasGrossValue("EUR", 8.81), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + } + @Test public void testDividende01() { @@ -530,4 +531,37 @@ public void testKontoauszug01() assertThat(results, hasItem(deposit(hasDate("2023-08-17"), hasAmount("EUR", 10.00), // hasSource("Kontoauszug01.txt"), hasNote(null)))); } + + @Test + public void testFusion01() + { + OldenburgischeLandesbankAGPDFExtractor extractor = new OldenburgischeLandesbankAGPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Fusion01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("LU1861134382"), hasWkn(null), hasTicker(null), // + hasName("AIS-AM.WORLD SRI PAB Act.Nom. UCITS ETF DR (C)o.N."), // + hasCurrencyCode("EUR")))); + + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + inboundDelivery( // + hasDate("2024-02-02T00:00"), hasShares(255.212216), // + hasSource("Fusion01.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); + } } diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sunrise/Kauf02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sunrise/Kauf02.txt new file mode 100644 index 0000000000..a02eb6c33d --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sunrise/Kauf02.txt @@ -0,0 +1,45 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.67.1 +----------------------------------------- +Depotführung: Ein Service von: +Für Rückfragen wenden Sie sich bitte an: +info@meetsunrise.com +Herr +Fondsabrechnung +TOGSoj SozSi +FcvmR ydOdxqCbtQB 7/0 Wien, 20.10.2022 +2908 vLwD Depotinhaber: frQDJw AedNd +ukFulZrAOV Depotnummer: 5406992396 +Hiermit bestätigen wir Ihnen folgende Transaktion für Sie ausgeführt zu haben: +Transaktion Fondsname Betrag Preis Anteile +WKN/ISIN Preisdatum Bestand neu +Verwahrart/Lagerland +Kauf Standortfonds Österreich 50.00 € 115.40 € 0.433 +AT0000A1QA38 18.10.2022 4.740 +Girosammelverwahrung/AT +Abrechnungsbetrag: 50.00 € +Ausgabeaufschlag/Provision: 0,00% +Auftrags-Nummer: 747448052066562190749732135729 +KESt-Neubestand mit Anschaffungskosten nach dem gleitenden Durchschnittsverfahren § 27a Abs. 4 Zi 3 EStG: +0.433 Anteile. +Steuerlicher Anschaffungswert: 49.97 € +Verrechnung Kapitalertragssteuer* +• Vor dieser Transaktion nicht ausgeglichene Gewinne: +• Nach dieser Transaktion nicht ausgeglichene Gewinne: +• Vor dieser Transaktion nicht ausgeglichene Verluste: +• Nach dieser Transaktion nicht ausgeglichene Verluste: +* Innerhalb eines Kalenderjahres werden realisierte Verluste mit realisierten Gewinnen ausgeglichen. Dabei werden alle +von Ihnen bei uns gehaltenen Depots zusammen betrachtet. Es gibt zwei Fälle: Im ersten Fall haben Sie in der +Vergangenheit Gewinne realisiert, mit der aktuellen Transaktion machen Sie aber einen Verlust. In diesem Fall wird Ihre +bereits bezahlte Kapitalertragsteuer mit dieser Auszahlung rückerstattet. Im zweiten Fall haben Sie in der Vergangenheit +Verluste realisiert, machen aber mit dieser Auszahlung einen Gewinn. Dann wurde der Verlust aus der Vergangenheit bei +der Berechnung des Kapitalertragsteuerabzugs für diesen Verkauf berücksichtigt. +Anlagen in Investmentfonds können erst nach Kenntnisnahme der gesetzlichen Verkaufsunterlagen (Prospekt, Kunden- +informationsdokumente, Halb-/Jahresbericht) erfolgen. Diese Unterlagen haben Sie direkt über die Sunrise Kanäle +erhalten bzw. vor Auftragserteilung dort eingesehen. +Hinweis: Einwendungen gegen diese Fondsabrechnung wegen Unrichtigkeit oder Unvollständigkeit richten Sie bitte +schriftlich spätestens einen Monat nach Zugang an: info@meetsunrise.com +Simpel S.A., 33, Boulevard Prince Henri, L-1724 Luxemburg; Sitz: Luxemburg; Umsatzsteuer-lD-Nr. LU32888126; Vorsitzender des Verwaltungsrats: +Thomas Niss; Conducting Officers: Martin Foussek, Christian McFadden +Simpel Zweigniederlassung Österreich, 1040 Wien, Gußhausstraße 3/2a; Handelsgericht Wien, FN 562615a ; Niederlassungsleiter: +Christian McFadden, Martin Foussek, Ständiger Vertreter: Thomas Niss \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sunrise/Kauf03.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sunrise/Kauf03.txt new file mode 100644 index 0000000000..16a1a9727a --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sunrise/Kauf03.txt @@ -0,0 +1,33 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.67.1 +----------------------------------------- +Ein Service von: +Für Rückfragen wenden Sie sich +bitte an: info@meetsunrise.com +Herr +bbMArl kpKGn Fondsabrechnung +kyUDc IXQfXfvVuZi 6/0 +2952 Ytaj Datum: 29.12.2023 +TqZadDlMZh Depotnummer: 6782756237 +Hiermit bestätigen wir Ihnen folgende Transaktion für Sie ausgeführt zu haben: +Transaktion Fondsname Betrag Preis Anteile +ISIN Preisdatum Bestand neu +Verwahrart/Lagerland +Verwahrort +Kauf Standortfonds Österreich 10.08 € 140.03 € 0.072 +AT0000A1QA38 28.12.2023 13.548 +Girosammelverwahrung/AT +Raiffeisen Bank International AG +Abrechnungsbetrag: 10.08 € +Ausgabeaufschlag/Provision: 0,00% +Auftrags-Nummer: 751175802407452854275862438475 +Anlagen in Investmentfonds können erst nach Kenntnisnahme der gesetzlichen Verkaufsunterlagen +(Basisinformationsblatt) erfolgen. Diese Unterlagen haben Sie direkt über die Sunrise Kanäle erhalten bzw. vor +Auftragserteilung dort eingesehen. +Wichtiger Hinweis: Einwendungen gegen diese Fondsabrechnung wegen Unrichtigkeit oder Unvollständigkeit +richten Sie bitte schriftlich spätestens einen Monat nach Zugang an: info@meetsunrise.com. +Mit besten Grüßen +Ihr Sunrise Team +Sunrise Securities GmbH, Gußhausstraße 3/2, A-1040 Wien; UID-Nummer: ATU 68616777, Firmenbuchnummer: FN 410750w +Sunrise Securities GmbH nach österreichischem Recht Zweigniederlassung Deutschland, Rahel-Hirsch-Straße 10, D-10557 Berlin; Handelsregister: HRB 258310 B +Version_2023_01_K \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sunrise/Kauf04.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sunrise/Kauf04.txt new file mode 100644 index 0000000000..ed2269be5a --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sunrise/Kauf04.txt @@ -0,0 +1,33 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.67.3 +----------------------------------------- +Ein Service von: +Für Rückfragen wenden Sie sich +bitte an: info@meetsunrise.com +Herr +gifSwG BNiVTeGR Fondsabrechnung +zaeldasd-emd-MqKbfe 81 +39610 pTfvIfZgatMvWz Datum: 05.01.2024 +Deutschland Depotnummer: 5190828770 +Hiermit bestätigen wir Ihnen folgende Transaktion für Sie ausgeführt zu haben: +Transaktion Fondsname Betrag Preis Anteile +ISIN Preisdatum Bestand neu +Verwahrart/Lagerland +Verwahrort +Kauf Standortfonds Deutschland 1003.84 € 133.81 € 7.502 +AT0000A1Z882 03.01.2024 275.444 +Girosammelverwahrung/AT +Raiffeisen Bank International AG +Abrechnungsbetrag: 1003.84 € +Ausgabeaufschlag/Provision: 0,00% +Auftrags-Nummer: 413093083849495599565316731081 +Anlagen in Investmentfonds können erst nach Kenntnisnahme der gesetzlichen Verkaufsunterlagen +(Basisinformationsblatt) erfolgen. Diese Unterlagen haben Sie direkt über die Sunrise Kanäle erhalten bzw. vor +Auftragserteilung dort eingesehen. +Wichtiger Hinweis: Einwendungen gegen diese Fondsabrechnung wegen Unrichtigkeit oder Unvollständigkeit +richten Sie bitte schriftlich spätestens einen Monat nach Zugang an: info@meetsunrise.com. +Mit besten Grüßen +Ihr Sunrise Team +Sunrise Securities GmbH, Gußhausstraße 3/2, A-1040 Wien; UID-Nummer: ATU 68616777, Firmenbuchnummer: FN 410750w +Sunrise Securities GmbH nach österreichischem Recht Zweigniederlassung Deutschland, Rahel-Hirsch-Straße 10, D-10557 Berlin; Handelsregister: HRB 258310 B +Version_2023_01_K \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sunrise/SunrisePDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sunrise/SunrisePDFExtractorTest.java index 4d70c4abc7..0e77687fd9 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sunrise/SunrisePDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sunrise/SunrisePDFExtractorTest.java @@ -1,32 +1,41 @@ package name.abuchen.portfolio.datatransfer.pdf.sunrise; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.dividend; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasAmount; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasCurrencyCode; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasDate; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasFees; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasGrossValue; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasIsin; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasName; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasNote; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasShares; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasSource; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTaxes; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTicker; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasWkn; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.purchase; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.taxes; +import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransactions; +import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countBuySell; +import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countSecurities; +import static org.hamcrest.CoreMatchers.hasItem; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsEmptyCollection.empty; -import static org.junit.Assert.assertNull; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import org.junit.Test; -import name.abuchen.portfolio.datatransfer.Extractor.BuySellEntryItem; import name.abuchen.portfolio.datatransfer.Extractor.Item; -import name.abuchen.portfolio.datatransfer.Extractor.SecurityItem; -import name.abuchen.portfolio.datatransfer.Extractor.TransactionItem; import name.abuchen.portfolio.datatransfer.actions.AssertImportActions; import name.abuchen.portfolio.datatransfer.pdf.PDFInputFile; import name.abuchen.portfolio.datatransfer.pdf.SunrisePDFExtractor; -import name.abuchen.portfolio.model.AccountTransaction; -import name.abuchen.portfolio.model.BuySellEntry; import name.abuchen.portfolio.model.Client; -import name.abuchen.portfolio.model.PortfolioTransaction; -import name.abuchen.portfolio.model.Security; -import name.abuchen.portfolio.model.Transaction.Unit; import name.abuchen.portfolio.money.CurrencyUnit; -import name.abuchen.portfolio.money.Money; -import name.abuchen.portfolio.money.Values; @SuppressWarnings("nls") public class SunrisePDFExtractorTest @@ -41,80 +50,156 @@ public void testWertpapierKauf01() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf01.txt"), errors); assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); assertThat(results.size(), is(2)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security - Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security.getIsin(), is("AT0000A1QA38")); - assertNull(security.getWkn()); - assertNull(security.getTickerSymbol()); - assertThat(security.getName(), is("Standortfonds Österreich")); - assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); + assertThat(results, hasItem(security( // + hasIsin("AT0000A1QA38"), hasWkn(null), hasTicker(null), // + hasName("Standortfonds Österreich"), // + hasCurrencyCode("EUR")))); // check buy sell transaction - BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2024-01-03T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.215))); - assertThat(entry.getSource(), is("Kauf01.txt")); - assertThat(entry.getNote(), is("Auftrags-Nummer: 345834056535324784670985082345")); - - assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(30.12)))); - assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(30.12)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(results, hasItem(purchase( // + hasDate("2024-01-03T00:00"), hasShares(0.215), // + hasSource("Kauf01.txt"), // + hasNote("Auftrags-Nummer: 345834056535324784670985082345"), // + hasAmount("EUR", 30.12), hasGrossValue("EUR", 30.12), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); } @Test - public void testDividende01() + public void testWertpapierKauf02() { - Client client = new Client(); + SunrisePDFExtractor extractor = new SunrisePDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf02.txt"), errors); - SunrisePDFExtractor extractor = new SunrisePDFExtractor(client); + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("AT0000A1QA38"), hasWkn(null), hasTicker(null), // + hasName("Standortfonds Österreich"), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2022-10-18T00:00"), hasShares(0.433), // + hasSource("Kauf02.txt"), // + hasNote("Auftrags-Nummer: 747448052066562190749732135729"), // + hasAmount("EUR", 50.00), hasGrossValue("EUR", 50.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + } + + @Test + public void testWertpapierKauf03() + { + SunrisePDFExtractor extractor = new SunrisePDFExtractor(new Client()); List errors = new ArrayList<>(); - List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende01.txt"), errors); + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf03.txt"), errors); assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); assertThat(results.size(), is(2)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security - Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security.getIsin(), is("AT0000A1QA38")); - assertNull(security.getWkn()); - assertNull(security.getTickerSymbol()); - assertThat(security.getName(), is("Standortfonds Österreich")); - assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); + assertThat(results, hasItem(security( // + hasIsin("AT0000A1QA38"), hasWkn(null), hasTicker(null), // + hasName("Standortfonds Österreich"), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2023-12-28T00:00"), hasShares(0.072), // + hasSource("Kauf03.txt"), // + hasNote("Auftrags-Nummer: 751175802407452854275862438475"), // + hasAmount("EUR", 10.08), hasGrossValue("EUR", 10.08), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + } + + @Test + public void testWertpapierKauf04() + { + SunrisePDFExtractor extractor = new SunrisePDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf04.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("AT0000A1Z882"), hasWkn(null), hasTicker(null), // + hasName("Standortfonds Deutschland"), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2024-01-03T00:00"), hasShares(7.502), // + hasSource("Kauf04.txt"), // + hasNote("Auftrags-Nummer: 413093083849495599565316731081"), // + hasAmount("EUR", 1003.84), hasGrossValue("EUR", 1003.84), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + } + + @Test + public void testDividende22() + { + SunrisePDFExtractor extractor = new SunrisePDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(2L)); + assertThat(results.size(), is(3)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("AT0000A1QA38"), hasWkn(null), hasTicker(null), // + hasName("Standortfonds Österreich"), // + hasCurrencyCode("EUR")))); // check dividends transaction - AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance) - .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(transaction.getType(), is(AccountTransaction.Type.DIVIDENDS)); - - assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-12-15T00:00"))); - assertThat(transaction.getShares(), is(Values.Share.factorize(10.29 / 0.49))); - assertThat(transaction.getSource(), is("Dividende01.txt")); - assertThat(transaction.getNote(), is("Turnus: jährlich")); - - assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(transaction.getGrossValue(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.29)))); - assertThat(transaction.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.29)))); - assertThat(transaction.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + assertThat(results, hasItem(dividend( // + hasDate("2023-12-15T00:00"), hasShares(10.29 / 0.49), // + hasSource("Dividende01.txt"), // + hasNote("Turnus: jährlich"), // + hasAmount("EUR", 10.29), hasGrossValue("EUR", 10.29), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + + // check taxes transaction + assertThat(results, hasItem(taxes( // + hasDate("2023-12-15T00:00"), hasShares(10.29 / 0.49), // + hasSource("Dividende01.txt"), // + hasNote(null), // + hasAmount("EUR", 10.29), hasGrossValue("EUR", 10.29), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); } } diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/CryptoKauf01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/CryptoKauf01.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/CryptoKauf01.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/CryptoKauf01.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/CryptoVerkauf01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/CryptoVerkauf01.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/CryptoVerkauf01.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/CryptoVerkauf01.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Depotauszug01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Depotauszug01.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Depotauszug01.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Depotauszug01.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Depotauszug02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Depotauszug02.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Depotauszug02.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Depotauszug02.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Depotauszug03.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Depotauszug03.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Depotauszug03.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Depotauszug03.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Depotauszug04.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Depotauszug04.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Depotauszug04.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Depotauszug04.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Depotauszug05.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Depotauszug05.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Depotauszug05.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Depotauszug05.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Dividende01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Dividende01.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Dividende01.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Dividende01.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Dividende02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Dividende02.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Dividende02.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Dividende02.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Dividende03.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Dividende03.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Dividende03.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Dividende03.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Dividende04.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Dividende04.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Dividende04.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Dividende04.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Dividende05.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Dividende05.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Dividende05.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Dividende05.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Kapitalveraenderung01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Kapitalveraenderung01.txt new file mode 100644 index 0000000000..a2e1032c47 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Kapitalveraenderung01.txt @@ -0,0 +1,32 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.64.0 +----------------------------------------- +justTRADE +Ein Service der Sutor Bank GmbH +JT Technologies GmbH +Herr Hamburger Allee 14 +Vor Name 60486 Frankfurt am Main +Straße 1 E-Mail: service@justtrade.com +11111 Ort Web: www.justtrade.com +Name des Kunden: Vor Name +Depotnummer: 111111111 +08. Juni 2023 +Kapitalveränderung - Bezugsrechtsemission +Produktbezeichnung - OXFORD SQUARE CAP. DL-,01 +Internationale Wertpapierkennnummer US69181V1070 +(ISIN) +Anzahl/Nominale 500,00 +Referenz 11111 +Ex Datum - Tag 25. Mai 2023 +Verhältnis Neu/ Alt 1 : 3,00 +Neues Wertpapier Oxford Square Capital Corp. Anrechte +Neue ISIN US69181V1153 +Einbuchung Anzahl/Nominale 166,67 +Bei Fragen oder im Falle einer fehlerhaften Abrechnung wenden Sie sich bitte an unseren Kundenservice. Sie +finden die Kontaktdetails im Briefkopf dieses Schreibens. +Dieses Dokument wurde maschinell erstellt und wird nicht unterschrieben. +SUTOR BANK GmbH TELEFON 040-8090685-0 GESCHÄFTSFÜHRUNG FINANZAMT HAMBURG AMTSGERICHT HAMBURG +HERMANNSTRASSE 46 TELEFAX 040-8090685-810 ROBERT FREITAG STNR: 222721000896 HRB 178357 +20095 HAMBURG THOMAS MEIER UST-IDNR: DE155617009 +POSTFACH 11 33 37 INFO@SUTORBANK.DE BANKLEITZAHL 202 308 00 +20433 HAMBURG WWW.SUTORBANK.DE BIC CODE: MHSBDEHBXXX \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Kauf01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Kauf01.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Kauf01.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Kauf01.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Kauf02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Kauf02.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Kauf02.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Kauf02.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Kauf03.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Kauf03.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Kauf03.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Kauf03.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Kauf04.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Kauf04.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Kauf04.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Kauf04.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Sammelabrechnung01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Sammelabrechnung01.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Sammelabrechnung01.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Sammelabrechnung01.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/JustTradePDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/SutorBankGmbHPDFExtractorTest.java similarity index 97% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/JustTradePDFExtractorTest.java rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/SutorBankGmbHPDFExtractorTest.java index 82e60b8bb3..aef6f1826a 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/JustTradePDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/SutorBankGmbHPDFExtractorTest.java @@ -1,4 +1,4 @@ -package name.abuchen.portfolio.datatransfer.pdf.justtrade; +package name.abuchen.portfolio.datatransfer.pdf.sutorbankgmbh; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasAmount; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasCurrencyCode; @@ -15,10 +15,12 @@ import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTaxes; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTicker; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasWkn; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.outboundDelivery; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.purchase; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.sale; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.taxes; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.withFailureMessage; import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransactions; import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countBuySell; import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countSecurities; @@ -41,8 +43,8 @@ import name.abuchen.portfolio.datatransfer.Extractor.SecurityItem; import name.abuchen.portfolio.datatransfer.Extractor.TransactionItem; import name.abuchen.portfolio.datatransfer.actions.AssertImportActions; -import name.abuchen.portfolio.datatransfer.pdf.JustTradePDFExtractor; import name.abuchen.portfolio.datatransfer.pdf.PDFInputFile; +import name.abuchen.portfolio.datatransfer.pdf.SutorBankGmbHPDFExtractor; import name.abuchen.portfolio.model.AccountTransaction; import name.abuchen.portfolio.model.BuySellEntry; import name.abuchen.portfolio.model.Client; @@ -55,9 +57,9 @@ import name.abuchen.portfolio.online.impl.CoinGeckoQuoteFeed; @SuppressWarnings("nls") -public class JustTradePDFExtractorTest +public class SutorBankGmbHPDFExtractorTest { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()) + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()) { @Override protected CoinGeckoQuoteFeed lookupFeed() @@ -80,7 +82,7 @@ public synchronized List getCoins() throws IOException @Test public void testWertpapierKauf01() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -124,7 +126,7 @@ public void testWertpapierKauf01() @Test public void testWertpapierKauf02() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -168,7 +170,7 @@ public void testWertpapierKauf02() @Test public void testWertpapierKauf03() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -212,7 +214,7 @@ public void testWertpapierKauf03() @Test public void testWertpapierKauf04() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -242,7 +244,7 @@ public void testWertpapierKauf04() @Test public void testWertpapierVerkauf01() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -286,7 +288,7 @@ public void testWertpapierVerkauf01() @Test public void testWertpapierVerkauf02() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -330,7 +332,7 @@ public void testWertpapierVerkauf02() @Test public void testWertpapierVerkauf03() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -360,7 +362,7 @@ public void testWertpapierVerkauf03() @Test public void testWertpapierVerkauf04() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -390,7 +392,7 @@ public void testWertpapierVerkauf04() @Test public void testSammelabrechnung01() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -581,7 +583,7 @@ public void testSammelabrechnung01() @Test public void testDividende01() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -624,7 +626,7 @@ public void testDividende01() @Test public void testDividende02() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -667,7 +669,7 @@ public void testDividende02() @Test public void testDividende03() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -710,7 +712,7 @@ public void testDividende03() @Test public void testDividende04() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -753,7 +755,7 @@ public void testDividende04() @Test public void testDividende05() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -796,7 +798,7 @@ public void testDividende05() @Test public void testVorabpauschale01() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -824,10 +826,76 @@ public void testVorabpauschale01() hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); } + @Test + public void testKapitalveraenderung01() + { + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kapitalveraenderung01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("US69181V1070"), hasWkn(null), hasTicker(null), // + hasName("OXFORD SQUARE CAP. DL-,01"), // + hasCurrencyCode("EUR")))); + + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + outboundDelivery( // + hasDate("2023-05-25T00:00"), hasShares(500.00), // + hasSource("Kapitalveraenderung01.txt"), // + hasNote("Verhältnis Neu/ Alt 1 : 3,00"), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); + } + + @Test + public void testUebernahme01() + { + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Uebernahme01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("US03990B1017"), hasWkn(null), hasTicker(null), // + hasName("Ares Management Corp."), // + hasCurrencyCode("EUR")))); + + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + outboundDelivery( // + hasDate("2023-12-14T00:00"), hasShares(50.00), // + hasSource("Uebernahme01.txt"), // + hasNote("Verhältnis Neu/ Alt 1,00 : 1,00"), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); + } + @Test public void testDepotauszug01() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -1071,7 +1139,7 @@ public void testDepotauszug01() @Test public void testDepotauszug02() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -1283,7 +1351,7 @@ public void testDepotauszug02() @Test public void testDepotauszug03() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -2696,7 +2764,7 @@ public void testDepotauszug03() @Test public void testDepotauszug04() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); @@ -3063,71 +3131,41 @@ public void testDepotauszug04() assertThat(transaction.getUnitSum(Unit.Type.FEE), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - // check 1st delivery outbound (Auslieferung) transaction - PortfolioTransaction entry1 = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance) - .skip(4).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry1.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); - - assertThat(entry1.getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); - assertThat(entry1.getShares(), is(Values.Share.factorize(241))); - assertThat(entry1.getSource(), is("Depotauszug04.txt")); - assertThat(entry1.getNote(), is("Übertrag")); - - assertThat(entry1.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry1.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry1.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry1.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - - // check 2nd delivery outbound (Auslieferung) transaction - entry1 = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(5).findFirst() - .orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry1.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); - - assertThat(entry1.getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); - assertThat(entry1.getShares(), is(Values.Share.factorize(37))); - assertThat(entry1.getSource(), is("Depotauszug04.txt")); - assertThat(entry1.getNote(), is("Übertrag")); - - assertThat(entry1.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry1.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry1.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry1.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - - // check 3rd delivery outbound (Auslieferung) transaction - entry1 = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(6).findFirst() - .orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry1.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); - - assertThat(entry1.getDateTime(), is(LocalDateTime.parse("2021-06-01T00:00"))); - assertThat(entry1.getShares(), is(Values.Share.factorize(295))); - assertThat(entry1.getSource(), is("Depotauszug04.txt")); - assertThat(entry1.getNote(), is("Übertrag")); - - assertThat(entry1.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry1.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry1.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry1.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + outboundDelivery( // + hasDate("2021-06-01T00:00"), hasShares(241), // + hasSource("Depotauszug04.txt"), // + hasNote("Übertrag"), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); + + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + outboundDelivery( // + hasDate("2021-06-01T00:00"), hasShares(37), // + hasSource("Depotauszug04.txt"), // + hasNote("Übertrag"), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); + + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + outboundDelivery( // + hasDate("2021-06-01T00:00"), hasShares(295), // + hasSource("Depotauszug04.txt"), // + hasNote("Übertrag"), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); } @Test public void testDepotauszug05() { - JustTradePDFExtractor extractor = new JustTradePDFExtractor(new Client()); + SutorBankGmbHPDFExtractor extractor = new SutorBankGmbHPDFExtractor(new Client()); List errors = new ArrayList<>(); diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Uebernahme01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Uebernahme01.txt new file mode 100644 index 0000000000..d45fdbb589 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Uebernahme01.txt @@ -0,0 +1,46 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.67.3 +----------------------------------------- +justTRADE +Ein Service der Sutor Bank GmbH +JT Technologies GmbH +Herr Hamburger Allee 14 +DJmOvA txdR 60486 Frankfurt am Main +HBaHaMxkZGPXgi 41 E-Mail: service@justtrade.com +32521 GWlQhgSHqUDb Web: www.justtrade.com +Name des Kunden: cwjwfV KpdM +Depotnummer: 123456789 +01. März 2024 +Übernahme - Vergleichsplan +Produktbezeichnung - Ares Management Corp. +Internationale Wertpapierkennnummer US03990B1017 +(ISIN) +Anzahl/Nominale 50,00 +Referenz 12345 +Zahlbarkeitstag 14. Dezember 2023 +Ex Datum - Tag 14. Dezember 2023 +Bestandsstichtag 15. Dezember 2023 +Valutadatum 14. Dezember 2023 +Verhältnis Neu/ Alt 1,00 : 1,00 +Altes Wertpapier Ares Management Corp. +Alte ISIN US03990B1017 +Ausbuchung Stück/Nominal 50,00 +Neues Wertpapier Ares Management Corp. +Neue ISIN US03990B1017 +Einbuchung Stück/Nominal 50,00 +Rückzahlungskurs EUR 0,47 +Rückzahlungsbetrag EUR 23,72 +Berechnungsgrundlage EUR 23,70 +Kapitalertragssteuer +Kapitalertragssteuer EUR 5,93 +Solidaritätszuschlag EUR 0,32 +Ausmachender Betrag EUR 17,47 +Bei Fragen oder im Falle einer fehlerhaften Abrechnung wenden Sie sich bitte an unseren Kundenservice. Sie +finden die Kontaktdetails im Briefkopf dieses Schreibens. +Der Gegenwert der Transaktion wird per Valutatag gebucht. Dies ist keine Steuerbescheinigung. +Dieses Dokument wurde maschinell erstellt und wird nicht unterschrieben. +SUTOR BANK GmbH TELEFON 040-8090685-0 GESCHÄFTSFÜHRUNG FINANZAMT HAMBURG AMTSGERICHT HAMBURG +HERMANNSTRASSE 46 TELEFAX 040-8090685-810 ROBERT FREITAG STNR: 222721000896 HRB 178357 +20095 HAMBURG THOMAS MEIER UST-IDNR: DE155617009 +POSTFACH 11 33 37 INFO@SUTORBANK.DE BANKLEITZAHL 202 308 00 +20433 HAMBURG WWW.SUTORBANK.DE BIC CODE: MHSBDEHBXXX \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Verkauf01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Verkauf01.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Verkauf01.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Verkauf01.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Verkauf02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Verkauf02.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Verkauf02.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Verkauf02.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Verkauf03.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Verkauf03.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Verkauf03.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Verkauf03.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Verkauf04.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Verkauf04.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Verkauf04.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Verkauf04.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Vorabpauschale01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Vorabpauschale01.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/justtrade/Vorabpauschale01.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/sutorbankgmbh/Vorabpauschale01.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/Kauf13.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/Kauf13.txt new file mode 100644 index 0000000000..391e094c1b --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/Kauf13.txt @@ -0,0 +1,28 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.67.3 +----------------------------------------- +TRADE REPUBLIC BANK GMBH BRUNNENSTRASSE 19-21 10119 BERLIN +tygkI HBjkt mdySPWKNNou SEITE 1 von 1 +MZAKzhzG. 08B DATUM 05.03.2024 +23537 DCrFCrYea AUSFÜHRUNG 5437-f7f5 +SAVEBACK B2C4-n64q +DEPOT 5652696149 +WERTPAPIERABRECHNUNG SAVEBACK +ÜBERSICHT +Ausführung von Saveback am 04.03.2024 an der Lang & Schwarz Exchange. +Der Kontrahent der Transaktion ist Lang & Schwarz TradeCenter AG & Co. KG. +POSITION ANZAHL DURCHSCHNITTSKURS BETRAG +MUL Amundi MSCI AC World 0,032743 Stk. 420,85 EUR 13,78 EUR +UCITS ETF Inh.Anteile Acc +ISIN: LU1829220216 +GESAMT 13,78 EUR +BUCHUNG +VERRECHNUNGSKONTO WERTSTELLUNG BETRAG +DE2123456789012345678 06.03.2024 -13,78 EUR +MUL Amundi MSCI AC World UCITS ETF Inh.Anteile Acc in Girosammelverwahrung in Deutschland. +Diese Abrechnung wird maschinell erstellt und daher nicht unterschrieben. +Sofern keine Umsatzsteuer ausgewiesen ist, handelt es sich gem. § 4 Nr. 8 UStG um eine umsatzsteuerfreie Leistung. +Trade Republic Bank GmbH www.traderepublic.com Sitz der Gesellschaft: Berlin Geschäftsführer +Brunnenstraße 19-21 service@traderepublic.com AG Charlottenburg HRB 244347 B Andreas Torner +10119 Berlin USt-ID DE307510626 Gernot Mittendorfer +ABRE / 05.03.2024 / 32549613 / DR37-6Z5F \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/Kauf14.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/Kauf14.txt new file mode 100644 index 0000000000..df4c9b0f52 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/Kauf14.txt @@ -0,0 +1,32 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.3 +----------------------------------------- +TRADE REPUBLIC BANK GMBH BRUNNENSTRASSE 19-21 10119 BERLIN +CRwazW CVGYx oATxGhG SEITE 1 von 1 +AtehMW-fYEnfbmPd-ApeaZD 33 DATUM 26.03.2024 +23949 VEjt ORDER 20f0-0026 +AUSFÜHRUNG 761d-19e4 +DEPOT 0706195861 +WERTPAPIERABRECHNUNG +ÜBERSICHT +Market-Order Kauf am 26.03.2024, um 15:53 Uhr (Europe/Berlin). +Der Kontrahent der Transaktion ist Lang & Schwarz TradeCenter AG & Co. KG. +POSITION NOMINALE PREIS BETRAG +Bundesrep.Deutschland 1.019 EUR 98,05 % 999,13 EUR +Bundesobl.Ser.180 v.2019(24) +ISIN: DE0001141802 +GESAMT 999,13 EUR +ABRECHNUNG +POSITION BETRAG +Fremdkostenzuschlag -1,00 EUR +GESAMT -1.000,13 EUR +BUCHUNG +VERRECHNUNGSKONTO WERTSTELLUNG BETRAG +DE58120700700122500000 28.03.2024 -1.000,13 EUR +Bundesrep.Deutschland Bundesobl.Ser.180 v.2019(24) in Girosammelverwahrung in Deutschland. +Diese Abrechnung wird maschinell erstellt und daher nicht unterschrieben. +Sofern keine Umsatzsteuer ausgewiesen ist, handelt es sich gem. § 4 Nr. 8 UStG um eine umsatzsteuerfreie Leistung. +Trade Republic Bank GmbH www.traderepublic.com Sitz der Gesellschaft: Berlin Geschäftsführer +Brunnenstraße 19-21 service@traderepublic.com AG Charlottenburg HRB 244347 B Andreas Torner +10119 Berlin USt-ID DE307510626 Gernot Mittendorfer +ABRE / 26.03.2024 / 63960219 / 46a8-f932 \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/USQuellensteuer01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/Steuerkorrektur01.txt similarity index 100% rename from name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/USQuellensteuer01.txt rename to name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/Steuerkorrektur01.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/TradeRepublicPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/TradeRepublicPDFExtractorTest.java index eeaff49b62..0d59924fa4 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/TradeRepublicPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/traderepublic/TradeRepublicPDFExtractorTest.java @@ -21,6 +21,7 @@ import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasWkn; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.inboundDelivery; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.interest; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.outboundDelivery; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.purchase; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.removal; import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.sale; @@ -60,6 +61,7 @@ import name.abuchen.portfolio.model.AccountTransaction; import name.abuchen.portfolio.model.BuySellEntry; import name.abuchen.portfolio.model.Client; +import name.abuchen.portfolio.model.Portfolio; import name.abuchen.portfolio.model.PortfolioTransaction; import name.abuchen.portfolio.model.Security; import name.abuchen.portfolio.model.Transaction; @@ -123,7 +125,7 @@ public void testWertpapierKauf01() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-05-13T12:14"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1))); assertThat(entry.getSource(), is("Kauf01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Order: dead-beef | Ausführung: ab12-c3de")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.05)))); @@ -167,7 +169,7 @@ public void testWertpapierKauf02() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-05-13T13:59"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1))); assertThat(entry.getSource(), is("Kauf02.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Order: 1234-abcd | Ausführung: a1b2-3456")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(59.19)))); @@ -211,7 +213,7 @@ public void testWertpapierKauf03() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-06-17T12:27"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1))); assertThat(entry.getSource(), is("Kauf03.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Order: fd98-0283 | Ausführung: 51cb-50a8")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(193.08)))); @@ -255,7 +257,7 @@ public void testWertpapierKauf04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-11-05T15:16"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(4))); assertThat(entry.getSource(), is("Kauf04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Order: a1b2-3456 | Ausführung: 1234-56bb")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(485.80)))); @@ -299,7 +301,7 @@ public void testWertpapierKauf05() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-11-21T15:57"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(20))); assertThat(entry.getSource(), is("Kauf05.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Order: xxxx-xxxx | Ausführung: xxxx-xxxx")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1396.60)))); @@ -387,7 +389,7 @@ public void testWertpapierKauf07() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-05-02T21:26"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2))); assertThat(entry.getSource(), is("Kauf07.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Order: 01f6-b7cc | Ausführung: a952-e304")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(95.69)))); @@ -469,7 +471,7 @@ public void testWertpapierKauf09() assertThat(results, hasItem(purchase( // hasDate("2023-11-27T16:17"), hasShares(1000.00), // hasSource("Kauf09.txt"), // - hasNote(null), // + hasNote("Order: 39f0-5191 | Ausführung: f728-6a96"), // hasAmount("EUR", 941.00), hasGrossValue("EUR", 940.00), // hasTaxes("EUR", 0.00), hasFees("EUR", 1.00)))); } @@ -500,7 +502,7 @@ public void testWertpapierKauf10() assertThat(results, hasItem(purchase( // hasDate("2023-11-27T14:05"), hasShares(1000.00), // hasSource("Kauf10.txt"), // - hasNote(null), // + hasNote("Order: 64b4-82d5 | Ausführung: c4f5-afae"), // hasAmount("EUR", 941.00), hasGrossValue("EUR", 940.00), // hasTaxes("EUR", 0.00), hasFees("EUR", 1.00)))); } @@ -531,7 +533,7 @@ public void testWertpapierKauf11() assertThat(results, hasItem(purchase( // hasDate("2023-12-12T19:41"), hasShares(1000.00), // hasSource("Kauf11.txt"), // - hasNote(null), // + hasNote("Order: c141-b5b3 | Ausführung: 4019-2100"), // hasAmount("EUR", 1611.00), hasGrossValue("EUR", 1610.00), // hasTaxes("EUR", 0.00), hasFees("EUR", 1.00)))); } @@ -562,11 +564,73 @@ public void testWertpapierKauf12() assertThat(results, hasItem(purchase( // hasDate("2024-02-09T00:00"), hasShares(0.09351), // hasSource("Kauf12.txt"), // - hasNote(null), // + hasNote("Ausführung: 8f44-fdf5 | Round Up: 42c2-50a7"), // hasAmount("EUR", 2.50), hasGrossValue("EUR", 2.50), // hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); } + @Test + public void testWertpapierKauf13() + { + TradeRepublicPDFExtractor extractor = new TradeRepublicPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf13.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("LU1829220216"), hasWkn(null), hasTicker(null), // + hasName("MUL Amundi MSCI AC World UCITS ETF Inh.Anteile Acc"), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2024-03-04T00:00"), hasShares(0.032743), // + hasSource("Kauf13.txt"), // + hasNote("Ausführung: 5437-f7f5 | Saveback: B2C4-n64q"), // + hasAmount("EUR", 13.78), hasGrossValue("EUR", 13.78), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + } + + @Test + public void testWertpapierKauf14() + { + TradeRepublicPDFExtractor extractor = new TradeRepublicPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf14.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check security + assertThat(results, hasItem(security( // + hasIsin("DE0001141802"), hasWkn(null), hasTicker(null), // + hasName("Bundesrep.Deutschland Bundesobl.Ser.180 v.2019(24)"), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2024-03-26T15:53"), hasShares(10.19), // + hasSource("Kauf14.txt"), // + hasNote("Order: 20f0-0026 | Ausführung: 761d-19e4"), // + hasAmount("EUR", 1000.13), hasGrossValue("EUR", 999.13), // + hasTaxes("EUR", 0.00), hasFees("EUR", 1.00)))); + } + @Test public void testBuy01() { @@ -593,7 +657,7 @@ public void testBuy01() assertThat(results, hasItem(purchase( // hasDate("2023-04-28T11:13"), hasShares(100.00), // hasSource("Buy01.txt"), // - hasNote(null), // + hasNote("Order: 10VG-16T0 | Execution: 4A66-g597"), // hasAmount("EUR", 87.40), hasGrossValue("EUR", 86.40), // hasTaxes("EUR", 0.00), hasFees("EUR", 1.00)))); } @@ -624,7 +688,7 @@ public void testAcquisto01() assertThat(results, hasItem(purchase( // hasDate("2023-06-01T10:46"), hasShares(125.00), // hasSource("Acquisto01.txt"), // - hasNote(null), // + hasNote("Ordine: cY43-6m6l | Esecuzione: V711-7789"), // hasAmount("EUR", 3719.75), hasGrossValue("EUR", 3718.75), // hasTaxes("EUR", 0.00), hasFees("EUR", 1.00)))); } @@ -686,7 +750,7 @@ public void testCryptoKauf02() assertThat(results, hasItem(purchase( // hasDate("2023-05-16T00:00"), hasShares(0.000983), // hasSource("CryptoKauf02.txt"), // - hasNote("Sparplan: y646-a753 | Ausführung: K7Y2-2e37"), // + hasNote("Ausführung: K7Y2-2e37 | Sparplan: y646-a753"), // hasAmount("EUR", 24.99), hasGrossValue("EUR", 24.99), // hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); } @@ -845,7 +909,7 @@ public void testAchat01() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-01-17T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.3773))); assertThat(entry.getSource(), is("Achat01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Exécution : cee1-2d00 | Programmé : eea2-4c8b")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(20.00)))); @@ -1126,13 +1190,13 @@ public void testSteuerabrechnung01() } @Test - public void testUSQuellensteuer01() + public void testSteuerkorrektur01() { TradeRepublicPDFExtractor extractor = new TradeRepublicPDFExtractor(new Client()); List errors = new ArrayList<>(); - List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "USQuellensteuer01.txt"), errors); + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Steuerkorrektur01.txt"), errors); assertThat(errors, empty()); assertThat(results.size(), is(2)); @@ -1155,7 +1219,7 @@ public void testUSQuellensteuer01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-11-02T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(38.4597))); - assertThat(transaction.getSource(), is("USQuellensteuer01.txt")); + assertThat(transaction.getSource(), is("Steuerkorrektur01.txt")); assertNull(transaction.getNote()); assertThat(transaction.getMonetaryAmount(), @@ -1200,7 +1264,7 @@ public void testWertpapierVerkauf01() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-06-18T17:50"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(80))); assertThat(entry.getSource(), is("Verkauf01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Order: 55a8-39ad | Ausführung: 051a-e65e")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1792.29)))); @@ -1244,7 +1308,7 @@ public void testWertpapierVerkauf02() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-06-10T11:42"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(500))); assertThat(entry.getSource(), is("Verkauf02.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Order: 1234-1234 | Ausführung: 1234-1234")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(3594.00)))); @@ -1308,7 +1372,7 @@ public void testWertpapierVerkauf03() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-07-21T09:30"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(30))); assertThat(entry.getSource(), is("Verkauf03.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Order: c17d-baea | Ausführung: 6415-fd77")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1199.00)))); @@ -1372,7 +1436,7 @@ public void testWertpapierVerkauf04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-09-12T12:19"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.0068))); assertThat(entry.getSource(), is("Verkauf04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Order: 36de-8883 | Ausführung: f439-3735")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.29)))); @@ -1524,7 +1588,7 @@ public void testWertpapierVerkauf07() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-05-23T21:10"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(9))); assertThat(entry.getSource(), is("Verkauf07.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Order: 5a93-03d1 | Ausführung: b11c-12c4")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(623.60)))); @@ -1588,7 +1652,7 @@ public void testWertpapierVerkauf08() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-08-03T16:49"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2))); assertThat(entry.getSource(), is("Verkauf08.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Order: 886a-ffff | Ausführung: dcd2-ffff")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(301.88)))); @@ -1605,10 +1669,10 @@ public void testWertpapierVerkauf08() assertThat(transaction.getType(), is(AccountTransaction.Type.TAX_REFUND)); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-08-03T16:49"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2))); - assertThat(entry.getSource(), is("Verkauf08.txt")); - assertNull(entry.getNote()); + assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-08-03T16:49"))); + assertThat(transaction.getShares(), is(Values.Share.factorize(2))); + assertThat(transaction.getSource(), is("Verkauf08.txt")); + assertNull(transaction.getNote()); assertThat(transaction.getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(12.65 + 0.69)))); @@ -1757,8 +1821,8 @@ public void testDividendeStorno01() hasDate("2020-02-26T00:00"), hasShares(200), // hasSource("DividendeStorno01.txt"), // hasNote(null), // - hasAmount("EUR", 29.90), hasGrossValue("EUR", 40.34), // - hasForexGrossValue("USD", 44.80), // + hasAmount("EUR", 30.17), hasGrossValue("EUR", 40.61), // + hasForexGrossValue("USD", 45.10), // hasTaxes("EUR", ((6.81 / 1.1105) + 4.09 + 0.22)), hasFees("EUR", 0.00))))); // check tax refund transaction @@ -1768,8 +1832,8 @@ public void testDividendeStorno01() hasDate("2020-02-26T00:00"), hasShares(200), // hasSource("DividendeStorno01.txt"), // hasNote(null), // - hasAmount("EUR", 0.27), hasGrossValue("EUR", 0.27), // - hasForexGrossValue("USD", 0.30), // + hasAmount("EUR", 0.36), hasGrossValue("EUR", 0.36), // + hasForexGrossValue("USD", 0.40), // hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); } @@ -1802,7 +1866,7 @@ public void testDividendeStorno01WithSecurityInEUR() hasDate("2020-02-26T00:00"), hasShares(200), // hasSource("DividendeStorno01.txt"), // hasNote(null), // - hasAmount("EUR", 29.90), hasGrossValue("EUR", 40.34), // + hasAmount("EUR", 30.17), hasGrossValue("EUR", 40.61), // hasTaxes("EUR", ((6.81 / 1.1105) + 4.09 + 0.22)), hasFees("EUR", 0.00), // check(tx -> { CheckCurrenciesAction c = new CheckCurrenciesAction(); @@ -1819,7 +1883,7 @@ public void testDividendeStorno01WithSecurityInEUR() hasDate("2020-02-26T00:00"), hasShares(200), // hasSource("DividendeStorno01.txt"), // hasNote(null), // - hasAmount("EUR", 0.27), hasGrossValue("EUR", 0.27), // + hasAmount("EUR", 0.36), hasGrossValue("EUR", 0.36), // hasTaxes("EUR", 0.00), hasFees("EUR", 0.00), // check(tx -> { CheckCurrenciesAction c = new CheckCurrenciesAction(); @@ -3329,41 +3393,30 @@ public void testKapitalerhoehungGegenBar01() List errors = new ArrayList<>(); - List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "KapitalerhoehungGegenBar01.txt"), - errors); + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "KapitalerhoehungGegenBar01.txt"), errors); assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); assertThat(results.size(), is(2)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security - Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security.getIsin(), is("DE000A3E5CX4")); - assertNull(security.getWkn()); - assertNull(security.getTickerSymbol()); - assertThat(security.getName(), is("Nordex SE Inhaber-Aktien o.N.")); - assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); - - // check delivery inbound (Einlieferung) transaction - PortfolioTransaction entry = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance) - .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); - - assertThat(entry.getDateTime(), is(LocalDateTime.parse("2021-07-02T00:00"))); - assertThat(entry.getShares(), is(Values.Share.factorize(130))); - assertThat(entry.getSource(), is("KapitalerhoehungGegenBar01.txt")); - assertNull(entry.getNote()); + assertThat(results, hasItem(security( // + hasIsin("DE000A0D6554"), hasWkn(null), hasTicker(null), // + hasName("Nordex SE Inhaber-Aktien o.N."), // + hasCurrencyCode("EUR")))); - assertThat(entry.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + inboundDelivery( // + hasDate("2021-07-02T00:00"), hasShares(130.00), // + hasSource("KapitalerhoehungGegenBar01.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); } @Test @@ -3373,41 +3426,30 @@ public void testDepotuebertragEingehend() List errors = new ArrayList<>(); - List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "DepotuebertragEingehend.txt"), - errors); + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "DepotuebertragEingehend.txt"), errors); assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); assertThat(results.size(), is(2)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security - Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security.getIsin(), is("DE000KBX1006")); - assertNull(security.getWkn()); - assertNull(security.getTickerSymbol()); - assertThat(security.getName(), is("Knorr-Bremse AG Inhaber-Aktien o.N.")); - assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); - - // check delivery inbound (Einlieferung) transaction - PortfolioTransaction entry = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance) - .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); - - assertThat(entry.getDateTime(), is(LocalDateTime.parse("2022-11-08T00:00"))); - assertThat(entry.getShares(), is(Values.Share.factorize(13))); - assertThat(entry.getSource(), is("DepotuebertragEingehend.txt")); - assertNull(entry.getNote()); + assertThat(results, hasItem(security( // + hasIsin("DE000KBX1006"), hasWkn(null), hasTicker(null), // + hasName("Knorr-Bremse AG Inhaber-Aktien o.N."), // + hasCurrencyCode("EUR")))); - assertThat(entry.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + inboundDelivery( // + hasDate("2022-11-08T00:00"), hasShares(13.00), // + hasSource("DepotuebertragEingehend.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); } @Test @@ -3417,41 +3459,30 @@ public void testSpinOff01() List errors = new ArrayList<>(); - List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "SpinOff01.txt"), - errors); + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "SpinOff01.txt"), errors); assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); assertThat(results.size(), is(2)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security - Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security.getIsin(), is("US64110Y1082")); - assertNull(security.getWkn()); - assertNull(security.getTickerSymbol()); - assertThat(security.getName(), is("Net Lease Office Properties Registered Shares DL -,001")); - assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); - - // check delivery inbound (Einlieferung) transaction - PortfolioTransaction entry = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance) - .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); - - assertThat(entry.getDateTime(), is(LocalDateTime.parse("2023-11-03T00:00"))); - assertThat(entry.getShares(), is(Values.Share.factorize(2.564))); - assertThat(entry.getSource(), is("SpinOff01.txt")); - assertNull(entry.getNote()); + assertThat(results, hasItem(security( // + hasIsin("US64110Y1082"), hasWkn(null), hasTicker(null), // + hasName("Net Lease Office Properties Registered Shares DL -,001"), // + hasCurrencyCode("EUR")))); - assertThat(entry.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + inboundDelivery( // + hasDate("2023-11-03T00:00"), hasShares(2.564), // + hasSource("SpinOff01.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); } @Test @@ -3464,37 +3495,27 @@ public void testUmtausch01() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Umtausch01.txt"), errors); assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); assertThat(results.size(), is(2)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security - Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security.getIsin(), is("DE000A3E5CX4")); - assertNull(security.getWkn()); - assertNull(security.getTickerSymbol()); - assertThat(security.getName(), is("Nordex SE Inhaber-Bezugsrechte")); - assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); - - // check delivery outbound (Auslieferung) transaction - PortfolioTransaction entry = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance) - .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); - - assertThat(entry.getDateTime(), is(LocalDateTime.parse("2021-07-20T00:00"))); - assertThat(entry.getShares(), is(Values.Share.factorize(129.25))); - assertThat(entry.getSource(), is("Umtausch01.txt")); - assertNull(entry.getNote()); + assertThat(results, hasItem(security( // + hasIsin("DE000A3E5CX4"), hasWkn(null), hasTicker(null), // + hasName("Nordex SE Inhaber-Bezugsrechte"), // + hasCurrencyCode("EUR")))); - assertThat(entry.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + inboundDelivery( // + hasDate("2021-07-20T00:00"), hasShares(129.25), // + hasSource("Umtausch01.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); } @Test @@ -3507,38 +3528,27 @@ public void testUmtausch02() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Umtausch02.txt"), errors); assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); assertThat(results.size(), is(2)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security - Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security.getIsin(), is("DE000A0D6554")); - assertNull(security.getWkn()); - assertNull(security.getTickerSymbol()); - assertThat(security.getName(), is("Nordex SE Inhaber-Aktien o.N.")); - assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); - - // check buy sell transaction - BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.BUY)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.BUY)); - - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-07-15T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(47))); - assertThat(entry.getSource(), is("Umtausch02.txt")); - assertNull(entry.getNote()); + assertThat(results, hasItem(security( // + hasIsin("DE000A0D6554"), hasWkn(null), hasTicker(null), // + hasName("Nordex SE Inhaber-Aktien o.N."), // + hasCurrencyCode("EUR")))); - assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(648.90)))); - assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(643.90)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.00)))); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + inboundDelivery( // + hasDate("2021-07-20T00:00"), hasShares(47.00), // + hasSource("Umtausch02.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); } @Test @@ -3649,7 +3659,7 @@ public void testSparplan01() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2019-11-18T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.4534))); assertThat(entry.getSource(), is("Sparplan01.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Ausführung: ff2f-1254")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.00)))); @@ -3693,7 +3703,7 @@ public void testSparplan02() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-05-04T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(4.9261))); assertThat(entry.getSource(), is("Sparplan02.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Ausführung: xxxx-xxxx | Sparplan: xxxx-xxxx")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(100.00)))); @@ -3737,7 +3747,7 @@ public void testSparplan03() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-05-18T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(5.5520))); assertThat(entry.getSource(), is("Sparplan03.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Ausführung: 8eac-25ab | Sparplan: 77c8-1b0c")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(150.00)))); @@ -3781,7 +3791,7 @@ public void testSparplan04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-01-18T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(2.0028))); assertThat(entry.getSource(), is("Sparplan04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Ausführung: 3609-6874 | Sparplan: 98a0-1d15")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(1003.00)))); @@ -3825,7 +3835,7 @@ public void testSparplan05() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2022-04-19T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.0358))); assertThat(entry.getSource(), is("Sparplan05.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Ausführung: fc69-6fc3 | Sparplan: af97-c4b1")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(19.96)))); @@ -3863,7 +3873,7 @@ public void testSparplan06() assertThat(results, hasItem(purchase( // hasDate("2023-05-16T00:00"), hasShares(0.3367), // hasSource("Sparplan06.txt"), // - hasNote(null), // + hasNote("Execution: e083-506a | Savings plan: 7687-2574"), // hasAmount("EUR", 100.00), hasGrossValue("EUR", 100.00), // hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); } @@ -3894,7 +3904,7 @@ public void testSparplan07() assertThat(results, hasItem(purchase( // hasDate("2023-06-02T00:00"), hasShares(0.081967), // hasSource("Sparplan07.txt"), // - hasNote(null), // + hasNote("Execution: d008-0f58 | Savings plan: dbc9-ad4d"), // hasAmount("EUR", 25.00), hasGrossValue("EUR", 25.00), // hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); } @@ -3925,7 +3935,7 @@ public void testSparplan08() assertThat(results, hasItem(purchase( // hasDate("2023-06-02T00:00"), hasShares(0.336491), // hasSource("Sparplan08.txt"), // - hasNote(null), // + hasNote("Execution: 8c26-15e1 | Savings plan: 6af7-5be3"), // hasAmount("EUR", 25.00), hasGrossValue("EUR", 25.00), // hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); } @@ -3940,64 +3950,42 @@ public void testFusion01() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Fusion01.txt"), errors); assertThat(errors, empty()); + assertThat(countSecurities(results), is(2L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(2L)); assertThat(results.size(), is(4)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security - Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security1.getIsin(), is("US79466L3024")); - assertNull(security1.getWkn()); - assertNull(security1.getTickerSymbol()); - assertThat(security1.getName(), is("salesforce.com Inc. Registered Shares DL -,001")); - assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); - - Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security2.getIsin(), is("US83088V1026")); - assertThat(security2.getName(), is("Slack Technologies Inc. Registered Shs Cl.A o.N.")); - assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); - - // check buy sell transaction - BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); - - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-07-22T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(10))); - assertThat(entry.getSource(), is("Fusion01.txt")); - assertNull(entry.getNote()); - - assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(163.68)))); - assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(227.32)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(55.58 + 3.06 + 5.00)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - - // check delivery inbound (Einlieferung) transaction - PortfolioTransaction entry2 = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance) - .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + assertThat(results, hasItem(security( // + hasIsin("US83088V1026"), hasWkn(null), hasTicker(null), // + hasName("Slack Technologies Inc. Registered Shs Cl.A o.N."), // + hasCurrencyCode("EUR")))); - assertThat(entry2.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + assertThat(results, hasItem(security( // + hasIsin("US79466L3024"), hasWkn(null), hasTicker(null), // + hasName("salesforce.com Inc. Registered Shares DL -,001"), // + hasCurrencyCode("EUR")))); - assertThat(entry2.getDateTime(), is(LocalDateTime.parse("2021-07-27T00:00"))); - assertThat(entry2.getShares(), is(Values.Share.factorize(0.776))); - assertThat(entry2.getSource(), is("Fusion01.txt")); - assertNull(entry2.getNote()); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + outboundDelivery( // + hasDate("2021-07-27T00:00"), hasShares(10.00), // + hasSource("Fusion01.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); - assertThat(entry2.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry2.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry2.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry2.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + inboundDelivery( // + hasDate("2021-07-27T00:00"), hasShares(0.776), // + hasSource("Fusion01.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); } @Test @@ -4043,38 +4031,62 @@ public void testZwangsuebernahme01() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Zwangsuebernahme01.txt"), errors); assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); assertThat(results.size(), is(2)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security - Security security = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security.getIsin(), is("NO0010785967")); - assertNull(security.getWkn()); - assertNull(security.getTickerSymbol()); - assertThat(security.getName(), is("Quantafuel AS Navne-Aksjer NK -,01")); - assertThat(security.getCurrencyCode(), is(CurrencyUnit.EUR)); + assertThat(results, hasItem(security( // + hasIsin("NO0010785967"), hasWkn(null), hasTicker(null), // + hasName("Quantafuel AS Navne-Aksjer NK -,01"), // + hasCurrencyCode("NOK")))); // check buy sell transaction - BuySellEntry entry = (BuySellEntry) results.stream().filter(BuySellEntryItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSubject(); + assertThat(results, hasItem(sale( // + hasDate("2024-02-12T00:00"), hasShares(17.00), // + hasSource("Zwangsuebernahme01.txt"), // + hasNote(null), // + hasAmount("EUR", 9.54), hasGrossValue("EUR", 9.54), // + hasForexGrossValue("NOK", 108.47), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + } - assertThat(entry.getPortfolioTransaction().getType(), is(PortfolioTransaction.Type.SELL)); - assertThat(entry.getAccountTransaction().getType(), is(AccountTransaction.Type.SELL)); + @Test + public void testZwangsuebernahme01WithSecurityInEUR() + { + Security security = new Security("Quantafuel AS Navne-Aksjer NK -,01", CurrencyUnit.EUR); + security.setIsin("NO0010785967"); - assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2024-02-12T00:00"))); - assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(17.00))); - assertThat(entry.getSource(), is("Zwangsuebernahme01.txt")); - assertNull(entry.getNote()); + Client client = new Client(); + client.addSecurity(security); - assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.54)))); - assertThat(entry.getPortfolioTransaction().getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(9.54)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getPortfolioTransaction().getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + TradeRepublicPDFExtractor extractor = new TradeRepublicPDFExtractor(client); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Zwangsuebernahme01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(1)); + new AssertImportActions().check(results, CurrencyUnit.EUR); + + // check buy sell transaction + assertThat(results, hasItem(sale( // + hasDate("2024-02-12T00:00"), hasShares(17.00), // + hasSource("Zwangsuebernahme01.txt"), // + hasNote(null), // + hasAmount("EUR", 9.54), hasGrossValue("EUR", 9.54), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00), // + check(tx -> { + CheckCurrenciesAction c = new CheckCurrenciesAction(); + Status s = c.process((PortfolioTransaction) tx, new Portfolio()); + assertThat(s, is(Status.OK_STATUS)); + })))); } @Test @@ -4087,55 +4099,27 @@ public void testSteuerlicherUmtausch01() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "SteuerlicherUmtausch01.txt"), errors); assertThat(errors, empty()); - assertThat(results.size(), is(3)); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(2)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security - Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security1.getIsin(), is("FR0010754135")); - assertNull(security1.getWkn()); - assertNull(security1.getTickerSymbol()); - assertThat(security1.getName(), is("AMUN.GOV.BD EO BR.IG 1-3 U.ETF Actions au Porteur o.N.")); - assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); - - // check delivery outbound (Auslieferung) transaction - PortfolioTransaction entry = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance) - .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); - assertThat(entry.getDateTime(), is(LocalDateTime.parse("2023-12-07T00:00"))); - assertThat(entry.getShares(), is(Values.Share.factorize(50))); - assertThat(entry.getSource(), is("SteuerlicherUmtausch01.txt")); - assertNull(entry.getNote()); - - assertThat(entry.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - - // check transaction - AccountTransaction transaction = (AccountTransaction) results.stream().filter(TransactionItem.class::isInstance).skip(1) - .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(transaction.getType(), is(AccountTransaction.Type.TAXES)); - assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2023-12-01T00:00"))); - assertThat(transaction.getShares(), is(Values.Share.factorize(50))); - assertThat(transaction.getSource(), is("SteuerlicherUmtausch01.txt")); - assertNull(transaction.getNote()); + assertThat(results, hasItem(security( // + hasIsin("FR0010754135"), hasWkn(null), hasTicker(null), // + hasName("AMUN.GOV.BD EO BR.IG 1-3 U.ETF Actions au Porteur o.N."), // + hasCurrencyCode("EUR")))); - assertThat(transaction.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(23.07)))); - assertThat(transaction.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(23.07)))); - assertThat(transaction.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(transaction.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + outboundDelivery( // + hasDate("2023-12-07T00:00"), hasShares(50.00), // + hasSource("SteuerlicherUmtausch01.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); } @Test @@ -4148,36 +4132,27 @@ public void testSteuerlicherUmtausch02() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "SteuerlicherUmtausch02.txt"), errors); assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); assertThat(results.size(), is(2)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security - Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security1.getIsin(), is("LU1650487413")); - assertNull(security1.getWkn()); - assertNull(security1.getTickerSymbol()); - assertThat(security1.getName(), is("MUL-LYX.EO Gov.Bd 1-3Y(DR)U.E. Nam.-An. Acc o.N.")); - assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); - - // check delivery inbound transaction - PortfolioTransaction entry = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance) - .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); - assertThat(entry.getDateTime(), is(LocalDateTime.parse("2023-12-07T00:00"))); - assertThat(entry.getShares(), is(Values.Share.factorize(67.541))); - assertThat(entry.getSource(), is("SteuerlicherUmtausch02.txt")); - assertThat(entry.getNote(), is("Einstandskurs fehlt")); + assertThat(results, hasItem(security( // + hasIsin("LU1650487413"), hasWkn(null), hasTicker(null), // + hasName("MUL-LYX.EO Gov.Bd 1-3Y(DR)U.E. Nam.-An. Acc o.N."), // + hasCurrencyCode("EUR")))); - assertThat(entry.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + inboundDelivery( // + hasDate("2023-12-07T00:00"), hasShares(67.541), // + hasSource("SteuerlicherUmtausch02.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); } @Test @@ -4190,65 +4165,42 @@ public void testVergleichsverfahren01() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Vergleichsverfahren01.txt"), errors); assertThat(errors, empty()); + assertThat(countSecurities(results), is(2L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(2L)); assertThat(results.size(), is(4)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security - Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security1.getIsin(), is("GB00BH0P3Z91")); - assertNull(security1.getWkn()); - assertNull(security1.getTickerSymbol()); - assertThat(security1.getName(), is("BHP Group PLC Registered Shares DL -,50")); - assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); - - Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security2.getIsin(), is("AU000000BHP4")); - assertNull(security2.getWkn()); - assertNull(security2.getTickerSymbol()); - assertThat(security2.getName(), is("BHP Group Ltd. Registered Shares DL -,50")); - assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); - - // check delivery inbound (Einlieferung) transaction - PortfolioTransaction entry = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance) - .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); - - assertThat(entry.getDateTime(), is(LocalDateTime.parse("2022-01-27T00:00"))); - assertThat(entry.getShares(), is(Values.Share.factorize(8))); - assertThat(entry.getSource(), is("Vergleichsverfahren01.txt")); - assertNull(entry.getNote()); - - assertThat(entry.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - - // check delivery inbound (Einlieferung) transaction - entry = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance) - .skip(1).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + assertThat(results, hasItem(security( // + hasIsin("GB00BH0P3Z91"), hasWkn(null), hasTicker(null), // + hasName("BHP Group PLC Registered Shares DL -,50"), // + hasCurrencyCode("EUR")))); - assertThat(entry.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + assertThat(results, hasItem(security( // + hasIsin("AU000000BHP4"), hasWkn(null), hasTicker(null), // + hasName("BHP Group Ltd. Registered Shares DL -,50"), // + hasCurrencyCode("EUR")))); - assertThat(entry.getDateTime(), is(LocalDateTime.parse("2022-01-27T00:00"))); - assertThat(entry.getShares(), is(Values.Share.factorize(8))); - assertThat(entry.getSource(), is("Vergleichsverfahren01.txt")); - assertNull(entry.getNote()); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + outboundDelivery( // + hasDate("2022-01-27T00:00"), hasShares(8.00), // + hasSource("Vergleichsverfahren01.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); - assertThat(entry.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + inboundDelivery( // + hasDate("2022-01-27T00:00"), hasShares(8.00), // + hasSource("Vergleichsverfahren01.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); } @Test @@ -4261,65 +4213,42 @@ public void testTitelumtausch01() List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Titelumtausch01.txt"), errors); assertThat(errors, empty()); + assertThat(countSecurities(results), is(2L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(2L)); assertThat(results.size(), is(4)); new AssertImportActions().check(results, CurrencyUnit.EUR); // check security - Security security1 = results.stream().filter(SecurityItem.class::isInstance).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security1.getIsin(), is("GB00B03MLX29")); - assertNull(security1.getWkn()); - assertNull(security1.getTickerSymbol()); - assertThat(security1.getName(), is("Shell PLC Reg. Shares Class A EO -,07")); - assertThat(security1.getCurrencyCode(), is(CurrencyUnit.EUR)); - - Security security2 = results.stream().filter(SecurityItem.class::isInstance).skip(1).findFirst() - .orElseThrow(IllegalArgumentException::new).getSecurity(); - assertThat(security2.getIsin(), is("GB00BP6MXD84")); - assertNull(security2.getWkn()); - assertNull(security2.getTickerSymbol()); - assertThat(security2.getName(), is("Shell PLC Reg. Shares Class EO -,07")); - assertThat(security2.getCurrencyCode(), is(CurrencyUnit.EUR)); - - // check delivery inbound (Einlieferung) transaction - PortfolioTransaction entry = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance) - .findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); - - assertThat(entry.getType(), is(PortfolioTransaction.Type.DELIVERY_OUTBOUND)); - - assertThat(entry.getDateTime(), is(LocalDateTime.parse("2022-02-01T00:00"))); - assertThat(entry.getShares(), is(Values.Share.factorize(25))); - assertThat(entry.getSource(), is("Titelumtausch01.txt")); - assertNull(entry.getNote()); - - assertThat(entry.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - - // check delivery inbound (Einlieferung) transaction - entry = (PortfolioTransaction) results.stream().filter(TransactionItem.class::isInstance) - .skip(1).findFirst().orElseThrow(IllegalArgumentException::new).getSubject(); + assertThat(results, hasItem(security( // + hasIsin("GB00B03MLX29"), hasWkn(null), hasTicker(null), // + hasName("Shell PLC Reg. Shares Class A EO -,07"), // + hasCurrencyCode("EUR")))); - assertThat(entry.getType(), is(PortfolioTransaction.Type.DELIVERY_INBOUND)); + assertThat(results, hasItem(security( // + hasIsin("GB00BP6MXD84"), hasWkn(null), hasTicker(null), // + hasName("Shell PLC Reg. Shares Class EO -,07"), // + hasCurrencyCode("EUR")))); - assertThat(entry.getDateTime(), is(LocalDateTime.parse("2022-02-01T00:00"))); - assertThat(entry.getShares(), is(Values.Share.factorize(25))); - assertThat(entry.getSource(), is("Titelumtausch01.txt")); - assertNull(entry.getNote()); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + outboundDelivery( // + hasDate("2022-02-01T00:00"), hasShares(25.00), // + hasSource("Titelumtausch01.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); - assertThat(entry.getMonetaryAmount(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getGrossValue(), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.TAX), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); - assertThat(entry.getUnitSum(Unit.Type.FEE), - is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(0.00)))); + // check unsupported transaction + assertThat(results, hasItem(withFailureMessage( // + Messages.MsgErrorTransactionTypeNotSupported, // + inboundDelivery( // + hasDate("2022-02-01T00:00"), hasShares(25.00), // + hasSource("Titelumtausch01.txt"), // + hasNote(null), // + hasAmount("EUR", 0.00), hasGrossValue("EUR", 0.00), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00))))); } @Test diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/ubsag/UBSAGPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/ubsag/UBSAGPDFExtractorTest.java index d7168bc0ae..5c21873dfd 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/ubsag/UBSAGPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/ubsag/UBSAGPDFExtractorTest.java @@ -185,7 +185,7 @@ public void testWertpapierKauf02() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-27T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(15))); assertThat(entry.getSource(), is("Kauf02.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftrags-Nr. 90586827")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of("CHF", Values.Amount.factorize(2213.15)))); @@ -229,7 +229,7 @@ public void testWertpapierKauf03() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-26T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(100))); assertThat(entry.getSource(), is("Kauf03.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftrags-Nr. 90586823")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of("CHF", Values.Amount.factorize(3881.75)))); @@ -275,7 +275,7 @@ public void testWertpapierKauf03WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2017-12-26T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(100))); assertThat(entry.getSource(), is("Kauf03.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftrags-Nr. 90586823")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of("CHF", Values.Amount.factorize(3881.75)))); @@ -425,7 +425,7 @@ public void testWertpapierVerkauf02() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-12-23T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(10))); assertThat(entry.getSource(), is("Verkauf02.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftrags-Nr. 155032892")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of("CHF", Values.Amount.factorize(3720.18)))); @@ -469,7 +469,7 @@ public void testWertpapierVerkauf03() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-08-19T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(39))); assertThat(entry.getSource(), is("Verkauf03.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftrags-Nr. 149557039")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of("CHF", Values.Amount.factorize(1883.08)))); @@ -516,7 +516,7 @@ public void testWertpapierVerkauf03WithSecurityInUSD() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-08-19T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(39))); assertThat(entry.getSource(), is("Verkauf03.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftrags-Nr. 149557039")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of("CHF", Values.Amount.factorize(1883.08)))); @@ -570,7 +570,7 @@ public void testWertpapierVerkauf04() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-05-10T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(1))); assertThat(entry.getSource(), is("Verkauf04.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftrags-Nr. 6820800")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of("CHF", Values.Amount.factorize(36.90)))); @@ -614,7 +614,7 @@ public void testWertpapierVerkauf05() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2021-04-12T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(73))); assertThat(entry.getSource(), is("Verkauf05.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftrags-Nr. 8583497")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of("CHF", Values.Amount.factorize(8030.00)))); @@ -658,7 +658,7 @@ public void testWertpapierVerkauf06() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-01-04T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.167))); assertThat(entry.getSource(), is("Verkauf06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftrags-Nr. 6615705")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of("CHF", Values.Amount.factorize(2.63)))); @@ -705,7 +705,7 @@ public void testWertpapierVerkauf06WithSecurityInCHF() assertThat(entry.getPortfolioTransaction().getDateTime(), is(LocalDateTime.parse("2020-01-04T00:00"))); assertThat(entry.getPortfolioTransaction().getShares(), is(Values.Share.factorize(0.167))); assertThat(entry.getSource(), is("Verkauf06.txt")); - assertNull(entry.getNote()); + assertThat(entry.getNote(), is("Auftrags-Nr. 6615705")); assertThat(entry.getPortfolioTransaction().getMonetaryAmount(), is(Money.of("CHF", Values.Amount.factorize(2.63)))); @@ -754,7 +754,7 @@ public void testDividende01() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-12-28T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(20))); assertThat(transaction.getSource(), is("Dividende01.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Auftrags-Nr. 3256654")); assertThat(transaction.getMonetaryAmount(), is(Money.of("CHF", Values.Amount.factorize(3.85)))); @@ -799,7 +799,7 @@ public void testDividende01WithSecurityInCHF() assertThat(transaction.getDateTime(), is(LocalDateTime.parse("2021-12-28T00:00"))); assertThat(transaction.getShares(), is(Values.Share.factorize(20))); assertThat(transaction.getSource(), is("Dividende01.txt")); - assertNull(transaction.getNote()); + assertThat(transaction.getNote(), is("Auftrags-Nr. 3256654")); assertThat(transaction.getMonetaryAmount(), is(Money.of("CHF", Values.Amount.factorize(3.85)))); @@ -843,10 +843,10 @@ public void testDividende02() assertThat(results, hasItem(dividend( // hasDate("2023-12-20T00:00"), hasShares(546), // hasSource("Dividende02.txt"), // - hasNote(null), // - hasAmount("CHF", 155.64), hasGrossValue("CHF", 158.26), // - hasForexGrossValue("EUR", 170.44), // - hasTaxes("CHF", 0.00), hasFees("CHF", 2.62)))); + hasNote("Auftrags-Nr. 4083256 | FX-Marge: 2.62 CHF"), // + hasAmount("CHF", 155.64), hasGrossValue("CHF", 155.64), // + hasForexGrossValue("EUR", 167.62), // + hasTaxes("CHF", 0.00), hasFees("CHF", 0.00)))); } @Test @@ -877,9 +877,9 @@ public void testDividende02WithSecurityInCHF() assertThat(results, hasItem(dividend( // hasDate("2023-12-20T00:00"), hasShares(546), // hasSource("Dividende02.txt"), // - hasNote(null), // - hasAmount("CHF", 155.64), hasGrossValue("CHF", 158.26), // - hasTaxes("CHF", 0.00), hasFees("CHF", 2.62), // + hasNote("Auftrags-Nr. 4083256 | FX-Marge: 2.62 CHF"), // + hasAmount("CHF", 155.64), hasGrossValue("CHF", 155.64), // + hasTaxes("CHF", 0.00), hasFees("CHF", 0.00), // check(tx -> { CheckCurrenciesAction c = new CheckCurrenciesAction(); Account account = new Account(); @@ -890,7 +890,7 @@ public void testDividende02WithSecurityInCHF() } @Test - public void testaddDepotAccountFee01() + public void testDepotAccountFee01() { UBSAGBankingAGPDFExtractor extractor = new UBSAGBankingAGPDFExtractor(new Client()); diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Dividende01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Dividende01.txt new file mode 100644 index 0000000000..5b9bf64e21 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Dividende01.txt @@ -0,0 +1,45 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.3 +----------------------------------------- +Kontakt Topbank +Telefon 0844 850 820 +E-Mail topberater@topbank.ch +Adresse Bahnhofstrasse 9 +8001 Zürich +Briefadresse Postfach, 8010 Zürich +Clearing-Nr. 700 +BIC (SWIFT) ZKBKCHZZ80A +UID CHE-116.320.184 MWST +Konto-Nr. 11bb-7112.9c1 +IBAN CH14 0070 011b b71 129c 1 +Produkt ZKB Beratungskonto +Lautend auf Muster Peter +Depot-Nr. aaa-123456 +Produkt ZKB Wertschriftendepot +Lautend auf Muster Peter +Zürich, 19. Januar 2024 +Ertragsabrechnung (Eingang vorbehalten) +Abwicklungs-Nr. 744484581 / Buchungstag 19.01.2024 +Stück 2'000 Registered Shs Babcock International Group PLC +Valor 1142141 / ISIN GB0009697037 +Dividendensatz GBP 0.017 +Ex-Tag 23.11.2023 +Zahlbar 19.01.2024 +GBP +Bruttobetrag 34.00 +Total 34.00 +zum Kurs von GBP/CHF 1.09551 CHF +Total zu Ihren Gunsten Valuta 19.01.2024 37.25 +Freundliche Grüsse +Zürcher Kantonalbank +Ohne manuelle Ergänzung +gültig ohne Unterschrift +ANAMHKENFKCNFPAJGKAIDNAPENBJGNGNEKEK +AJCJFIGDAKKPNDLPFKAIJKKMIIFOMMGPHCLK +AMJPMBPEIKEHIMIGLKAGIDJBLNJGLDKEIAOK OY4005 1.266.211-4 18359 +ACJAMNCGGDEIHNHABKAAOAADFGPHDADDDJHK +ALJKJDAKICIKBLICBKALIDBCJCALIDADADBK 202401190001290839114237365002 - Zürcher Kantonalbank +ACAJOCMECBBCMMNDPKAGLLGNBLPOCNCAPBHK +ACLMMMFEOFEICILOPKABDDAIHMKPFAJEONIK +AGPHJFLKLPCFLAKOJKAOHAMNICFCPCFEFHNK 12159403316 1/1 +AIKAACIGOAKEKEMIOKAMMMIMCKKIAGKKEMGK \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Dividende02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Dividende02.txt new file mode 100644 index 0000000000..49972e2dc9 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Dividende02.txt @@ -0,0 +1,53 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.3 +----------------------------------------- +Kontakt Topbank +Telefon 0844 850 820 +E-Mail topberater@topbank.ch +Adresse Bahnhofstrasse 9 +8001 Zürich +Briefadresse Postfach, 8010 Zürich +Clearing-Nr. 700 +BIC (SWIFT) ZKBKCHZZ80A +UID CHE-116.320.184 MWST +Postkonto 80-151-4 +Konto-Nr. 11bb-7112.9c1 +IBAN CH14 0070 011b b71 129c 1 +Produkt ZKB Beratungskonto +Lautend auf Muster Peter +Depot-Nr. aaa-123456 +Produkt ZKB Wertschriftendepot +Lautend auf Muster Peter +Zürich, 4. Januar 2023 +Ertragsabrechnung (Eingang vorbehalten) +Abwicklungs-Nr. 680426625 / Buchungstag 04.01.2023 +Stück 200 Shs J.P. Morgan Exchange-Traded Fund Trust JPMorgan Equity Premium +Income Fund +Valor 52708803 / ISIN US46641Q3323 +Dividendensatz USD 0.57292 +Ex-Tag 29.12.2022 +Zahlbar 04.01.2023 +USD +Bruttobetrag 114.58 +15% Zusätzlicher Steuerrückbehalt 17.19 +15% Quellensteuer 17.19 +Total 80.20 +zum Kurs von USD/CHF 0.922785 CHF +Total zu Ihren Gunsten Valuta 04.01.2023 74.01 +Steuerrelevante Informationen Rückforderbarer zusätzlicher CHF 15.86 +Steuerückbehalt USA +zum Kurs vom USD / CHF 0.922785 +Die Abrechnung dient der Geltendmachung von Verrechnungs- und Rückforderungsansprüchen. +Freundliche Grüsse +Zürcher Kantonalbank +Ohne manuelle Ergänzung +gültig ohne Unterschrift +ANAMHKENFKCNFPAJGKAICPELEJFJGNGNEKEK +AJCJFIGDAKKPNANMFKAIPEMMAIFOMMHOGBLK +AMJPMBPEIKMHLPJGJKAOIDJBLNJCMNOCKEOK OY4005 +ADIAONCGGDEIPFPABKAAOAADFGOHLBNPPIHK +ADBKJDAKICIKBLICBKALIDBCILIKJCADILAK 202301040001290533095918865002 - Zürcher Kantonalbank +ACAJOCMECBBCMMNDPKAGIJIIEPBBEAKDKBHK +ACLMMMFEOFEICIJOAKAIJILKDFPOGOFHHBIK +AGPHJFLKLPCHAMBHOKAEOCDNNMLPIKFNDPFK 12142020222 1/1 +AIKAACIGGAEECAAAKKAEOEIAKOAACOCGAIGK \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Dividende03.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Dividende03.txt new file mode 100644 index 0000000000..80637c8672 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Dividende03.txt @@ -0,0 +1,50 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.3 +----------------------------------------- +Kontakt Topbank +Telefon 0844 850 820 +E-Mail topberater@topbank.ch +Adresse Bahnhofstrasse 9 +8001 Zürich +Briefadresse Postfach, 8010 Zürich +Clearing-Nr. 700 +BIC (SWIFT) ZKBKCHZZ80A +UID CHE-116.320.184 MWST +Konto-Nr. 2701-7658.a02 +IBAN CH07 0073 01G0 00H4 7610 5 +Produkt ZKB Beratungskonto +Lautend auf Muster Peter +Depot-Nr. aaa-123456 +Produkt ZKB Wertschriftendepot +Lautend auf Muster Peter +Zürich, 6. Februar 2024 +Ertragsabrechnung (Eingang vorbehalten) +Abwicklungs-Nr. 759703889 / Buchungstag 06.02.2024 +Stück 200 Shs J.P. Morgan Exchange-Traded Fund Trust JPMorgan Equity Premium +Income Fund +Valor 52708803 / ISIN US46641Q3323 +Dividendensatz USD 0.30061 +Ex-Tag 01.02.2024 +Zahlbar 06.02.2024 +USD +Bruttobetrag 60.12 +15% Zusätzlicher Steuerrückbehalt 9.02 +15% Quellensteuer 9.02 +Total zu Ihren Gunsten Valuta 06.02.2024 42.08 +Steuerrelevante Informationen Rückforderbarer zusätzlicher CHF 7.72 +Steuerückbehalt USA +zum Kurs vom USD / CHF 0.855575 +Die Abrechnung dient der Geltendmachung von Verrechnungs- und Rückforderungsansprüchen. +Freundliche Grüsse +Zürcher Kantonalbank +Ohne manuelle Ergänzung +gültig ohne Unterschrift +ANAMHKENFKCNFPAJGKAJDNELFNBJGNGNEKEK +AJCJFIGDAKKPNANMFKAMPEEEIIFOMMGJDCLK +AMJPMBPEIKEHIMKEDKAOADJBLNJCJOAMNGMK OY4005 1.266.211-4 18359 +ACJAOFKGGDGKBFHABKAAOAADFGOHCFNAKLHK +ALBKJDAKICIKBLICBKALIDBCALJKAKADIDJK 202402060001290525012965595002 - Zürcher Kantonalbank +ACAJOCMECBBCMMNDPKAGLINNKILJEPPEAJHK +ACLMMMFEOFEICILNMKAAGGNDLIJBDCCILFIK +AGPHJFLKLPDFMFOBCKAEPEIHLBNDFDFMEHFK 12160717469 1/1 +AIKAACIGOGAEKEIMEKAIMEIEOOOCKGCOEIGK \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Kauf01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Kauf01.txt new file mode 100644 index 0000000000..50ee147b70 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Kauf01.txt @@ -0,0 +1,48 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.3 +----------------------------------------- +Kontakt Peter Muster +Telefon 044 265 67 72 +E-Mail peter.muster@zkb.ch +Adresse Bahnhofstr. 9 +8001 Zürich +Briefadresse Postfach, 8010 Zürich +Clearing-Nr. 700 +BIC (SWIFT) ZKBKCHZZ80A +Postkonto 80-151-4 +Geschäfts-Nr. 000-264064 +Produkt ZKB Wertschriftendepot +Lautend auf Max und Moritz +Konto-Nr. 4711 +IBAN CH12 1346 7890 1234 5678 9 +Produkt ZKB Beratungskonto +Lautend auf Max und Moritz +Zürich, 4. Oktober 2021 +Effektenabrechnung +Ihr Kauf +Abschluss per: 04.10.2021 / Buchungstag: 04.10.2021 / Börsenplatz: LSE UK 1 CUR +Abwicklungs-Nr. 592473551 / Auftrags-Nr. ONBA-0005128022772021 +Registered Shs Glencore PLC +Valor 12964057 / ISIN JE00B4T3BW64 +Stück GBP GBP +1'000 zu 3.545 3'545.00 +Fremde Kommission 0.71 +Eidg. Abgaben 5.31 +Total 3'551.02 +zum Kurs von GBP CHF 1.258775 CHF +Total zu Ihren Lasten Valuta 06.10.2021 4'469.94 +Abschlüsse mit Zeitangaben in Klammer +460 zu 3.545 (17:26; BATE; 211004B250750283), 540 zu 3.545 (17:26; XLON; 211004B250750783) +Freundliche Grüsse +Zürcher Kantonalbank +Ohne manuelle Ergänzung +gültig ohne Unterschrift +ANAMHKENFKCJFLAJGKAJCNAPGJFJGNGNEKEK +AJCJFIGDAKLPNAMMFKAMJIKMAIFOMNGOADLK +AMJPMBNGCCMHLLJEPKAGIDJBLNJHKDBDFEIK OY2015 +ADIAONKGGDGIPNPABKAAOAADFGPFHDHHCJHK +ADBKJDAKICIKBLICBKALIDBCALALBLJCJKBK 202110040001291727155431625001 - Zürcher Kantonalbank +ACAJPCMECBBCMMNDPKAGKJAIELFMBJJELJPK +ACDEEMFEOFEICIKNAKAOLELCMJBAMBKDBBIK +AGPHJFLKLPDEEJKOKKAKLEBFGDAKIEDKGPNK 12121789301 1/1 +AIKAACIGGGEECGEEKKAEEMAMKOMKKOCOMMGK \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Kauf02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Kauf02.txt new file mode 100644 index 0000000000..926cdba66a --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Kauf02.txt @@ -0,0 +1,48 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.3 +----------------------------------------- +Kontakt Topbank +Telefon 0844 850 820 +E-Mail topberater@topbank.ch +Adresse Bahnhofstrasse 9 +8001 Zürich +Briefadresse Postfach, 8010 Zürich +Clearing-Nr. 700 +BIC (SWIFT) ZKBKCHZZ80A +Geschäfts-Nr. +Produkt ZKB Wertschriftendepot +Lautend auf Muster Peter +Konto-Nr. 2701-7658.a02 +IBAN CH07 0073 01G0 00H4 7610 5 +Produkt ZKB Beratungskonto +Lautend auf Muster Peter +Zürich, 29. Juni 2023 +Effektenabrechnung +Ihr Kauf +Abschluss per: 29.06.2023 / Buchungstag: 29.06.2023 / Börsenplatz: LSE UK 1 CUR +Abwicklungs-Nr. 715281248 / Auftrags-Nr. ONBA-0005066961792023 +Registered Shs Babcock International Group PLC +Valor 1142141 / ISIN GB0009697037 +Stück GBP GBP +2'000 zu 2.95 5'900.00 +Fremde Kommission 4.20 +Eidg. Abgaben 8.85 +UK Stamp Tax 29.50 +Total 5'942.55 +zum Kurs von GBP USD 1.264615 USD +Total zu Ihren Lasten Valuta 03.07.2023 7'515.04 +Abschlüsse mit Zeitangaben in Klammer +2'000 zu 2.95 (09:54; XLON; 230629BU-0016768733) +Freundliche Grüsse +Zürcher Kantonalbank +Ohne manuelle Ergänzung +gültig ohne Unterschrift +ANAMHKENFKCJFLAJGKAJDNELELFJGNGNEKEK +AJCJFIGDAKKPNDLOBKAIJIIEAIFOMNHJDDLK +AMJPMBPEIKMHIMKGLKAGIDJBLNJHLNKLHIIK OY2015E0SH 1.266.211-4 18356 +ACLCCFKGGDEINFHABKAAOAADFGOHNOCNAKHK +ALJKJDAKICIKBLICBKALIDBCIKBCJKJDBLBK 202306290001290955077533175001 - Zürcher Kantonalbank +ACAJPCMECBBCMMNDPKAGJIDHHBBKFBALLBHK +ACDEEMFEOFEICIJMNKAANBGGIMBLLDODKEJK +AGPHJFLKLPBHIALCDKANAPGNHNCKNNOHDHNK 12149593101 1/1 +AIKAACIGGMAECCIAAKAACMAEOOEMAGCCEMGK \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Kauf03.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Kauf03.txt new file mode 100644 index 0000000000..0d1b49142e --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Kauf03.txt @@ -0,0 +1,46 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.3 +----------------------------------------- +Kontakt Topbank +Telefon 0844 850 820 +E-Mail topberater@topbank.ch +Adresse Bahnhofstrasse 9 +8001 Zürich +Briefadresse Postfach, 8010 Zürich +Clearing-Nr. 700 +BIC (SWIFT) ZKBKCHZZ80A +Postkonto 80-151-4 +Geschäfts-Nr. aaa-123456 +Produkt ZKB Wertschriftendepot +Lautend auf Muster Peter +Konto-Nr. 11bb-7112.9c1 +IBAN CH14 0070 011b b71 129c 1 +Produkt ZKB Beratungskonto +Lautend auf Muster Peter +Zürich, 8. Juni 2022 +Effektenabrechnung +Ihr Kauf +Abschluss per: 08.06.2022 / Buchungstag: 08.06.2022 / Börsenplatz: SIX SX +Abwicklungs-Nr. 640981320 / Auftrags-Nr. ONBA-0005082331592022 +Namen-Akt Holcim AG +Valor 1221405 / ISIN CH0012214059 +Stück CHF CHF +150 zu 48.5822 7'287.33 +Eidg. Abgaben 5.47 +Ausführungsgebühr 1.50 +Total zu Ihren Lasten Valuta 10.06.2022 7'294.30 +Abschlüsse mit Zeitangaben in Klammer +117 zu 48.58 (11:49; XSWX; 035B40DQIMF025ET), 33 zu 48.59 (11:49; XSWX; 035B40DQIMF025EU) +Freundliche Grüsse +Zürcher Kantonalbank +Ohne manuelle Ergänzung +gültig ohne Unterschrift +ANAMHKENFKCJFLAJGKAIDJELGLHJGNGNEKEK +AJCJFIGDAKLPNBNMBKAMPEMMAIFOMMGMHBLK +AMJPMBPEACEHLLJGBKAOIDJBLNJHLHEHKAIK OY2015 +ACJAGFKGGDGIPNPABKAAOAADFGMFLFOPFLHK +ADBKJDAKICIKBLICBKALIDBCJCALILICJCIK 202206080001291149425958625002 - Zürcher Kantonalbank +ACAJOCMECBBCMMNDPKAGLILPKEDCIKIMFJPK +ACLMMMFEOFEICIJNNKAGCHPGKHBMKFKFKMIK +AGPHJFLKLPAFDBBLBKANBIOPNOAPHCCIOHFK 12133296256 1/1 +AIKAACIGCCMMKKMMOKAEKEIMGGCCIOCCEMGK \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Kauf04.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Kauf04.txt new file mode 100644 index 0000000000..357fca5f80 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Kauf04.txt @@ -0,0 +1,49 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.3 +----------------------------------------- +Kontakt Topbank +Telefon 0844 850 820 +E-Mail topberater@topbank.ch +Adresse Bahnhofstrasse 9 +8001 Zürich +Briefadresse Postfach, 8010 Zürich +Clearing-Nr. 700 +BIC (SWIFT) ZKBKCHZZ80A +Postkonto 80-151-4 +Geschäfts-Nr. aaa-123456 +Produkt ZKB Wertschriftendepot +Lautend auf Muster Peter +Konto-Nr. 11bb-7112.9c1 +IBAN CH14 0070 011b b71 129c 1 +Produkt ZKB Beratungskonto +Lautend auf Muster Peter +Zürich, 28. März 2022 +Effektenabrechnung +Ihr Kauf +Abschluss per: 28.03.2022 / Buchungstag: 28.03.2022 / Börsenplatz: Euronext Par +Abwicklungs-Nr. 626674106 / Auftrags-Nr. ONBA-0005089660872022 +Act Kering SA +Valor 21591 / ISIN FR0000121485 +Stück EUR EUR +10 zu 589.10 5'891.00 +Fremde Kommission 4.50 +Eidg. Abgaben 8.84 +0.3% Finanztransaktionssteuer Frankreich 17.67 +Total 5'922.01 +zum Kurs von EUR CHF 1.0264 CHF +Total zu Ihren Lasten Valuta 30.03.2022 6'078.35 +Abschlüsse mit Zeitangaben in Klammer +10 zu 589.10 (16:55; XPAR; 220328B527905283) +Freundliche Grüsse +Zürcher Kantonalbank +Ohne manuelle Ergänzung +gültig ohne Unterschrift +ANAMHKENFKCJFLAJGKAJCIELHLFJGNGNEKEK +AJCJFIGDAKLPNAMNBKAIPEGEAIFOMNGIFCLK +AMJPMBPEACEHIIKELKAGADJBLNJFOJEKGMIK OY2015 +ACLCKFCGGDGKFNHABKAAOAADFGPHCPGKBLHK +ADBKJDAKICIKBLICBKALIDBCBCJCICBKIKJK 202203280001291658433845315002 - Zürcher Kantonalbank +ACAJOCMECBBCMMNDPKAGJLOMFOGFNCMPIJHK +ACLMMMFEOFEICILPDKAPEGELGAAEACIGLAIK +AGPHJFLKLPCHDIJIGKABFMNAPBHIPCAGFPNK 12129631004 1/1 +AIKAACIGCOAEKGEECKAMAEIEOCOGIOCKIIGK \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Verkauf01.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Verkauf01.txt new file mode 100644 index 0000000000..27b37c5267 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Verkauf01.txt @@ -0,0 +1,46 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.3 +----------------------------------------- +Kontakt Topbank +Telefon 0844 850 820 +E-Mail topberater@topbank.ch +Adresse Bahnhofstrasse 9 +8001 Zürich +Briefadresse Postfach, 8010 Zürich +Clearing-Nr. 700 +BIC (SWIFT) ZKBKCHZZ80A +Postkonto 80-151-4 +Geschäfts-Nr. aaa-123456 +Produkt ZKB Wertschriftendepot +Lautend auf Muster Peter +Konto-Nr. 11bb-7112.9c1 +IBAN CH14 0070 011b b71 129c 1 +Produkt ZKB Beratungskonto +Lautend auf Muster Peter +Zürich, 24. Februar 2023 +Effektenabrechnung +Ihr Verkauf +Abschluss per: 24.02.2023 / Buchungstag: 24.02.2023 / Börsenplatz: MULTMKT +Abwicklungs-Nr. 691980481 / Auftrags-Nr. ONBA-0005093310552023 +Namen-Akt Holcim AG +Valor 1221405 / ISIN CH0012214059 +Stück CHF CHF +150 zu 56.80 8'520.00 +Eidg. Abgaben 6.39 +Ausführungsgebühr 1.50 +Total zu Ihren Gunsten Valuta 28.02.2023 8'512.11 +Abschlüsse mit Zeitangaben in Klammer +150 zu 56.80 (14:30; BATP; 1007532783) +Freundliche Grüsse +Zürcher Kantonalbank +Ohne manuelle Ergänzung +gültig ohne Unterschrift +ANAMHKENFKCJFLAJGKAJCOALELFJGNGNEKEK +AJCJFIGDAKKPNANNFKAIPGGMIIFOMNGKADLK +AMJPMBPEIKMHLLJENKAOIDJBLNJDJNJIAMOK OY2015 +ADKCKFKGGDEINFHABKAAOAADFGOHMGIHFLHK +ADBKJDAKICIKBLICBKALIDBCJDBCALJDJCBK 202302240001291430278612975002 - Zürcher Kantonalbank +ACAJOCMECBBCMMNDPKAGIKKMLGMIJCBKPJHK +ACLMMMFEOFEICIKONKALKAGBNKLIDHGPHGIK +AGPHJFLKLPCFMDIDNKABLILBIDBHAOPCBPFK 12144518039 1/1 +AIKAACIGICGEKKMIOKAAGEIEGOOIGGCKIAGK \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Verkauf02.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Verkauf02.txt new file mode 100644 index 0000000000..4f9f411953 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/Verkauf02.txt @@ -0,0 +1,48 @@ +PDFBox Version: 1.8.17 +Portfolio Performance Version: 0.68.3 +----------------------------------------- +Kontakt Topbank +Telefon 0844 850 820 +E-Mail topberater@topbank.ch +Adresse Bahnhofstrasse 9 +8001 Zürich +Briefadresse Postfach, 8010 Zürich +Clearing-Nr. 700 +BIC (SWIFT) ZKBKCHZZ80A +Postkonto 80-151-4 +Geschäfts-Nr. aaa-123456 +Produkt ZKB Wertschriftendepot +Lautend auf Muster Peter +Konto-Nr. 11bb-7112.9c1 +IBAN CH14 0070 011b b71 129c 1 +Produkt ZKB Beratungskonto +Lautend auf Muster Peter +Zürich, 17. Februar 2023 +Effektenabrechnung +Ihr Verkauf +Abschluss per: 17.02.2023 / Buchungstag: 17.02.2023 / Börsenplatz: Euronext Par +Abwicklungs-Nr. 690706592 / Auftrags-Nr. ONBA-0005146670482023 +Act Kering SA +Valor 21591 / ISIN FR0000121485 +Stück EUR EUR +10 zu 590.00 5'900.00 +Fremde Kommission 4.50 +Eidg. Abgaben 8.85 +Total 5'886.65 +zum Kurs von EUR CHF 0.9907 CHF +Total zu Ihren Gunsten Valuta 21.02.2023 5'831.90 +Abschlüsse mit Zeitangaben in Klammer +10 zu 590.00 (10:43; XPAR; 230217A996527183) +Freundliche Grüsse +Zürcher Kantonalbank +Ohne manuelle Ergänzung +gültig ohne Unterschrift +ANAMHKENFKCJFLAJGKAJCNALELHJGNGNEKEK +AJCJFIGDAKKPNBNNBKAMPEMMAIFOMMHLGDLK +AMJPMBPEIKMHIIIGJKAOIDJBLNJDOHOLGGKK OY2015 +ACJAMFKGGDGIFFPABKAAOAADFGMGPDJLOJHK +ADJKJDAKICIKBLICBKALIDBCIDALBKBLBCJK 202302170001291047265918435002 - Zürcher Kantonalbank +ACAJOCMECBBCMMNDPKAGLJJHMJIJEBJMMBPK +ACLMMMFEOFEICIIPEKAJLIJICJMDFMCNCNJK +AGPHJFLKLPAEHOIDFKANMLMFHFMDJGGDHHFK 12144257965 1/1 +AIKAACIGGCAMKOIMCKAEIEIMKGCAGOKKMMGK \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/ZuercherKantonalbankPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/ZuercherKantonalbankPDFExtractorTest.java new file mode 100644 index 0000000000..3334865292 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/zuercherkantonalbank/ZuercherKantonalbankPDFExtractorTest.java @@ -0,0 +1,601 @@ +package name.abuchen.portfolio.datatransfer.pdf.zuercherkantonalbank; + +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.check; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.dividend; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasAmount; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasCurrencyCode; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasDate; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasFees; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasForexGrossValue; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasGrossValue; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasIsin; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasName; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasNote; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasShares; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasSource; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTaxes; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasTicker; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.hasWkn; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.purchase; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.sale; +import static name.abuchen.portfolio.datatransfer.ExtractorMatchers.security; +import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countAccountTransactions; +import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countBuySell; +import static name.abuchen.portfolio.datatransfer.ExtractorTestUtilities.countSecurities; +import static org.hamcrest.CoreMatchers.hasItem; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsEmptyCollection.empty; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.Test; + +import name.abuchen.portfolio.datatransfer.Extractor.Item; +import name.abuchen.portfolio.datatransfer.ImportAction.Status; +import name.abuchen.portfolio.datatransfer.actions.AssertImportActions; +import name.abuchen.portfolio.datatransfer.actions.CheckCurrenciesAction; +import name.abuchen.portfolio.datatransfer.pdf.PDFInputFile; +import name.abuchen.portfolio.datatransfer.pdf.ZuercherKantonalbankPDFExtractor; +import name.abuchen.portfolio.model.Account; +import name.abuchen.portfolio.model.AccountTransaction; +import name.abuchen.portfolio.model.Client; +import name.abuchen.portfolio.model.Portfolio; +import name.abuchen.portfolio.model.PortfolioTransaction; +import name.abuchen.portfolio.model.Security; + +@SuppressWarnings("nls") +public class ZuercherKantonalbankPDFExtractorTest +{ + @Test + public void testWertpapierKauf01() + { + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, "CHF"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("JE00B4T3BW64"), hasWkn("12964057"), hasTicker(null), // + hasName("Registered Shs Glencore PLC"), // + hasCurrencyCode("GBP")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2021-10-04T00:00"), hasShares(1000), // + hasSource("Kauf01.txt"), // + hasNote("Abwicklungs-Nr. 592473551 | Auftrags-Nr. ONBA-0005128022772021"), // + hasAmount("CHF", 4469.94), hasGrossValue("CHF", 4462.37), // + hasForexGrossValue("GBP", 3545.00), // + hasTaxes("CHF", 6.68), hasFees("CHF", 0.89)))); + } + + @Test + public void testWertpapierKauf01WithSecurityInCHF() + { + Security security = new Security("Registered Shs Glencore PLC", "CHF"); + security.setIsin("JE00B4T3BW64"); + security.setWkn("12964057"); + + Client client = new Client(); + client.addSecurity(security); + + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(client); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(1)); + new AssertImportActions().check(results, "CHF"); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2021-10-04T00:00"), hasShares(1000), // + hasSource("Kauf01.txt"), // + hasNote("Abwicklungs-Nr. 592473551 | Auftrags-Nr. ONBA-0005128022772021"), // + hasAmount("CHF", 4469.94), hasGrossValue("CHF", 4462.37), // + hasTaxes("CHF", 6.68), hasFees("CHF", 0.89), // + check(tx -> { + CheckCurrenciesAction c = new CheckCurrenciesAction(); + Status s = c.process((PortfolioTransaction) tx, new Portfolio()); + assertThat(s, is(Status.OK_STATUS)); + })))); + } + + @Test + public void testWertpapierKauf02() + { + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf02.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, "USD"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("GB0009697037"), hasWkn("1142141"), hasTicker(null), // + hasName("Registered Shs Babcock International Group PLC"), // + hasCurrencyCode("GBP")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2023-06-29T00:00"), hasShares(2000), // + hasSource("Kauf02.txt"), // + hasNote("Abwicklungs-Nr. 715281248 | Auftrags-Nr. ONBA-0005066961792023"), // + hasAmount("USD", 7515.04), hasGrossValue("USD", 7461.23), // + hasForexGrossValue("GBP", 5900.00), // + hasTaxes("USD", 48.50), hasFees("USD", 5.31)))); + } + + @Test + public void testWertpapierKauf02WithSecurityInUSD() + { + Security security = new Security("Registered Shs Babcock International Group PLC", "USD"); + security.setIsin("GB0009697037"); + security.setWkn("1142141"); + + Client client = new Client(); + client.addSecurity(security); + + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(client); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf02.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(1)); + new AssertImportActions().check(results, "USD"); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2023-06-29T00:00"), hasShares(2000), // + hasSource("Kauf02.txt"), // + hasNote("Abwicklungs-Nr. 715281248 | Auftrags-Nr. ONBA-0005066961792023"), // + hasAmount("USD", 7515.04), hasGrossValue("USD", 7461.23), // + hasTaxes("USD", 48.50), hasFees("USD", 5.31), // + check(tx -> { + CheckCurrenciesAction c = new CheckCurrenciesAction(); + Status s = c.process((PortfolioTransaction) tx, new Portfolio()); + assertThat(s, is(Status.OK_STATUS)); + })))); + } + + @Test + public void testWertpapierKauf03() + { + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf03.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, "CHF"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("CH0012214059"), hasWkn("1221405"), hasTicker(null), // + hasName("Namen-Akt Holcim AG"), // + hasCurrencyCode("CHF")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2022-06-08T00:00"), hasShares(150), // + hasSource("Kauf03.txt"), // + hasNote("Abwicklungs-Nr. 640981320 | Auftrags-Nr. ONBA-0005082331592022"), // + hasAmount("CHF", 7294.30), hasGrossValue("CHF", 7287.33), // + hasTaxes("CHF", 5.47), hasFees("CHF", 1.50)))); + } + + @Test + public void testWertpapierKauf04() + { + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf04.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, "CHF"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("FR0000121485"), hasWkn("21591"), hasTicker(null), // + hasName("Act Kering SA"), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2022-03-28T00:00"), hasShares(10), // + hasSource("Kauf04.txt"), // + hasNote("Abwicklungs-Nr. 626674106 | Auftrags-Nr. ONBA-0005089660872022"), // + hasAmount("CHF", 6078.35), hasGrossValue("CHF", 6046.52), // + hasForexGrossValue("EUR", 5891.00), // + hasTaxes("CHF", 27.21), hasFees("CHF", 4.62)))); + } + + @Test + public void testWertpapierKauf04WithSecurityInCHF() + { + Security security = new Security("Act Kering SA", "CHF"); + security.setIsin("FR0000121485"); + security.setWkn("21591"); + + Client client = new Client(); + client.addSecurity(security); + + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(client); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Kauf04.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(1)); + new AssertImportActions().check(results, "CHF"); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2022-03-28T00:00"), hasShares(10), // + hasSource("Kauf04.txt"), // + hasNote("Abwicklungs-Nr. 626674106 | Auftrags-Nr. ONBA-0005089660872022"), // + hasAmount("CHF", 6078.35), hasGrossValue("CHF", 6046.52), // + hasTaxes("CHF", 27.21), hasFees("CHF", 4.62), // + check(tx -> { + CheckCurrenciesAction c = new CheckCurrenciesAction(); + Status s = c.process((PortfolioTransaction) tx, new Portfolio()); + assertThat(s, is(Status.OK_STATUS)); + })))); + } + + @Test + public void testWertpapierVerkauf01() + { + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, "CHF"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("CH0012214059"), hasWkn("1221405"), hasTicker(null), // + hasName("Namen-Akt Holcim AG"), // + hasCurrencyCode("CHF")))); + + // check buy sell transaction + assertThat(results, hasItem(sale( // + hasDate("2023-02-24T00:00"), hasShares(150), // + hasSource("Verkauf01.txt"), // + hasNote("Abwicklungs-Nr. 691980481 | Auftrags-Nr. ONBA-0005093310552023"), // + hasAmount("CHF", 8512.11), hasGrossValue("CHF", 8520.00), // + hasTaxes("CHF", 6.39), hasFees("CHF", 1.50)))); + } + + @Test + public void testWertpapierVerkauf02() + { + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf02.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, "CHF"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("FR0000121485"), hasWkn("21591"), hasTicker(null), // + hasName("Act Kering SA"), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(sale( // + hasDate("2023-02-17T00:00"), hasShares(10), // + hasSource("Verkauf02.txt"), // + hasNote("Abwicklungs-Nr. 690706592 | Auftrags-Nr. ONBA-0005146670482023"), // + hasAmount("CHF", 5831.90), hasGrossValue("CHF", 5845.13), // + hasForexGrossValue("EUR", 5900.00), // + hasTaxes("CHF", 8.77), hasFees("CHF", 4.46)))); + } + + @Test + public void testWertpapierVerkauf02WithSecurityInCHF() + { + Security security = new Security("Act Kering SA", "CHF"); + security.setIsin("FR0000121485"); + security.setWkn("21591"); + + Client client = new Client(); + client.addSecurity(security); + + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(client); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Verkauf02.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(1L)); + assertThat(countAccountTransactions(results), is(0L)); + assertThat(results.size(), is(1)); + new AssertImportActions().check(results, "CHF"); + + // check buy sell transaction + assertThat(results, hasItem(sale( // + hasDate("2023-02-17T00:00"), hasShares(10), // + hasSource("Verkauf02.txt"), // + hasNote("Abwicklungs-Nr. 690706592 | Auftrags-Nr. ONBA-0005146670482023"), // + hasAmount("CHF", 5831.90), hasGrossValue("CHF", 5845.13), // + hasTaxes("CHF", 8.77), hasFees("CHF", 4.46), // + check(tx -> { + CheckCurrenciesAction c = new CheckCurrenciesAction(); + Status s = c.process((PortfolioTransaction) tx, new Portfolio()); + assertThat(s, is(Status.OK_STATUS)); + })))); + } + + @Test + public void testDividende01() + { + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, "CHF"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("GB0009697037"), hasWkn("1142141"), hasTicker(null), // + hasName("Registered Shs Babcock International Group PLC"), // + hasCurrencyCode("GBP")))); + + // check dividends transaction + assertThat(results, hasItem(dividend( // + hasDate("2024-01-19T00:00"), hasShares(2000), // + hasSource("Dividende01.txt"), // + hasNote("Abwicklungs-Nr. 744484581"), // + hasAmount("CHF", 37.25), hasGrossValue("CHF", 37.250), // + hasForexGrossValue("GBP", 34.00), // + hasTaxes("CHF", 0.00), hasFees("CHF", 0.00)))); + } + + @Test + public void testDividende01WithSecurityInCHF() + { + Security security = new Security("Registered Shs Babcock International Group PLC", "CHF"); + security.setIsin("GB0009697037"); + security.setWkn("1142141"); + + Client client = new Client(); + client.addSecurity(security); + + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(client); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende01.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(1)); + new AssertImportActions().check(results, "CHF"); + + // check dividends transaction + assertThat(results, hasItem(dividend( // + hasDate("2024-01-19T00:00"), hasShares(2000), // + hasSource("Dividende01.txt"), // + hasNote("Abwicklungs-Nr. 744484581"), // + hasAmount("CHF", 37.25), hasGrossValue("CHF", 37.250), // + hasTaxes("CHF", 0.00), hasFees("CHF", 0.00), // + check(tx -> { + CheckCurrenciesAction c = new CheckCurrenciesAction(); + Account account = new Account(); + account.setCurrencyCode("CHF"); + Status s = c.process((AccountTransaction) tx, account); + assertThat(s, is(Status.OK_STATUS)); + })))); + } + + @Test + public void testDividende02() + { + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende02.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, "CHF"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("US46641Q3323"), hasWkn("52708803"), hasTicker(null), // + hasName("Shs J.P. Morgan Exchange-Traded Fund Trust JPMorgan Equity Premium"), // + hasCurrencyCode("USD")))); + + // check dividends transaction + assertThat(results, hasItem(dividend( // + hasDate("2023-01-04T00:00"), hasShares(200), // + hasSource("Dividende02.txt"), // + hasNote("Abwicklungs-Nr. 680426625"), // + hasAmount("CHF", 74.01), hasGrossValue("CHF", 105.73), // + hasForexGrossValue("USD", 114.58), // + hasTaxes("CHF", 31.72), hasFees("CHF", 0.00)))); + } + + @Test + public void testDividende02WithSecurityInUSD() + { + Security security = new Security("Shs J.P. Morgan Exchange-Traded Fund Trust JPMorgan Equity Premium", "CHF"); + security.setIsin("US46641Q3323"); + security.setWkn("52708803"); + + Client client = new Client(); + client.addSecurity(security); + + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(client); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende02.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(1)); + new AssertImportActions().check(results, "CHF"); + + // check dividends transaction + assertThat(results, hasItem(dividend( // + hasDate("2023-01-04T00:00"), hasShares(200), // + hasSource("Dividende02.txt"), // + hasNote("Abwicklungs-Nr. 680426625"), // + hasAmount("CHF", 74.01), hasGrossValue("CHF", 105.73), // + hasTaxes("CHF", 31.72), hasFees("CHF", 0.00), // + check(tx -> { + CheckCurrenciesAction c = new CheckCurrenciesAction(); + Account account = new Account(); + account.setCurrencyCode("CHF"); + Status s = c.process((AccountTransaction) tx, account); + assertThat(s, is(Status.OK_STATUS)); + })))); + } + + @Test + public void testDividende03() + { + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende03.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(1L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(2)); + new AssertImportActions().check(results, "USD"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("US46641Q3323"), hasWkn("52708803"), hasTicker(null), // + hasName("Shs J.P. Morgan Exchange-Traded Fund Trust JPMorgan Equity Premium"), // + hasCurrencyCode("USD")))); + + // check dividends transaction + assertThat(results, hasItem(dividend( // + hasDate("2024-02-06T00:00"), hasShares(200), // + hasSource("Dividende03.txt"), // + hasNote("Abwicklungs-Nr. 759703889"), // + hasAmount("USD", 42.08), hasGrossValue("USD", 60.12), // + hasTaxes("USD", 18.04), hasFees("USD", 0.00)))); + } + + @Test + public void testDividende03WithSecurityInUSD() + { + Security security = new Security("Shs J.P. Morgan Exchange-Traded Fund Trust JPMorgan Equity Premium", "CHF"); + security.setIsin("US46641Q3323"); + security.setWkn("52708803"); + + Client client = new Client(); + client.addSecurity(security); + + ZuercherKantonalbankPDFExtractor extractor = new ZuercherKantonalbankPDFExtractor(client); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Dividende03.txt"), errors); + + assertThat(errors, empty()); + assertThat(countSecurities(results), is(0L)); + assertThat(countBuySell(results), is(0L)); + assertThat(countAccountTransactions(results), is(1L)); + assertThat(results.size(), is(1)); + new AssertImportActions().check(results, "USD"); + + // check dividends transaction + assertThat(results, hasItem(dividend( // + hasDate("2024-02-06T00:00"), hasShares(200), // + hasSource("Dividende03.txt"), // + hasNote("Abwicklungs-Nr. 759703889"), // + hasAmount("USD", 42.08), hasGrossValue("USD", 60.12), // + hasForexGrossValue("CHF", 51.44), // + hasTaxes("USD", 18.04), hasFees("USD", 0.00), // + check(tx -> { + CheckCurrenciesAction c = new CheckCurrenciesAction(); + Account account = new Account(); + account.setCurrencyCode("USD"); + Status s = c.process((AccountTransaction) tx, account); + assertThat(s, is(Status.OK_STATUS)); + })))); + } +} diff --git a/name.abuchen.portfolio.ui.tests/META-INF/MANIFEST.MF b/name.abuchen.portfolio.ui.tests/META-INF/MANIFEST.MF index 3e9c1f97a7..99d398777d 100644 --- a/name.abuchen.portfolio.ui.tests/META-INF/MANIFEST.MF +++ b/name.abuchen.portfolio.ui.tests/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Portfolio Performance UI Tests Bundle-SymbolicName: name.abuchen.portfolio.ui.tests -Bundle-Version: 0.68.3.qualifier +Bundle-Version: 0.68.4.qualifier Fragment-Host: name.abuchen.portfolio.ui Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-Vendor: Andreas Buchen diff --git a/name.abuchen.portfolio.ui.tests/pom.xml b/name.abuchen.portfolio.ui.tests/pom.xml index 74bf24fe56..f90bb0ae50 100644 --- a/name.abuchen.portfolio.ui.tests/pom.xml +++ b/name.abuchen.portfolio.ui.tests/pom.xml @@ -7,7 +7,7 @@ name.abuchen.portfolio portfolio-app - 0.68.3-SNAPSHOT + 0.68.4-SNAPSHOT ../portfolio-app diff --git a/name.abuchen.portfolio.ui/META-INF/MANIFEST.MF b/name.abuchen.portfolio.ui/META-INF/MANIFEST.MF index 721efadce0..3a1979fa1e 100644 --- a/name.abuchen.portfolio.ui/META-INF/MANIFEST.MF +++ b/name.abuchen.portfolio.ui/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Portfolio Platform UI Bundle-SymbolicName: name.abuchen.portfolio.ui;singleton:=true -Bundle-Version: 0.68.3.qualifier +Bundle-Version: 0.68.4.qualifier Bundle-RequiredExecutionEnvironment: JavaSE-17 Bundle-ActivationPolicy: lazy Bundle-Activator: name.abuchen.portfolio.ui.PortfolioPlugin @@ -116,7 +116,7 @@ Import-Package: com.google.common.base, org.osgi.service.event, org.osgi.service.prefs, org.swtchart -Require-Bundle: name.abuchen.portfolio;bundle-version="0.68.3", +Require-Bundle: name.abuchen.portfolio;bundle-version="0.68.4", org.eclipse.nebula.cwt, org.eclipse.ui.forms, org.eclipse.e4.ui.css.core, diff --git a/name.abuchen.portfolio.ui/pom.xml b/name.abuchen.portfolio.ui/pom.xml index 0efde243bb..f4bee413e5 100644 --- a/name.abuchen.portfolio.ui/pom.xml +++ b/name.abuchen.portfolio.ui/pom.xml @@ -6,7 +6,7 @@ name.abuchen.portfolio portfolio-app - 0.68.3-SNAPSHOT + 0.68.4-SNAPSHOT ../portfolio-app diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages.properties index bf0e6dd4e3..d2386b5d85 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages.properties @@ -1358,7 +1358,7 @@ LabelJSONFactor = Factor (for quotes) LabelJSONFactorHint = A factor all quotes (close, high, low) get multiplied with. -LabelJSONPathHint = Path must yield an array with either dates or closing price.\nPP is using the library https://github.com/json-path/JsonPath.\n\nFor example, given this JSON:\n\n{\n "isin": "IE00B3WJKG14",\n "data": [\n { "close": 11.756, "date": "2020-02-14" },\n { "close": 11.75, "date": "2020-02-13" }]\n}\n\nPath to date: $.data[*].date\nPath to close: $.data[*].close +LabelJSONPathHint = Path must yield an array with either dates or closing price.\nPortfolio Performance is using the library https://github.com/json-path/JsonPath.\n\nFor example, given this JSON:\n\n{\n "isin": "IE00B3WJKG14",\n "data": [\n { "close": 11.756, "date": "2020-02-14" },\n { "close": 11.75, "date": "2020-02-13" }]\n}\n\nPath to date: $.data[*].date\nPath to close: $.data[*].close LabelJSONPathToClose = Path to Close @@ -1516,7 +1516,7 @@ LabelQuandlCode = Quandl Code LabelQuandlColumnNameQuote = Column name of quote -LabelQuandlColumnNameQuoteHint = Name of the column that contains the stock quote.\nIf no name is provided, PP will use the column "Close" or "Net Asset Value". +LabelQuandlColumnNameQuoteHint = Name of the column that contains the stock quote.\nIf no name is provided, Portfolio Performance will use the column "Close" or "Net Asset Value". LabelQuote = Quote @@ -2082,7 +2082,7 @@ MsgUpdateNoWritePermissions = No permissions to install the update.\n\nStart Por MsgUpdateRequiresLatestJavaVersion = This version requires Java {0}.\n\nIf you run Windows or macOS, consider downloading Portfolio Performance that embeds the right Java runtime directly in the download.\n\nOn Linux, install Java Runtime Environment {0} with your favorite package manager.\n\nFor example:\n\nsudo apt install openjdk-{0}-jre\nsudo update-alternatives --config java -MsgUpdateRunning32BitOn64BitOS = You seem to be running a 32bit PP on a 64bit Operating System. Instead of updating, download the 64bit version. +MsgUpdateRunning32BitOn64BitOS = You seem to be running a 32bit Portfolio Performance on a 64bit Operating System. Instead of updating, download the 64bit version. MsgUpdatedXEntries = {0} entries updated @@ -2204,7 +2204,7 @@ PrefBackupLocation = Backup location PrefCheckOnStartup = &Check for updates on start -PrefCreateBackupBeforeSaving = Automatically create a backup copy before saving a file (*.backup.xml) +PrefCreateBackupBeforeSaving = Automatically create a backup copy before saving a file PrefDescriptionAlphaVantage = Alpha Vantage Inc. is a provider of free APIs for realtime and historical data on stocks, physical currencies, and digital/crypto currencies.\n\nTo use Alpha Vantage, you need an API key. The free API key allows up to 5 requests per minute. Alpha Vantage offers various premium API keys for purchase that allow up to 600 requests per minute.\n\nPlease follow this link to sign up: @@ -2216,7 +2216,7 @@ PrefDescriptionFinnhub = Institutional-grade data with a generous free plan.\n\n PrefDescriptionLeeway = PWP Leeway UG provides price data for stocks, ETFs, indices, funds, currencies and cryptocurrencies.\n\nHint:\nSecurities are searched by ISIN.\nPrices are also available in foreign currencies.\n\nLimits (Free):\n* Personal use only\n* 50 API calls/day\n* Approx. 1,000 securities in free API package\n\nPlease follow this link to sign up: -PrefDescriptionMyDividends24 = The automated transfer of the stock portfolio from Portfolio Performance to the personal securities account at myDividends24 allows users to easily track future dividend payments from their smartphone. This handy feature can help monitor investments more effectively. \n\nSimply follow the steps below:\n1. download myDividends24 from the AppStore or Google Play Store.\n2. create an account and generate an API key under "Settings"\n3. save the API key in the settings of Portfolio Performance\n4. press "Upload myDividends24" in the top menu +PrefDescriptionMyDividends24 = The automated transfer of the stock portfolio from Portfolio Performance to the personal securities account at myDividends24 allows users to easily track future dividend payments from their smartphone. This handy feature can help monitor investments more effectively. \n\nSimply follow the steps below:\n1. Download myDividends24 from the AppStore or Google Play Store.\n2. Create an account and generate an API key under "Settings".\n3. Save the API key in the settings of Portfolio Performance.\n4. Press "Upload myDividends24" in the top menu. PrefDescriptionPortfolioReport = Synchronization of data with the Portfolio Report Server. @@ -2266,9 +2266,9 @@ PrefMsgLanguageConfig = To change the language, a restart is required. PrefMyDividends24APIKey = myDividends24 API Key -PrefNoteIndirectQuotation = Quotes using a country's home currency as the price currency\n(for example, EUR 0.9009 = USD 1.00 in the Eurozone) are known\nas direct quotation or price quotation (from that country's\nperspective) and are used by most countries.\n\nQuotes using a country's home currency as the unit currency\n(for example, USD 1.11 = EUR 1.00 in the Eurozone) are known\nas indirect quotation or quantity quotation and are used in\nBritish newspapers and are also common in Australia, New\nZealand and the Eurozone.\n\nSource: https://en.wikipedia.org/wiki/Exchange_rate\n\n\nExamples:\n\nIndirect (Quantity) Quotation: EUR/USD 1.1232\n"For one Euro one gets 1.1232 USD."\n\nDirect (Price) Quotation: USD/EUR 0.89\n"One USD costs 0.89 EUR." +PrefNoteIndirectQuotation = Quotes using a country's home currency as the price currency (for example, EUR 0.9009 = USD 1.00 in the Eurozone) are known as direct quotation or price quotation (from that country's perspective) and are used by most countries.\n\nQuotes using a country's home currency as the unit currency (for example, USD 1.11 = EUR 1.00 in the Eurozone) are known as indirect quotation or quantity quotation and are used in British newspapers and are also common in Australia, New Zealand and the Eurozone.\n\nSource: https://en.wikipedia.org/wiki/Exchange_rate\n\n\nExamples:\n\nIndirect (Quantity) Quotation: EUR/USD 1.1232\n"For one Euro one gets 1.1232 USD."\n\nDirect (Price) Quotation: USD/EUR 0.89\n"One USD costs 0.89 EUR." -PrefNoteStoreSettingsNextToFile = The GUI settings contain configurations such as the start page,\nthe width of some columns and window areas, the expanded nodes\nof the classification view, and more.\n\nBy default, the GUI settings are stored hidden in the 'workspace'\nfolder. It is also possible to store them in a '.settings' file\nnext to the Portfolio Performance file itself. This facilitates\nsynchronizing the settings across multiple PCs.\n\nAttention: the GUI settings are not migrated. To keep the current\nsettings, do the following: open a Portfolio Performance file ->\nthen change the checkbox here -> then save the file under a new\nname. +PrefNoteStoreSettingsNextToFile = The GUI settings contain configurations such as the start page, the width of some columns and window areas, the expanded nodes of the classification view, and more.\n\nBy default, the GUI settings are stored hidden in the 'workspace' folder. It is also possible to store them in a '.settings' file next to the Portfolio Performance file itself. This facilitates synchronizing the settings across multiple PCs.\n\nAttention: the GUI settings are not migrated. To keep the current settings, do the following: open a Portfolio Performance file -> then change the checkbox here -> then save the file under a new name. PrefPortfolioReportAPIKey = Portfolio Report API Key diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_cs.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_cs.properties index eaa449dd7e..0db8ba8194 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_cs.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_cs.properties @@ -2194,7 +2194,7 @@ PrefBackupLocation = Um\u00EDst\u011Bn\u00ED z\u00E1lohy PrefCheckOnStartup = &Kontrola aktualizac\u00ED p\u0159i spu\u0161t\u011Bn\u00ED -PrefCreateBackupBeforeSaving = Automatick\u00E9 vytvo\u0159en\u00ED z\u00E1lo\u017En\u00ED kopie p\u0159ed ulo\u017Een\u00EDm souboru (*.backup.xml) +PrefCreateBackupBeforeSaving = Automatick\u00E9 vytvo\u0159en\u00ED z\u00E1lo\u017En\u00ED kopie p\u0159ed ulo\u017Een\u00EDm souboru PrefDescriptionAlphaVantage = Spole\u010Dnost Alpha Vantage Inc. je poskytovatelem bezplatn\u00FDch rozhran\u00ED API pro realtime a historick\u00E1 data o akci\u00EDch, fyzick\u00FDch m\u011Bn\u00E1ch a digit\u00E1ln\u00EDch/krypto m\u011Bn\u00E1ch.\n\nChcete-li pou\u017E\u00EDvat slu\u017Ebu Alpha Vantage, pot\u0159ebujete kl\u00ED\u010D API. Bezplatn\u00FD kl\u00ED\u010D API umo\u017E\u0148uje a\u017E 5 po\u017Eadavk\u016F za minutu. Alpha Vantage nab\u00EDz\u00ED k zakoupen\u00ED r\u016Fzn\u00E9 pr\u00E9miov\u00E9 kl\u00ED\u010De API, kter\u00E9 umo\u017E\u0148uj\u00ED a\u017E 600 po\u017Eadavk\u016F za minutu.\n\nPro registraci p\u0159ejd\u011Bte na tento odkaz: @@ -2256,9 +2256,9 @@ PrefMsgLanguageConfig = Pro zm\u011Bnu jazyka je nutn\u00FD restart. PrefMyDividends24APIKey = Kl\u00ED\u010D API myDividends24 -PrefNoteIndirectQuotation = Kotace s pou\u017Eit\u00EDm dom\u00E1c\u00ED m\u011Bny zem\u011B jako m\u011Bny ceny\n(nap\u0159\u00EDklad 0,9009 EUR = 1,00 USD v euroz\u00F3n\u011B) jsou zn\u00E1m\u00E9.\njako p\u0159\u00EDm\u00FD z\u00E1pis nebo nep\u0159\u00EDm\u00FD z\u00E1pis (z m\u011Bny dan\u00E9 zem\u011B).\nz pohledu dan\u00E9 zem\u011B) a pou\u017E\u00EDv\u00E1 je v\u011Bt\u0161ina zem\u00ED.\n\nK\u00F3tov\u00E1n\u00ED s pou\u017Eit\u00EDm dom\u00E1c\u00ED m\u011Bny zem\u011B jako jednotkov\u00E9 m\u011Bny\n(nap\u0159. 1,11 USD = 1,00 EUR v euroz\u00F3n\u011B) jsou zn\u00E1m\u00E9 pod ozna\u010Den\u00EDm\njako nep\u0159\u00EDm\u00FD z\u00E1pis nebo mno\u017Estevn\u00ED z\u00E1pis a pou\u017E\u00EDvaj\u00ED se ve\nBritsk\u00FDch novin\u00E1ch a jsou b\u011B\u017En\u00E9 tak\u00E9 v Austr\u00E1lii, Nov\u00E9m\nZ\u00E9landu a euroz\u00F3n\u011B.\n\nhttps://cs.wikipedia.org/wiki/M%C4%9Bnov%C3%BD_kurz\n\n\nP\u0159\u00EDklady:\n\nNep\u0159\u00EDm\u00FD (mno\u017Estevn\u00ED) z\u00E1pis: EUR/USD 1,1232\n"Za jedno euro dostanete 1,1232 USD."\n\nP\u0159\u00EDm\u00FD (cenov\u00E1) z\u00E1pis: USD/EUR 0,89\n"Jeden USD stoj\u00ED 0,89 EUR." +PrefNoteIndirectQuotation = Kotace s pou\u017Eit\u00EDm dom\u00E1c\u00ED m\u011Bny zem\u011B jako m\u011Bny ceny (nap\u0159\u00EDklad 0,9009 EUR = 1,00 USD v euroz\u00F3n\u011B) jsou zn\u00E1m\u00E9. jako p\u0159\u00EDm\u00FD z\u00E1pis nebo nep\u0159\u00EDm\u00FD z\u00E1pis (z m\u011Bny dan\u00E9 zem\u011B). z pohledu dan\u00E9 zem\u011B) a pou\u017E\u00EDv\u00E1 je v\u011Bt\u0161ina zem\u00ED.\n\nK\u00F3tov\u00E1n\u00ED s pou\u017Eit\u00EDm dom\u00E1c\u00ED m\u011Bny zem\u011B jako jednotkov\u00E9 m\u011Bny (nap\u0159. 1,11 USD = 1,00 EUR v euroz\u00F3n\u011B) jsou zn\u00E1m\u00E9 pod ozna\u010Den\u00EDm jako nep\u0159\u00EDm\u00FD z\u00E1pis nebo mno\u017Estevn\u00ED z\u00E1pis a pou\u017E\u00EDvaj\u00ED se ve Britsk\u00FDch novin\u00E1ch a jsou b\u011B\u017En\u00E9 tak\u00E9 v Austr\u00E1lii, Nov\u00E9m Z\u00E9landu a euroz\u00F3n\u011B.\n\nhttps://cs.wikipedia.org/wiki/M%C4%9Bnov%C3%BD_kurz\n\n\nP\u0159\u00EDklady:\n\nNep\u0159\u00EDm\u00FD (mno\u017Estevn\u00ED) z\u00E1pis: EUR/USD 1,1232\n"Za jedno euro dostanete 1,1232 USD."\n\nP\u0159\u00EDm\u00FD (cenov\u00E1) z\u00E1pis: USD/EUR 0,89\n"Jeden USD stoj\u00ED 0,89 EUR." -PrefNoteStoreSettingsNextToFile = Nastaven\u00ED grafick\u00E9ho u\u017Eivatelsk\u00E9ho rozhran\u00ED obsahuje konfigurace, jako je \u00FAvodn\u00ED str\u00E1nka,\n\u0161\u00ED\u0159ka n\u011Bkter\u00FDch sloupc\u016F a okenn\u00EDch oblast\u00ED, roz\u0161\u00ED\u0159en\u00E9 uzly.\nzobrazen\u00ED klasifikace a dal\u0161\u00ED.\n\nVe v\u00FDchoz\u00EDm nastaven\u00ED jsou nastaven\u00ED grafick\u00E9ho u\u017Eivatelsk\u00E9ho rozhran\u00ED ulo\u017Eena skryt\u011B v "pracovn\u00EDm prostoru".\nve slo\u017Ece "GUI". Je tak\u00E9 mo\u017En\u00E9 je ulo\u017Eit do souboru '.settings'.\nvedle samotn\u00E9ho souboru Portfolio Performance. To usnad\u0148uje\nsynchronizaci nastaven\u00ED na v\u00EDce po\u010D\u00EDta\u010D\u00EDch.\n\nPozor: Nastaven\u00ED grafick\u00E9ho u\u017Eivatelsk\u00E9ho rozhran\u00ED se nemigruj\u00ED. Chcete-li zachovat aktu\u00E1ln\u00ED\nnastaven\u00ED, prove\u010Fte n\u00E1sleduj\u00EDc\u00ED: otev\u0159ete soubor Portfolio Performance ->\npak zde zm\u011B\u0148te za\u0161krt\u00E1vac\u00ED pol\u00ED\u010Dko -> pot\u00E9 soubor ulo\u017Ete pod nov\u00FDm n\u00E1zvem.\nn\u00E1zvem. +PrefNoteStoreSettingsNextToFile = Nastaven\u00ED grafick\u00E9ho u\u017Eivatelsk\u00E9ho rozhran\u00ED obsahuje konfigurace, jako je \u00FAvodn\u00ED str\u00E1nka, \u0161\u00ED\u0159ka n\u011Bkter\u00FDch sloupc\u016F a okenn\u00EDch oblast\u00ED, roz\u0161\u00ED\u0159en\u00E9 uzly. zobrazen\u00ED klasifikace a dal\u0161\u00ED.\n\nVe v\u00FDchoz\u00EDm nastaven\u00ED jsou nastaven\u00ED grafick\u00E9ho u\u017Eivatelsk\u00E9ho rozhran\u00ED ulo\u017Eena skryt\u011B v "pracovn\u00EDm prostoru". ve slo\u017Ece "GUI". Je tak\u00E9 mo\u017En\u00E9 je ulo\u017Eit do souboru '.settings'. vedle samotn\u00E9ho souboru Portfolio Performance. To usnad\u0148uje synchronizaci nastaven\u00ED na v\u00EDce po\u010D\u00EDta\u010D\u00EDch.\n\nPozor: Nastaven\u00ED grafick\u00E9ho u\u017Eivatelsk\u00E9ho rozhran\u00ED se nemigruj\u00ED. Chcete-li zachovat aktu\u00E1ln\u00ED nastaven\u00ED, prove\u010Fte n\u00E1sleduj\u00EDc\u00ED: otev\u0159ete soubor Portfolio Performance -> pak zde zm\u011B\u0148te za\u0161krt\u00E1vac\u00ED pol\u00ED\u010Dko -> pot\u00E9 soubor ulo\u017Ete pod nov\u00FDm n\u00E1zvem. PrefPortfolioReportAPIKey = Portfolio Report API kl\u00ED\u010D diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_da.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_da.properties index 6a921b3567..e830f33f8e 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_da.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_da.properties @@ -2195,7 +2195,7 @@ PrefBackupLocation = Backup lokation PrefCheckOnStartup = &Se efter opdateringer ved start -PrefCreateBackupBeforeSaving = Opret automatisk en sikkerhedskopi, f\u00F8r du gemmer en fil (*.backup.xml) +PrefCreateBackupBeforeSaving = Opret automatisk en sikkerhedskopi, f\u00F8r du gemmer en fil PrefDescriptionAlphaVantage = Alpha Vantage Inc. er en udbyder af gratis API'er til realtidsdata og historiske data om aktier, fysiske valutaer og digitale/kryptovalutaer.\n\nFor at bruge Alpha Vantage skal du bruge en API-n\u00F8gle. Den gratis API-n\u00F8gle tillader op til 5 anmodninger i minuttet. Alpha Vantage tilbyder forskellige premium API-n\u00F8gler til k\u00F8b, der tillader op til 600 anmodninger i minuttet.\n\nF\u00F8lg venligst dette link for at tilmelde dig: @@ -2257,9 +2257,9 @@ PrefMsgLanguageConfig = For at skifte sprog, kr\u00E6ves genstart. PrefMyDividends24APIKey = myDividends24 API n\u00F8gle -PrefNoteIndirectQuotation = Kurser der bruger et lands hjemmevaluta som prisvaluta\n(for eksempel 0.9009 EUR = 1.00 USD i euroomr\u00E5det) er kendt\nsom direkte tilbud eller pristilbud (fra det p\u00E5g\u00E6ldende lands\nperspektiv) og bruges af de fleste lande.\n\nAnf\u00F8rselstegn der bruger et lands hjemmevaluta som enhedsvaluta\n(for eksempel USD 1.11 = EUR 1.00 i euroomr\u00E5det) er kendt\nsom indirekte tilbud eller m\u00E6ngdetilbud og anvendes i\nbritiske aviser og er ogs\u00E5 almindelige i Australien, New\nSj\u00E6lland og Eurozonen.\n\nKilde: https://en.wikipedia.org/wiki/Exchange_rate\n\n\nEksempler:\n\nIndirekte (m\u00E6ngde) tilbud: EUR/USD 1.1232\n"For \u00E9n Euro f\u00E5r man 1.1232 USD."\n\nDirekte (pris) tilbud: USD/EUR 0.89\n"\u00C9n USD koster 0.89 EUR." +PrefNoteIndirectQuotation = Kurser der bruger et lands hjemmevaluta som prisvaluta (for eksempel 0.9009 EUR = 1.00 USD i euroomr\u00E5det) er kendt som direkte tilbud eller pristilbud (fra det p\u00E5g\u00E6ldende lands perspektiv) og bruges af de fleste lande.\n\nAnf\u00F8rselstegn der bruger et lands hjemmevaluta som enhedsvaluta (for eksempel USD 1.11 = EUR 1.00 i euroomr\u00E5det) er kendt som indirekte tilbud eller m\u00E6ngdetilbud og anvendes i britiske aviser og er ogs\u00E5 almindelige i Australien, New Sj\u00E6lland og Eurozonen.\n\nKilde: https://en.wikipedia.org/wiki/Exchange_rate\n\n\nEksempler:\n\nIndirekte (m\u00E6ngde) tilbud: EUR/USD 1.1232\n"For \u00E9n Euro f\u00E5r man 1.1232 USD."\n\nDirekte (pris) tilbud: USD/EUR 0.89\n"\u00C9n USD koster 0.89 EUR." -PrefNoteStoreSettingsNextToFile = GUI-indstillingerne indeholder konfigurationer s\u00E5som startsiden,\nbredden af \u200B\u200Bnogle kolonner og vinduesomr\u00E5der, de udvidede noder\naf klassifikationsvisningen og mere.\n\nSom standard gemmes GUI-indstillingerne skjult i 'arbejdsomr\u00E5de'\nmappen. Det er ogs\u00E5 muligt at gemme dem i en '.settings'-fil\nud for selve Portfolio Performance-filen. Dette letter\nsynkronisering af indstillingerne p\u00E5 tv\u00E6rs af flere pc'er.\n\nBem\u00E6rk: GUI-indstillingerne migreres ikke. For at holde nuv\u00E6rende\nindstillinger, g\u00F8r f\u00F8lgende: \u00E5bn en Portfolio Performance-fil ->\ns\u00E5 skift afkrydsningsfeltet her -> gem s\u00E5 filen under et ny\nnavn. +PrefNoteStoreSettingsNextToFile = GUI-indstillingerne indeholder konfigurationer s\u00E5som startsiden, bredden af \u200B\u200Bnogle kolonner og vinduesomr\u00E5der, de udvidede noder af klassifikationsvisningen og mere.\n\nSom standard gemmes GUI-indstillingerne skjult i 'arbejdsomr\u00E5de' mappen. Det er ogs\u00E5 muligt at gemme dem i en '.settings'-fil ud for selve Portfolio Performance-filen. Dette letter synkronisering af indstillingerne p\u00E5 tv\u00E6rs af flere pc'er.\n\nBem\u00E6rk: GUI-indstillingerne migreres ikke. For at holde nuv\u00E6rende indstillinger, g\u00F8r f\u00F8lgende: \u00E5bn en Portfolio Performance-fil -> s\u00E5 skift afkrydsningsfeltet her -> gem s\u00E5 filen under et ny navn. PrefPortfolioReportAPIKey = Portef\u00F8lje rapport API n\u00F8gle diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_de.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_de.properties index 5bcadf7a60..574c27fbdd 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_de.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_de.properties @@ -47,11 +47,11 @@ BaseCurrencyCue = ** BaseCurrencyMigrationPage_Description = Konten und Wertpapiere unterst\u00FCtzen nun W\u00E4hrungen. -BaseCurrencyMigrationPage_ExplanationIndividualCurrency = W\u00E4hlen Sie hier die Hauptw\u00E4hrung f\u00FCr Ihr Gesamtportfolio, welche auch als Standardwert f\u00FCr neue Konten und Wertpapiere verwendet wird.\n\nWenn die W\u00E4hrung f\u00FCr bestimmte Konten oder Wertpapiere nicht Ihrer Hauptw\u00E4hrung entspricht, k\u00F6nnen Sie diese sp\u00E4ter nach Abschluss des Migrations Wizards anpassen. +BaseCurrencyMigrationPage_ExplanationIndividualCurrency = W\u00E4hlen Sie hier die Hauptw\u00E4hrung f\u00FCr Ihr Gesamtportfolio, welche auch als Standardwert f\u00FCr neue Konten und Wertpapiere verwendet wird.\n\nWenn die W\u00E4hrung f\u00FCr bestimmte Konten oder Wertpapiere nicht Ihrer Hauptw\u00E4hrung entspricht, k\u00F6nnen Sie diese sp\u00E4ter nach Abschluss des Migration-Wizards anpassen. BaseCurrencySelectionPage_Description = W\u00E4hlen Sie die Hauptw\u00E4hrung, die auch als Standardwert\nf\u00FCr neue Konten und Wertpapiere verwendet wird. -BaseCurrencySelectionPage_ExplanationIndividualCurrency = Wenn die W\u00E4hrung f\u00FCr bestimmte Konten oder Wertpapiere nicht Ihrer Hauptw\u00E4hrung entspricht, k\u00F6nnen Sie diese sp\u00E4ter nach Abschluss des Import Wizards anpassen. +BaseCurrencySelectionPage_ExplanationIndividualCurrency = Wenn die W\u00E4hrung f\u00FCr bestimmte Konten oder Wertpapiere nicht Ihrer Hauptw\u00E4hrung entspricht, k\u00F6nnen Sie diese sp\u00E4ter nach Abschluss des Import-Wizards anpassen. BaseCurrencySelectionPage_Title = W\u00E4hlen Sie die Hauptw\u00E4hrung @@ -199,7 +199,7 @@ ClientEditorLabelClientMasterData = Stammdaten ClientEditorLabelGeneralData = Allgemeine Daten -ClientEditorLabelHoldings = Best\u00E4nde +ClientEditorLabelHoldings = Bestand ClientEditorLabelPerformance = Performance @@ -213,13 +213,13 @@ ColumnAbsolutePerformance = Abs.Perf. ColumnAbsolutePerformancePercent = Abs.Perf. % -ColumnAbsolutePerformancePercent_Description = Absolute Performance % = Absolute Performance / ( Anfangswert + K\u00E4ufe/Einlieferungen )\n\nDie prozentuale absolute Performance bezieht sich immer auf den Berichtszeitraum, d. h. der Einstandspreis ist der Wert der Position zu Beginn des Zeitraumes.\n\nDiese Kennzahl unterscheidet sich vom "Kursgewinn (aktueller Bestand)" dahingehend, dass sowohl Dividenden und Steuern betrachtet werden sowie alle Kursgewinne, also auch die Kursgewinne schon verkaufter Positionen. +ColumnAbsolutePerformancePercent_Description = Absolute Performance % = Absolute Performance / ( Anfangswert + K\u00E4ufe/Einlieferungen )\n\nDie prozentuale absolute Performance bezieht sich immer auf den Berichtszeitraum, d. h. der Einstandspreis ist der Wert der Position zu Beginn des Zeitraums.\n\nDiese Kennzahl unterscheidet sich vom "Kursgewinn (aktueller Bestand)" dahingehend, dass sowohl Dividenden und Steuern betrachtet werden sowie alle Kursgewinne, also auch die Kursgewinne schon verkaufter Positionen. ColumnAbsolutePerformancePercent_MenuLabel = Absolute Performance % ColumnAbsolutePerformancePercent_Option = Abs.Perf. % {0} -ColumnAbsolutePerformance_Description = Absolute Performance = Endwert + Verk\u00E4ufe/Auslieferungen + Dividenden - Steuern - Geb\u00FChren - Anfangswert - K\u00E4ufe/Einlieferungen\n\nDer Gesamtgewinn bezieht sich immer auf den Berichtszeitraum, d. h. der Einstandspreis ist der Wert der Position zu Beginn des Zeitraumes.\n\nDiese Kennzahl unterscheidet sich vom "Kursgewinn (aktueller Bestand)" dahingehend, dass sowohl Dividenden und Steuern betrachtet werden sowie alle Kursgewinne, also auch die Kursgewinne schon verkaufter Positionen. +ColumnAbsolutePerformance_Description = Absolute Performance = Endwert + Verk\u00E4ufe/Auslieferungen + Dividenden - Steuern - Geb\u00FChren - Anfangswert - K\u00E4ufe/Einlieferungen\n\nDer Gesamtgewinn bezieht sich immer auf den Berichtszeitraum, d. h. der Einstandspreis ist der Wert der Position zu Beginn des Zeitraums.\n\nDiese Kennzahl unterscheidet sich vom "Kursgewinn (aktueller Bestand)" dahingehend, dass sowohl Dividenden und Steuern betrachtet werden sowie alle Kursgewinne, also auch die Kursgewinne schon verkaufter Positionen. ColumnAbsolutePerformance_MenuLabel = Absolute Performance @@ -233,11 +233,11 @@ ColumnAccountFrom = Von ColumnAccountTo = Nach -ColumnActualPercent = IST % +ColumnActualPercent = IST-% -ColumnActualValue = IST Wert +ColumnActualValue = IST-Wert -ColumnActualValueBaseCurrency = IST Wert in Basisw\u00E4hrung +ColumnActualValueBaseCurrency = IST-Wert in Basisw\u00E4hrung ColumnAmount = Betrag @@ -255,13 +255,13 @@ ColumnCapitalGainsMovingAverage = Kursgewinn (GLD, aktueller Bestand) ColumnCapitalGainsMovingAveragePercent = Kursgewinn % (GLD, aktueller Bestand) -ColumnCapitalGainsMovingAveragePercent_Description = Kursgewinn % (gleitender Durchschnitt, aktueller Bestand) = (Marktwert - Einstandspreis (gleitender Durchschnitt)) / Einstandspreis (gleitender Durchschnitt)\n\nDie Berechnung der Kursgewinne bezieht sich immer auf den Berichtszeitraum, d. h. der Einstandspreis ist entweder eine Kaufbuchung innerhalb des Zeitraumes oder der Wert der Position am Anfang der Berichtsperiode.\n\nEs werden nur die Kursgewinne der aktuell noch im Bestand befindlichen Wertpapiere betrachtet.\n\nDer Einstandspreis wird nach dem Prinzip des gleitenden Durchschnitts (anstatt FIFO) berechnet. +ColumnCapitalGainsMovingAveragePercent_Description = Kursgewinn % (gleitender Durchschnitt, aktueller Bestand) = (Marktwert - Einstandspreis (gleitender Durchschnitt)) / Einstandspreis (gleitender Durchschnitt)\n\nDie Berechnung der Kursgewinne bezieht sich immer auf den Berichtszeitraum, d. h. der Einstandspreis ist entweder eine Kaufbuchung innerhalb des Zeitraums oder der Wert der Position am Anfang der Berichtsperiode.\n\nEs werden nur die Kursgewinne der aktuell noch im Bestand befindlichen Wertpapiere betrachtet.\n\nDer Einstandspreis wird nach dem Prinzip des gleitenden Durchschnitts (anstatt FIFO) berechnet. ColumnCapitalGainsMovingAveragePercent_MenuLabel = Kursgewinn % (gleitender Durchschnitt, aktueller Bestand) ColumnCapitalGainsMovingAveragePercent_Option = Kursgewinn (GLD) % {0} -ColumnCapitalGainsMovingAverage_Description = Kursgewinn (gleitender Durchschnitt, aktueller Bestand) = Marktwert - Einstandspreis (gleitender Durchschnitt)\n\nDie Berechnung der Kursgewinne bezieht sich immer auf den Berichtszeitraum, d. h. der Einstandspreis ist entweder eine Kaufbuchung innerhalb des Zeitraumes oder der Wert der Position am Anfang der Berichtsperiode.\n\nEs werden nur die Kursgewinne der aktuell noch im Bestand befindlichen Wertpapiere betrachtet.\n\nDer Einstandspreis wird nach dem Prinzip des gleitenden Durchschnitts (anstatt FIFO) berechnet. +ColumnCapitalGainsMovingAverage_Description = Kursgewinn (gleitender Durchschnitt, aktueller Bestand) = Marktwert - Einstandspreis (gleitender Durchschnitt)\n\nDie Berechnung der Kursgewinne bezieht sich immer auf den Berichtszeitraum, d. h. der Einstandspreis ist entweder eine Kaufbuchung innerhalb des Zeitraums oder der Wert der Position am Anfang der Berichtsperiode.\n\nEs werden nur die Kursgewinne der aktuell noch im Bestand befindlichen Wertpapiere betrachtet.\n\nDer Einstandspreis wird nach dem Prinzip des gleitenden Durchschnitts (anstatt FIFO) berechnet. ColumnCapitalGainsMovingAverage_MenuLabel = Kursgewinn (gleitender Durchschnitt, aktueller Bestand) @@ -269,11 +269,11 @@ ColumnCapitalGainsMovingAverage_Option = Kursgewinn (GLD) {0} ColumnCapitalGainsPercent = Kursgewinn % (FIFO, aktueller Bestand) -ColumnCapitalGainsPercent_Description = Kursgewinn % (aktueller Bestand) = (Marktwert - Einstandspreis (FIFO)) / Einstandspreis (FIFO)\n\nDie Berechnung der Kursgewinne bezieht sich immer auf den Berichtszeitraum, d. h. der Einstandspreis ist entweder eine Kaufbuchung innerhalb des Zeitraumes oder der Wert der Position am Anfang der Berichtsperiode.\n\nEs werden nur die Kursgewinne der aktuell noch im Bestand befindlichen Wertpapiere betrachtet.\n\nDer Einstandspreis wird nach dem FIFO-Prinzip (First In - First Out) berechnet. +ColumnCapitalGainsPercent_Description = Kursgewinn % (aktueller Bestand) = (Marktwert - Einstandspreis (FIFO)) / Einstandspreis (FIFO)\n\nDie Berechnung der Kursgewinne bezieht sich immer auf den Berichtszeitraum, d. h. der Einstandspreis ist entweder eine Kaufbuchung innerhalb des Zeitraums oder der Wert der Position am Anfang der Berichtsperiode.\n\nEs werden nur die Kursgewinne der aktuell noch im Bestand befindlichen Wertpapiere betrachtet.\n\nDer Einstandspreis wird nach dem FIFO-Prinzip (First In - First Out) berechnet. ColumnCapitalGainsPercent_Option = Kursgewinn % (FIFO) {0} -ColumnCapitalGains_Description = Kursgewinn (aktueller Bestand) = Marktwert - Einstandspreis (FIFO)\n\nDie Berechnung der Kursgewinne bezieht sich immer auf den Berichtszeitraum, d. h. der Einstandspreis ist entweder eine Kaufbuchung innerhalb des Zeitraumes oder der Wert der Position am Anfang der Berichtsperiode.\n\nEs werden nur die Kursgewinne der aktuell noch im Bestand befindlichen Wertpapiere betrachtet.\n\nDer Einstandspreis wird nach dem FIFO-Prinzip (First In - First Out) berechnet. +ColumnCapitalGains_Description = Kursgewinn (aktueller Bestand) = Marktwert - Einstandspreis (FIFO)\n\nDie Berechnung der Kursgewinne bezieht sich immer auf den Berichtszeitraum, d. h. der Einstandspreis ist entweder eine Kaufbuchung innerhalb des Zeitraums oder der Wert der Position am Anfang der Berichtsperiode.\n\nEs werden nur die Kursgewinne der aktuell noch im Bestand befindlichen Wertpapiere betrachtet.\n\nDer Einstandspreis wird nach dem FIFO-Prinzip (First In - First Out) berechnet. ColumnCapitalGains_Option = Kursgewinn (FIFO) {0} @@ -339,7 +339,7 @@ ColumnDeltaPercentIndicator = Delta % Indikator ColumnDeltaPercentRelative = Delta % (relativ) -ColumnDeltaPercentRelative_Description = Differenz zwischen IST % und Aufteilung in Prozentpunkten +ColumnDeltaPercentRelative_Description = Differenz zwischen IST-% und Aufteilung in Prozentpunkten ColumnDeltaShares = Rebalance (St\u00FCcke) @@ -443,7 +443,7 @@ ColumnHoldingPeriod = Haltedauer (Tage) ColumnIRR = IZF -ColumnIRRPerformance = IZF Performance +ColumnIRRPerformance = IZF-Performance ColumnIRRPerformanceOption = IZF {0} @@ -545,7 +545,7 @@ ColumnPortfolio = Depot ColumnPreviousClose = Letzter Schlusskurs -ColumnPreviousPrice = Vorheriger Kurs +ColumnPreviousPrice = Voriger Kurs ColumnProfitLoss = Gewinn / Verlust @@ -585,7 +585,7 @@ ColumnQuoteChange_Option = \u0394 {0} ColumnQuoteDistanceFromAthPercent = Abstand vom ATH -ColumnQuoteDistanceFromAthPercent_Description = Prozentualer Abstand zum letzten All Time High (ATH) in dem gew\u00E4hlten Zeitraum. +ColumnQuoteDistanceFromAthPercent_Description = Prozentualer Abstand zum letzten All-Time-High (ATH) in dem gew\u00E4hlten Zeitraum. ColumnQuoteDistanceFromAthPercent_Option = \u0394 ATH {0} % @@ -651,7 +651,7 @@ ColumnTargetCurrency = Zielw\u00E4hrung ColumnTargetCurrencyToolTip = Zielw\u00E4hrung (nur zutreffend f\u00FCr W\u00E4hrungskurse, sonst keine W\u00E4hrung ausw\u00E4hlen) -ColumnTargetValue = SOLL Wert +ColumnTargetValue = SOLL-Wert ColumnTaxes = Steuern @@ -665,9 +665,9 @@ ColumnThereofForeignCurrencyGains = davon Fremdw\u00E4hrungsgewinne ColumnTicker = Symbol -ColumnToBePctOfTotal = SOLL % am GV +ColumnToBePctOfTotal = SOLL-% am GV -ColumnToBePctOfTotal_MenuLabel = SOLL % am Gesamtverm\u00F6gen +ColumnToBePctOfTotal_MenuLabel = SOLL-% am Gesamtverm\u00F6gen ColumnTotal = Gesamtbetrag @@ -703,7 +703,7 @@ ConfigurationDeleteConfirm = M\u00F6chten Sie die Ansicht ''{0}'' wirklich l\u00 ConfigurationDuplicate = Ansicht duplizieren -ConfigurationErrorIllegalCharacters = Name enth\u00E4lt ung\u00FCltige Zeichenfolge +ConfigurationErrorIllegalCharacters = Name enth\u00E4lt ung\u00FCltige Zeichen ConfigurationErrorMissingValue = Name fehlt @@ -751,7 +751,7 @@ DivvyDiaryIncludeTransactionHistory = Buchungen in den Upload aufnehmen DivvyDiaryMissingAPIKey = DivvyDiary API-Schl\u00FCssel ist nicht in den Einstellungen hinterlegt. -DivvyDiaryMsgUploading = Best\u00E4nden auf DivvyDiary hochladen +DivvyDiaryMsgUploading = Bestand auf DivvyDiary hochladen DivvyDiaryUploadSuccessfulMsg = Der Upload zu DivvyDiary wurde erfolgreich abgeschlossen @@ -779,9 +779,9 @@ EditWizardMasterDataUnlink_ToolTip = Bei Online Wertpapieren wird die ISIN und W EditWizardOptionSameAsHistoricalQuoteFeed = (wie historische Kurse) -EditWizardQuoteFeedLabelFeedURL = Kurs URL +EditWizardQuoteFeedLabelFeedURL = Kurs-URL -EditWizardQuoteFeedMsgErrorMissingURL = Kurs URL fehlt f\u00FCr ''{0}'' +EditWizardQuoteFeedMsgErrorMissingURL = Kurs-URL fehlt f\u00FCr ''{0}'' EditWizardQuoteFeedMsgErrorOrNoData = Fehler / Keine Daten @@ -819,7 +819,7 @@ ExportWizardSecurityMasterData = Stammdaten ExportWizardSelectDirectory = Verzeichnis f\u00FCr die exportierten Dateien w\u00E4hlen -ExportWizardTitle = CSV Exportieren +ExportWizardTitle = CSV exportieren ExportWizardUnsupportedExport = Unbekannter Exporttyp {0} und Element {0} @@ -845,7 +845,7 @@ FollowUpWidget_Option_SortingByDateDescending = Nach Datum, absteigend ForceClearPersistedStateDialogTitle = GUI zur\u00FCcksetzen -ForceClearPersistedStateMessage = Zu Fehlerbehandlung das GUI zur\u00FCcksetzen und neu starten? +ForceClearPersistedStateMessage = Zur Fehlerbehandlung GUI zur\u00FCcksetzen und neu starten? GroupLabelAttributes = Attribute @@ -869,15 +869,15 @@ HelpURL = {0} HoldingsWarningAssetsWithNegativeValuation = Achtung: Positionen mit negativem Wert werden nicht angezeigt -HoldingsWarningAssetsWithNegativeValuationDetails = Das Kuchendiagramm der Best\u00E4nde ist nicht korrekt, da es Positionen mit negativem Wert gibt. Die Prozentzahlen beziehen sich auf den Wert des Gesamtportfolios in H\u00F6he von {0} und nicht auf den Wert der angezeigten Positionen.\n\n{1} +HoldingsWarningAssetsWithNegativeValuationDetails = Das Kreisdiagramm des Bestands ist nicht korrekt, da es Positionen mit negativem Wert gibt. Die Prozentzahlen beziehen sich auf den Wert des Gesamtportfolios in H\u00F6he von {0} und nicht auf den Wert der angezeigten Positionen.\n\n{1} -ImportWizardPasteSourceDescription = Historische Kurse aus dem HTML-Code einer Webseite importieren\n{0} +ImportWizardPasteSourceDescription = Historische Kurse aus dem HTML-Quelltext einer Webseite importieren\n{0} ImportWizardPasteSourceExplanation = Onvista\n* Detailseite "B\u00F6rsen" oder "Kurs\u00FCbersicht" w\u00E4hlen\n* "Kurshistorie - Einzelkursabfrage" w\u00E4hlen\n* Per Rechtsklick "Seitenquelltext anzeigen", kopieren und unten einf\u00FCgen\n\nFinanzen.net\n* "Historisch" ausw\u00E4hlen\n* Per Rechtsklick "Seitenquelltext anzeigen", kopieren und unten einf\u00FCgen ImportWizardPasteSourcePasteHere = Seitenquelltext hier einf\u00FCgen... -ImportWizardPasteSourceTitle = HTML Source Code einf\u00FCgen +ImportWizardPasteSourceTitle = HTML-Quelltext einf\u00FCgen ImportWizardReviewDescription = \u00DCbersicht der extrahierten historischen Kurse @@ -893,7 +893,7 @@ IntroLabelSamples = Beispiele IntroLabelTranslation = Sprache -IntroMobileApp = Verfolge Deine Investitionen unterwegs.\n\nSpeichere Deine Datei als \u201Ebin\u00E4r\u201C oder \u201Epasswortgesch\u00FCtzt\u201C auf einem Cloud-Speicheranbieter wie iCloud, Google Drive oder OneDrive. \u00D6ffne dann die Datei auf Deinem Mobiltelefon.\n\nZum Herunterladen, scanne diesen Code mit Deinem Mobiltelefon: +IntroMobileApp = Verfolge Deine Investitionen unterwegs.\n\nSpeichere Deine Datei als \u201Ebin\u00E4r\u201C oder \u201Epasswortgesch\u00FCtzt\u201C auf einem Cloud-Speicheranbieter wie iCloud, Google Drive oder OneDrive. \u00D6ffne dann die Datei auf Deinem Mobiltelefon.\n\nZum Herunterladen scanne diesen Code mit Deinem Mobilger\u00E4t: IntroNewAndNoteworthyText = \u00DCbersicht der neuesten \u00C4nderungen in Portfolio Performance @@ -1191,7 +1191,7 @@ LabelCrosshair = Fadenkreuz LabelCurrencies = W\u00E4hrungen -LabelCurrencyConverter = W\u00E4hrungsrechner +LabelCurrencyConverter = W\u00E4hrungsumrechner LabelCurrentConfiguration = Aktuelle Konfiguration @@ -1351,7 +1351,7 @@ LabelJSONFactor = Faktor (f\u00FCr Kurse) LabelJSONFactorHint = Ein Faktor, mit dem alle Kurse (Schluss, Hoch, Tief) multipliziert werden. -LabelJSONPathHint = Der Pfad muss ein Array mit Datum oder Schlusskurs ergeben.\nPP verwendet die Bibliothek https://github.com/json-path/JsonPath.\n\nBeispiel JSON:\n\n{\n "isin": "IE00B3WJKG14",\n "data": [\n { "close": 11.756, "date": "2020-02-14" },\n { "close": 11.75, "date": "2020-02-13" }]\n}\n\nPfad zu Datum: $.data[*].date\nPfad zu Kurs: $.data[*].close +LabelJSONPathHint = Der Pfad muss ein Array mit Datum oder Schlusskurs ergeben.\nPortfolio Performance verwendet die Bibliothek https://github.com/json-path/JsonPath.\n\nBeispiel JSON:\n\n{\n "isin": "IE00B3WJKG14",\n "data": [\n { "close": 11.756, "date": "2020-02-14" },\n { "close": 11.75, "date": "2020-02-13" }]\n}\n\nPfad zu Datum: $.data[*].date\nPfad zu Kurs: $.data[*].close LabelJSONPathToClose = Pfad zu Kurs @@ -1407,6 +1407,8 @@ LabelMissingQuotes = Fehlende Kurse: LabelMissingQuotes_Decsription = An diesen Terminen sollte es laut Handelskalender einen Wertpapierkurs geben, aber der Kurs fehlt. +LabelMobileApp = Mobile App + LabelNamePlusCopy = {0} (Kopie) LabelNet = Netto @@ -1491,7 +1493,7 @@ LabelPortfolioPerformanceFile = Portfolio Performance Datei LabelPortfolioRateNotAvailable = F\u00FCr den gegebenen Zeitraum l\u00E4sst sich keine sinnvolle Quote errechnen. Das kann daran liegen, dass es keine positive Wertentwicklung gab oder dass nur Erstattungen gebucht wurden. -LabelPortfolioTaxRate = Portfolio-Steuersatz +LabelPortfolioTaxRate = Portfolio-Steuerquote LabelPortfolioTimeMachine = Portfolio Time Machine @@ -1499,15 +1501,15 @@ LabelPortfolios = Depots LabelPreTax = Vor Steuern -LabelPreviousTradingDay = Vorheriger Handelstag +LabelPreviousTradingDay = Voriger Handelstag LabelPurchaseTransactionsOnly = Nur K\u00E4ufe -LabelQuandlCode = Quandl Code +LabelQuandlCode = Quandl-Code LabelQuandlColumnNameQuote = Spaltenname Kurs -LabelQuandlColumnNameQuoteHint = Name der Spalte, die den Aktienkurs enth\u00E4lt.\nWird kein Name angegeben, verwendet PP die Spalte "Close" oder "Net Asset Value". +LabelQuandlColumnNameQuoteHint = Name der Spalte, die den Aktienkurs enth\u00E4lt.\nWird kein Name angegeben, verwendet Portfolio Performance die Spalte "Close" oder "Net Asset Value". LabelQuote = Kursnotierung @@ -1595,7 +1597,7 @@ LabelSecurityCalendarToolTip = Kalender der B\u00F6rse zur Ermittlung fehlender LabelSecurityLatestPrice = Wertpapier: letzter Kurs -LabelSecurityPerformance = Wertpapier Performance +LabelSecurityPerformance = Wertpapier-Performance LabelSecurityTransfer = Wertpapierumbuchung @@ -1621,7 +1623,7 @@ LabelStatementOfAssets = Verm\u00F6gensaufstellung LabelStatementOfAssetsHistory = Verm\u00F6gensaufstellung - Historie -LabelStatementOfAssetsHoldings = Verm\u00F6gensaufstellung - Best\u00E4nde +LabelStatementOfAssetsHoldings = Verm\u00F6gensaufstellung - Bestand LabelSuffix_HICP = (HVPI) @@ -1717,7 +1719,7 @@ LabelViewReBalancing = Rebalancing LabelViewStackedChart = Fl\u00E4chendiagramm -LabelViewStackedChartActualValue = Gestapeltes Fl\u00E4chendiagramm (Istwert) +LabelViewStackedChartActualValue = Gestapeltes Fl\u00E4chendiagramm (Ist-Wert) LabelViewTaxonomyDefinition = Definition der Klassifizierung @@ -1793,7 +1795,7 @@ MenuConfirmDeleteAllTransactions = Alle Buchungen f\u00FCr das Wertpapier {0} l\ MenuConvertToBuy = In Kaufbuchung umwandeln -MenuConvertToBuySell = In Kauf-/Verkaufbuchung umwandeln +MenuConvertToBuySell = In Kauf-/Verkaufsbuchung umwandeln MenuConvertToDelivery = In Ein-/Auslieferung umwandeln @@ -1803,7 +1805,7 @@ MenuConvertToInboundDelivery = In Einlieferung umwandeln MenuConvertToOutboundDelivery = In Auslieferung umwandeln -MenuConvertToSell = In Verkaufbuchung umwandeln +MenuConvertToSell = In Verkaufsbuchung umwandeln MenuCreateAccountOrTransaction = Neues Konto oder Buchung anlegen @@ -1903,7 +1905,7 @@ MenuSettingsNew = Neu... MenuShow = Anzeigen -MenuShowHideColumns = Spalten anzeigen / verstecken +MenuShowHideColumns = Spalten anzeigen / ausblenden MenuShowInformationPane = Informationsfenster anzeigen @@ -1985,7 +1987,7 @@ MsgErrorAccountNotExist = Es ist kein Konto vorhanden.\nBitte erstellen Sie ein MsgErrorConvertToBuySellCurrencyMismatch = Buchung in der W\u00E4hrung {0} kann nicht auf Konto ''{2}'' mit der W\u00E4hrung {1} gebucht werden. -MsgErrorConvertedAmount = Rechnung stimmt nicht: Umgerechneter Betrag ergibt sich nicht aus Betrag und Wechselkurs +MsgErrorConvertedAmount = Berechnung stimmt nicht: Umgerechneter Betrag ergibt sich nicht aus Betrag und Wechselkurs MsgErrorDividendsYearBetween1900AndNow = Jahreszahl muss zwischen 1900 und {0} sein. @@ -1993,7 +1995,7 @@ MsgErrorExchangeMissing = B\u00F6rsenplatz fehlt f\u00FCr ''{0}'' MsgErrorMinimumHeightRequired = Es ist eine Mindesth\u00F6he von {0} erforderlich. Man muss den Abstandshalter immer noch mit der Maus bedienen k\u00F6nnen. -MsgErrorMissingQuandlCode = Fehlender oder unvollst\u00E4ndiger Quandl Code +MsgErrorMissingQuandlCode = Fehlender oder unvollst\u00E4ndiger Quandl-Code MsgErrorNoInvestmentVehicleFoundAtURL = Kein Wertpapier unter {0} gefunden @@ -2007,7 +2009,7 @@ MsgErrorSavingIniFile = Fehler beim Speichern der ini Datei: {0} MsgErrorTradeCollectionWithErrors = Fehler bei der Berechnung von Trades -MsgErrorUpdating = Fehler beim Update +MsgErrorUpdating = Fehler beim Aktualisieren MsgHintNoAttributesConfigured = Keine Attribute vom Typ ''{0}'' konfiguriert.\nJetzt konfigurieren @@ -2021,11 +2023,11 @@ MsgInfoChangingCurrencyNotPossible = Es existieren bereits Buchungen zu diesem W MsgInfoRetiredSecurities = Wenn ein Wertpapier als "inaktiv" markiert ist:\n* Das Wertpapier wird nicht mehr in Dropdowns angezeigt, um neue Transaktionen zu erstellen, z. B. Kauf- und Verkaufsdialoge.\n* Die historischen Kurse werden nicht automatisch aktualisiert - nur wenn sie \u00FCber das Online-Men\u00FC (Strg-U K) aktualisiert werden. -MsgInvalidImage = Bilddatei fehlerhaft +MsgInvalidImage = Ung\u00FCltige Bilddatei MsgInvalidImageDetail = Die Datei ''{0}'' scheint kein Bild zu sein oder konnte nicht gelesen werden. M\u00F6glicherweise wird das Bildformat nicht unterst\u00FCtzt. -MsgJavaVersionTooOldForLetsEncrypt = Die Java-Version ist zu alt. Das SSL-Zertifikat des Update Servers wird nicht akzeptiert werden.\nPP ben\u00F6tigt mindestens Version 1.8.0_101, l\u00E4uft aber gerade auf {0}. +MsgJavaVersionTooOldForLetsEncrypt = Die Java-Version ist zu alt. Das SSL-Zertifikat des Update-Servers wird nicht akzeptiert werden.\nPortfolio Performance ben\u00F6tigt mindestens Version 1.8.0_101, l\u00E4uft aber gerade auf {0}. MsgLoadingFile = Lade {0} @@ -2045,7 +2047,7 @@ MsgNoIssuesFound = Keine Probleme gefunden. MsgNoProfileFound = Kein Installationsprofil gefunden. L\u00E4uft die Anwendung in der IDE? -MsgNoUpdatesAvailable = Keine Updates vorhanden. +MsgNoUpdatesAvailable = Keine Aktualisierungen vorhanden. MsgOpenFile = {0} \u00F6ffnen @@ -2073,7 +2075,7 @@ MsgUpdateNoWritePermissions = Berechtigung zur Installation des Updates fehlt.\n MsgUpdateRequiresLatestJavaVersion = Diese Version ben\u00F6tigt Java {0}.\n\nWenn Sie Windows oder macOS verwenden, sollten Sie Portfolio Performance herunterladen, das die richtige Java-Laufzeitumgebung direkt im Download enth\u00E4lt.\n\nUnter Linux installieren Sie Java Runtime Environment {0} mit Ihrem bevorzugten Paketmanager.\n\nZum Beispiel:\n\nsudo apt install openjdk-{0}-jre\nsudo update-alternatives --config java -MsgUpdateRunning32BitOn64BitOS = 32-Bit Java auf einem 64-Bit Betriebssystem erkannt: statt der Online Aktualisierung, lade die 64-Bit Version neu. +MsgUpdateRunning32BitOn64BitOS = 32-Bit Java auf einem 64-Bit Betriebssystem erkannt: statt der Online-Aktualisierung, lade die 64-Bit Version neu. MsgUpdatedXEntries = {0} Eintr\u00E4ge aktualisiert @@ -2081,15 +2083,15 @@ MsgUpdatingDashboardData = Berechne Dashboard... MsgUpdatingExchangeRates = Wechselkurse von {0} aktualisieren -MsgWarningPieChartNoValues = Kuchendiagramm ohne Werte mit dem selektierten Filter +MsgWarningPieChartNoValues = Kreisdiagramm ohne Werte mit dem selektierten Filter -MsgWarningPieChartWithNegativeValues = Achtung: Negative Werte k\u00F6nnen im Kuchendiagramm nicht dargestellt werden und wurden ausgelassen +MsgWarningPieChartWithNegativeValues = Achtung: Negative Werte k\u00F6nnen im Kreisdiagramm nicht dargestellt werden und wurden ausgelassen MyDividends24ConfirmUpload = Achtung: Beim Import wird dein bestehendes Depot auf myDividends24 \u00FCberschrieben MyDividends24MissingAPIKey = myDividends24 API-Schl\u00FCssel ist nicht in den Einstellungen hinterlegt. -MyDividends24MsgUploading = Best\u00E4nde auf myDividends24 hochladen +MyDividends24MsgUploading = Bestand auf myDividends24 hochladen MyDividends24UploadSuccessfulMsg = Der Upload zu myDividends24 wurde erfolgreich abgeschlossen @@ -2109,7 +2111,7 @@ NewFileWizardSecurityDescription = In der Ansicht 'Wertpapiere' k\u00F6nnen sp\u NewFileWizardSecurityTitle = Wertpapiere hinzuf\u00FCgen -NewFileWizardTaxonomyDescription = Klassifizierungen erm\u00F6glichen die Analyse des Gesamtportfolios\nmit Hilfe von Kuchen- und Fl\u00E4chendiagrammen sowie Baumkarten. +NewFileWizardTaxonomyDescription = Klassifizierungen erm\u00F6glichen die Analyse des Gesamtportfolios\nmit Hilfe von Kreis- und Fl\u00E4chendiagrammen sowie Baumkarten. NewFileWizardTaxonomyTitle = Klassifizierungen hinzuf\u00FCgen @@ -2123,9 +2125,9 @@ PDFImportDebugTextExtraction = Debug: Text aus PDF extrahieren PDFImportErrorParsingDocument = Fehler beim Einlesen oder Umwandeln der PDF-Datei: {0} (F\u00FCr Details, siehe Fehlerprotokoll) -PDFImportFilterName = PDF Dokument (*.pdf;*.zip) +PDFImportFilterName = PDF-Dokument (*.pdf, *.zip) -PDFImportWizardAssistant = PDF Import Assistent +PDFImportWizardAssistant = PDF-Import-Assistent PDFImportWizardDescription = Die unten stehenden Buchungen werden erstellt, sofern sie nicht durchgestrichen sind.\n\u00C4nderungen k\u00F6nnen mit Hilfe des Kontextmen\u00FCs vorgenommen werden. @@ -2195,7 +2197,7 @@ PrefBackupLocation = Backup-Speicherort PrefCheckOnStartup = Beim &Start nach Aktualisierungen suchen -PrefCreateBackupBeforeSaving = Automatisch Sicherheitskopie vor dem Speichern erstellen (*.backup.xml) +PrefCreateBackupBeforeSaving = Automatisch Sicherheitskopie vor dem Speichern erstellen PrefDescriptionAlphaVantage = Alpha Vantage Inc. ist ein Anbieter von kostenlosen APIs f\u00FCr Echtzeit- und historische Daten von Aktien, physischen sowie digitalen/kryptographischen W\u00E4hrungen.\n\nMit dem kostenlosen API-Schl\u00FCssel kann man bis zu 5 Anfragen pro Minute machen. Alpha Vantage verkauft verschiedene Premium API-Schl\u00FCssel, mit denen bis zu 600 Anfragen pro Minute m\u00F6glich sind.\n\nDer kostenlose API-Schl\u00FCssel ist unter diesem Link erh\u00E4ltlich: @@ -2207,7 +2209,7 @@ PrefDescriptionFinnhub = Daten von institutioneller Qualit\u00E4t mit einem gro\ PrefDescriptionLeeway = PWP Leeway UG bietet Kursdaten f\u00FCr Aktien, ETFs, Indizes, Fonds, W\u00E4hrungen und Kryptow\u00E4hrungen.\n\nHinweis:\nWertpapiere werden \u00FCber die ISIN gesucht.\nKurse sind auch in Fremdw\u00E4hrungen verf\u00FCgbar.\n\nBeschr\u00E4nkungen (kostenlos):\n* Nur f\u00FCr den pers\u00F6nlichen Gebrauch\n* 50 API-Aufrufe/Tag\n* Ca. 1.000 Wertpapiere im API-Paket\n\nDer kostenlose API-Schl\u00FCssel ist unter diesem Link erh\u00E4ltlich: -PrefDescriptionMyDividends24 = Die automatisierte \u00DCbertragung des Aktienbestands von Portfolio Performance in das pers\u00F6nliche Depot bei myDividends24 erm\u00F6glicht es dem Nutzer, zuk\u00FCnftige Dividendenzahlungen von seinem Smartphone aus einfach zu verfolgen. Diese praktische Funktion kann dabei helfen, Investitionen effektiver zu \u00FCberwachen. \n\nBefolge daf\u00FCr einfach die folgenden Schritte:\n1. Lade myDividends24 im App Store oder Google Play Store herunter\n2. Erstelle ein Account und generiere unter "Einstellungen" einen API-Schl\u00FCssel\n3. Hinterlege den API-Schl\u00FCssel in den Einstellungen von Portfolio Performance\n4. Dr\u00FCcke im Men\u00FC oben auf "myDividends24 hochladen" +PrefDescriptionMyDividends24 = Die automatisierte \u00DCbertragung des Aktienbestands von Portfolio Performance in das pers\u00F6nliche Depot bei myDividends24 erm\u00F6glicht es dem Nutzer, zuk\u00FCnftige Dividendenzahlungen von seinem Smartphone aus einfach zu verfolgen. Diese praktische Funktion kann dabei helfen, Investitionen effektiver zu \u00FCberwachen. \n\nBefolge daf\u00FCr einfach die folgenden Schritte:\n1. Lade myDividends24 im App Store oder Google Play Store herunter.\n2. Erstelle einen Account und generiere unter "Einstellungen" einen API-Schl\u00FCssel.\n3. Hinterlege den API-Schl\u00FCssel in den Einstellungen von Portfolio Performance.\n4. Dr\u00FCcke im Men\u00FC oben auf "myDividends24 hochladen". PrefDescriptionPortfolioReport = Synchronisierung der Daten mit dem Portfolio Report Server. @@ -2215,7 +2217,7 @@ PrefDescriptionProxy = Der Proxy-Server wird verwendet um Kurse, Wechselkurse, V PrefDescriptionQuandl = Quandl ist eine Plattform f\u00FCr finanzielle, wirtschaftliche und alternative Daten, die Investmentprofis dient.\n\nUm Quandl nutzen zu k\u00F6nnen, muss ein API-Schl\u00FCssel hinterlegt werden. Authentifizierte Benutzer von kostenlosen Daten-Feeds haben ein Parallelit\u00E4tslimit von eins. Das hei\u00DFt, sie k\u00F6nnen jeweils einen Abruf von Daten t\u00E4tigen und einen weiteren Abruf in der Warteschlange haben.\n\nDer kostenlose API-Schl\u00FCssel ist unter diesem Link erh\u00E4ltlich: -PrefDescriptionTwelveData = Twelve Data ist ein technologieorientiertes Unternehmen, das Finanzmarktdaten und Finanzinstrumente anbietet.\nDie zugeh\u00F6rigen Handelspl\u00E4tze werden \u00FCber die Market identifier codes (MIC) nach ISO-10383 ermittelt.\n\nLimits (kostenlos):\n* Nur f\u00FCr den pers\u00F6nlichen Gebrauch\n* 800 API-Aufrufe/Tag\n* 8 API-Aufrufe/Minute\n* Nur US-Marktdaten\n\nDer kostenlose API-Schl\u00FCssel ist unter diesem Link erh\u00E4ltlich: +PrefDescriptionTwelveData = Twelve Data ist ein technologieorientiertes Unternehmen, das Finanzmarktdaten und Finanzinstrumente anbietet.\nDie zugeh\u00F6rigen Handelspl\u00E4tze werden \u00FCber die Market identifier codes (MIC) nach ISO 10383 ermittelt.\n\nLimits (kostenlos):\n* Nur f\u00FCr den pers\u00F6nlichen Gebrauch\n* 800 API-Aufrufe/Tag\n* 8 API-Aufrufe/Minute\n* Nur US-Marktdaten\n\nDer kostenlose API-Schl\u00FCssel ist unter diesem Link erh\u00E4ltlich: PrefDivvyDiaryAPIKey = DivvyDiary API-Schl\u00FCssel @@ -2257,9 +2259,9 @@ PrefMsgLanguageConfig = F\u00FCr den Wechsel der Sprache ist ein Neustart des Pr PrefMyDividends24APIKey = myDividends24 API-Schl\u00FCssel -PrefNoteIndirectQuotation = Die Mengennotierung gibt den Preis einer Einheit der inl\u00E4ndischen\nW\u00E4hrung in Einheiten der ausl\u00E4ndischen W\u00E4hrung an (am Beispiel von\nEuropa und den USA aus europ\u00E4ischer Sicht: Dollar je Euro). Dagegen\ngibt die Preisnotierung den Preis einer Einheit der ausl\u00E4ndischen\nW\u00E4hrung in Einheiten der inl\u00E4ndischen W\u00E4hrung an (Euro je Dollar\naus europ\u00E4ischer Sicht).\n\nIn der Eurozone, Gro\u00DFbritannien, Australien und Neuseeland wird heute\nmehrheitlich die Mengennotierung verwendet, w\u00E4hrend ansonsten die\nPreisnotierung \u00FCblich ist, insbesondere auch in der Schweiz.\n\nQuelle: https://de.wikipedia.org/wiki/Wechselkurs\n\n\nBeispiele:\n\nMengennotierung: EUR/USD 1,1232\n"F\u00FCr einen Euro bekommt man 1,1232 US-Dollar."\n\nPreisnotierung: USD/EUR 0,89\n"F\u00FCr einen US-Dollar muss man 0,89 Euro bezahlen." +PrefNoteIndirectQuotation = Die Mengennotierung gibt den Preis einer Einheit der inl\u00E4ndischen W\u00E4hrung in Einheiten der ausl\u00E4ndischen W\u00E4hrung an (am Beispiel von Europa und den USA aus europ\u00E4ischer Sicht: Dollar je Euro). Dagegen gibt die Preisnotierung den Preis einer Einheit der ausl\u00E4ndischen W\u00E4hrung in Einheiten der inl\u00E4ndischen W\u00E4hrung an (Euro je Dollar aus europ\u00E4ischer Sicht).\n\nIn der Eurozone, Gro\u00DFbritannien, Australien und Neuseeland wird heute mehrheitlich die Mengennotierung verwendet, w\u00E4hrend ansonsten die Preisnotierung \u00FCblich ist, insbesondere auch in der Schweiz.\n\nQuelle: https://de.wikipedia.org/wiki/Wechselkurs\n\n\nBeispiele:\n\nMengennotierung: EUR/USD 1,1232\n"F\u00FCr einen Euro bekommt man 1,1232 US-Dollar."\n\nPreisnotierung: USD/EUR 0,89\n"F\u00FCr einen US-Dollar muss man 0,89 Euro bezahlen." -PrefNoteStoreSettingsNextToFile = Die GUI-Einstellungen enthalten Konfigurationen wie die Startseite,\ndie Breite einiger Spalten und Fensterbereiche, zuletzt aufgeklappte\nKnoten in den Klassifizierungen, und so weiter.\n\nNormalerweise werden die GUI-Einstellungen versteckt im 'workspace'\nVerzeichnis gespeichert. Sie k\u00F6nnen aber auch als '.settings' Datei\nneben der Portfolio Performance Datei gespeichert werden, um sie\neinfacher auf verschiedene Rechner zu synchronisieren.\n\nAchtung: Die Einstellungen werden nicht verschoben. Um die\nEinstellungen zu erhalten, bietet sich folgendes Vorgehen an:\nDatei \u00F6ffnen -> dann Checkbox hier \u00E4ndern -> Datei unter neuem\nNamen speichern. +PrefNoteStoreSettingsNextToFile = Die GUI-Einstellungen enthalten Konfigurationen wie die Startseite, die Breite einiger Spalten und Fensterbereiche, zuletzt aufgeklappte Knoten in den Klassifizierungen, und so weiter.\n\nNormalerweise werden die GUI-Einstellungen versteckt im 'workspace' Verzeichnis gespeichert. Sie k\u00F6nnen aber auch als '.settings' Datei neben der Portfolio Performance Datei gespeichert werden, um sie einfacher auf verschiedene Rechner zu synchronisieren.\n\nAchtung: Die Einstellungen werden nicht verschoben. Um die Einstellungen zu erhalten, bietet sich folgendes Vorgehen an: Datei \u00F6ffnen -> dann Checkbox hier \u00E4ndern -> Datei unter neuem Namen speichern. PrefPortfolioReportAPIKey = Portfolio Report API-Schl\u00FCssel @@ -2323,13 +2325,13 @@ PresetsPrefPageTime = Uhrzeit PresetsPrefPageTitle = Voreinstellungen -RebalanceAmbiguousTooltip = Dieses Rebalancing Ergebnis ist mehrdeutig.\n\nDurch Verfeinern der Taxonomie oder durch Ausschlie\u00DFen von Wertpapieren vom Rebalancing kann die Mehrdeutigkeit behoben werden. +RebalanceAmbiguousTooltip = Dieses Rebalancing-Ergebnis ist mehrdeutig.\n\nDurch Verfeinern der Taxonomie oder durch Ausschlie\u00DFen von Wertpapieren vom Rebalancing kann die Mehrdeutigkeit behoben werden. RebalanceInexactTooltip = Dieses Rebalancing-Ergebnis ist nicht exakt, weil es keine exakte L\u00F6sung gibt.\n\nDiese L\u00F6sung minimiert den mittleren quadratischen Fehler unter der Nebenbedingung, dass die Rebalancing-Werte sich zu 0 addieren m\u00FCssen.\n\nDurch Vergr\u00F6bern der Taxonomie oder durch Einschlie\u00DFen von weiteren Wertpapieren beim Rebalancing kann eine genaue L\u00F6sung erm\u00F6glicht werden. SearchSecurityWizardPageSymbolAlreadyExistsInfo = Ein Wertpapier mit dem Symbol ''{0}'' existiert bereits. -SecuritiesChart_NoDataMessage_NoHoldings = Keine Best\u00E4nde vorhanden +SecuritiesChart_NoDataMessage_NoHoldings = Kein Bestand vorhanden SecuritiesChart_NoDataMessage_NoPrices = Keine Kurse vorhanden @@ -2361,7 +2363,7 @@ SecurityMenuAddEvent = Ereignis... SecurityMenuAddNewSecurity = Wertpapier hinzuf\u00FCgen -SecurityMenuAddNewSecurityDescription = Suche anhand von Ticker-Symbol, ISIN, oder Name nach\nWertpapieren (direkt im Browser findet man evtl. mehr). +SecurityMenuAddNewSecurityDescription = Suche anhand von Ticker-Symbol, ISIN, oder Name nach\nWertpapieren (direkt im Browser findet man eventuell mehr). SecurityMenuAddPrice = Neu @@ -2563,7 +2565,7 @@ TooltipMaxDurationLowToHigh = L\u00E4ngste Recovery Time (Zeit zwischen einem Ti TooltipPortfolioFeeRate = Portfolio-Geb\u00FChrenquote\n\nGeb\u00FChren / (Kurserfolge + Realisierte Erfolge + Ertr\u00E4ge) -TooltipPortfolioTaxRate = Portfolio-Steuersatz\n\nSteuern / (realisierte und nicht realisierte Kurserfolge + Ertr\u00E4ge - Geb\u00FChren) +TooltipPortfolioTaxRate = Portfolio-Steuerquote\n\nSteuern / (realisierte und nicht realisierte Kurserfolge + Ertr\u00E4ge - Geb\u00FChren) TooltipQuoteAtDate = {0} vom {1} diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_es.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_es.properties index ed6fc7419c..90b4529661 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_es.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_es.properties @@ -2197,7 +2197,7 @@ PrefBackupLocation = Ubicaci\u00F3n de la copia de seguridad PrefCheckOnStartup = Buscar a&ctualizaciones al iniciar -PrefCreateBackupBeforeSaving = Crear autom\u00E1ticamente una copia de seguridad antes de guardar un archivo (*.backup.xml) +PrefCreateBackupBeforeSaving = Crear autom\u00E1ticamente una copia de seguridad antes de guardar un archivo PrefDescriptionAlphaVantage = Alpha Vantage Inc. es un proveedor de APIs gratuitas para tiempo real y datos hist\u00F3ricos sobre acciones, divisas y criptomonedas\n\nAlpha Vantage es gratuita, pero debe registrarse para obtener una clave de API.\n\nPor favor siga este enlace para inscribirse: @@ -2259,9 +2259,9 @@ PrefMsgLanguageConfig = Para cambiar el idioma es necesario reiniciar la aplicac PrefMyDividends24APIKey = Clave API de myDividends24 -PrefNoteIndirectQuotation = Las cotizaciones que usan la moneda nacional del pa\u00EDs para el precio del activo\n(por ejemplo, EUR 0.9009 = USD 1.00 en la Eurozona) se denominan\ncotizaciones directas (desde la perspectiva de ese pa\u00EDs)\ny se usan en la mayor\u00EDa de los paises.\n\nLas cotizaciones que usan la moneda local como moneda de unidad\n(por ejemplo, USD 1.11 = EUR 1.00 en la Eurozona) se conocen\ncomo cotizaciones indirectas o cotizaciones de cantidad, y se usan\nen peri\u00F3dicos brit\u00E1nicos, aunque tambi\u00E9n son comunes en Australia,\nNueva Zelanza y la Eurozona.\n\nFuente: https://es.wikipedia.org/wiki/Tasa_de_cambio\n\n\nEjemplos:\n\nCotizaci\u00F3n Indirecta (Cantidad): EUR/USD 1.1232\n"Por cada Euro, se obtienen 1.1232 D\u00F3lares USA."\n\nCotizaci\u00F3n Directa (Precio): USD/EUR 0.89\n"Un D\u00F3lar USA cuesta 0.89 Euros." +PrefNoteIndirectQuotation = Las cotizaciones que usan la moneda nacional del pa\u00EDs para el precio del activo (por ejemplo, EUR 0.9009 = USD 1.00 en la Eurozona) se denominan\ncotizaciones directas (desde la perspectiva de ese pa\u00EDs) y se usan en la mayor\u00EDa de los paises.\n\nLas cotizaciones que usan la moneda local como moneda de unidad (por ejemplo, USD 1.11 = EUR 1.00 en la Eurozona) se conocen como cotizaciones indirectas o cotizaciones de cantidad, y se usan en peri\u00F3dicos brit\u00E1nicos, aunque tambi\u00E9n son comunes en Australia, Nueva Zelanza y la Eurozona.\n\nFuente: https://es.wikipedia.org/wiki/Tasa_de_cambio\n\n\nEjemplos:\n\nCotizaci\u00F3n Indirecta (Cantidad): EUR/USD 1.1232\n"Por cada Euro, se obtienen 1.1232 D\u00F3lares USA."\n\nCotizaci\u00F3n Directa (Precio): USD/EUR 0.89\n"Un D\u00F3lar USA cuesta 0.89 Euros." -PrefNoteStoreSettingsNextToFile = Los ajustes de interfaz gr\u00E1fica de usuario contienen configuraciones\ntales como la p\u00E1gina de inicio, ancho de algunas columnas y \u00E1reas de\nla ventana, los nodos expandidos de la vista de clasificaci\u00F3n, y m\u00E1s.\n\nPor defecto, la configuraci\u00F3n de interfaz gr\u00E1fica de usuario se almacena\noculta en la carpeta 'workspace'. Tambi\u00E9n es posible almacenarla en\nun archivo '.settings' junto al propio Portfolio Performance. Eso\nfacilita la sincronizaci\u00F3n a trav\u00E9s de m\u00FAltiples PCs.\n\nAtenci\u00F3n:. La configuraci\u00F3n de la GUI no se migra. Para mantener\nla configuraci\u00F3n actual, haga lo siguiente: Abra un archivo de\nPortfolio Performance -> cambie la casilla de verificaci\u00F3n -> guarde el fichero con un nuevo nombre. +PrefNoteStoreSettingsNextToFile = Los ajustes de interfaz gr\u00E1fica de usuario contienen configuraciones tales como la p\u00E1gina de inicio, ancho de algunas columnas y \u00E1reas de la ventana, los nodos expandidos de la vista de clasificaci\u00F3n, y m\u00E1s.\n\nPor defecto, la configuraci\u00F3n de interfaz gr\u00E1fica de usuario se almacena oculta en la carpeta 'workspace'. Tambi\u00E9n es posible almacenarla en un archivo '.settings' junto al propio Portfolio Performance. Eso facilita la sincronizaci\u00F3n a trav\u00E9s de m\u00FAltiples PCs.\n\nAtenci\u00F3n:. La configuraci\u00F3n de la GUI no se migra. Para mantener la configuraci\u00F3n actual, haga lo siguiente: Abra un archivo de\nPortfolio Performance -> cambie la casilla de verificaci\u00F3n -> guarde el fichero con un nuevo nombre. PrefPortfolioReportAPIKey = Clave API de Portfolio Report diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_fr.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_fr.properties index a9cb62cf71..7a44445add 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_fr.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_fr.properties @@ -648,7 +648,7 @@ ColumnTTWRORpa = TTWROR p.a. ColumnTTWRORpa_Option = TTWROR p.a. {0} -ColumnTargetCurrency = Device cible +ColumnTargetCurrency = Devise cible ColumnTargetCurrencyToolTip = Devise cible (applicable uniquement pour les taux de change, sinon ne s\u00E9lectionner aucune devise) @@ -862,7 +862,7 @@ HeatmapOrnamentAverage = Moyenne HeatmapOrnamentGeometricMean = Moyenne g\u00E9om\u00E9trique -HeatmapOrnamentStandardDeviation = D\u00E9viation standard +HeatmapOrnamentStandardDeviation = \u00C9cart-type HeatmapOrnamentSum = Somme @@ -2198,7 +2198,7 @@ PrefBackupLocation = Emplacement de sauvegarde PrefCheckOnStartup = &V\u00E9rifier mises \u00E0 jour au lancement -PrefCreateBackupBeforeSaving = Automatiquement cr\u00E9er un fichier de restauration avant de sauvegarder (*.backup.xml) +PrefCreateBackupBeforeSaving = Automatiquement cr\u00E9er un fichier de restauration avant de sauvegarder PrefDescriptionAlphaVantage = Alpha Vantage Inc. est un fournisseur d'API gratuites pour les donn\u00E9es en temps r\u00E9el et historiques sur les actions, les devises physiques et les devises num\u00E9riques/crypto.\n\nPour utiliser Alpha Vantage, vous avez besoin d'une clef API. La clef API gratuite autorise jusqu'\u00E0 5 requ\u00EAtes par minute. Alpha Vantage propose diverses clefs API premium \u00E0 l'achat qui permettent jusqu'\u00E0 600 requ\u00EAtes par minute.\n\nVeuillez suivre ce lien pour vous inscrire : @@ -2260,9 +2260,9 @@ PrefMsgLanguageConfig = Le programme doit \u00EAtre red\u00E9marr\u00E9 pour cha PrefMyDividends24APIKey = Cl\u00E9 API myDividends24 -PrefNoteIndirectQuotation = Les cotations utilisant la devise du pays comme prix\n(par exemple, 0,9009 EUR = 1,00 USD dans la zone euro) sont appel\u00E9es\ncotations directes ou cotations de prix (du point de vue de ce pays),\net sont utilis\u00E9s dans la plupart des pays.\n\nLes cotations utilisant la devise du pays comme unit\u00E9\n(par exemple, 1,11 USD = 1,00 EUR dans la zone euro) sont appel\u00E9es\ncotations indirectes ou cotations de quantit\u00E9, et sont utilis\u00E9es dans\nles journaux britanniques et en Australie, Nouvelle Z\u00E9lande et zone euro.\n\nSource : https://en.wikipedia.org/wiki/Exchange_rate\n\nExemples:\n\nCotation indirecte (quantit\u00E9): EUR / USD 1,1232\n"Pour un euro, on obtient 1,1232 USD."\n\nCotation directe (prix): 0,89 USD / EUR\n"Un USD co\u00FBte 0,89 EUR." +PrefNoteIndirectQuotation = Les cotations utilisant la devise du pays comme prix (par exemple, 0,9009 EUR = 1,00 USD dans la zone euro) sont appel\u00E9es cotations directes ou cotations de prix (du point de vue de ce pays), et sont utilis\u00E9s dans la plupart des pays.\n\nLes cotations utilisant la devise du pays comme unit\u00E9 (par exemple, 1,11 USD = 1,00 EUR dans la zone euro) sont appel\u00E9es cotations indirectes ou cotations de quantit\u00E9, et sont utilis\u00E9es dans les journaux britanniques et en Australie, Nouvelle Z\u00E9lande et zone euro.\n\nSource : https://en.wikipedia.org/wiki/Exchange_rate\n\nExemples:\n\nCotation indirecte (quantit\u00E9): EUR / USD 1,1232\n"Pour un euro, on obtient 1,1232 USD."\n\nCotation directe (prix): 0,89 USD / EUR\n"Un USD co\u00FBte 0,89 EUR." -PrefNoteStoreSettingsNextToFile = Les param\u00E8tres de l'interface graphique contiennent des configurations telles que la page de d\u00E9marrage, \nla largeur de certaines colonnes et zones de fen\u00EAtre, les n\u0153uds d\u00E9velopp\u00E9s \nde la vue de classification, et plus encore.\n\nPar d\u00E9faut, les param\u00E8tres de l'interface graphique sont stock\u00E9s cach\u00E9s dans un dossier 'workspace'. Il est \u00E9galement possible de les stocker dans un fichier '.settings' \n\u00E0 c\u00F4t\u00E9 du fichier Portfolio Performance lui-m\u00EAme. Cela facilite \nla synchronisation des param\u00E8tres sur plusieurs PC.\n\nAttention : les param\u00E8tres de l'interface graphique ne sont pas migr\u00E9s. Pour garder les\nparam\u00E8tres actuels : ouvrir un fichier Portfolio Performance -> \ncocher la case -> enregistrer le fichier sous un nouveau nom. +PrefNoteStoreSettingsNextToFile = Les param\u00E8tres de l'interface graphique contiennent des configurations telles que la page de d\u00E9marrage, la largeur de certaines colonnes et zones de fen\u00EAtre, les n\u0153uds d\u00E9velopp\u00E9s de la vue de classification, et plus encore.\n\nPar d\u00E9faut, les param\u00E8tres de l'interface graphique sont stock\u00E9s cach\u00E9s dans un dossier 'workspace'. Il est \u00E9galement possible de les stocker dans un fichier '.settings' \u00E0 c\u00F4t\u00E9 du fichier Portfolio Performance lui-m\u00EAme. Cela facilite la synchronisation des param\u00E8tres sur plusieurs PC.\n\nAttention : les param\u00E8tres de l'interface graphique ne sont pas migr\u00E9s. Pour garder les param\u00E8tres actuels : ouvrir un fichier Portfolio Performance -> cocher la case -> enregistrer le fichier sous un nouveau nom. PrefPortfolioReportAPIKey = Clef API Portfolio Report diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_it.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_it.properties index 713edb83e3..b050b4091c 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_it.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_it.properties @@ -2197,7 +2197,7 @@ PrefBackupLocation = Posizione di backup PrefCheckOnStartup = &Controlla aggiornamenti all'avvio -PrefCreateBackupBeforeSaving = Crea automaticamente una copia di backup prima del salvataggio (*.backup.xml) +PrefCreateBackupBeforeSaving = Crea automaticamente una copia di backup prima del salvataggio PrefDescriptionAlphaVantage = Alpha Vantage Inc. \u00E8 un fornitore di API gratuite per dati storici e in tempo reale su azioni, valute fisiche e valute digitali / crittografiche.\n\nPer utilizzare Alpha Vantage, \u00E8 necessaria una chiave API. La chiave API gratuita consente fino a 5 richieste al minuto. Alpha Vantage offre varie chiavi API premium per l'acquisto che consentono fino a 600 richieste al minuto.\n\nSegui questo link per iscriverti: @@ -2259,9 +2259,9 @@ PrefMsgLanguageConfig = Per cambiare la lingua, \u00E8 necessario un riavvio. PrefMyDividends24APIKey = Chiave API di myDividends24 -PrefNoteIndirectQuotation = Quotazioni che utilizzano la valuta locale di un paese come valuta del prezzo\n(ad esempio, EUR 0,9009 = USD 1,00 nella zona euro) sono noti\ncome quotazione diretta o quotazione di prezzo (dalla prospettiva di quel paese) e sono utilizzati dalla maggior parte dei paesi.\n\nQuotazioni che utilizzano la valuta locale di un paese come valuta unitaria\n(ad esempio, 1,11 USD = 1,00 EUR nella zona euro) sono noti\ncome quotazione indiretta o quotazione di quantit\u00E0 e sono utilizzati nei\ngiornali britannici e sono comuni anche in Australia, Nuova\nZelanda e Eurozona.\n\nFonte: https://en.wikipedia.org/wiki/Exchange_rate\n\n\nEsempi:\n\nQuotazione indiretta (quantit\u00E0): EUR/USD 1.1232\n"Per un euro si ottiene 1,1232 dollari."\n\nQuotazione diretta (prezzo): USD/EUR 0,89\n"Un dollaro USA costa 0,89 EUR." +PrefNoteIndirectQuotation = Quotazioni che utilizzano la valuta locale di un paese come valuta del prezzo (ad esempio, EUR 0,9009 = USD 1,00 nella zona euro) sono noti come quotazione diretta o quotazione di prezzo (dalla prospettiva di quel paese) e sono utilizzati dalla maggior parte dei paesi.\n\nQuotazioni che utilizzano la valuta locale di un paese come valuta unitaria (ad esempio, 1,11 USD = 1,00 EUR nella zona euro) sono noti come quotazione indiretta o quotazione di quantit\u00E0 e sono utilizzati nei giornali britannici e sono comuni anche in Australia, Nuova Zelanda e Eurozona.\n\nFonte: https://en.wikipedia.org/wiki/Exchange_rate\n\n\nEsempi:\n\nQuotazione indiretta (quantit\u00E0): EUR/USD 1.1232\n"Per un euro si ottiene 1,1232 dollari."\n\nQuotazione diretta (prezzo): USD/EUR 0,89\n"Un dollaro USA costa 0,89 EUR." -PrefNoteStoreSettingsNextToFile = Le impostazioni della GUI contengono configurazioni come la pagina iniziale,\nla larghezza di alcune colonne e aree della finestra, i nodi espansi\nnella visualizzazione della classificazione e altro ancora.\n\nNormalmente le impostazioni della GUI sono memorizzate nascoste nella cartella "spazio di lavoro".\n\u00C8 anche possibile memorizzarli in un file ".settings"\naccanto al file di Portfolio Performance. Questo facilita la\nsincronizzazione delle impostazioni su pi\u00F9 PC.\n\nAttenzione: le impostazioni della GUI non vengono migrate. Per mantenere le impostazioni correnti,\nprocedere come segue: aprire un file Portfolio Performance ->\ncambiare qui la casella di controllo -> quindi salvare il file con un nuovo\nnome. +PrefNoteStoreSettingsNextToFile = Le impostazioni della GUI contengono configurazioni come la pagina iniziale, la larghezza di alcune colonne e aree della finestra, i nodi espansi nella visualizzazione della classificazione e altro ancora.\n\nNormalmente le impostazioni della GUI sono memorizzate nascoste nella cartella "spazio di lavoro". \u00C8 anche possibile memorizzarli in un file ".settings" accanto al file di Portfolio Performance. Questo facilita la sincronizzazione delle impostazioni su pi\u00F9 PC.\n\nAttenzione: le impostazioni della GUI non vengono migrate. Per mantenere le impostazioni correnti, procedere come segue: aprire un file Portfolio Performance -> cambiare qui la casella di controllo -> quindi salvare il file con un nuovo nome. PrefPortfolioReportAPIKey = Portfolio Report API Key diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_nl.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_nl.properties index 19d72dc3f8..0c2039f020 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_nl.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_nl.properties @@ -17,15 +17,15 @@ AccountMenuImportCSV = CSV-bestand importeren... AccountMenuImportPDF = PDF-bestand importeren... -AccountMenuTransfer = Overboeken tussen rekeningen... +AccountMenuTransfer = Overboeken van geld... AttributeSettings = Kenmerkinstellingen AttributeSettings_LimitPrice_ColorSettings = Kleurinstellingen -AttributeSettings_LimitPrice_ColorSettings_LimitExceededNegatively = Kleur 'limiet negatief overschreden' +AttributeSettings_LimitPrice_ColorSettings_LimitExceededNegatively = Kleur voor 'limiet negatief overschreden' -AttributeSettings_LimitPrice_ColorSettings_LimitExceededPositively = Kleur 'limiet positief overschreden' +AttributeSettings_LimitPrice_ColorSettings_LimitExceededPositively = Kleur voor 'limiet positief overschreden' AttributeSettings_LimitPrice_ColorSettings_ResetColors = Resetten naar standaardinstellingen @@ -57,25 +57,25 @@ BaseCurrencySelectionPage_Title = Kies de basisvaluta BookmarkMenu_EditBookmarks = Bladwijzers instellen... -BookmarksListView_LabelAttributeReplacements = Tijdelijke aanduiding kenmerken +BookmarksListView_LabelAttributeReplacements = Placeholder (kenmerk) -BookmarksListView_LabelDefaultReplacements = Standaard tijdelijke aanduiding +BookmarksListView_LabelDefaultReplacements = Placeholder (standaard) -BookmarksListView_LabelReplaceFirstAvailable = Gebruik de eerste beschikbare tijdelijke aanduiding +BookmarksListView_LabelReplaceFirstAvailable = Gebruik de eerst beschikbare placeholder BookmarksListView_NewBookmark = Nieuwe bladwijzer BookmarksListView_addSeparator = Afstandhouder toevoegen -BookmarksListView_bookmark = Bladwijzer +BookmarksListView_bookmark = Bladwijzernaam BookmarksListView_delete = Verwijderen BookmarksListView_insertAfter = Invoegen na -BookmarksListView_insertBefore = Plaats voor +BookmarksListView_insertBefore = Invoegen voor -BookmarksListView_replacements = Invoegen vervanging +BookmarksListView_replacements = Placeholder invoegen BookmarksListView_title = Bladwijzers @@ -91,7 +91,7 @@ BtnLabelRestartLater = Later opnieuw opstarten BtnLabelRestartNow = Nu opnieuw opstarten -BtnTooltipInvertExchangeRate = Keer de wisselkoerswaarde om.\n\nLet op: deze bewerking wijzigt de notatie van de wisselkoers niet, maar deelt eenvoudig 1 door de huidige wisselkoers. +BtnTooltipInvertExchangeRate = Keer de wisselkoerswaarde om.\n\nLet op: deze bewerking wijzigt de notatie van de wisselkoers niet, maar deelt 1 door de huidige wisselkoers. CSVConfigCSVImportLabelFileJSON = JSON-bestanden (* .json) @@ -137,7 +137,7 @@ CSVImportLabelMappedToField = \u22D9\u202F{0} CSVImportLabelProvidedValue = Toegewezen -CSVImportLabelSkipLines = Skip-regels: +CSVImportLabelSkipLines = Aantal skip-regels: CSVImportLabelTarget = Type gegevens: @@ -195,31 +195,31 @@ ChartSortZA = Z-A ClientEditorLabelChart = Grafiek -ClientEditorLabelClientMasterData = Rekeningen +ClientEditorLabelClientMasterData = Metadata ClientEditorLabelGeneralData = Algemene gegevens -ClientEditorLabelHoldings = Posities +ClientEditorLabelHoldings = Bezit ClientEditorLabelPerformance = Resultaten ClientEditorLabelReports = Rapporten -ClientEditorLabelReturnsVolatility = Opbrengst/Volatiliteit +ClientEditorLabelReturnsVolatility = Rendement/Volatiliteit -ClientEditorPerformanceCalculation = Berekening +ClientEditorPerformanceCalculation = Opstelling ColumnAbsolutePerformance = Abs.Res. ColumnAbsolutePerformancePercent = Abs.Res. % -ColumnAbsolutePerformancePercent_Description = Absoluut resultaat % = Absoluut resultaat / (initi\u00EBle waarderingen + aankopen + inkomende leveringen) \n\nHet absolute resultaat in procenten is altijd beperkt tot de rapportageperiode. Met andere woorden: de aanschafwaarde is de waarde van de effectenpositie aan het begin van de rapportageperiode. \n\nHet absolute resultaat in procenten wijkt af \u200B\u200Bvan het cijfer "Vermogenswinst (actuele posities)" in die zin dat dividenden, belastingen en gerealiseerde resultaten van verkochte beleggingen zijn inbegrepen. +ColumnAbsolutePerformancePercent_Description = Absoluut resultaat in % = Absoluut resultaat / (Waarde op de begindatum + Aankopen + Inkomende leveringen) \n\nHet absolute resultaat in procenten is altijd beperkt tot de rapportageperiode. Met andere woorden: de aankoopwaarde is de waarde van de effectenpositie aan het begin van de rapportageperiode. \n\nHet absolute resultaat in procenten wijkt af \u200B\u200Bvan het "Resultaat (huidig bezit)" omdat dividenden, belastingen en resultaten zijn inbegrepen. ColumnAbsolutePerformancePercent_MenuLabel = Absoluut resultaat % ColumnAbsolutePerformancePercent_Option = Abs.Res. % {0} -ColumnAbsolutePerformance_Description = Absoluut resultaat = marktwaarde + verkopen + uitgaande leveringen + dividenden - belastingen - kosten - initi\u00EBle waarderingen - aankopen - inkomende leveringen.\n\nHet absolute resultaat is altijd beperkt tot de rapportageperiode. Met andere woorden: de aanschafwaarde is de waarde van de effectenpositie aan het begin van de rapportageperiode. \n\nHet absolute resultaat wijkt af van het cijfer "Vermogenswinst (actuele posities)", in die zin, dat dividenden, belastingen en gerealiseerde resultaten van verkochte beleggingen zijn inbegrepen. +ColumnAbsolutePerformance_Description = Absoluut resultaat = Waarde + Verkopen + Uitgaande leveringen + Dividenden - Belastingen - Kosten - Waarde op begindatum - Aankopen - Inkomende leveringen.\n\nDe waarde van het absolute resultaat is altijd beperkt tot de rapportageperiode. Met andere woorden: de aankoopwaarde is de waarde van de effectenpositie aan het begin van de rapportageperiode. \n\nHet absolute resultaat wijkt af van het "Resultaat (huidig bezit)" omdat dividenden, belastingen en resultaten zijn inbegrepen. ColumnAbsolutePerformance_MenuLabel = Absoluut resultaat @@ -235,9 +235,9 @@ ColumnAccountTo = Naar ColumnActualPercent = Weging (%) -ColumnActualValue = Actuele waarde +ColumnActualValue = Waarde (abs.) -ColumnActualValueBaseCurrency = Actuele waarde (basisvaluta) +ColumnActualValueBaseCurrency = Actuele waarde (abs., basisvaluta) ColumnAmount = Transactiewaarde (bruto) @@ -249,33 +249,33 @@ ColumnBalance_Description = Saldo van de rekening inclusief alle transacties tot ColumnBaseCurrency = Basisvaluta -ColumnCapitalGains = Vermogenswinst (FIFO, huidige posities) +ColumnCapitalGains = Resultaat (FIFO, huidig bezit) -ColumnCapitalGainsMovingAverage = Vermogenswinst (VG, huidige posities) +ColumnCapitalGainsMovingAverage = Resultaat (SMA, huidig bezit) -ColumnCapitalGainsMovingAveragePercent = Vermogenswinst % (VG, huidige posities) +ColumnCapitalGainsMovingAveragePercent = Resultaat % (SMA, huidig bezit) -ColumnCapitalGainsMovingAveragePercent_Description = Vermogenswinst % (Voortschrijdend gemiddelde, huidige posities) = (Marktwaarde - Aankoopwaarde (voortschrijdend gemiddelde)) / Aankoopwaarde (voortschrijdend gemiddelde).\n\nDe vermogenswinst in procenten is altijd beperkt tot de rapportageperiode. Met andere woorden: de aanschafwaarde is ofwel een effectenaankoop binnen de rapportageperiode of de waardering van het effect aan het begin van de periode. \n\nDe waarde van de vermogenswinst in procenten houdt enkel rekening met de posities aan het einde van de rapportageperiode. \n\nDe aankoopwaarde wordt berekend volgens het voortschrijdend gemiddelde-principe (in tegenstelling tot FIFO). +ColumnCapitalGainsMovingAveragePercent_Description = Resultaat % (SMA, huidig bezit) = (Waarde - Aankoopwaarde op basis van voortschrijdend gemiddelde) / Aankoopwaarde op basis van voortschrijdend gemiddelde.\n\nHet resultaat in procenten is altijd beperkt tot de rapportageperiode. Met andere woorden: de aankoopwaarde is ofwel de waarde van een aankoop binnen de rapportageperiode of de waarde van de effectenpositie aan het begin van de rapportageperiode.\n\nDe waarde van het resultaat in procenten houdt uitsluitend rekening met het bezit aan het einde van de rapportageperiode. -ColumnCapitalGainsMovingAveragePercent_MenuLabel = Vermogenswinst % (voortschrijdend gemiddelde, huidige posities) +ColumnCapitalGainsMovingAveragePercent_MenuLabel = Resultaat % (SMA, huidig bezit) -ColumnCapitalGainsMovingAveragePercent_Option = Vermogenswinst (VG) % {0} +ColumnCapitalGainsMovingAveragePercent_Option = Resultaat (SMA) % {0} -ColumnCapitalGainsMovingAverage_Description = Vermogenswinst (voortschrijdend gemiddelde, huidige posities) = Marktwaarde - Aankoopwaarde (voortschrijdend gemiddelde).\n\nDe vermogenswinst is altijd beperkt tot de rapportageperiode. Met andere woorden: de aanschafwaarde is ofwel een effectenaankoop binnen de rapportageperiode of de waardering van het effect aan het begin van de periode. \n\nDe waarde van de vermogenswinst houdt enkel rekening met de posities in beleggingen aan het einde van de rapportageperiode. \n\nDe aankoopwaarde wordt berekend volgens het voortschrijdend gemiddelde-principe (in tegenstelling tot FIFO). +ColumnCapitalGainsMovingAverage_Description = Resultaat (SMA, huidig bezit) = Waarde - Aankoopwaarde op basis van voortschrijdend gemiddelde.\n\nDe waarde van het resultaat is altijd beperkt tot de rapportageperiode. Met andere woorden: de aankoopwaarde is ofwel de waarde van een aankoop binnen de rapportageperiode of de waarde van de effectenpositie aan het begin van de rapportageperiode.\n\nDe waarde van het resultaat houdt uitsluitend rekening met de effectenposities aan het einde van de rapportageperiode. -ColumnCapitalGainsMovingAverage_MenuLabel = Vermogenswinst (voortschrijdend gemiddelde, huidige posities) +ColumnCapitalGainsMovingAverage_MenuLabel = Resultaat (SMA, huidig bezit) -ColumnCapitalGainsMovingAverage_Option = Vermogenswinst (VG) {0} +ColumnCapitalGainsMovingAverage_Option = Resultaat (SMA) {0} -ColumnCapitalGainsPercent = Vermogenswinst % (FIFO, huidige posities) +ColumnCapitalGainsPercent = Resultaat % (FIFO, huidig bezit) -ColumnCapitalGainsPercent_Description = Vermogenswinst % (huidige posities) = (Marktwaarde - Aankoopwaarde (FIFO)) / Aankoopwaarde (FIFO)\n\nDe vermogenswinst in procenten is altijd beperkt tot de rapportageperiode. Met andere woorden: de aanschafwaarde is ofwel een effectentransactie binnen de rapportageperiode of de waardering van een effectenpositie aan het begin van de rapportageperiode. \n\nDe waarde van de vermogenswinst in procenten houdt enkel rekening met de effectenposities aan het einde van de rapportageperiode.\n\nDe aankoopwaarde wordt berekend volgens het FIFO-principe (First In - First Out). +ColumnCapitalGainsPercent_Description = Resultaat % (huidig bezit) = (Waarde - Aankoopwaarde (FIFO)) / Aankoopwaarde (FIFO)\n\nDe waarde van het resultaat in procenten is altijd beperkt tot de rapportageperiode. Met andere woorden: de aankoopwaarde is ofwel de waarde van een aankoop binnen de rapportageperiode of de waarde van de effectenposities aan het begin van de rapportageperiode. \n\nDe waarde van het resultaat in procenten houdt uitsluitend rekening met de effecten in bezit aan het einde van de rapportageperiode.\n\nDe aankoopwaarde wordt berekend volgens het FIFO-principe (First In, First Out). -ColumnCapitalGainsPercent_Option = Vermogenswinst % (FIFO) {0} +ColumnCapitalGainsPercent_Option = Resultaat % (FIFO) {0} -ColumnCapitalGains_Description = Vermogenswinst (huidige posities) = Marktwaarde - Aankoopwaarde (FIFO)\n\nDe vermogenswinst in procenten is altijd beperkt tot de rapportageperiode. Met andere woorden: de aanschafwaarde is ofwel een transactie binnen de rapportageperiode of de waardering van een effectenpositie aan het begin van de rapportageperiode. \n\nDe waarde van de vermogenswinst houdt enkel rekening met de effectenpositie aan het einde van de rapportageperiode.\n\nDe aankoopwaarde wordt berekend volgens het FIFO-principe (First In - First Out). +ColumnCapitalGains_Description = Resultaat (huidig bezit) = Waarde - Aankoopwaarde (FIFO)\n\nDe waarde van het resultaat is altijd beperkt tot de rapportageperiode. Met andere woorden: de aankoopwaarde is ofwel de waarde van een aankoop binnen de rapportageperiode of de waarde van de effectenposities aan het begin van de rapportageperiode.\n\nDe waarde van het resultaat houdt uitsluitend rekening met de effecten in bezit aan het einde van de rapportageperiode.\n\nDe aankoopwaarde wordt berekend volgens het FIFO-principe (First In, First Out). -ColumnCapitalGains_Option = Vermogenswinst (FIFO) {0} +ColumnCapitalGains_Option = Resultaat (FIFO) {0} ColumnCategoryKey = Categorie @@ -297,11 +297,11 @@ ColumnCount = Aantallen ColumnCountByYear = Aantallen per jaar -ColumnCreditNote = Waarde (credit) +ColumnCreditNote = Waarde (bij) ColumnCurrency = Valuta -ColumnCurrencyGains = Winsten in vreemde valuta +ColumnCurrencyGains = Resultaat op vreemde valuta ColumnCurrencyProvider = Leverancier @@ -327,57 +327,57 @@ ColumnDaysHigh = Hoogste koers van de dag ColumnDaysLow = Laagste koers van de dag -ColumnDebitNote = Waarde (debet) +ColumnDebitNote = Waarde (af) ColumnDeltaPctOfTotal = Delta % van totaalwaarde ColumnDeltaPctOfTotal_MenuLabel = Delta % van totaalwaarde -ColumnDeltaPercent = Delta % +ColumnDeltaPercent = Wegingsverschil (%) ColumnDeltaPercentIndicator = Delta % indicator -ColumnDeltaPercentRelative = Delta % (relative) +ColumnDeltaPercentRelative = Delta % (relatief) -ColumnDeltaPercentRelative_Description = Het verschil in procentpunten tussen de feitelijke en de gewenste beleggingsmix +ColumnDeltaPercentRelative_Description = Het verschil in procentpunten tussen de doelweging en de feitelijke weging. ColumnDeltaShares = Herbalanceren (aantal) -ColumnDeltaValue = Delta waarde (abs.) +ColumnDeltaValue = Waardeverschil (abs.) -ColumnDesiredAllocation = Beleggingsmix +ColumnDesiredAllocation = Doelweging (%) -ColumnDesiredAllocation_Description = De beleggingsmix wordt gebruikt om te herbalanceren en bepaalt het gewenste percentage van een belegging per categorie.\n\nDe beleggingsmix binnen een categorie moet altijd optellen tot 100%. +ColumnDesiredAllocation_Description = De doelweging (%) wordt gebruikt om te herbalanceren en bepaalt het gewenste percentage van een beleggingscategorie (als onderdeel van de beleggingsmix) of een belegging binnen een beleggingscategorie. \n\nWegingen, ook die binnen een beleggingscategorie, moeten optellen tot 100%. ColumnDetails = Details ColumnDistanceFromMovingAverage = Afstand tot VG -ColumnDistanceFromMovingAverage_Description = Procentuele afstand van huidige koers tot geselecteerd VG (= (geldend tarief / VGx) - 1) +ColumnDistanceFromMovingAverage_Description = Procentuele afstand van huidige koers tot geselecteerd SMA (= (geldend tarief / SMAx) - 1) -ColumnDistanceFromMovingAverage_Option = \u0394 tot VG{0} +ColumnDistanceFromMovingAverage_Option = \u0394 tot SMA{0} -ColumnDividendMovingAverageTotalRateOfReturn = Div% (MA) +ColumnDividendMovingAverageTotalRateOfReturn = Div% (SMA) -ColumnDividendMovingAverageTotalRateOfReturn_Description = dividendrendement (voortschrijdend gemiddelde) = som van dividendbetalingen / aankoopwaarde op basis van voortschrijdend gemiddelde \n\nLet op: als aandelen na een dividenduitbetaling worden verkocht, wordt de dividendbetaling niet verlaagd. Daarom kan het rendement worden overschat. +ColumnDividendMovingAverageTotalRateOfReturn_Description = Het Dividendrendement (SMA) = (som van Dividend) / Aankoopwaarde op basis van voortschrijdend gemiddelde.\n\nLet op: als aandelen na een dividenduitkering worden verkocht, wordt het dividend niet verlaagd. Daarom kan het rendement worden overschat. -ColumnDividendMovingAverageTotalRateOfReturn_MenuLabel = Div% (voortschrijdend gemiddelde) +ColumnDividendMovingAverageTotalRateOfReturn_MenuLabel = Div% (SMA) ColumnDividendPayment = Dividend -ColumnDividendPaymentCount = Aantal dividendbetalingen +ColumnDividendPaymentCount = Aantal dividenduitkeringen -ColumnDividendPaymentCount_MenuLabel = Aantal dividendbetalingen +ColumnDividendPaymentCount_MenuLabel = Aantal dividenduitkeringen ColumnDividendPerShare = Dividend/aandeel ColumnDividendPeriodicity = Periodiciteit -ColumnDividendPeriodicity_Description = De periodiciteit van dividendbetalingen wordt geschat op basis van de betalingen tijdens de rapportageperiode. +ColumnDividendPeriodicity_Description = De periodiciteit van dividenduitkeringen wordt geschat op basis van de uitkeringen tijdens de rapportageperiode. ColumnDividendRateOfReturnPerYear = Div%/jaar -ColumnDividendRateOfReturnPerYear_Description = Dividendrendement per jaar = dividendbetaling / koers op het moment van dividendbetaling (gemiddeld per jaar). +ColumnDividendRateOfReturnPerYear_Description = Dividendrendement per jaar = Dividend/ Koers op het moment van uitkering (gemiddeld per jaar). ColumnDividendSum = \u2211Div @@ -385,17 +385,17 @@ ColumnDividendSum_MenuLabel = Som van dividenden ColumnDividendTotalRateOfReturn = Div% -ColumnDividendTotalRateOfReturn_Description = dividendrendement = som van dividenduitbetalingen / aankoopwaarde op basis van FIFO \n\nLet op: als aandelen na een dividenduitbetaling worden verkocht, wordt de dividendbetaling niet verlaagd. Daarom kan het rendement worden overschat. +ColumnDividendTotalRateOfReturn_Description = Het dividendrendement = (som van Dividend) / Aankoopwaarde op basis van FIFO.\n\nLet op: als aandelen na een dividenduitkering worden verkocht, wordt het dividend niet verlaagd. Daarom kan het rendement worden overschat. ColumnEarnings = Opbrengsten -ColumnEarnings_Description = Divdend + Interestbetalingen +ColumnEarnings_Description = Dividenduitkeringen en Interestbetalingen ColumnEndDate = Einddatum ColumnEntity = Entiteit -ColumnEntryValue = Aankoopwaarde +ColumnEntryValue = Beginwaarde ColumnErrorMessages = Foutmeldingen @@ -403,7 +403,7 @@ ColumnExDate = Ex-datum ColumnExchangeRate = Wisselkoers -ColumnExitValue = (Verkoop)waarde +ColumnExitValue = Verkoopwaarde ColumnExpectedReturn = Verwacht rendement @@ -423,7 +423,7 @@ ColumnFeedURLLatest = URL (laatste koers) ColumnFees = Kosten -ColumnFees_Description = Betaalde kosten voor aan- en verkopen, evenals inkomende en uitgaande leveringen. +ColumnFees_Description = Betaalde kosten voor aan- en verkopen en inkomende en uitgaande leveringen. ColumnFieldType = Veldtype @@ -459,13 +459,13 @@ ColumnInterval = Interval ColumnIssue = Uitgifte -ColumnLabel = Berekeningslabel +ColumnLabel = Opstellingslabel ColumnLastDate = Laatste uitvoering -ColumnLastDividendPayment = Laatste dividendbetaling +ColumnLastDividendPayment = Laatste dividenduitkering -ColumnLastDividendPayment_MenuLabel = Datum van laatste dividendbetaling +ColumnLastDividendPayment_MenuLabel = Datum van de laatste dividenduitkering ColumnLatest = Laatste koers @@ -487,7 +487,7 @@ ColumnLevels = Niveaus ColumnMarketValue = Waarde -ColumnMarketValueBaseCurrency = Waarde (nu, in basisvaluta) +ColumnMarketValueBaseCurrency = Waarde (in basisvaluta) ColumnMaxDrawdown = MDD @@ -499,7 +499,7 @@ ColumnMetricActualNumberOfQuotes = Aantal actuele koersen ColumnMetricCompleteness = Volledigheid van historische koersen -ColumnMetricCompleteness_Description = Volledigheid is het percentage beschikbare koersen ten opzichte van het verwachte aantal koersen in het gecontroleerde interval.\n\nHet interval begint met de eerste historische koers. Het interval eindigt met de huidige datum tenzij de download gedeactiveerd is; dan eindigt het met de laatste historische koers. +ColumnMetricCompleteness_Description = De volledigheid van historische koersen is het percentage beschikbare koersen ten opzichte van het verwachte aantal koersen in het gecontroleerde interval.\n\nHet interval begint met de eerste historische koers. Het interval eindigt met de huidige datum tenzij het updaten van koersen gedeactiveerd is; dan eindigt het interval met de laatste historische koers. ColumnMetricExpectedNumberOfQuotes = Aantal verwachte koersen @@ -533,13 +533,13 @@ ColumnPerShare = Per aandeel ColumnPerShare_Description = Voor aan- en verkopen en inkomende en uitgaande leveringen bevat deze kolom de koers per aandeel.\n\nVoor dividendtransacties bevat deze kolom het brutodividend per aandeel. -ColumnPersonalDividendYield = Dividend opbrengst +ColumnPersonalDividendYield = Dividendrendement -ColumnPersonalDividendYieldMovingAverage = Dividendopbrengst (voortschrijdend gemiddelde) +ColumnPersonalDividendYieldMovingAverage = Dividendrendement (SMA) -ColumnPersonalDividendYieldMovingAverage_Description = Dividendopbrengst (voortschrijdend gemiddelde) = dividenden / aankoopkoers (berekend op basis van het voortschrijdend gemiddelde) +ColumnPersonalDividendYieldMovingAverage_Description = Dividendrendement (SMA) = Dividend / Aankoopkoers op basis van voortschrijdend gemiddelde. -ColumnPersonalDividendYield_Description = Dividendrendement = dividenden / aankoopkoers met behulp van de FIFO-methode +ColumnPersonalDividendYield_Description = Dividendrendement = Dividend / Aankoopkoers (FIFO) ColumnPortfolio = Portefeuille @@ -555,25 +555,25 @@ ColumnPurchasePrice = Aankoopkoers ColumnPurchasePriceBaseCurrency = Aankoopkoers (basisvaluta) -ColumnPurchasePriceMovingAverage = Aankoopkoers (VG) +ColumnPurchasePriceMovingAverage = Aankoopkoers (SMA) -ColumnPurchasePriceMovingAverage_Description = Aankoopkoers van gehouden aandelen berekend volgens de methode van het voortschrijdend gemiddelde. Het bedrag is exclusief (transactie)kosten en belastingen. +ColumnPurchasePriceMovingAverage_Description = Aankoopkoers van beleggingen berekend volgens de methode van het voortschrijdend gemiddelde. Het bedrag is exclusief (transactie)kosten en belastingen. -ColumnPurchasePriceMovingAverage_MenuLabel = Aankoopkoers (voortschrijdend gemiddelde) +ColumnPurchasePriceMovingAverage_MenuLabel = Aankoopkoers (SMA) -ColumnPurchasePrice_Description = Aankoopkoers van gehouden aandelen berekend met behulp van de FIFO-methode.\nHet bedrag is exclusief de (transactie)kosten en belastingen. +ColumnPurchasePrice_Description = Aankoopkoers van gehouden aandelen berekend met behulp van de FIFO-methode.\nHet bedrag is exclusief (transactie)kosten en belastingen. ColumnPurchaseValue = Aankoopwaarde -ColumnPurchaseValueBaseCurrency = Aankoopwaarde (toen, basisvaluta) +ColumnPurchaseValueBaseCurrency = Aankoopwaarde (basisvaluta) -ColumnPurchaseValueMovingAverage = Aankoopwaarde (toen, VG) +ColumnPurchaseValueMovingAverage = Aankoopwaarde (SMA) -ColumnPurchaseValueMovingAverage_Description = De aankoopwaarde van beleggingen berekend op basis van het voortschrijdend gemiddelde. De aankoopwaarde is inclusief de (transactie)kosten. +ColumnPurchaseValueMovingAverage_Description = De aankoopwaarde van beleggingen, berekend op basis van het voortschrijdend gemiddelde. De aankoopwaarde is inclusief de (transactie)kosten. -ColumnPurchaseValueMovingAverage_MenuLabel = Aankoopwaarde (voortschrijdend gemiddelde) +ColumnPurchaseValueMovingAverage_MenuLabel = Aankoopwaarde (SMA) -ColumnPurchaseValue_Description = De aankoopwaarde van beleggingen berekend op basis van de FIFO-methode. De aankoopwaarde is inclusief de (transactie)kosten. +ColumnPurchaseValue_Description = De aankoopwaarde van beleggingen, berekend op basis van de FIFO-methode. De aankoopwaarde is inclusief de (transactie)kosten. ColumnQuote = Koers @@ -601,7 +601,7 @@ ColumnRebalanceAmount = Herbalanceren (bedrag) ColumnRebalancingIndicatorAbsoluteThreshold = Absolute drempel -ColumnRebalancingIndicatorBarLength = Breedte van de indicator +ColumnRebalancingIndicatorBarLength = Breedte van de Delta %-indicator ColumnRebalancingIndicatorRelativeThreshold = Relatieve drempel @@ -609,19 +609,19 @@ ColumnReferenceAccount = Tegenrekening ColumnRetired = Inactief? -ColumnReturn = Keer terug +ColumnReturn = Rendement ColumnSecurity = Effect ColumnSecurityExchange = Beurs -ColumnSecurityType = Beleggingsinstrument +ColumnSecurityType = Type -ColumnShareInPercent = Weging (%) +ColumnShareInPercent = Belang (%) ColumnShares = Aantal -ColumnSharesOwned = Aantal in bezit +ColumnSharesOwned = Bezit ColumnSharesOwnedHoldingPeriod = Aantal ({0}. bewaarperiode) @@ -651,7 +651,7 @@ ColumnTargetCurrency = Doelvaluta ColumnTargetCurrencyToolTip = Doelvaluta (alleen van toepassing op wisselkoersen, anders geen valuta selecteren) -ColumnTargetValue = Doelwaarde +ColumnTargetValue = Doelwaarde (abs.) ColumnTaxes = Belastingen @@ -661,7 +661,7 @@ ColumnTaxonomy = Taxonomie ColumnTermCurrency = Termijnvaluta -ColumnThereofForeignCurrencyGains = daarvan valutakoerswinsten +ColumnThereofForeignCurrencyGains = daarvan wisselkoersresultaten ColumnTicker = Tickersymbool @@ -669,9 +669,9 @@ ColumnToBePctOfTotal = Doel % van totaalwaarde ColumnToBePctOfTotal_MenuLabel = Doel % van totaalwaarde -ColumnTotal = Totaal +ColumnTotal = Waarde -ColumnTransactionType = Type transactie +ColumnTransactionType = Transactietype ColumnUnrealizedCapitalGains = Ongerealiseerd resultaat @@ -693,7 +693,7 @@ ColumnWKN = WKN ColumnWeight = Weging (%) -ColumnWeight_Description = De 'weging' geeft aan welk percentage van een effect is toegewezen aan deze categorie. +ColumnWeight_Description = De 'weging' geeft aan welk percentage van een effect is toegewezen aan de bovenliggende categorie. ColumnYear = Jaar @@ -729,9 +729,9 @@ DesktopAPIIllegalURL = Ongeldige URL: {0} DesktopAPIPlatformNotSupported = Java kan geen webbrowser openen op dit besturingssysteem -DialogConsistencyChecksTitle = Resultaten van de consistentiecontroles +DialogConsistencyChecksTitle = Resultaten van de consistentiecontrole -DialogConssitencyChecksMessage = Los een gemeld probleem op door in de laatste kolom te klikken en een van de voorgestelde oplossingen te selecteren.\nVoer de consistentiecontrole opnieuw uit via het hoofdmenu. +DialogConssitencyChecksMessage = Los een gemeld probleem op door in de laatste kolom te klikken en een van de voorgestelde oplossingen te selecteren.\nDe consistentiecontrole kan op elk moment worden uitgevoerd via het hoofdmenu. DialogTaxonomyNamePrompt = Geef de taxonomie een naam @@ -767,9 +767,9 @@ EditWizardMasterDataMsgClassificationMissing = Selecteer een classificatie uit d EditWizardMasterDataMsgDuplicateClassification = ''{0}'' is tweemaal geselecteerd. -EditWizardMasterDataMsgWeightEqualsZero = Toewijzingsgewicht moet groter zijn dan 0%. +EditWizardMasterDataMsgWeightEqualsZero = Doelweging (%) moet groter zijn dan 0%. -EditWizardMasterDataMsgWeightNot100Percent = De gewichten van ''{0}'' tellen {1}% op, wat meer is dan 100%. +EditWizardMasterDataMsgWeightNot100Percent = De weging van ''{0}'' is met {1}% groter dan 100%. EditWizardMasterDataTitle = Metadata @@ -785,7 +785,7 @@ EditWizardQuoteFeedMsgErrorMissingURL = Feed-URL ontbreekt voor ''{0}'' EditWizardQuoteFeedMsgErrorOrNoData = Fout/Geen gegevens -EditWizardQuoteFeedMsgLoading = Bezig met laden ... +EditWizardQuoteFeedMsgLoading = Bezig met laden... EditWizardQuoteFeedTitle = Historische koersen @@ -797,7 +797,7 @@ EventWizardLabelMessage = Gebeurtenis EventWizardTitle = Gebeurtenis toevoegen -ExportWizardAccountTransactions = Transacties +ExportWizardAccountTransactions = Rekeningtransacties ExportWizardAllTransactionsAktienfreundeNet = aktienfreunde.net (alle transacties en dividenden) @@ -827,13 +827,13 @@ ExportWizardVINISApp = VINIS-App FilterNotRetired = Alleen actieve effecten en rekeningen -FilterOnlyClosedTrades = Alleen afgesloten transacties +FilterOnlyClosedTrades = Alleen gesloten posities -FilterOnlyLossMakingTrades = Alleen verlieslatende transacties +FilterOnlyLossMakingTrades = Alleen verlieslatende posities -FilterOnlyOpenTrades = Alleen open transacties +FilterOnlyOpenTrades = Alleen open posities -FilterOnlyProfitableTrades = Alleen winstgevende transacties +FilterOnlyProfitableTrades = Alleen winstgevende posities FilterValuationNonZero = Waarde is niet nul @@ -847,19 +847,19 @@ ForceClearPersistedStateDialogTitle = GUI resetten naar standaardinstellingen ForceClearPersistedStateMessage = GUI resetten naar standaardinstellingen en opnieuw opstarten om problemen op te lossen? -GroupLabelAttributes = Kenmerken +GroupLabelAttributes = Kenmerk GroupLabelDataQuality = Gegevenskwaliteit -GroupLabelDividends = Dividenden +GroupLabelDividends = Dividend -GroupLabelPerformance = Resultaten +GroupLabelPerformance = Rendementsindicatoren GroupLabelQuoteFeed = Koersleverancier -HeatmapOrnamentAverage = Gemiddelde +HeatmapOrnamentAverage = Rekenkundig gemiddelde -HeatmapOrnamentGeometricMean = Geometrisch gemiddelde +HeatmapOrnamentGeometricMean = Meetkundig gemiddelde HeatmapOrnamentStandardDeviation = Standaarddeviatie @@ -869,7 +869,7 @@ HelpURL = https://translate.google.de/translate?hl=&sl=de&tl=nl&u={0} HoldingsWarningAssetsWithNegativeValuation = Let op: posities met een negatieve waardering worden niet meegenomen -HoldingsWarningAssetsWithNegativeValuationDetails = De grafiek met posities is niet juist omdat er posities zijn met een negatieve waardering. De weergegeven percentages zijn gerelateerd aan de totale waarde van de beleggingsrekening, zijnde: {0}. De percentages zijn niet relatief ten opzichte van de totale waarde van de weergegeven posities.\n\n{1} +HoldingsWarningAssetsWithNegativeValuationDetails = De grafiek van het bezit is niet juist omdat er posities zijn met een negatieve waardering. De weergegeven percentages zijn gerelateerd aan de totale waarde van de portefeuille, zijnde: {0}. De percentages zijn niet relatief ten opzichte van de totale waarde van de weergegeven posities.\n\n{1} ImportWizardPasteSourceDescription = Historische koersen importeren uit de broncode van een webpagina \n{0} @@ -889,7 +889,7 @@ IntroLabelHelp = Help IntroLabelRecentlyUsedFiles = Recent geopende bestanden -IntroLabelSamples = Voorbeelden +IntroLabelSamples = Taxonomievoorbeeld IntroLabelTranslation = Taal @@ -899,7 +899,7 @@ IntroNewAndNoteworthyText = Overzicht van de laatste wijzigingen in Portfolio Pe IntroNewFile = Maak een nieuw bestand -IntroNewFileText = Maak een nieuw Portfolio Performance-bestand (XML). +IntroNewFileText = Maak een nieuw Portfolio Performance-\nbestand (XML). IntroOpenFAQ = Veelgestelde vragen @@ -937,7 +937,7 @@ InvestmentPlanOptionDelivery = (Inkomende levering) InvestmentPlanOptionDeposit = (Storting) -InvestmentPlanOptionRemoval = (Opname) +InvestmentPlanOptionRemoval = (Onttrekking) InvestmentPlanTitleEditPlan = Bewerk investeringsplan @@ -947,7 +947,7 @@ InvestmentPlanTxCreated = {1} transacties aangemaakt voor investeringsplan ''{0} InvestmentPlanTxForMultiplePlansCreated = {0} transacties voor investeringsplannen aangemaakt. -InvestmentPlanTypeBuyDelivery = Aankoop/levering +InvestmentPlanTypeBuyDelivery = Aankoop/inkomende levering InvestmentPlanTypeDeposit = Storting @@ -965,17 +965,17 @@ JobLabelUpdateStackedLineChart = De gestapelde-lijngrafiek bijwerken JobLabelUpdating = Koersen aan het bijwerken... -JobLabelUpdatingDividendEvents = Bijwerken van dividendbetalingen +JobLabelUpdatingDividendEvents = Bijwerken van de dividenduitkeringen JobMsgCheckingForUpdates = Controleren op programma-updates... -JobMsgErrorUpdatingIndices = Fouten tijdens het bijwerken van prijsindexen +JobMsgErrorUpdatingIndices = Fout(en) tijdens het bijwerken van prijsindexen -JobMsgErrorUpdatingQuotes = Fouten tijdens het bijwerken van offertes +JobMsgErrorUpdatingQuotes = Fout(en) tijdens het bijwerken van de koersen JobMsgLoadingExchanges = Uitwisseling laden -JobMsgRunningConsistencyChecks = Controle van de consistentie +JobMsgRunningConsistencyChecks = Consistentiecontrole uitvoeren JobMsgSamplingHistoricalQuotes = Historische koersen van beurs {0} samplen @@ -985,11 +985,11 @@ LabelAbout = Over Portfolio Performance LabelAbsoluteChange = Absolute verandering -LabelAbsoluteDelta = Vermogenswinst (sinds eerste transactie) +LabelAbsoluteDelta = Resultaat (sinds eerste transactie) LabelAbsoluteInvestedCapital = Ge\u00EFnvesteerd vermogen (sinds eerste transactie) -LabelAccountTransfer = Overboeken tussen rekeningen +LabelAccountTransfer = Overboeken tussen bankrekeningen LabelAccounts = Bankrekeningen @@ -1003,13 +1003,13 @@ LabelAccumulatedInterestCharge = Rentekosten (cumulatief) LabelAccumulatedTaxes = Belastingen (cumulatief) -LabelAdhocFilter = Adhoc-filter +LabelAdhocFilter = Ad hoc-filter -LabelAfterTaxAndFees = na kosten en belastingen +LabelAfterTaxAndFees = Na kosten en belastingen LabelAggregation = Aggregatie -LabelAggregationDaily = dagelijks +LabelAggregationDaily = Dagelijks LabelAllAttributes = Alle @@ -1027,7 +1027,7 @@ LabelAllTrades = Alle transacties LabelAllTransactions = Alle transacties -LabelAssetChart = Beleggingsoverzicht - Grafiek +LabelAssetChart = Portefeuilleoverzicht - Grafiek LabelAutomaticDarkLightTheme = Automatisch @@ -1043,21 +1043,21 @@ LabelBackupModeRelativeDirectory = Directory naast gegevensbestand LabelBaseDataSeries = Reeksen basisgegevens -LabelBeforeTaxAndFees = v\u00F3\u00F3r kosten en belastingen +LabelBeforeTaxAndFees = V\u00F3\u00F3r kosten en belastingen LabelBenchmarks = Benchmarks LabelBiggerSize = Groter -LabelCapitalGains = Vermogenswinst +LabelCapitalGains = Resultaat -LabelCategoryOtherMovements = Andere bewegingen +LabelCategoryOtherMovements = Overige resultaten -LabelChartDetailChartDevelopment = Grafiek-ontwikkeling +LabelChartDetailChartDevelopment = Koersontwikkeling -LabelChartDetailChartDevelopmentClosing = Grafiek-ontwikkeling +LabelChartDetailChartDevelopmentClosing = Koersontwikkeling -LabelChartDetailChartDevelopmentClosingFIFO = Grafiek - Waarde versus aanschafwaarde +LabelChartDetailChartDevelopmentClosingFIFO = Koersontwikkeling versus aankoopwaarde LabelChartDetailChartScaling = Schaling @@ -1065,7 +1065,7 @@ LabelChartDetailChartScalingLinear = Lineair LabelChartDetailChartScalingLog = Logaritmisch -LabelChartDetailIndicator = Indicator +LabelChartDetailIndicator = Technische indicatoren LabelChartDetailIndicatorBollingerBands = Bollinger Bands @@ -1075,7 +1075,7 @@ LabelChartDetailIndicatorBollingerBandsUpper = Onderste Bollinger Band LabelChartDetailIndicatorMacd = MACD -LabelChartDetailIndicatorMacdSignal = MACD Signaal +LabelChartDetailIndicatorMacdSignal = MACD-signaal LabelChartDetailMarker = Markeren @@ -1087,7 +1087,7 @@ LabelChartDetailMarkerHigh = Hoog LabelChartDetailMarkerHighLow = Hoog/Laag -LabelChartDetailMarkerInvestments = Investeringen +LabelChartDetailMarkerInvestments = Transacties LabelChartDetailMarkerLow = Laag @@ -1095,9 +1095,9 @@ LabelChartDetailMarkerPurchaseFIFO = Aankoopwaarde (FIFO) LabelChartDetailMarkerPurchaseFIFOHoldingPeriod = Aankoopwaarde (FIFO) ({0}. bewaarperiode) -LabelChartDetailMarkerPurchaseMovingAverage = Aankoopwaarde (voortschrijdend gemiddelde) +LabelChartDetailMarkerPurchaseMovingAverage = Aankoopwaarde (SMA) -LabelChartDetailMarkerPurchaseMovingAverageHoldingPeriod = Aankoopwaarde (voortschrijdend gemiddelde) ({0}. bewaarperiode) +LabelChartDetailMarkerPurchaseMovingAverageHoldingPeriod = Aankoopwaarde (SMA) ({0}. bewaarperiode) LabelChartDetailMovingAverage = Gemiddelde @@ -1121,7 +1121,7 @@ LabelChartDetailMovingAverage_5days = 5 dagen LabelChartDetailMovingAverage_90days = 90 dagen -LabelChartDetailSettings = Instelling +LabelChartDetailSettings = Instellingen LabelChartDetailSettingsShowDataLabel = Toon datalabels @@ -1129,7 +1129,7 @@ LabelChartDetailSettingsShowHorizontalLinesMain = Horizontale lijnen (waarde-as) LabelChartDetailSettingsShowHorizontalLinesPercentage = Horizontale lijnen (procentuele as) -LabelChartDetailSettingsShowLimits = = Toon Grenzen +LabelChartDetailSettingsShowLimits = Toon limieten LabelChartDetailSettingsShowMarkerLines = Weergeven met markeringslijnen @@ -1151,9 +1151,9 @@ LabelClientFilter = Filter LabelClientFilterDialogMessage = Kies bankrekeningen en portefeuilles -LabelClientFilterDialogTitle = Bankrekeningen en portefeuilles +LabelClientFilterDialogTitle = Rekeningen en portefeuilles -LabelClientFilterEditTooltip = Filter: Dubbelklik om de naam te bewerken, rechterklik voor meer acties\n(Verwijder filter of voeg elementen toe aan filter)\n\nBankrekening/Portefeuille: Rechterklik voor meer acties (item verwijderen) +LabelClientFilterEditTooltip = Filter: Dubbelklik om de naam te bewerken, rechterklik voor meer acties\n(Verwijder filter of voeg items toe aan filter)\n\nBankrekening/Portefeuille: Rechterklik voor meer acties (item verwijderen) LabelClientFilterManage = Beheer... @@ -1177,11 +1177,11 @@ LabelColumns = Kolommen LabelColumnsInReverseOrder = Omgekeerde kolomvolgorde -LabelCommon = Algemene elementen +LabelCommon = Algemene widgetitems LabelConsumerPriceIndex = Consumentenprijsindex -LabelConvertBuySellIntoDeliveryTransactions = Aan- en verkopen converteren naar inkomende/uitgaande leveringen +LabelConvertBuySellIntoDeliveryTransactions = Aan-/verkopen converteren naar inkomende/uitgaande leveringen LabelCopyToClipboard = Kopi\u00EBren naar klembord @@ -1191,11 +1191,11 @@ LabelCrosshair = Dradenkruis LabelCurrencies = Valuta -LabelCurrencyConverter = Valuta Converter +LabelCurrencyConverter = Valuta-calculator LabelCurrentConfiguration = Huidige configuratie -LabelCurrentDate = Huidige datum +LabelCurrentDate = Vandaag: LabelCurrentMonth = Huidige maand @@ -1217,11 +1217,11 @@ LabelDefaultFontSize = Standaard LabelDefaultReferenceAccountName = Tegenrekening -LabelDelta = Delta (voor de rapportageperiode) +LabelDelta = Resultaat (voor de rapportageperiode) LabelDescription = Beschrijving (vrije tekst) -LabelDividendPerShare = Dividendbetaling per aandeel +LabelDividendPerShare = Dividend per aandeel LabelDividends = Dividenden @@ -1229,7 +1229,7 @@ LabelDoImport = Importeren LabelDoNotImport = Niet importeren -LabelDuplicateSecurity = Effectdoublure +LabelDuplicateSecurity = Effect dupliceren LabelEarnings = Inkomsten @@ -1257,7 +1257,7 @@ LabelErrorProtocolDetails = Foutmeldingen (details) LabelEurostatRegion = Regio -LabelExcessReturnBaselineDataSeries = Overtollig rendement (Baseline) +LabelExcessReturnBaselineDataSeries = Meeropbrengst (t.o.v. Baseline) LabelExcessReturnOperator = Berekening @@ -1307,13 +1307,13 @@ LabelHeatmapEarnings = Maandelijkse inkomsten LabelHeatmapFees = Maandelijkse kosten -LabelHeatmapInvestments = Maandelijkse investeringen +LabelHeatmapInvestments = Maandelijkse inleg -LabelHeatmapInvestmentsDirect = Investeringen +LabelHeatmapInvestmentsDirect = Inleg (abs.) -LabelHeatmapInvestmentsNoSellings = Investeringen minus opbrengsten van afgesloten transacties +LabelHeatmapInvestmentsNoSellings = Inleg minus gerealiseerd resultaat -LabelHeatmapOrnament = Ornament +LabelHeatmapOrnament = Heatmap uitbreiden met LabelHeatmapTaxes = Maandelijkse belastingen @@ -1325,7 +1325,7 @@ LabelIRR = Intern rendement (IRR) LabelImportNotesFromSource = Importeren van notities (indien beschikbaar) -LabelIncludeSecuritiesInPieChart = Voeg beleggingsvehikels toe +LabelIncludeSecuritiesInPieChart = Inclusief beleggingen LabelIncludeUnassignedCategoryInCharts = Inclusief "Zonder classificatie" @@ -1345,13 +1345,13 @@ LabelInvestmentPlans = Investeringsplannen LabelJSONDateFormat = Datumnotatie -LabelJSONDateFormatHint = Datumnotatie zoals dd.MM.yyyy of MM/dd/yyyy.\n\nLaat leeg voor ISO-datumnotatie of als de datum wordt weergegeven door het aantal milliseconden, \nof seconden\nof dagen sinds 01-01-1970 (Unix Epoch Time). +LabelJSONDateFormatHint = Datumnotatie zoals dd.MM.yyyy of MM/dd/yyyy.\n\nLaat leeg voor ISO-datumnotatie of als de datum wordt weergegeven door het aantal milliseconden, seconden of dagen sinds 01-01-1970 (Unix Epoch Time). LabelJSONFactor = Factor (voor koersen) LabelJSONFactorHint = Een factor waarmee alle koersen (close, high, low) worden vermenigvuldigd. -LabelJSONPathHint = Pad moet een array opleveren met datums of slotkoersen.\nPP gebruikt de bibliotheek https://github.com/json-path/JsonPath.\n\nBijvoorbeeld, gegeven deze JSON:\n\n{\n "isin": "IE00B3WJKG14",\n "data": [\n { "close": 11.756, "date": "2020-02-14" },\n { "close": 11.75, "date": "2020-02-13" }]\n}\n\nPad naar datum: $.data[*].date\nPad naar koers: $.data[*].close +LabelJSONPathHint = Pad moet een array opleveren met datums of slotkoersen.\nPortfolio Performance gebruikt de bibliotheek https://github.com/json-path/JsonPath.\n\nBijvoorbeeld, gegeven deze JSON:\n\n{\n "isin": "IE00B3WJKG14",\n "data": [\n { "close": 11.756, "date": "2020-02-14" },\n { "close": 11.75, "date": "2020-02-13" }]\n}\n\nPad naar datum: $.data[*].date\nPad naar koers: $.data[*].close LabelJSONPathToClose = Pad naar koers @@ -1391,7 +1391,7 @@ LabelMaxDrawdownDuration = Maximale dalingsduur LabelMeasureDistance = Afstand meten -LabelMetric = Metriek +LabelMetric = Indicator LabelMetricCheckInterval = Testperiode: {0} tot en met {1} @@ -1467,17 +1467,17 @@ LabelPaymentsPerYear = Jaar LabelPaymentsSelectStartYear = Betalingen beginnend met jaar: -LabelPaymentsTradeProfitLoss = Afgesloten transacties +LabelPaymentsTradeProfitLoss = Gesloten posities LabelPaymentsUseConsolidateRetired = Consolidatie van inactieve effecten -LabelPerformanceCalculation = Resultatenberekening +LabelPerformanceCalculation = Resultatenopstelling LabelPerformanceChart = Resultatengrafiek LabelPerformanceIRR = Intern Rendement (IRR) -LabelPerformanceMetric = Statistiek retourneren +LabelPerformanceMetric = Rendementsindicator LabelPerformanceTTWROR = Rendement (TTWROR) @@ -1493,7 +1493,7 @@ LabelPortfolioPerformanceFile = Portfolio Performance-bestand LabelPortfolioRateNotAvailable = Voor de gegeven periode kan geen zinvolle ratio worden berekend. Dit kan zijn omdat er geen positief resultaat was, of omdat alleen restituties werden geboekt. -LabelPortfolioTaxRate = Portefeuillebelastingtariefratio +LabelPortfolioTaxRate = Portefeuillebelastingratio LabelPortfolioTimeMachine = Portfolio Tijdmachine @@ -1519,15 +1519,15 @@ LabelQuoteFeedConfiguration = {0}, {1} koersen LabelQuoteFeedProvider = Provider -LabelRatio = Verhouding +LabelRatio = Ratio LabelRefresh = Controleer opnieuw -LabelRemoveDividends = Genereer een extra opname voor dividendtransacties +LabelRemoveDividends = Genereer een extra onttrekking voor dividendtransacties LabelRemoveLogo = Logo verwijderen -LabelReportInterval = Rapportinterval +LabelReportInterval = Rapportageperiode LabelReportingAddPeriod = Nieuw... @@ -1573,7 +1573,7 @@ LabelReportingPeriodEditTooltip = Klik met de rechtermuisknop om te verwijderen; LabelRiskIndicators = Risico-indicatoren -LabelRiskMetric = Risicometing +LabelRiskMetric = Risico-indicator LabelSaleTransactionsOnly = Alleen verkopen @@ -1597,7 +1597,7 @@ LabelSecurityCalendarToolTip = Kalender van de effectenbeurs om ontbrekende hand LabelSecurityLatestPrice = Effect: Laatste prijs -LabelSecurityPerformance = Rendement +LabelSecurityPerformance = Resultaat LabelSecurityTransfer = Overboeken van effecten @@ -1619,11 +1619,11 @@ LabelSmallerSize = Kleiner LabelStartTyping = Begin met typen... -LabelStatementOfAssets = Beleggingsoverzicht +LabelStatementOfAssets = Portefeuilleoverzicht -LabelStatementOfAssetsHistory = Beleggingsoverzicht - Geschiedenis +LabelStatementOfAssetsHistory = Portefeuilleoverzicht - Geschiedenis -LabelStatementOfAssetsHoldings = Beleggingsoverzicht - Posities +LabelStatementOfAssetsHoldings = Portefeuilleoverzicht - Bezit LabelSuffix_HICP = (HICP) @@ -1637,7 +1637,7 @@ LabelTTWROR_Annualized = Tijdgewogen rendement (op jaarbasis) LabelTaxonomies = Taxonomie\u00EBn -LabelTaxonomyTemplates = Sjablonen +LabelTaxonomyTemplates = Meegeleverde voorbeelden LabelTemplate = Sjabloon @@ -1653,19 +1653,19 @@ LabelToolTipInvestmentDetails = {0} shares op {1} LabelToolTipTransactionSummary = {0} op {1} \u2211 {2} -LabelTotalSum = Totaal +LabelTotalSum = Waarde -LabelTotalValuePercent = {0} tv +LabelTotalValuePercent = {0} TW LabelTotalsAtTheBottom = Totalenlijn hieronder LabelTotalsAtTheTop = Totalen lijn hierboven -LabelTrades = Transacties +LabelTrades = Open/gesloten posities LabelTradesBasicStatistics = Aantal transacties (met winst/verlies) -LabelTradesProfitLoss = Bedrijfswinst/verlies +LabelTradesProfitLoss = Transacties (winst/verlies) LabelTradesTurnoverRate = Omloopsnelheid van de portefeuille @@ -1705,9 +1705,9 @@ LabelUseGrossValue = Gebruik de brutowaarde LabelUsingDashboardDefaultReportingPeriod = Dashboard-rapportageperiode -LabelValueInboundDelivery = Waarde van inkomende levering +LabelValueInboundDelivery = Waarde van de inkomende levering -LabelValueOutboundDelivery = Waarde van uitgaande levering +LabelValueOutboundDelivery = Waarde van de uitgaande levering LabelVerticalSpacer = Verticale afstandhouder @@ -1715,13 +1715,13 @@ LabelViewDonutChart = Ringdiagram LabelViewPieChart = Taartdiagram -LabelViewReBalancing = Herbalanceren +LabelViewReBalancing = Herbalanceringdefinitie -LabelViewStackedChart = Gestapeld diagram +LabelViewStackedChart = Stapeldiagram (relatief belang) -LabelViewStackedChartActualValue = Gestapelde oppervlaktekaart (werkelijke waarde) +LabelViewStackedChartActualValue = Stapeldiagram (oppervlakte, absolute waarde) -LabelViewTaxonomyDefinition = Definitie van taxonomie +LabelViewTaxonomyDefinition = Taxonomiedefinitie LabelViewTreeMap = Boomgrafiek @@ -1733,7 +1733,7 @@ LabelWithoutClassification = Zonder classificatie LabelXDays = {0} dagen -LabelYTD = Huidige jaar (YTD) +LabelYTD = Huidig jaar (YTD) LabelYear = Jaar @@ -1741,7 +1741,7 @@ LabelYearlyHeatmap = Jaarlijks rendement in een heatmap LabelYes = Ja -MarkSecurityPageDescription = De geselecteerde items worden als 'index' gelabeld. Indices hebben geen valuta. +MarkSecurityPageDescription = De geselecteerde items worden als 'index' gelabeld. Indices zijn valutavrij. MarkSecurityPageTitle = Label effect(en) als een 'index' @@ -1759,7 +1759,7 @@ MenuChangeHeight = Hoogte wijzigen... MenuChangeUrl = URL wijzigen... -MenuChartAdjustRangeToOriginalSize = Origineel formaat +MenuChartAdjustRangeToOriginalSize = Oorspronkelijke grootte MenuChartShowYAxis = Y-as tonen @@ -1787,25 +1787,25 @@ MenuConfigureCurrentDashboard = Dashboard configureren MenuConfigureDashboards = Dashboards configureren -MenuConfigureRebalancingIndicator = Configureer {0}/{1} regel +MenuConfigureRebalancingIndicator = Configureer {0}/{1}-regel MenuConfigureView = Configureer scherm MenuConfirmDeleteAllTransactions = Verwijder alle transacties voor effect {0}? -MenuConvertToBuy = Omzetten naar kooptransactie +MenuConvertToBuy = Omzetten naar een aankoop -MenuConvertToBuySell = Omzetten naar aan-/verkooptransactie +MenuConvertToBuySell = Omzetten naar een aan- of verkoop -MenuConvertToDelivery = Omzetten naar levering +MenuConvertToDelivery = Omzetten naar een inkomende of uitgaande levering -MenuConvertToDepositRemoval = Omzetten naar storting/opname +MenuConvertToDepositRemoval = Omzetten naar een storting of onttrekking -MenuConvertToInboundDelivery = Omzetten naar binnenkomende levering +MenuConvertToInboundDelivery = Omzetten naar een inkomende levering -MenuConvertToOutboundDelivery = Omzetten naar uitgaande levering +MenuConvertToOutboundDelivery = Omzetten naar een uitgaande levering -MenuConvertToSell = Omzetten naar een verkooptransactie +MenuConvertToSell = Omzetten naar een verkoop MenuCreateAccountOrTransaction = Maak een nieuwe rekening of transactie aan @@ -1843,7 +1843,7 @@ MenuExportData = Gegevens exporteren als CSV MenuExportDiagram = Grafiek opslaan -MenuFilterTrades = Filter transacties +MenuFilterTrades = Filter open/gesloten posities MenuHideColumn = Kolom verbergen @@ -1881,7 +1881,7 @@ MenuReportingPeriodDelete = Verwijderen MenuReportingPeriodDeleteConfirm = Wil je echt het filter ''{0}'' verwijderen? -MenuReportingPeriodInsert = Elementen toevoegen +MenuReportingPeriodInsert = Items toevoegen MenuReportingPeriodManage = Beheer... @@ -1919,11 +1919,11 @@ MenuTaxonomyClassificationCreate = Nieuwe classificatie toevoegen MenuTaxonomyClassificationDelete = Verwijderen -MenuTaxonomyColorCascadeToChildren = Cascade color to children +MenuTaxonomyColorCascadeToChildren = Afgeleid kleurenpalet voor subniveaus MenuTaxonomyColorEdit = Bewerken... -MenuTaxonomyColorRandomPalette = Random palette to children +MenuTaxonomyColorRandomPalette = Willekeurig kleurenpalet voor subniveaus MenuTaxonomyCopy = Taxonomie kopi\u00EBren @@ -1931,7 +1931,7 @@ MenuTaxonomyCreate = Nieuw... MenuTaxonomyDelete = Taxonomie verwijderen -MenuTaxonomyDeleteConfirm = Wilt u de taxonomy ''{0}'' echt verwijderen? +MenuTaxonomyDeleteConfirm = Wilt u de taxonomie ''{0}'' echt verwijderen? MenuTaxonomyMakeAssignment = Toewijzen @@ -2007,7 +2007,7 @@ MsgErrorPortfolioNotExist = Er is geen portefeuille.\nGelieve een nieuwe portefe MsgErrorSavingIniFile = Fout bij opslaan van ini-bestand: {0} -MsgErrorTradeCollectionWithErrors = Fout bij ophalen orders +MsgErrorTradeCollectionWithErrors = Fout bij het ophalen van orderinformatie MsgErrorUpdating = Fout bij bijwerken @@ -2017,11 +2017,11 @@ MsgIncorrectConvertedSubTotal = Geconverteerd subtotaal is incorrect MsgIncorrectSubTotal = Subtotaal is onjuist -MsgIncorrectTotal = Totaal is onjuist \nVerwachte waarde: {0} +MsgIncorrectTotal = Sommering is onjuist \nVerwachte waarde: {0} MsgInfoChangingCurrencyNotPossible = Voor dit effect werden al transacties geregistreerd. Het is niet meer mogelijk om de valuta te wijzigen. -MsgInfoRetiredSecurities = Als een effect werd gemarkeerd als "inactief", dan:\n* wordt het effect niet meer weergegeven in vervolgkeuzemenu's om nieuwe transacties te maken, bijvoorbeeld: aan- en verkoopdialogen;\n* worden de historische koersen van het effect niet automatisch bijgewerkt - ze kunnen manueel worden bijgewerkt via de menukeuze "Online" (Ctrl-U, K) +MsgInfoRetiredSecurities = Als een effect werd gemarkeerd als "inactief", dan:\n* wordt het effect niet meer weergegeven in vervolgkeuzemenu's om nieuwe transacties aan te maken, bijvoorbeeld: aan- en verkoopdialogen;\n* worden de historische koersen van het effect niet automatisch bijgewerkt - ze kunnen handmatig worden bijgewerkt via de menukeuze "Online" (Ctrl-U, K) MsgInvalidImage = Ongeldig afbeeldingsbestand @@ -2083,9 +2083,9 @@ MsgUpdatingDashboardData = Dashboard berekenen... MsgUpdatingExchangeRates = Wisselkoersen bijwerken voor {0} -MsgWarningPieChartNoValues = Cirkeldiagram zonder waarden met het geselecteerde filter +MsgWarningPieChartNoValues = Taartdiagram zonder waarden met het geselecteerde filter -MsgWarningPieChartWithNegativeValues = Let op: Negatieve waarden kunnen niet worden weergegeven in het taartdiagram en zijn weggelaten. +MsgWarningPieChartWithNegativeValues = Let op: Negatieve waarden kunnen niet worden weergegeven in een taartdiagram en werden daarom niet meegenomen. MyDividends24ConfirmUpload = Let op: Bij het importeren worden bestaande posities op myDividends24 overschreven. @@ -2111,25 +2111,25 @@ NewFileWizardSecurityDescription = Effecten worden gebruikt om aan- en verkopen NewFileWizardSecurityTitle = Effecten toevoegen -NewFileWizardTaxonomyDescription = Taxonomie\u00EBn helpen om de totaalportefeuille in verschillende dimensies te kunnen analyseren. Daarbij kunnen cirkel-, boom- of lijndiagrammen worden gebruikt. +NewFileWizardTaxonomyDescription = Taxonomie\u00EBn helpen om de totaalportefeuille in verschillende dimensies te analyseren, waarbij diverse typen diagrammen worden gebruikt. NewFileWizardTaxonomyTitle = Voeg taxonomie\u00EBn toe OptionDateIsInTheFuture = Datum is in de toekomst -OptionDateIsInThePast = Datum is in het verleden +OptionDateIsInThePast = Expiratiedatum is in het verleden PDFImportDebugInformation = Instructies voor het anonimiseren van persoonsgegevens\n\n* Dubbelklik op de tekenreeks die geanonimiseerd moet worden.\n* Anonimiseer alleen persoonsgegevens. Laat andere gegevens of geldbedragen ongewijzigd. Dit is belangrijk voor een consistente berekening!\n* Kopieer de geanonimiseerde tekst naar het klembord.\n* Controleer in de lijst van ondersteunde importeurs of uw bank of makelaar beschikbaar is.\n* Maak een nieuw bericht aan in het bestaande topic met de geanonimiseerde tekst.\n* Als uw bank of broker niet in de lijst staat, maak dan een nieuw onderwerp aan in het forum.\n\nBeschrijf het probleem en de verwachte uitkomst zo gedetailleerd mogelijk. Voeg eventueel een screenshot toe om uw probleem te verduidelijken. PDFImportDebugTextExtraction = Debug: tekst uit PDF extraheren -PDFImportErrorParsingDocument = Fout bij lezen of converteren van PDF-document: {0} (Controleer foutenlogboek voor details) +PDFImportErrorParsingDocument = Fout(en) bij het lezen of converteren van PDF-document: {0}. Check het foutenlog voor details. PDFImportFilterName = PDF-bestand (*.pdf;*.zip) PDFImportWizardAssistant = PDF-importwizard -PDFImportWizardDescription = De onderstaande transacties zullen aan uw bestand worden toegevoegd.\nGebruik het contextmenu om transacties te verwijderen. +PDFImportWizardDescription = De onderstaande transacties zullen worden toegevoegd.\nGebruik het contextmenu om transacties te verwijderen. PDFImportWizardErroneousFiles = Deze bestanden konden niet worden ge\u00EFmporteerd. @@ -2147,7 +2147,7 @@ PerformanceChartLabelCPI = Consumentenprijsindex PerformanceChartLabelEntirePortfolio = Gehele portfolio -PerformanceHeatmapToolTip = Maandelijks rendement weergegeven als heatmap. \n\nOm het maandelijkse rendement te berekenen, wordt het tijdgewogen rendement (TTWROR) gebruikt.\n\nHet rendement wordt altijd voor de volledige maand berekend, zelfs als de rapportageperiode eindigt of begint in het midden van een maand. +PerformanceHeatmapToolTip = Maandelijks rendement weergegeven als heatmap. \n\nOm het maandelijkse rendement te berekenen, wordt het tijdgewogen rendement (TTWROR) gebruikt.\n\nHet rendement wordt altijd voor de volledige maand berekend, zelfs als de rapportageperiode begint of eindigt in het midden van een maand. PerformanceRelevantTransactionsFooter = Totaal van de relevante transacties {0} @@ -2185,7 +2185,7 @@ PortfolioReportMissingAPIKey = Portfolio Report API-sleutel ontbreekt. Configure PortfolioReportMissingAPIURL = Portfolio Report API URL is niet opgeslagen in de instellingen. Configureer deze in Help/Instellingen/API-sleutels. -PrefAlphaVantageAPIKey = Alpha Vantage API Key +PrefAlphaVantageAPIKey = Alpha Vantage API-sleutel PrefAlphaVantageCallFrequencyLimit = Aantal API calls per minuut @@ -2197,11 +2197,11 @@ PrefBackupLocation = Back-up locatie PrefCheckOnStartup = &Controleer op updates van Portfolio Performance bij het opstarten -PrefCreateBackupBeforeSaving = Maak automatisch een reservekopie aan voordat u een bestand opslaat (* .backup.xml) +PrefCreateBackupBeforeSaving = Maak automatisch een reservekopie aan voordat u een bestand opslaat PrefDescriptionAlphaVantage = Alpha Vantage Inc. is een aanbieder van gratis API's voor realtime en historische gegevens over aandelen, fysieke valuta en cryptovaluta.\n\nAls u Alpha Vantage wilt gebruiken, heeft u een API-sleutel nodig. Met de gratis API-sleutel kunnen maximaal 5 API calls per minuut worden gedaan. Alpha Vantage biedt verschillende premium API-sleutels aan die tot maximaal 600 API calls per minuut toestaan.\n\nVolg deze link om u aan te melden: -PrefDescriptionDivvyDiary = Upload uw beleggingen automatisch van Portfolio Performance naar uw persoonlijke account bij DivvyDiary. Hiermee kunt u toekomstige dividendbetalingen volgen vanaf uw smartphone.\n\nVolg hiervoor de onderstaande stappen:\n1. Maak een account aan bij DivvyDiary\n2. Genereer een API-sleutel onder "Instellingen"\n3. Sla de API-sleutel op in de Portfolio Performance-instellingen +PrefDescriptionDivvyDiary = Upload uw beleggingen automatisch van Portfolio Performance naar uw persoonlijke account bij DivvyDiary. Hiermee kunt u toekomstige dividenduitkeringen volgen vanaf uw smartphone.\n\nVolg hiervoor de onderstaande stappen:\n1. Maak een account aan bij DivvyDiary\n2. Genereer een API-sleutel onder "Instellingen"\n3. Sla de API-sleutel op in de Portfolio Performance-instellingen PrefDescriptionEODHistoricalData = EOD Historical Data biedt fundamentele gegevens en huidige en historische koersen voor aandelen, ETF's, beleggingsfondsen en opties van over de gehele wereld. @@ -2209,21 +2209,21 @@ PrefDescriptionFinnhub = Gegevens van institutionele kwaliteit met een royaal gr PrefDescriptionLeeway = PWP Leeway UG biedt koersgegevens voor aandelen, ETF's, indices, beleggingsfondsen en (crypto)valuta.\n\nTips:\n* Effecten worden gezocht op ISIN.\n* Koersen zijn beschikbaar in vreemde valuta.\n\nVoorwaarden (gratis):\n* Alleen persoonlijk gebruik\n* 50 API calls/dag\n* Ongeveer 1.000 financi\u00EBle instrumenten in het API-pakket\n\nVolg deze link om u aan te melden: -PrefDescriptionMyDividends24 = Upload uw beleggingen automatisch van Portfolio Performance naar uw persoonlijke account bij myDividends24. Hiermee kunt u toekomstige dividendbetalingen volgen vanaf uw smartphone.\n\nVolg hiervoor de onderstaande stappen:\n1. Download myDividends24 uit de AppStore of Google Play Store\n2. Maak een account aan en genereer een API-sleutel onder "Instellingen"\n3. Sla de API-sleutel op in de instellingen van Portfolio Performance\n4. Gebruik "Upload myDividends24" in het menu bovenaan. +PrefDescriptionMyDividends24 = Upload uw beleggingen automatisch van Portfolio Performance naar uw persoonlijke account bij myDividends24. Hiermee kunt u toekomstige dividenduitkeringen volgen vanaf uw smartphone.\n\nVolg hiervoor de onderstaande stappen:\n1. Download myDividends24 uit de AppStore of Google Play Store\n2. Maak een account aan en genereer een API-sleutel onder "Instellingen"\n3. Sla de API-sleutel op in de instellingen van Portfolio Performance\n4. Gebruik "Upload myDividends24" in het menu bovenaan. PrefDescriptionPortfolioReport = Synchronisatie van gegevens met de Portfolio Report Server. -PrefDescriptionProxy = De proxyserver wordt gebruikt om koersen, wisselkoersen en consumentenprijsindexen te downloaden en om te controleren of er updates zijn.\n\nAls het veld "Proxy-host" leeg is, wordt er geen proxyserver gebruikt.\n\nAls authenticatie nodig is, bekijk dan de FAQ. +PrefDescriptionProxy = De proxyserver wordt gebruikt om koersen, wisselkoersen en consumentenprijsindexen te downloaden en om te controleren of er updates zijn.\n\nAls het veld "Proxy-host" leeg is, wordt er geen proxyserver gebruikt.\n\nAls authenticatie nodig is, bekijk dan de "Veelgestelde vragen". PrefDescriptionQuandl = Quandl is een platform dat financi\u00EBle, economische en alternatieve gegevens voor professionele beleggers aanbiedt.\n\nOm Quandl te gebruiken, heeft u een API-sleutel nodig.\n\nGeverifieerde gebruikers van gratis datafeeds hebben een concurrency limit van \u00E9\u00E9n; dat wil zeggen, ze kunnen \u00E9\u00E9n oproep tegelijk doen en een extra oproep in de wachtrij plaatsen.\n\nVolg deze link om u aan te melden: PrefDescriptionTwelveData = Twelve Data levert financi\u00EBle marktgegevens en financi\u00EBle tooling. Voor de namen van de aangesloten beurzen worden de market identifier codes (MIC) volgens ISO-10383 gebruikt.\n\nVoorwaarden (gratis):\n* Alleen persoonlijk gebruik\n* 800 API calls/dag\n* 8 API calls/minuut\n* Alleen Amerikaanse marktgegevens\n\nVolg deze link om u aan te melden: -PrefDivvyDiaryAPIKey = DivvyDiary API Key +PrefDivvyDiaryAPIKey = DivvyDiary API-sleutel PrefEODHistoricalDataAPIKey = EOD Historical Data API Token -PrefFinnhubAPIKey = Finnhub API Key +PrefFinnhubAPIKey = Finnhub API-sleutel PrefLabelAlwaysDisplayCurrencyCode = Geef altijd de valutacode weer voor monetaire waarden @@ -2243,11 +2243,11 @@ PrefLabelQuoteDigits = Aantal decimalen voor berekende koerswaarden PrefLabelSharesDigits = Aantal decimalen voor het aantal stuks -PrefLabelUseIndirectQuotation = Gebruik indirecte valutakoersen +PrefLabelUseIndirectQuotation = Gebruik indirecte wisselkoersen -PrefLabelUseSWTChartLibrary = Gebruik de SWTChart-bibliotheek voor cirkeldiagrammen +PrefLabelUseSWTChartLibrary = Gebruik de SWTChart-bibliotheek voor taartdiagrammen -PrefLeewayAPIKey = Leeway API Key +PrefLeewayAPIKey = Leeway API-sleutel PrefMsgBackup = Instellingen voor de back-up van de gegevensbestanden @@ -2259,15 +2259,15 @@ PrefMsgLanguageConfig = Om de taal te wijzigen, is een herstart van Portfolio Pe PrefMyDividends24APIKey = myDividends24 API-sleutel -PrefNoteIndirectQuotation = Koersen die de eigen valuta van een land als prijsvaluta gebruiken\n(bijvoorbeeld EUR 0,9009 = USD 1,00 in de eurozone), staan bekend \nals een directe koers of een prijskoers (vanuit dat land gezien) \nen worden door de meeste landen gebruikt. \n\nKoersen die de eigen valuta van een land als eenheidsvaluta gebruiken\n(bijvoorbeeld USD 1,11 = EUR 1,00 in de eurozone), staan bekend\nals een indirecte koers of hoeveelheidskoers en worden gebruikt in \nBritse kranten en zijn veelvoorkomend in Australi\u00EB, Nieuw-Zeeland \nen de eurozone.\n\nBron: https://en.wikipedia.org/wiki/Exchange_rate\n\nVoorbeelden:\n* Indirecte (hoeveelheids)koers: EUR/USD 1,1232 \n "Voor \u00E9\u00E9n euro krijg je 1,1232 USD."\n* Directe (prijs)koers: USD/EUR 0,89 \n "E\u00E9n USD kost 0,89 EUR." +PrefNoteIndirectQuotation = Koersen die de eigen valuta van een land als prijsvaluta gebruiken (bijvoorbeeld EUR 0,9009 = USD 1,00 in de eurozone), staan bekend als een directe koers of een prijskoers (vanuit dat land gezien) en worden door de meeste landen gebruikt. \n\nKoersen die de eigen valuta van een land als eenheidsvaluta gebruiken (bijvoorbeeld USD 1,11 = EUR 1,00 in de eurozone), staan bekend als een indirecte koers of hoeveelheidskoers en worden gebruikt in Britse kranten en komen veel voor in Australi\u00EB, Nieuw-Zeeland en de eurozone.\n\nBron: https://en.wikipedia.org/wiki/Exchange_rate\n\nVoorbeelden:\n* Indirecte wisselkoers (hoeveelheid): EUR/USD 1,1232 \n "Voor \u00E9\u00E9n euro krijg je 1,1232 USD."\n* Directe wisselkoers (prijs): USD/EUR 0,89 \n "E\u00E9n USD kost 0,89 EUR." -PrefNoteStoreSettingsNextToFile = De GUI-instellingen bevatten configuraties zoals de startpagina, \nde breedte van sommige kolommen en venstergedeelten, de uitgevouwen\nknooppunten van de classificatie, en meer.\n\nDoor de standaardinstelling worden de GUI-instellingen verborgen\nopgeslagen in de 'workspace' Map. Het is ook mogelijk om ze op te\nslaan in een '.settings'-bestand naast het Portfolio Performance-\nbestand zelf. Deze voorzieningen synchroniseren de instellingen\nover meerdere PC's.\n\nLet op: de GUI-instellingen worden niet gemigreerd. Om de huidige \ninstellingen te behouden, doe je het volgende: open een Portfolio\nPerformance bestand -> verander hier het selectievakje -> sla het\nbestand dan op onder een nieuwe naam. +PrefNoteStoreSettingsNextToFile = De GUI-instellingen bevatten configuraties zoals de startpagina, de breedte van sommige kolommen en venstergedeelten, de laatst uitgevouwen knooppunten van taxonomi\u00EBen, en meer.\n\nDoor de standaardinstelling worden de GUI-instellingen verborgen opgeslagen in de 'workspace' Map. Het is ook mogelijk om ze op te slaan in een '.settings'-bestand naast het Portfolio Performance bestand zelf. Deze voorziening faciliteert de synchronisatie van de instellingen over meerdere PC's.\n\nLet op: de GUI-instellingen worden niet gemigreerd. Om de huidige instellingen te behouden, doe je het volgende: open een Portfolio Performance bestand -> verander hier het selectievakje -> sla het bestand dan op onder een nieuwe naam. -PrefPortfolioReportAPIKey = Portfolio Report API Key +PrefPortfolioReportAPIKey = Portfolio Report API-sleutel PrefPortfolioReportAPIURL = Portfolio Report API URL -PrefQuandlAPIKey = Quandl API Key +PrefQuandlAPIKey = Quandl API-sleutel PrefRelativeBackupDirectoryName = Naam van de directory naast het gegevensbestand @@ -2309,7 +2309,7 @@ PrefTitleQuandl = Quandl PrefTitleTwelveData = Twelve Data -PrefTwelveDataAPIKey = Twelve Data API Key +PrefTwelveDataAPIKey = Twelve Data API-sleutel PrefUpdateQuotesAfterFileOpen = Koersen automatisch bijwerken na het openen van een Portfolio Performance-bestand @@ -2325,13 +2325,13 @@ PresetsPrefPageTime = Tijd PresetsPrefPageTitle = Vooraf ingestelde waarden -RebalanceAmbiguousTooltip = Het resultaat van de herbalancering is dubbelzinnig.\n\nU kunt de taxonomie verfijnen of sommige effecten uitsluiten van de herbalancering om de dubbelzinnigheid op te lossen. +RebalanceAmbiguousTooltip = Het herbalanceringsresultaat is dubbelzinnig.\n\nU kunt de taxonomie verfijnen of sommige effecten uitsluiten van de herbalancering om de dubbelzinnigheid op te lossen. RebalanceInexactTooltip = Het herbalanceringsresultaat is niet exact, omdat er geen exacte oplossing is.\n\nDeze oplossing minimaliseert de gemiddelde kwadratische fout met inachtneming van het feit dat de resultaten moeten optellen tot 0.\n\nU kunt de taxonomie grover maken of meer effecten opnemen in de herbalancering om een exacte(re) oplossing te verkrijgen. SearchSecurityWizardPageSymbolAlreadyExistsInfo = Er bestaat al een effect met het tickersymbool ''{0}''. -SecuritiesChart_NoDataMessage_NoHoldings = Geen posities aanwezig +SecuritiesChart_NoDataMessage_NoHoldings = Geen bezit aanwezig SecuritiesChart_NoDataMessage_NoPrices = Geen koersen beschikbaar @@ -2341,13 +2341,13 @@ SecuritiesChart_NoDataMessage_NoSecuritySelected = Geen effect geselecteerd SecurityFilter = Effecten filteren op basis van het aantal in bezit -SecurityFilterSharesHeldEqualZero = Aantal stuks in bezit = 0 +SecurityFilterSharesHeldEqualZero = Aantal in bezit = 0 -SecurityFilterSharesHeldNotZero = Aantal stuks in bezit \u2260 0 +SecurityFilterSharesHeldNotZero = Aantal in bezit \u2260 0 SecurityListFilter = Effecten filteren -SecurityListFilterDateReached = Effecten: datum bereikt +SecurityListFilterDateReached = Effecten: Datum bereikt SecurityListFilterDistanceFromAth = Effect: Afstand van ATH @@ -2357,7 +2357,7 @@ SecurityListFilterLimitPriceExceeded = Effecten: Limietprijs overschreden SecurityListFilterOnlyExchangeRates = Alleen wisselkoersen -SecurityListFilterOnlySecurities = Alleen aandelen +SecurityListFilterOnlySecurities = Alleen effecten SecurityMenuAddEvent = Gebeurtenis... @@ -2447,7 +2447,7 @@ SecurityMenuSetSingleSecurityInactiveConfirm = Wil je effect ''{0}'' echt inacti SecurityMenuStockSplit = Aandelensplitsing... -SecurityMenuTransfer = Overboeken... +SecurityMenuTransfer = Overboeken van effecten... SecurityMenuUpdateQuotes = Update koersen online @@ -2503,11 +2503,11 @@ SecurityTabEvents = Gebeurtenissen SecurityTabHistoricalQuotes = Historische koersen -SecurityTabTrades = Transacties +SecurityTabTrades = Open/gesloten posities SecurityTabTransactions = Transacties -SplitWizardDefinitionDescription = Definieer voor welk instrument, op welke datum (ex-datum) en bij welke verhouding \n(bijvoorbeeld 2 nieuw voor 1 bestaand aandeel) het aandeel is gesplitst. +SplitWizardDefinitionDescription = Definieer voor welk effect, op welke datum ("ex-datum") en in welke verhouding \n(bijvoorbeeld: 2 nieuwe aandelen voor 1 bestaand aandeel) het aandeel werd gesplitst. SplitWizardDefinitionTitle = Aandelensplitsing @@ -2515,7 +2515,7 @@ SplitWizardErrorNewAndOldMustNotBeEqual = Split-ratio (nieuw voor oud) is identi SplitWizardLabelNewForOld = voor -SplitWizardLabelSplit = Splitsen +SplitWizardLabelSplit = Splitsing SplitWizardLabelUpdateQuotes = Converteer historische koersen @@ -2529,13 +2529,13 @@ SplitWizardReviewTransactionsDescription = Controleer de conversie van de transa SplitWizardReviewTransactionsTitle = Afdrukvoorbeeld van transacties -SystemMenuChangelog = Changelog +SystemMenuChangelog = Wijzigingslog SystemMenuCheckForUpdates = Controleren op updates... SystemMenuNewAndNoteworthy = Nieuw && Opmerkelijk -TabAccountBalanceChart = Saldografiek +TabAccountBalanceChart = Rekeningsaldografiek TabTransactions = Transacties @@ -2543,11 +2543,11 @@ TitlePasswordDialog = Wachtwoord toewijzen TooltipAllTimeHigh = All-Time High (ATH) in de laatste {0} dagen: {2} ({1})\nHuidige koers: {3} ({4}) -TooltipAverageHoldingPeriod = De gemiddelde bewaarperiode wordt als volgt berekend:\n\n* Alle portefeuilletransacties die op enig moment binnen de geselecteerde rapportageperiode aanwezig zijn, worden opgenomen.\n\n* De bewaartermijn van een effect vloeit voort uit het moment van aan- en verkoop. Onmiddellijke verkopen worden verondersteld voor de huidige posities.\n\n* De weging van een effect wordt berekend op basis van de aankoopkoers van het effect ten opzichte van het totale aantal van alle aankoopkoersen.\n\n* Resultaat "gemiddelde bewaarperiode van alle beleggingen" is de som van het product "bewaarperiode \u00D7 weging (%)" voor alle beleggingen. +TooltipAverageHoldingPeriod = De gemiddelde bewaarperiode wordt als volgt berekend:\n\n* Alle posities die op enig moment binnen de geselecteerde rapportageperiode aanwezig zijn, worden opgenomen.\n\n* De bewaartermijn van een effect vloeit voort uit het moment van aan- en verkoop. Onmiddellijke verkopen worden verondersteld voor de huidige posities.\n\n* De weging van een effect wordt berekend op basis van de aankoopkoers van het effect ten opzichte van het totale aantal van alle aankoopkoersen.\n\n* Resultaat "gemiddelde bewaarperiode van alle beleggingen" is de som van het product "bewaarperiode \u00D7 weging (%)" voor alle beleggingen. TooltipDateOfExchangeRate = Wisselkoers van {0} -TooltipHintPressAlt = Gebruik 'Alt, linkermuisknop' om items op waarde te sorteren +TooltipHintPressAlt = Gebruik 'Alt' of 'Option' om items op waarde te sorteren. TooltipMaxDrawdown = De maximale daling is het maximale piek-tot-dalverlies in een bepaalde periode.\n\n{0} tot {1} @@ -2559,21 +2559,21 @@ TooltipMaxDrawdownDurationFromXtoY = {0} tot {1} TooltipMaxDurationLowToHigh = Langste hersteltijd (duur van een lage piek tot een piek): {0} dagen. -TooltipPortfolioFeeRate = Portefeuillekostenratio\n\nKosten / (gerealiseerde en niet-gerealiseerde vermogenswinst + inkomsten) +TooltipPortfolioFeeRate = Portefeuillekostenratio\n\nKosten / (Gerealiseerd resultaat + Ongerealiseerd resultaat + Inkomsten) -TooltipPortfolioTaxRate = Portefeuillebelastingratio\n\nBelastingen / (gerealiseerde en niet-gerealiseerde vermogenswinst + inkomsten - kosten) +TooltipPortfolioTaxRate = Portefeuillebelastingratio\n\nBelastingen / (Ongerealiseerd resultaat + Gerealiseerd resultaat + Inkomsten) TooltipQuoteAtDate = {0} op {1} -TooltipRebalancingIndicator = Kleurcodering volgens de {0}/{1} regel:\n\n{0}% absolute afwijking: {2} is {3} van {4}\n{1}% relatieve afwijking: {2} is {5} van {6}\n\nConfigureer in de werkbalk. +TooltipRebalancingIndicator = Kleurcodering volgens de {0}/{1}-regel:\n\n{0}% absolute afwijking: {2} is {3} van {4}\n{1}% relatieve afwijking: {2} is {5} van {6}\n\nConfigureer in de werkbalk. TooltipSecurityLatestPrice = Laatste koers van {0} vanaf {1} -TooltipSemiVolatility = Semi-volatiliteit kijkt alleen naar de negatieve schommelingen van een belegging.\n\nAls de negatieve en positieve fluctuaties gelijk zijn, geldt het volgende: \n\n Volatiliteit (v) = Semi-volatiliteit (s) * \u221A2 \n\nAls de huidige dataset gelijkmatig is verdeeld, is de semi-volatiliteit: \n\n s = v \u00F7 \u221A2 = {2} \u00F7 \u221A2 = {0}\n\nVergelijk dat met de werkelijke semi-volatiliteit: \n\n {0} {1} {3} \n gelijkmatig verdeelde {1} werkelijke semi-volatiliteit \n\n \nDe semi-volatiliteit wordt berekend met behulp van de "gecumuleerde" gegevensreeks. Daarom hebben resultaat-onafhankelijke transacties geen impact. Weekends en feestdagen worden genegeerd (bijvoorbeeld Paas- en Kerstdagen). +TooltipSemiVolatility = Semi-volatiliteit kijkt alleen naar de negatieve prijsvariatie van een financieel instrument in de tijd en biedt daardoor een beter beeld van het neerwaartse risico dan volatiliteit.\n\nAls de negatieve en positieve fluctuaties gelijk zijn, geldt het volgende: \n\n Volatiliteit (v) = Semi-volatiliteit (s) * \u221A2 \n\nAls de huidige dataset gelijkmatig is verdeeld, is de semi-volatiliteit: \n\n s = v \u00F7 \u221A2 = {2} \u00F7 \u221A2 = {0}\n\nVergelijk dat met de werkelijke semi-volatiliteit: \n\n {0} {1} {3} \n gelijkmatig verdeelde {1} werkelijke semi-volatiliteit \n\n \nDe semi-volatiliteit wordt berekend met behulp van de "gecumuleerde" gegevensreeks. Daarom hebben resultaatneutrale transacties geen impact. Weekends en feestdagen worden genegeerd. TooltipTurnoverRate = De omloopsnelheid van de portefeuille geeft aan welk deel van de portefeuille werd "vervangen" gedurende de bewaarperiode, en drukt dit uit als een fractie van de gemiddelde waarde de portefeuille.\n\nAankopen: {0}\nVerkopen: {1}\nGemiddelde waarde van de portefeuille: {2}\nOmloopsnelheid van de portefeuille: {3} -TooltipVolatility = Volatiliteit (ook wel: variantie) is een maat voor de prijsvariatie van een financieel instrument in de tijd.\n\nDe volatiliteit wordt berekend met behulp van de "gecumuleerde" gegevensreeks. Daarom hebben resultaat-onafhankelijke transacties geen effect. Weekends en feestdagen worden genegeerd (bijvoorbeeld Paas- en Kerstdagen). +TooltipVolatility = Volatiliteit (ook wel: standaarddeviatie) is een maat voor de prijsvariatie van een financieel instrument in de tijd.\n\nEen lage volatiliteit betekent dat de koers van een financieel instrument redelijk stabiel is, terwijl een hoge volatiliteit aangeeft dat de koers veel beweegt.\n\nDe volatiliteit wordt berekend met behulp van de "gecumuleerde" gegevensreeks. Daarom hebben resultaatneutrale transacties geen effect. Weekends en feestdagen worden genegeerd. TransactionFilter = Gegevens filteren op transactietype @@ -2583,27 +2583,27 @@ TransactionFilterBuyAndSell = Aan- en verkopen TransactionFilterDeliveries = Leveringen -TransactionFilterDeposit = Deposito's +TransactionFilterDeposit = Stortingen -TransactionFilterDepositAndRemoval = Stortingen en opnames +TransactionFilterDepositAndRemoval = Stortingen en onttrekkingen TransactionFilterDividend = Dividenden -TransactionFilterFees = Transactie met kosten +TransactionFilterFees = Transacties met kosten TransactionFilterInterest = Rente TransactionFilterNone = Alle transactietypen -TransactionFilterRemoval = Opnames +TransactionFilterRemoval = Onttrekkingen -TransactionFilterSecurityRelated = Transacties met effecten +TransactionFilterSecurityRelated = Alleen transacties met effecten TransactionFilterSell = Verkopen TransactionFilterTaxes = Transacties met belastingen -TransactionFilterTransfers = Overschrijvingen +TransactionFilterTransfers = Overboekingen en -schrijvingen Url = URL @@ -2615,8 +2615,8 @@ WatchlistEditDialogMsg = Geef de volglijst een naam WatchlistNewLabel = Nieuwe volglijst -WatchlistRename = Volglijst wijzigen +WatchlistRename = Volglijstnaam wijzigen Website = Website -YearlyPerformanceHeatmapToolTip = Jaarlijkse rendementspercentage weergegeven als heatmap \n\nOm het jaarlijkse rendement te berekenen, wordt het tijdgewogen rendement (TTWROR) gebruikt.\n\nHet rendement wordt altijd voor het volledige jaar berekend, zelfs als de rapportageperiode eindigt of begint in het midden van een jaar. +YearlyPerformanceHeatmapToolTip = Jaarlijkse rendementspercentage weergegeven als heatmap \n\nOm het jaarlijkse rendement te berekenen, wordt het tijdgewogen rendement (TTWROR) gebruikt.\n\nHet rendement wordt altijd voor het volledige jaar berekend, zelfs als de rapportageperiode begint of eindigt in het midden van een jaar. diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_pl.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_pl.properties index 681d6d3afa..54719d54cf 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_pl.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_pl.properties @@ -2195,7 +2195,7 @@ PrefBackupLocation = Lokalizacja kopii zapasowej PrefCheckOnStartup = &Sprawd\u017A aktualizacje przy starcie -PrefCreateBackupBeforeSaving = Automatycznie utw\u00F3rz kopi\u0119 zapasow\u0105 przed zapisaniem pliku (*.backup.xml) +PrefCreateBackupBeforeSaving = Automatycznie utw\u00F3rz kopi\u0119 zapasow\u0105 przed zapisaniem pliku PrefDescriptionAlphaVantage = Alpha Vantage Inc. jest dostawc\u0105 bezp\u0142atnych interfejs\u00F3w API dla danych w czasie rzeczywistym i danych historycznych dotycz\u0105cych akcji, walut fizycznych oraz walut cyfrowych/kryptograficznych.\n\nAby korzysta\u0107 z Alpha Vantage, potrzebujesz klucza API. Darmowy klucz API umo\u017Cliwia do 5 \u017C\u0105da\u0144 na minut\u0119. Alpha Vantage oferuje klucze API premium, kt\u00F3re umo\u017Cliwiaj\u0105 do 600 \u017C\u0105da\u0144 na minut\u0119.\n\nKliknij ten link, aby si\u0119 zarejestrowa\u0107: @@ -2257,9 +2257,9 @@ PrefMsgLanguageConfig = Aby zmieni\u0107 j\u0119zyk, wymagane jest ponowne uruch PrefMyDividends24APIKey = myDividends24 Klucz API -PrefNoteIndirectQuotation = Wyceny z walut\u0105 krajow\u0105 kraju jako walut\u0105 ceny\n(na przyk\u0142ad 0,9009 EUR = 1,00 USD w strefie euro) s\u0105 znane\njako kwotowanie bezpo\u015Brednie lub kwotowanie cenowe (z perspektywy tego kraju) i s\u0105 u\u017Cywane przez wi\u0119kszo\u015B\u0107 kraj\u00F3w.\n\nKwotowania z walut\u0105 krajow\u0105 kraju jako walut\u0105 jednostkow\u0105\n(na przyk\u0142ad 1,11 USD = 1,00 EUR w strefie euro) s\u0105 znane\njako oferta po\u015Brednia lub oferta ilo\u015Bciowa i s\u0105 u\u017Cywane przez\nBrytyjsk\u0105 pras\u0119 i s\u0105 r\u00F3wnie\u017C powszechne w Australii, Nowej\nZelandii i strefie euro.\n\n\u0179r\u00F3d\u0142o: https://en.wikipedia.org/wiki/Exchange_rate\n\n\nPrzyk\u0142ady:\n\nWycena po\u015Brednia (ilo\u015B\u0107): EUR/USD 1,1232\n"Za jedno euro dostaje si\u0119 1,1232 USD."\n\nWycena bezpo\u015Brednia (cena): 0,89 USD / EUR\n\u201EJeden USD kosztuje 0,89 EUR\u201D. +PrefNoteIndirectQuotation = Wyceny z walut\u0105 krajow\u0105 kraju jako walut\u0105 ceny (na przyk\u0142ad 0,9009 EUR = 1,00 USD w strefie euro) s\u0105 znane jako kwotowanie bezpo\u015Brednie lub kwotowanie cenowe (z perspektywy tego kraju) i s\u0105 u\u017Cywane przez wi\u0119kszo\u015B\u0107 kraj\u00F3w.\n\nKwotowania z walut\u0105 krajow\u0105 kraju jako walut\u0105 jednostkow\u0105 (na przyk\u0142ad 1,11 USD = 1,00 EUR w strefie euro) s\u0105 znane jako oferta po\u015Brednia lub oferta ilo\u015Bciowa i s\u0105 u\u017Cywane przez Brytyjsk\u0105 pras\u0119 i s\u0105 r\u00F3wnie\u017C powszechne w Australii, Nowej Zelandii i strefie euro.\n\n\u0179r\u00F3d\u0142o: https://en.wikipedia.org/wiki/Exchange_rate\n\n\nPrzyk\u0142ady:\n\nWycena po\u015Brednia (ilo\u015B\u0107): EUR/USD 1,1232\n"Za jedno euro dostaje si\u0119 1,1232 USD."\n\nWycena bezpo\u015Brednia (cena): 0,89 USD / EUR\n\u201EJeden USD kosztuje 0,89 EUR\u201D. -PrefNoteStoreSettingsNextToFile = Ustawienia GUI zawieraj\u0105 konfiguracje, takie jak strona startowa,\nszeroko\u015B\u0107 niekt\u00F3rych kolumn i obszar\u00F3w okien, rozwini\u0119te w\u0119z\u0142y\nwidoku klasyfikacji i wi\u0119cej.\n\nDomy\u015Blnie, ustawienia GUI s\u0105 ukryte w katalogu 'workspace'.\nMo\u017Cliwe jest r\u00F3wnie\u017C przechowywanie ich w pliku '.settings'\nobok samego pliku Portfolio Performance. U\u0142atwia to\nsynchronizacj\u0119 ustawie\u0144 na wielu komputerach.\n\nUwaga: ustawienia GUI nie s\u0105 migrowane. Aby utrzyma\u0107 aktualno\u015B\u0107\nustawienia, wykonaj nast\u0119puj\u0105ce czynno\u015Bci: otw\u00F3rz plik Portfolio Performance ->\nnast\u0119pnie zaznacz opcj\u0119 -> zapisz plik pod now\u0105 nazw\u0105. +PrefNoteStoreSettingsNextToFile = Ustawienia GUI zawieraj\u0105 konfiguracje, takie jak strona startowa, szeroko\u015B\u0107 niekt\u00F3rych kolumn i obszar\u00F3w okien, rozwini\u0119te w\u0119z\u0142y widoku klasyfikacji i wi\u0119cej.\n\nDomy\u015Blnie, ustawienia GUI s\u0105 ukryte w katalogu 'workspace'. Mo\u017Cliwe jest r\u00F3wnie\u017C przechowywanie ich w pliku '.settings' obok samego pliku Portfolio Performance. U\u0142atwia to synchronizacj\u0119 ustawie\u0144 na wielu komputerach.\n\nUwaga: ustawienia GUI nie s\u0105 migrowane. Aby utrzyma\u0107 aktualno\u015B\u0107 ustawienia, wykonaj nast\u0119puj\u0105ce czynno\u015Bci: otw\u00F3rz plik Portfolio Performance -> nast\u0119pnie zaznacz opcj\u0119 -> zapisz plik pod now\u0105 nazw\u0105. PrefPortfolioReportAPIKey = Klucz API Portfolio Report diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_pt.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_pt.properties index 836cb16dce..4ff8e42771 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_pt.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_pt.properties @@ -2195,7 +2195,7 @@ PrefBackupLocation = Local de backup PrefCheckOnStartup = &Verificar se h\u00E1 atualiza\u00E7\u00F5es ao iniciar -PrefCreateBackupBeforeSaving = Cria automaticamente uma c\u00F3pia de backup antes de salvar um arquivo (*.backup.xml) +PrefCreateBackupBeforeSaving = Cria automaticamente uma c\u00F3pia de backup antes de salvar um arquivo PrefDescriptionAlphaVantage = Alpha Vantage Inc. \u00E9 um provedor de APIs gratuitas para dados hist\u00F3ricos e em tempo real sobre a\u00E7\u00F5es, moedas f\u00EDsicas e moedas digitais / criptomoedas.\n\nPara usar o Alpha Vantage, voc\u00EA precisa de uma chave de API. A chave da API gratuita permite at\u00E9 5 solicita\u00E7\u00F5es por minuto. O Alpha Vantage oferece v\u00E1rias chaves de API premium para compra que permitem at\u00E9 600 solicita\u00E7\u00F5es por minuto.\n\nClick neste link para se inscrever: @@ -2257,9 +2257,9 @@ PrefMsgLanguageConfig = Para alterar o idioma, \u00E9 necess\u00E1rio reiniciar. PrefMyDividends24APIKey = myDividends24 Chave API -PrefNoteIndirectQuotation = Cota\u00E7\u00F5es usando a moeda local de um pa\u00EDs como a moeda de pre\u00E7o (por exemplo, \nEUR 0,9009 = USD 1,00 na zona do euro) s\u00E3o conhecidos como cota\u00E7\u00E3o direta\nou cota\u00E7\u00E3o de pre\u00E7o (da perspectiva daquele pa\u00EDs) e s\u00E3o usados pela maioria\ndos pa\u00EDses.\n\nCota\u00E7\u00F5es usando a moeda local de um pa\u00EDs como a moeda unit\u00E1ria (por exemplo,\nUSD 1,11 = EUR 1,00 na zona do euro) s\u00E3o conhecidos como cota\u00E7\u00E3o indireta ou\ncota\u00E7\u00E3o de quantidade e s\u00E3o usados em Jornais brit\u00E2nicos e tamb\u00E9m s\u00E3o comuns\nna Austr\u00E1lia, Nova Zel\u00E2ndia e zona do euro.\n\nFonte: https://en.wikipedia.org/wiki/Exchange_rate\n\n\nExemplos:\n\nCota\u00E7\u00E3o indireta (quantidade): EUR / USD 1,1232 \n"Para um euro, obt\u00E9m-se 1,1232 USD."\n\nCota\u00E7\u00E3o direta (pre\u00E7o): USD / EUR 0,89 \n"Um d\u00F3lar custa 0,89 EUR." +PrefNoteIndirectQuotation = Cota\u00E7\u00F5es usando a moeda local de um pa\u00EDs como a moeda de pre\u00E7o (por exemplo, EUR 0,9009 = USD 1,00 na zona do euro) s\u00E3o conhecidos como cota\u00E7\u00E3o direta ou cota\u00E7\u00E3o de pre\u00E7o (da perspectiva daquele pa\u00EDs) e s\u00E3o usados pela maioria dos pa\u00EDses.\n\nCota\u00E7\u00F5es usando a moeda local de um pa\u00EDs como a moeda unit\u00E1ria (por exemplo, USD 1,11 = EUR 1,00 na zona do euro) s\u00E3o conhecidos como cota\u00E7\u00E3o indireta ou cota\u00E7\u00E3o de quantidade e s\u00E3o usados em Jornais brit\u00E2nicos e tamb\u00E9m s\u00E3o comuns na Austr\u00E1lia, Nova Zel\u00E2ndia e zona do euro.\n\nFonte: https://en.wikipedia.org/wiki/Exchange_rate\n\n\nExemplos:\n\nCota\u00E7\u00E3o indireta (quantidade): EUR / USD 1,1232 \n"Para um euro, obt\u00E9m-se 1,1232 USD."\n\nCota\u00E7\u00E3o direta (pre\u00E7o): USD / EUR 0,89 \n"Um d\u00F3lar custa 0,89 EUR." -PrefNoteStoreSettingsNextToFile = As configura\u00E7\u00F5es de GUI cont\u00EAm configura\u00E7\u00F5es como a p\u00E1gina inicial,\na largura de algumas colunas e \u00E1reas da janela, os n\u00F3s expandidos\nda vista de classifica\u00E7\u00E3o e muito mais.\n\nPor padr\u00E3o, as configura\u00E7\u00F5es de GUI s\u00E3o armazenadas ocultas\nna pasta '\u00E1rea de trabalho'. Tamb\u00E9m \u00E9 poss\u00EDvel armazen\u00E1-los em um\nficheiro '.settings' junto ao ficheiro do Portfolio Performance.\nIsto facilita a sincroniza\u00E7\u00E3o das configura\u00E7\u00F5es em v\u00E1rios PCs.\n\nAten\u00E7\u00E3o: as configura\u00E7\u00F5es de GUI n\u00E3o s\u00E3o migradas. Para manter\nas configura\u00E7\u00F5es atuais, fa\u00E7a o seguinte: abra um arquivo de Portfolio\nPerformance -> altere a caixa de sele\u00E7\u00E3o aqui -> e salve o arquivo\ncom um novo nome. +PrefNoteStoreSettingsNextToFile = As configura\u00E7\u00F5es de GUI cont\u00EAm configura\u00E7\u00F5es como a p\u00E1gina inicial, a largura de algumas colunas e \u00E1reas da janela, os n\u00F3s expandidos da vista de classifica\u00E7\u00E3o e muito mais.\n\nPor padr\u00E3o, as configura\u00E7\u00F5es de GUI s\u00E3o armazenadas ocultas na pasta '\u00E1rea de trabalho'. Tamb\u00E9m \u00E9 poss\u00EDvel armazen\u00E1-los em um ficheiro '.settings' junto ao ficheiro do Portfolio Performance. Isto facilita a sincroniza\u00E7\u00E3o das configura\u00E7\u00F5es em v\u00E1rios PCs.\n\nAten\u00E7\u00E3o: as configura\u00E7\u00F5es de GUI n\u00E3o s\u00E3o migradas. Para manter as configura\u00E7\u00F5es atuais, fa\u00E7a o seguinte: abra um arquivo de Portfolio Performance -> altere a caixa de sele\u00E7\u00E3o aqui -> e salve o arquivo\ncom um novo nome. PrefPortfolioReportAPIKey = Chave da API Portfolio Report diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_pt_BR.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_pt_BR.properties index 54afcf0a0f..f853e50c29 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_pt_BR.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_pt_BR.properties @@ -2195,7 +2195,7 @@ PrefBackupLocation = Local de backup PrefCheckOnStartup = &Verificar se h\u00E1 atualiza\u00E7\u00F5es ao iniciar -PrefCreateBackupBeforeSaving = Cria automaticamente uma c\u00F3pia de backup antes de salvar um arquivo (*.backup.xml) +PrefCreateBackupBeforeSaving = Cria automaticamente uma c\u00F3pia de backup antes de salvar um arquivo PrefDescriptionAlphaVantage = Alpha Vantage Inc. \u00E9 um provedor de APIs gratuitas para dados hist\u00F3ricos e em tempo real sobre a\u00E7\u00F5es, moedas f\u00EDsicas e moedas digitais / criptomoedas.\n\nPara usar o Alpha Vantage, voc\u00EA precisa de uma chave de API. A chave da API gratuita permite at\u00E9 5 solicita\u00E7\u00F5es por minuto. O Alpha Vantage oferece v\u00E1rias chaves de API premium para compra que permitem at\u00E9 600 solicita\u00E7\u00F5es por minuto.\n\nClick neste link para se inscrever: @@ -2257,9 +2257,9 @@ PrefMsgLanguageConfig = Para alterar o idioma, \u00E9 necess\u00E1rio reiniciar. PrefMyDividends24APIKey = myDividends24 Chave API -PrefNoteIndirectQuotation = Cota\u00E7\u00F5es usando a moeda local de um pa\u00EDs como a moeda de pre\u00E7o (por exemplo, EUR 0,9009 = USD 1,00 na zona do euro) s\u00E3o conhecidos como\ncota\u00E7\u00E3o direta\nou cota\u00E7\u00E3o de pre\u00E7o (da perspectiva daquele pa\u00EDs) e s\u00E3o usados pela maioria dos pa\u00EDses.\n\nCota\u00E7\u00F5es usando a moeda local de um pa\u00EDs como a moeda unit\u00E1ria (por exemplo, USD 1,11 = EUR 1,00 na zona do euro) s\u00E3o conhecidos como cota\u00E7\u00E3o indireta ou cota\u00E7\u00E3o de quantidade e s\u00E3o usados em Jornais brit\u00E2nicos e tamb\u00E9m s\u00E3o comuns na Austr\u00E1lia, Nova Zel\u00E2ndia e zona do euro.\n\nFonte: https://en.wikipedia.org/wiki/Exchange_rate\n\n\nExemplos:\n\nCota\u00E7\u00E3o indireta (quantidade): EUR / USD 1,1232 \n"Para um euro, obt\u00E9m-se 1,1232 USD."\n\nCota\u00E7\u00E3o direta (pre\u00E7o): USD / EUR 0,89 \n"Um d\u00F3lar custa 0,89 EUR." +PrefNoteIndirectQuotation = Cota\u00E7\u00F5es usando a moeda local de um pa\u00EDs como a moeda de pre\u00E7o (por exemplo, EUR 0,9009 = USD 1,00 na zona do euro) s\u00E3o conhecidos como\ncota\u00E7\u00E3o direta ou cota\u00E7\u00E3o de pre\u00E7o (da perspectiva daquele pa\u00EDs) e s\u00E3o usados pela maioria dos pa\u00EDses.\n\nCota\u00E7\u00F5es usando a moeda local de um pa\u00EDs como a moeda unit\u00E1ria (por exemplo, USD 1,11 = EUR 1,00 na zona do euro) s\u00E3o conhecidos como cota\u00E7\u00E3o indireta ou cota\u00E7\u00E3o de quantidade e s\u00E3o usados em Jornais brit\u00E2nicos e tamb\u00E9m s\u00E3o comuns na Austr\u00E1lia, Nova Zel\u00E2ndia e zona do euro.\n\nFonte: https://en.wikipedia.org/wiki/Exchange_rate\n\n\nExemplos:\n\nCota\u00E7\u00E3o indireta (quantidade): EUR / USD 1,1232 \n"Para um euro, obt\u00E9m-se 1,1232 USD."\n\nCota\u00E7\u00E3o direta (pre\u00E7o): USD / EUR 0,89 \n"Um d\u00F3lar custa 0,89 EUR." -PrefNoteStoreSettingsNextToFile = As configura\u00E7\u00F5es de GUI cont\u00EAm configura\u00E7\u00F5es como a p\u00E1gina inicial,\na largura de algumas colunas e \u00E1reas da janela, os n\u00F3s expandidos\nda tela de classifica\u00E7\u00E3o e muito mais.\n\nPor padr\u00E3o, as configura\u00E7\u00F5es de GUI s\u00E3o armazenadas ocultas\nna pasta '\u00E1rea de trabalho'. Tamb\u00E9m \u00E9 poss\u00EDvel armazen\u00E1-los em um\nficheiro '.settings' junto ao ficheiro do Portfolio Performance.\nIsto facilita a sincroniza\u00E7\u00E3o das configura\u00E7\u00F5es em v\u00E1rios PCs.\n\nAten\u00E7\u00E3o: as configura\u00E7\u00F5es de GUI n\u00E3o s\u00E3o migradas. Para manter\nas configura\u00E7\u00F5es atuais, fa\u00E7a o seguinte: abra um arquivo de Portfolio\nPerformance -> altere a caixa de sele\u00E7\u00E3o aqui -> e salve o arquivo\ncom um novo nome. +PrefNoteStoreSettingsNextToFile = As configura\u00E7\u00F5es de GUI cont\u00EAm configura\u00E7\u00F5es como a p\u00E1gina inicial, a largura de algumas colunas e \u00E1reas da janela, os n\u00F3s expandidos da tela de classifica\u00E7\u00E3o e muito mais.\n\nPor padr\u00E3o, as configura\u00E7\u00F5es de GUI s\u00E3o armazenadas ocultas na pasta '\u00E1rea de trabalho'. Tamb\u00E9m \u00E9 poss\u00EDvel armazen\u00E1-los em um ficheiro '.settings' junto ao ficheiro do Portfolio Performance. Isto facilita a sincroniza\u00E7\u00E3o das configura\u00E7\u00F5es em v\u00E1rios PCs.\n\nAten\u00E7\u00E3o: as configura\u00E7\u00F5es de GUI n\u00E3o s\u00E3o migradas. Para manter as configura\u00E7\u00F5es atuais, fa\u00E7a o seguinte: abra um arquivo de Portfolio Performance -> altere a caixa de sele\u00E7\u00E3o aqui -> e salve o arquivo com um novo nome. PrefPortfolioReportAPIKey = Chave da API Portfolio Report diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_ru.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_ru.properties index 8f63ee5e9e..668e4c6403 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_ru.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_ru.properties @@ -2195,7 +2195,7 @@ PrefBackupLocation = \u041C\u0435\u0441\u0442\u043E \u0440\u0435\u0437\u0435\u04 PrefCheckOnStartup = &\u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0442\u044C \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u0437\u0430\u043F\u0443\u0441\u043A\u0435 -PrefCreateBackupBeforeSaving = \u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0442\u044C \u0440\u0435\u0437\u0435\u0440\u0432\u043D\u0443\u044E \u043A\u043E\u043F\u0438\u044E \u043F\u0435\u0440\u0435\u0434 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435\u043C \u0444\u0430\u0439\u043B\u0430 (* .backup.xml) +PrefCreateBackupBeforeSaving = \u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 \u0441\u043E\u0437\u0434\u0430\u0432\u0430\u0442\u044C \u0440\u0435\u0437\u0435\u0440\u0432\u043D\u0443\u044E \u043A\u043E\u043F\u0438\u044E \u043F\u0435\u0440\u0435\u0434 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435\u043C \u0444\u0430\u0439\u043B\u0430 PrefDescriptionAlphaVantage = Alpha Vantage Inc. - \u043F\u043E\u0441\u0442\u0430\u0432\u0449\u0438\u043A \u0431\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u044B\u0445 API-\u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043E\u0432 \u0434\u043B\u044F \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u044F \u0434\u0430\u043D\u043D\u044B\u0445 \u0432 \u0440\u0435\u0430\u043B\u044C\u043D\u043E\u043C \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0438 \u0438\u0441\u0442\u043E\u0440\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0434\u0430\u043D\u043D\u044B\u0445 \u043E\u0431 \u0430\u043A\u0446\u0438\u044F\u0445, \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043A\u0438\u0445 \u0432\u0430\u043B\u044E\u0442\u0430\u0445, \u0430 \u0442\u0430\u043A\u0436\u0435 \u0446\u0438\u0444\u0440\u043E\u0432\u044B\u0445 / \u043A\u0440\u0438\u043F\u0442\u043E\u0432\u0430\u043B\u044E\u0442\u0430\u0445.\n\n\u0427\u0442\u043E\u0431\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C Alpha Vantage, \u0432\u0430\u043C \u043F\u043E\u043D\u0430\u0434\u043E\u0431\u0438\u0442\u0441\u044F \u043A\u043B\u044E\u0447 API. \u0411\u0435\u0441\u043F\u043B\u0430\u0442\u043D\u044B\u0439 \u043A\u043B\u044E\u0447 API \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u0435\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0442\u044C \u0434\u043E 5 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u0432 \u043C\u0438\u043D\u0443\u0442\u0443. Alpha Vantage \u043F\u0440\u0435\u0434\u043B\u0430\u0433\u0430\u0435\u0442 \u0434\u043B\u044F \u043F\u043E\u043A\u0443\u043F\u043A\u0438 \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0435 \u043A\u043B\u044E\u0447\u0438 API \u043F\u0440\u0435\u043C\u0438\u0443\u043C-\u043A\u043B\u0430\u0441\u0441\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043F\u043E\u0437\u0432\u043E\u043B\u044F\u044E\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0442\u044C \u0434\u043E 600 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u0432 \u043C\u0438\u043D\u0443\u0442\u0443.\n\n\u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u043F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043F\u043E \u044D\u0442\u043E\u0439 \u0441\u0441\u044B\u043B\u043A\u0435, \u0447\u0442\u043E\u0431\u044B \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043E\u0432\u0430\u0442\u044C\u0441\u044F: @@ -2257,9 +2257,9 @@ PrefMsgLanguageConfig = \u0414\u043B\u044F \u0438\u0437\u043C\u0435\u043D\u0435\ PrefMyDividends24APIKey = API-\u043A\u043B\u044E\u0447 myDividends24 -PrefNoteIndirectQuotation = \u041A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0438 \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u0434\u043E\u043C\u0430\u0448\u043D\u0435\u0439 \u0432\u0430\u043B\u044E\u0442\u044B \u0441\u0442\u0440\u0430\u043D\u044B \u0432 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0430\u043B\u044E\u0442\u044B \u0446\u0435\u043D\u044B\n(\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, 0,9009 \u0435\u0432\u0440\u043E = 1,00 \u0434\u043E\u043B\u043B\u0430\u0440 \u0421\u0428\u0410 \u0432 \u0435\u0432\u0440\u043E\u0437\u043E\u043D\u0435) \u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B\n\u043A\u0430\u043A \u043F\u0440\u044F\u043C\u0430\u044F \u043A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0438\u043B\u0438 \u0446\u0435\u043D\u043E\u0432\u0430\u044F \u043A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0430 (\u0441 \u0442\u043E\u0447\u043A\u0438 \u0437\u0440\u0435\u043D\u0438\u044F \u044D\u0442\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u044B) \u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u0432 \u0431\u043E\u043B\u044C\u0448\u0438\u043D\u0441\u0442\u0432\u0435 \u0441\u0442\u0440\u0430\u043D.\n\n\u041A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0438 \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043D\u0430\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0439 \u0432\u0430\u043B\u044E\u0442\u044B \u0441\u0442\u0440\u0430\u043D\u044B \u0432 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0430\u043B\u044E\u0442\u044B \u0435\u0434\u0438\u043D\u0438\u0446\u044B\n(\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, 1,11 \u0434\u043E\u043B\u043B. \u0421\u0428\u0410 = 1,00 \u0435\u0432\u0440\u043E \u0432 \u0435\u0432\u0440\u043E\u0437\u043E\u043D\u0435) \u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B\n\u043A\u0430\u043A \u043A\u043E\u0441\u0432\u0435\u043D\u043D\u0430\u044F \u043A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0438\u043B\u0438 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u043A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u0432 \u0411\u0440\u0438\u0442\u0430\u043D\u0441\u043A\u0438\u0445 \u0433\u0430\u0437\u0435\u0442\u0430\u0445, \u0430 \u0442\u0430\u043A\u0436\u0435 \u0440\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0435\u043D\u044B \u0432 \u0410\u0432\u0441\u0442\u0440\u0430\u043B\u0438\u0438, \u041D\u043E\u0432\u043E\u0439\n\u0417\u0435\u043B\u0430\u043D\u0434\u0438\u0438 \u0438 \u0435\u0432\u0440\u043E\u0437\u043E\u043D\u0435.\n\n\u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A: https://en.wikipedia.org/wiki/Exchange_rate\n\n\n\u041F\u0440\u0438\u043C\u0435\u0440\u044B:\n\n\u041A\u043E\u0441\u0432\u0435\u043D\u043D\u0430\u044F (\u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F) \u043A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0430: EUR / USD 1,1232\n\u00AB\u0417\u0430 \u043E\u0434\u0438\u043D \u0435\u0432\u0440\u043E \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442\u0441\u044F 1,1232 \u0434\u043E\u043B\u043B\u0430\u0440\u0430\u00BB.\n\n\u041F\u0440\u044F\u043C\u0430\u044F (\u0446\u0435\u043D\u0430) \u043A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0430: 0,89 \u0434\u043E\u043B\u043B. \u0421\u0428\u0410 / \u0435\u0432\u0440\u043E\n\u00AB\u041E\u0434\u0438\u043D \u0434\u043E\u043B\u043B\u0430\u0440 \u0441\u0442\u043E\u0438\u0442 0,89 \u0435\u0432\u0440\u043E\u00BB. +PrefNoteIndirectQuotation = \u041A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0438 \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u0434\u043E\u043C\u0430\u0448\u043D\u0435\u0439 \u0432\u0430\u043B\u044E\u0442\u044B \u0441\u0442\u0440\u0430\u043D\u044B \u0432 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0430\u043B\u044E\u0442\u044B \u0446\u0435\u043D\u044B (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, 0,9009 \u0435\u0432\u0440\u043E = 1,00 \u0434\u043E\u043B\u043B\u0430\u0440 \u0421\u0428\u0410 \u0432 \u0435\u0432\u0440\u043E\u0437\u043E\u043D\u0435) \u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B \u043A\u0430\u043A \u043F\u0440\u044F\u043C\u0430\u044F \u043A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0438\u043B\u0438 \u0446\u0435\u043D\u043E\u0432\u0430\u044F \u043A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0430 (\u0441 \u0442\u043E\u0447\u043A\u0438 \u0437\u0440\u0435\u043D\u0438\u044F \u044D\u0442\u043E\u0439 \u0441\u0442\u0440\u0430\u043D\u044B) \u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u0432 \u0431\u043E\u043B\u044C\u0448\u0438\u043D\u0441\u0442\u0432\u0435 \u0441\u0442\u0440\u0430\u043D.\n\n\u041A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0438 \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043D\u0430\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u043E\u0439 \u0432\u0430\u043B\u044E\u0442\u044B \u0441\u0442\u0440\u0430\u043D\u044B \u0432 \u043A\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0432\u0430\u043B\u044E\u0442\u044B \u0435\u0434\u0438\u043D\u0438\u0446\u044B (\u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440, 1,11 \u0434\u043E\u043B\u043B. \u0421\u0428\u0410 = 1,00 \u0435\u0432\u0440\u043E \u0432 \u0435\u0432\u0440\u043E\u0437\u043E\u043D\u0435) \u0438\u0437\u0432\u0435\u0441\u0442\u043D\u044B \u043A\u0430\u043A \u043A\u043E\u0441\u0432\u0435\u043D\u043D\u0430\u044F \u043A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0438\u043B\u0438 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F \u043A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0430 \u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F \u0432 \u0411\u0440\u0438\u0442\u0430\u043D\u0441\u043A\u0438\u0445 \u0433\u0430\u0437\u0435\u0442\u0430\u0445, \u0430 \u0442\u0430\u043A\u0436\u0435 \u0440\u0430\u0441\u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0435\u043D\u044B \u0432 \u0410\u0432\u0441\u0442\u0440\u0430\u043B\u0438\u0438, \u041D\u043E\u0432\u043E\u0439 \u0417\u0435\u043B\u0430\u043D\u0434\u0438\u0438 \u0438 \u0435\u0432\u0440\u043E\u0437\u043E\u043D\u0435.\n\n\u0418\u0441\u0442\u043E\u0447\u043D\u0438\u043A: https://en.wikipedia.org/wiki/Exchange_rate\n\n\n\u041F\u0440\u0438\u043C\u0435\u0440\u044B:\n\n\u041A\u043E\u0441\u0432\u0435\u043D\u043D\u0430\u044F (\u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0435\u043D\u043D\u0430\u044F) \u043A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0430: EUR / USD 1,1232\n\u00AB\u0417\u0430 \u043E\u0434\u0438\u043D \u0435\u0432\u0440\u043E \u043F\u043E\u043B\u0443\u0447\u0430\u0435\u0442\u0441\u044F 1,1232 \u0434\u043E\u043B\u043B\u0430\u0440\u0430\u00BB.\n\n\u041F\u0440\u044F\u043C\u0430\u044F (\u0446\u0435\u043D\u0430) \u043A\u043E\u0442\u0438\u0440\u043E\u0432\u043A\u0430: 0,89 \u0434\u043E\u043B\u043B. \u0421\u0428\u0410 / \u0435\u0432\u0440\u043E\n\u00AB\u041E\u0434\u0438\u043D \u0434\u043E\u043B\u043B\u0430\u0440 \u0441\u0442\u043E\u0438\u0442 0,89 \u0435\u0432\u0440\u043E\u00BB. -PrefNoteStoreSettingsNextToFile = \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442 \u0442\u0430\u043A\u0438\u0435 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043A\u0430\u043A \u0441\u0442\u0430\u0440\u0442\u043E\u0432\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430, \u0448\u0438\u0440\u0438\u043D\u0430 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0441\u0442\u043E\u043B\u0431\u0446\u043E\u0432 \u0438 \u043E\u043A\u043E\u043D\u043D\u044B\u0445 \u043E\u0431\u043B\u0430\u0441\u0442\u0435\u0439, \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0435 \u043A\u043E\u043B\u043E\u043D\u043A\u0438, \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043A\u043B\u0430\u0441\u0441\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0439 \u0438 \u0434\u0440.\n\n\u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0441\u043A\u0440\u044B\u0442\u044B \u0432 \u043F\u0430\u043F\u043A\u0435 'workspace'. \u0418\u0445 \u0442\u0430\u043A\u0436\u0435 \u043C\u043E\u0436\u043D\u043E \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0432 \u0444\u0430\u0439\u043B\u0435 .settings.\n\u0440\u044F\u0434\u043E\u043C \u0441 \u0441\u0430\u043C\u0438\u043C \u0444\u0430\u0439\u043B\u043E\u043C Portfolio Performance. \u042D\u0442\u043E \u043E\u0431\u043B\u0435\u0433\u0447\u0430\u0435\u0442\n\u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u044E \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u043D\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u041F\u041A.\n\n\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435: \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043D\u0435 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u044F\u0442\u0441\u044F. \u0427\u0442\u043E\u0431\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0438\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F: \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u0444\u0430\u0439\u043B Portfolio Performance ->\n\u0437\u0430\u0442\u0435\u043C \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u0435 \u0444\u043B\u0430\u0436\u043E\u043A \u0437\u0434\u0435\u0441\u044C -> \u0437\u0430\u0442\u0435\u043C \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u0435 \u0444\u0430\u0439\u043B \u043F\u043E\u0434 \u043D\u043E\u0432\u044B\u043C\n\u0438\u043C\u0435\u043C. +PrefNoteStoreSettingsNextToFile = \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0442 \u0442\u0430\u043A\u0438\u0435 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043A\u0430\u043A \u0441\u0442\u0430\u0440\u0442\u043E\u0432\u0430\u044F \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430, \u0448\u0438\u0440\u0438\u043D\u0430 \u043D\u0435\u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0441\u0442\u043E\u043B\u0431\u0446\u043E\u0432 \u0438 \u043E\u043A\u043E\u043D\u043D\u044B\u0445 \u043E\u0431\u043B\u0430\u0441\u0442\u0435\u0439, \u0440\u0430\u0437\u0432\u0435\u0440\u043D\u0443\u0442\u044B\u0435 \u043A\u043E\u043B\u043E\u043D\u043A\u0438, \u043F\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043A\u043B\u0430\u0441\u0441\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0439 \u0438 \u0434\u0440.\n\n\u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0441\u043A\u0440\u044B\u0442\u044B \u0432 \u043F\u0430\u043F\u043A\u0435 'workspace'. \u0418\u0445 \u0442\u0430\u043A\u0436\u0435 \u043C\u043E\u0436\u043D\u043E \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0432 \u0444\u0430\u0439\u043B\u0435 .settings. \u0440\u044F\u0434\u043E\u043C \u0441 \u0441\u0430\u043C\u0438\u043C \u0444\u0430\u0439\u043B\u043E\u043C Portfolio Performance. \u042D\u0442\u043E \u043E\u0431\u043B\u0435\u0433\u0447\u0430\u0435\u0442 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u044E \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A \u043D\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u0438\u0445 \u041F\u041A.\n\n\u0412\u043D\u0438\u043C\u0430\u043D\u0438\u0435: \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u043D\u0435 \u043F\u0435\u0440\u0435\u043D\u043E\u0441\u044F\u0442\u0441\u044F. \u0427\u0442\u043E\u0431\u044B \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0438\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044F: \u043E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \u0444\u0430\u0439\u043B Portfolio Performance -> \u0437\u0430\u0442\u0435\u043C \u0438\u0437\u043C\u0435\u043D\u0438\u0442\u0435 \u0444\u043B\u0430\u0436\u043E\u043A \u0437\u0434\u0435\u0441\u044C -> \u0437\u0430\u0442\u0435\u043C \u0441\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u0435 \u0444\u0430\u0439\u043B \u043F\u043E\u0434 \u043D\u043E\u0432\u044B\u043C \u0438\u043C\u0435\u043C. PrefPortfolioReportAPIKey = \u041A\u043B\u044E\u0447 API DivvyDiary \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. \u041D\u0430\u0441\u0442\u0440\u043E\u0438\u0442\u044C \u0432 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430\u0445. diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_sk.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_sk.properties index 9f9dcd8a3a..cbccdb24e1 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_sk.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_sk.properties @@ -2197,7 +2197,7 @@ PrefBackupLocation = Umiestnenie z\u00E1lohy PrefCheckOnStartup = &Kontrola aktualiz\u00E1ci\u00ED pri spusten\u00ED -PrefCreateBackupBeforeSaving = Automatick\u00E9 vytvorenie z\u00E1lo\u017Enej k\u00F3pie pred ulo\u017Een\u00EDm s\u00FAboru (*.backup.xml) +PrefCreateBackupBeforeSaving = Automatick\u00E9 vytvorenie z\u00E1lo\u017Enej k\u00F3pie pred ulo\u017Een\u00EDm s\u00FAboru PrefDescriptionAlphaVantage = Spolo\u010Dnos\u0165 Alpha Vantage Inc. je poskytovate\u013Eom bezplatn\u00FDch rozhran\u00ED API pre \u00FAdaje v re\u00E1lnom \u010Dase a historick\u00E9 \u00FAdaje o akci\u00E1ch, fyzick\u00FDch men\u00E1ch a digit\u00E1lnych/krypto men\u00E1ch.\n\nNa pou\u017E\u00EDvanie Alpha Vantage potrebujete k\u013E\u00FA\u010D API. Bezplatn\u00FD k\u013E\u00FA\u010D API umo\u017E\u0148uje a\u017E 5 po\u017Eiadaviek za min\u00FAtu. Alpha Vantage pon\u00FAka na zak\u00FApenie r\u00F4zne pr\u00E9miov\u00E9 k\u013E\u00FA\u010De API, ktor\u00E9 umo\u017E\u0148uj\u00FA a\u017E 600 po\u017Eiadaviek za min\u00FAtu.\n\nAk sa chcete zaregistrova\u0165, postupujte pod\u013Ea tohto odkazu: @@ -2259,9 +2259,9 @@ PrefMsgLanguageConfig = Na zmenu jazyka je potrebn\u00FD re\u0161tart. PrefMyDividends24APIKey = K\u013E\u00FA\u010D API myDividends24 -PrefNoteIndirectQuotation = Kot\u00E1cie, pri ktor\u00FDch sa ako mena ceny pou\u017E\u00EDva dom\u00E1ca mena krajiny \n(napr\u00EDklad 0,9009 EUR = 1,00 USD v euroz\u00F3ne), s\u00FA zn\u00E1me ako priame kot\u00E1cie alebo cenov\u00E9 kot\u00E1cie (z poh\u013Eadu danej krajiny) a pou\u017E\u00EDva ich v\u00E4\u010D\u0161ina kraj\u00EDn.\n\nK\u00F3tovanie, pri ktorom sa ako jednotkov\u00E1 mena pou\u017E\u00EDva dom\u00E1ca mena krajiny \n(napr\u00EDklad 1,11 USD = 1,00 EUR v euroz\u00F3ne), je zn\u00E1me ako nepriame k\u00F3tovanie alebo k\u00F3tovanie mno\u017Estva a pou\u017E\u00EDva sa v britsk\u00FDch novin\u00E1ch a je be\u017En\u00E9 aj v Austr\u00E1lii, na Novom Z\u00E9lande a v euroz\u00F3ne.\n\nZdroj: https://en.wikipedia.org/wiki/Exchange_rate\n\n\nPr\u00EDklady:\n\nNepriama (mno\u017Estevn\u00E1) cenov\u00E1 ponuka: \n"Za jedno euro dostanete 1,1232 USD."\n\nPriama (cenov\u00E1) kot\u00E1cia: USD/EUR 0,89 \n"Jeden USD stoj\u00ED 0,89 EUR." +PrefNoteIndirectQuotation = Kot\u00E1cie, pri ktor\u00FDch sa ako mena ceny pou\u017E\u00EDva dom\u00E1ca mena krajiny (napr\u00EDklad 0,9009 EUR = 1,00 USD v euroz\u00F3ne), s\u00FA zn\u00E1me ako priame kot\u00E1cie alebo cenov\u00E9 kot\u00E1cie (z poh\u013Eadu danej krajiny) a pou\u017E\u00EDva ich v\u00E4\u010D\u0161ina kraj\u00EDn.\n\nK\u00F3tovanie, pri ktorom sa ako jednotkov\u00E1 mena pou\u017E\u00EDva dom\u00E1ca mena krajiny (napr\u00EDklad 1,11 USD = 1,00 EUR v euroz\u00F3ne), je zn\u00E1me ako nepriame k\u00F3tovanie alebo k\u00F3tovanie mno\u017Estva a pou\u017E\u00EDva sa v britsk\u00FDch novin\u00E1ch a je be\u017En\u00E9 aj v Austr\u00E1lii, na Novom Z\u00E9lande a v euroz\u00F3ne.\n\nZdroj: https://en.wikipedia.org/wiki/Exchange_rate\n\n\nPr\u00EDklady:\n\nNepriama (mno\u017Estevn\u00E1) cenov\u00E1 ponuka: \n"Za jedno euro dostanete 1,1232 USD."\n\nPriama (cenov\u00E1) kot\u00E1cia: USD/EUR 0,89 \n"Jeden USD stoj\u00ED 0,89 EUR." -PrefNoteStoreSettingsNextToFile = Nastavenia grafick\u00E9ho rozhrania obsahuj\u00FA konfigur\u00E1cie, ako je \u00FAvodn\u00E1 str\u00E1nka, \n\u0161\u00EDrka niektor\u00FDch st\u013Apcov a oblast\u00ED okien, roz\u0161\u00EDren\u00E9 uzly klasifika\u010Dn\u00E9ho zobrazenia a \u010Fal\u0161ie.\n\nV predvolenom nastaven\u00ED s\u00FA nastavenia grafick\u00E9ho pou\u017E\u00EDvate\u013Esk\u00E9ho rozhrania ulo\u017Een\u00E9 skryto v prie\u010Dinku "workspace". Je tie\u017E mo\u017En\u00E9 ulo\u017Ei\u0165 ich do s\u00FAboru '.settings' ved\u013Ea samotn\u00E9ho s\u00FAboru Portfolio Performance. To u\u013Eah\u010Duje synchroniz\u00E1ciu nastaven\u00ED na viacer\u00FDch po\u010D\u00EDta\u010Doch.\n\nPozor: Nastavenia grafick\u00E9ho rozhrania sa nemigruj\u00FA. Ak chcete zachova\u0165 aktu\u00E1lne nastavenia, postupujte takto: \notvorte s\u00FAbor Portfolio Performance -> \npotom tu zme\u0148te za\u0161krt\u00E1vacie pol\u00ED\u010Dko -> potom s\u00FAbor ulo\u017Ete pod nov\u00FDm n\u00E1zvom. +PrefNoteStoreSettingsNextToFile = Nastavenia grafick\u00E9ho rozhrania obsahuj\u00FA konfigur\u00E1cie, ako je \u00FAvodn\u00E1 str\u00E1nka, \u0161\u00EDrka niektor\u00FDch st\u013Apcov a oblast\u00ED okien, roz\u0161\u00EDren\u00E9 uzly klasifika\u010Dn\u00E9ho zobrazenia a \u010Fal\u0161ie.\n\nV predvolenom nastaven\u00ED s\u00FA nastavenia grafick\u00E9ho pou\u017E\u00EDvate\u013Esk\u00E9ho rozhrania ulo\u017Een\u00E9 skryto v prie\u010Dinku "workspace". Je tie\u017E mo\u017En\u00E9 ulo\u017Ei\u0165 ich do s\u00FAboru '.settings' ved\u013Ea samotn\u00E9ho s\u00FAboru Portfolio Performance. To u\u013Eah\u010Duje synchroniz\u00E1ciu nastaven\u00ED na viacer\u00FDch po\u010D\u00EDta\u010Doch.\n\nPozor: Nastavenia grafick\u00E9ho rozhrania sa nemigruj\u00FA. Ak chcete zachova\u0165 aktu\u00E1lne nastavenia, postupujte takto: otvorte s\u00FAbor Portfolio Performance -> potom tu zme\u0148te za\u0161krt\u00E1vacie pol\u00ED\u010Dko -> potom s\u00FAbor ulo\u017Ete pod nov\u00FDm n\u00E1zvom. PrefPortfolioReportAPIKey = K\u013E\u00FA\u010D API k spr\u00E1ve o portf\u00F3liu diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_zh.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_zh.properties index bde03021ec..ab6454c793 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_zh.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_zh.properties @@ -2197,7 +2197,7 @@ PrefBackupLocation = \u5907\u4EFD\u4F4D\u7F6E PrefCheckOnStartup = &\u542F\u52A8\u65F6\u68C0\u67E5\u66F4\u65B0 -PrefCreateBackupBeforeSaving = \u4FDD\u5B58\u6587\u4EF6\u524D\u81EA\u52A8\u5907\u4EFD (*.backup.xml) +PrefCreateBackupBeforeSaving = \u4FDD\u5B58\u6587\u4EF6\u524D\u81EA\u52A8\u5907\u4EFD PrefDescriptionAlphaVantage = Alpha Vantage Inc. \u4E3A\u80A1\u7968\u3001\u5916\u6C47\u53CA\u6570\u5B57\u8D27\u5E01\u7684\u5B9E\u65F6\u4E0E\u5386\u53F2\u62A5\u4EF7\u63D0\u4F9B\u514D\u8D39 API\u3002\n\n\u4F60\u9700\u8981 API \u5BC6\u94A5\u4EE5\u4F7F\u7528 Alpha Vantage\u3002\u514D\u8D39\u7684 API \u5BC6\u94A5\u9650\u5236\u4E3A\u6BCF\u5206\u949F\n5 \u4E2A\u8BF7\u6C42\u3002Alpha Vantage \u4E5F\u63D0\u4F9B\u591A\u79CD\u6536\u8D39 API \u5BC6\u94A5\uFF0C\u6700\u9AD8\u9650\u5236\u4E3A\u6BCF\u5206\u949F\n600 \u4E2A\u8BF7\u6C42\u3002\n\n\u8BF7\u4F7F\u7528\u6B64\u94FE\u63A5\u6CE8\u518C\uFF1A @@ -2259,7 +2259,7 @@ PrefMsgLanguageConfig = \u91CD\u542F\u8F6F\u4EF6\u4EE5\u66F4\u6539\u8BED\u8A00\u PrefMyDividends24APIKey = myDividends24 API \u5BC6\u94A5 -PrefNoteIndirectQuotation = \u76F4\u63A5\u6C47\u7387\uFF1A\u4EE5\u5916\u5E01\u4F5C\u57FA\u51C6\u8868\u793A\u672C\u5730\u8D27\u5E01\u6C47\u7387\u3002\u4F8B\u5982\uFF0C\nUSD/CNY 6.84\u3002\u201C1 \u7F8E\u5143\u503C 6.84 \u4EBA\u6C11\u5E01\u3002\u201D\n\u76EE\u524D\uFF0C\u4E16\u754C\u5404\u56FD\u591A\u4EE5\u76F4\u63A5\u6C47\u7387\u4E3A\u4E3B\u3002\n\n\u95F4\u63A5\u6C47\u7387\uFF1A\u4EE5\u672C\u5730\u8D27\u5E01\u4F5C\u57FA\u51C6\u8868\u793A\u5916\u5E01\u6C47\u7387\u3002\n\u4F8B\u5982\uFF0CCNY/USD 0.15\u3002\u201C1 \u4EBA\u6C11\u5E01\u503C 0.15 \u7F8E\u5143\u3002\u201D\n\u95F4\u63A5\u6C47\u7387\u4E3B\u8981\u5728\u6B27\u5143\u533A\u3001\u82F1\u56FD\u3001\u6FB3\u6D32\u53CA\u65B0\u897F\u5170\u4F7F\u7528\u3002\n\n\u6765\u6E90\uFF1Ahttps://zh.wikipedia.org/wiki/%E6%B1%87%E7%8E%87 +PrefNoteIndirectQuotation = \u76F4\u63A5\u6C47\u7387\uFF1A\u4EE5\u5916\u5E01\u4F5C\u57FA\u51C6\u8868\u793A\u672C\u5730\u8D27\u5E01\u6C47\u7387\u3002\u4F8B\u5982\uFF0CUSD/CNY 6.84\u3002\u201C1 \u7F8E\u5143\u503C 6.84 \u4EBA\u6C11\u5E01\u3002\u201D \u76EE\u524D\uFF0C\u4E16\u754C\u5404\u56FD\u591A\u4EE5\u76F4\u63A5\u6C47\u7387\u4E3A\u4E3B\u3002\n\n\u95F4\u63A5\u6C47\u7387\uFF1A\u4EE5\u672C\u5730\u8D27\u5E01\u4F5C\u57FA\u51C6\u8868\u793A\u5916\u5E01\u6C47\u7387\u3002\u4F8B\u5982\uFF0CCNY/USD 0.15\u3002\u201C1 \u4EBA\u6C11\u5E01\u503C 0.15 \u7F8E\u5143\u3002\u201D \u95F4\u63A5\u6C47\u7387\u4E3B\u8981\u5728\u6B27\u5143\u533A\u3001\u82F1\u56FD\u3001\u6FB3\u6D32\u53CA\u65B0\u897F\u5170\u4F7F\u7528\u3002\n\n\u6765\u6E90\uFF1Ahttps://zh.wikipedia.org/wiki/%E6%B1%87%E7%8E%87 PrefNoteStoreSettingsNextToFile = GUI \u8BBE\u7F6E\u6DB5\u76D6\u8D77\u59CB\u9875\u3001\u5217\u4E0E\u7A97\u53E3\u5BBD\u5EA6\u3001\u5206\u7C7B\u89C6\u56FE\u5C55\u5F00\u7684\u5B50\u9879\u7B49\u3002\n\n\u9ED8\u8BA4\u60C5\u51B5\u4E0B\uFF0CGUI \u8BBE\u7F6E\u4FDD\u5B58\u5728\u9690\u85CF\u7684 \u201C\u5DE5\u4F5C\u533A\u201D \u76EE\u5F55\u3002\u4E5F\u53EF\u4EE5\u4FDD\u5B58\u81F3 Portfolio Performance \u6587\u4EF6\u65C1\u7684 \u201C.settings\u201D \u6587\u4EF6\uFF0C\u4EE5\u4FBF\u5728\u4E0D\u540C\u7535\u8111\u4E4B\u95F4\u540C\u6B65\u8BBE\u7F6E\u3002\n\n\u6CE8\u610F\uFF1AGUI \u8BBE\u7F6E\u4E0D\u4F1A\u88AB\u8F6C\u79FB\u3002\u5982\u9700\u4FDD\u5B58\uFF0C\u8BF7\u6309\u4EE5\u4E0B\u6B65\u9AA4\u64CD\u4F5C\uFF1A\n\u6253\u5F00 Portfolio Performance \u6587\u4EF6 -> \u52FE\u9009\u6B64\u8BBE\u7F6E -> \u5C06\u6587\u4EF6\u4EE5\u5176\u4ED6\u540D\u79F0\u4FDD\u5B58\u3002 diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_zh_TW.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_zh_TW.properties index 3fcf36d834..01c90c91c5 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_zh_TW.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/messages_zh_TW.properties @@ -2195,7 +2195,7 @@ PrefBackupLocation = \u5099\u4EFD\u4F4D\u7F6E PrefCheckOnStartup = \u555F\u52D5\u6642\u6AA2\u67E5\u66F4\u65B0 -PrefCreateBackupBeforeSaving = \u81EA\u52D5\u5728\u4FDD\u5B58\u6A94\u6848\u4E4B\u524D\u5EFA\u7ACB\u5099\u4EFD\u526F\u672C\uFF08*.backup.xml\uFF09 +PrefCreateBackupBeforeSaving = \u81EA\u52D5\u5728\u4FDD\u5B58\u6A94\u6848\u4E4B\u524D\u5EFA\u7ACB\u5099\u4EFD\u526F\u672C PrefDescriptionAlphaVantage = Alpha Vantage Inc. \u662F\u63D0\u4F9B\u80A1\u7968\u3001\u5BE6\u7269\u8CA8\u5E63\u548C\u6578\u5B57/\u52A0\u5BC6\u8CA8\u5E63\u5BE6\u6642\u548C\u6B77\u53F2\u6578\u64DA\u7684\u514D\u8CBBAPI\u63D0\u4F9B\u5546\u3002\n\n\u4F7F\u7528Alpha Vantage\uFF0C\u60A8\u9700\u8981\u4E00\u500BAPI\u5BC6\u9470\u3002\u514D\u8CBBAPI\u5BC6\u9470\u6BCF\u5206\u9418\u53EF\u9032\u884C5\u6B21\u8ACB\u6C42\u3002Alpha Vantage\u63D0\u4F9B\u591A\u7A2E\u9AD8\u7D1AAPI\u5BC6\u9470\u4F9B\u8CFC\u8CB7\uFF0C\u6BCF\u5206\u9418\u6700\u591A\u53EF\u9032\u884C600\u6B21\u8ACB\u6C42\u3002\n\n\u8ACB\u4F7F\u7528\u4EE5\u4E0B\u93C8\u63A5\u8A3B\u518A\uFF1A diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/parts/samplemessages_nl.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/parts/samplemessages_nl.properties index 6a77ddb342..7082245dd1 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/parts/samplemessages_nl.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/parts/samplemessages_nl.properties @@ -15,13 +15,13 @@ Kommer_Commodities = Grondstoffen Kommer_CryptocurrencyAccount = Cryptovalutarekening -Kommer_DepositAccount = Beleggingsrekening +Kommer_DepositAccount = Portefeuillerekening Kommer_DiagramConfigurationSimple = Eenvoudig Kommer_JapanAustralia = Japan/Australi\u00EB -Kommer_RealAssetsWorldwide = Onroerend goed +Kommer_RealAssetsWorldwide = Vastgoed Kommer_RiskBasedPart = Niet-risicovrij portefeuilledeel diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/preferences/GeneralPreferencePage.java b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/preferences/GeneralPreferencePage.java index 0819f23109..a630c6f929 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/preferences/GeneralPreferencePage.java +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/preferences/GeneralPreferencePage.java @@ -24,7 +24,7 @@ public void createFieldEditors() addField(new BooleanFieldEditor(UIConstants.Preferences.STORE_SETTINGS_NEXT_TO_FILE, // Messages.PrefStoreSettingsNextToFile, getFieldEditorParent())); - createNoteComposite(getFieldEditorParent().getFont(), getFieldEditorParent(), // + PreferenceDialogUtil.createNoteComposite(getFieldEditorParent().getFont(), getFieldEditorParent(), Messages.PrefLabelNote, Messages.PrefNoteStoreSettingsNextToFile); addField(new BooleanFieldEditor(UIConstants.Preferences.ENABLE_EXPERIMENTAL_FEATURES, // diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/preferences/PreferenceDialogUtil.java b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/preferences/PreferenceDialogUtil.java new file mode 100644 index 0000000000..1d30021942 --- /dev/null +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/preferences/PreferenceDialogUtil.java @@ -0,0 +1,41 @@ +package name.abuchen.portfolio.ui.preferences; + +import org.eclipse.jface.layout.GridDataFactory; +import org.eclipse.jface.layout.GridLayoutFactory; +import org.eclipse.jface.resource.JFaceResources; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; + +/* package */ class PreferenceDialogUtil +{ + private PreferenceDialogUtil() + { + } + + /** + * Creates a composite with a highlighted Note entry and a message text. In + * contrast to the default method of the PreferencePage, this is designed to + * limit the width of the message and word wrap the text. + */ + /* package */ static void createNoteComposite(Font font, Composite composite, String title, String message) + { + Composite messageComposite = new Composite(composite, SWT.NONE); + messageComposite.setFont(font); + + GridLayoutFactory.fillDefaults().numColumns(2).applyTo(messageComposite); + GridDataFactory.fillDefaults().align(SWT.FILL, SWT.BEGINNING).hint(400, SWT.DEFAULT).applyTo(messageComposite); + + final Label noteLabel = new Label(messageComposite, SWT.BOLD); + noteLabel.setText(title); + noteLabel.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT)); + noteLabel.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING)); + + Label messageLabel = new Label(messageComposite, SWT.WRAP); + GridDataFactory.fillDefaults().grab(true, true).applyTo(messageLabel); + messageLabel.setText(message); + messageLabel.setFont(font); + } +} diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/preferences/PresentationPreferencePage.java b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/preferences/PresentationPreferencePage.java index 76f1426698..8fc667d65f 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/preferences/PresentationPreferencePage.java +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/preferences/PresentationPreferencePage.java @@ -21,7 +21,7 @@ public void createFieldEditors() addField(new BooleanFieldEditor(UIConstants.Preferences.USE_INDIRECT_QUOTATION, // Messages.PrefLabelUseIndirectQuotation, getFieldEditorParent())); - createNoteComposite(getFieldEditorParent().getFont(), getFieldEditorParent(), // + PreferenceDialogUtil.createNoteComposite(getFieldEditorParent().getFont(), getFieldEditorParent(), Messages.PrefLabelNote, Messages.PrefNoteIndirectQuotation); addField(new BooleanFieldEditor(UIConstants.Preferences.ALWAYS_DISPLAY_CURRENCY_CODE, // diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/settings/labels_de.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/settings/labels_de.properties index 4d97113d9f..030b5360b3 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/settings/labels_de.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/settings/labels_de.properties @@ -11,7 +11,7 @@ DATE.name = Datum IMAGE.name = Bild -LIMIT_PRICE.name = Limit Preis +LIMIT_PRICE.name = Limit-Preis PERCENT.name = Prozentzahl diff --git a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/settings/labels_nl.properties b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/settings/labels_nl.properties index d8035f7f53..c359cfc726 100644 --- a/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/settings/labels_nl.properties +++ b/name.abuchen.portfolio.ui/src/name/abuchen/portfolio/ui/views/settings/labels_nl.properties @@ -19,6 +19,6 @@ PERCENTPLAIN.name = Percentage (eenvoudig) QUOTE.name = Koers -SHARE.name = Aandeel +SHARE.name = Effect STRING.name = Tekst diff --git a/name.abuchen.portfolio/META-INF/MANIFEST.MF b/name.abuchen.portfolio/META-INF/MANIFEST.MF index d3724f0788..9fdfe42a41 100644 --- a/name.abuchen.portfolio/META-INF/MANIFEST.MF +++ b/name.abuchen.portfolio/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Bundle-Name Bundle-SymbolicName: name.abuchen.portfolio -Bundle-Version: 0.68.3.qualifier +Bundle-Version: 0.68.4.qualifier Bundle-RequiredExecutionEnvironment: JavaSE-17 Export-Package: name.abuchen.portfolio, name.abuchen.portfolio.checks, diff --git a/name.abuchen.portfolio/pom.xml b/name.abuchen.portfolio/pom.xml index 538bc0ec10..3aaefa202b 100644 --- a/name.abuchen.portfolio/pom.xml +++ b/name.abuchen.portfolio/pom.xml @@ -7,7 +7,7 @@ name.abuchen.portfolio portfolio-app - 0.68.3-SNAPSHOT + 0.68.4-SNAPSHOT ../portfolio-app diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/Messages.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/Messages.java index 8bef6ead41..ada68d37d6 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/Messages.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/Messages.java @@ -299,7 +299,7 @@ public class Messages extends NLS public static String MsgNoQuotesFoundInHTML; public static String MsgNotANumber; public static String MsgNotAComparator; - public static String MsgNotAPortflioFile; + public static String MsgNotAPortfolioFile; public static String MsgPasswordMissing; public static String MsgReadingFile; public static String MsgUnexpectedHeader; diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/BaaderBankPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/BaaderBankPDFExtractor.java index 6f01c6b115..45f6717831 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/BaaderBankPDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/BaaderBankPDFExtractor.java @@ -39,7 +39,7 @@ public BaaderBankPDFExtractor(Client client) addFeesAssetManagerTransaction(); addInterestTransaction(); addDeliveryInOutBoundTransaction(); - addTransferOutTransaction(); + addNonImportableTransaction(); } @Override @@ -50,9 +50,16 @@ public String getLabel() private void addBuySellTransaction() { - DocumentType type = new DocumentType("((Wertpapierabrechnung|Transaction Statement): " // - + "(Kauf|Verkauf|Purchase|Sale)" // - + "|Zeichnung|Spitzenregulierung|Gesamtr.ckzahlung)"); + final DocumentType type = new DocumentType("((Wertpapierabrechnung|Transaction Statement): " // + + "(Kauf" // + + "|Verkauf" // + + "|Purchase" // + + "|Sale)" // + + "|Zeichnung" // + + "|Spitzenregulierung" // + + "|Gesamtr.ckzahlung" // + + "|Ablauf der Optionsfrist" // + + "|Obligatorische Barabfindung)"); this.addDocumentTyp(type); Transaction pdfTransaction = new Transaction<>(); @@ -71,19 +78,32 @@ private void addBuySellTransaction() // Is type --> "Verkauf" change from BUY to SELL .section("type").optional() // - .match("^(Wertpapierabrechnung|Transaction Statement): (?(Kauf|Verkauf|Purchase|Sale)).*$") // + .match("^(Wertpapierabrechnung|Transaction Statement): " // + + "(?(Kauf" // + + "|Verkauf" // + + "|Purchase" // + + "|Sale)).*$") // .assign((t, v) -> { - if ("Verkauf".equals(v.get("type")) || "Sale".equals(v.get("type"))) + if ("Verkauf".equals(v.get("type")) || "Sale".equals(v.get("type"))) // t.setType(PortfolioTransaction.Type.SELL); }) // @formatter:off - // Is type --> "Spitzenregulierung" or "Gesamtrückzahlung" change from BUY to SELL + // Is type --> "Spitzenregulierung" change from BUY to SELL + // Is type --> "Gesamtrückzahlung" change from BUY to SELL + // Is type --> "Ablauf der Optionsfrist" change from BUY to SELL + // Is type --> "Obligatorische Barabfindung" change from BUY to SELL // @formatter:off .section("type").optional() // - .match("^(?(Spitzenregulierung|Gesamtr.ckzahlung)).*$") // + .match("^(?(Spitzenregulierung" // + + "|Gesamtr.ckzahlung" // + + "|Ablauf der Optionsfrist" // + + "|Obligatorische Barabfindung)).*$") // .assign((t, v) -> { - if ("Spitzenregulierung".equals(v.get("type")) || "Gesamtrückzahlung".equals(v.get("type"))) + if ("Spitzenregulierung".equals(v.get("type")) // + || "Gesamtrückzahlung".equals(v.get("type")) // + || "Ablauf der Optionsfrist".equals(v.get("type")) // + || "Obligatorische Barabfindung".equals(v.get("type"))) // t.setType(PortfolioTransaction.Type.SELL); }) @@ -117,6 +137,17 @@ private void addBuySellTransaction() .match("^(?[\\w]{3})[\\s]{1,}[\\.,\\d]+ [\\.,\\d]+ % [\\.,\\d]+ %$") // .match("^(?.*)$") // .match("^(?.*)$") // + .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))), + // @formatter:off + // Nominale ISIN: DE0001104875 WKN: 110487 Rückzahlung + // EUR 208.000,00 Bundesrep.Deutschland 100,00 % + // Bundesschatzanw. v.22(24) + // @formatter:on + section -> section // + .attributes("isin", "wkn", "currency", "name", "nameContinued") // + .match("^(Nominale|Quantity) ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]) WKN: (?[A-Z0-9]{6}) (Kurs|Bezugspreis|Barabfindung|Price|R.ckzahlung).*$") // + .match("^(?[\\w]{3})[\\s]{1,}[\\.,\\d]+ (?.*) [\\.,\\d]+ %$") // + .match("^(?.*)$") // .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v)))) .oneOf( // @@ -135,10 +166,11 @@ private void addBuySellTransaction() }), // @formatter:off // EUR 1.000,00 15,00 % 97,28 % + // EUR 208.000,00 Bundesrep.Deutschland 100,00 % // @formatter:on section -> section // .attributes("shares") // - .match("^[\\w]{3}[\\s]{1,}(?[\\.,\\d]+) [\\.,\\d]+ % [\\.,\\d]+ %$") // + .match("^[\\w]{3}[\\s]{1,}(?[\\.,\\d]+) .* [\\.,\\d]+ %$") // .assign((t, v) -> { // Percentage quotation, workaround for bonds BigDecimal shares = asBigDecimal(v.get("shares")); @@ -225,20 +257,41 @@ private void addBuySellTransaction() t.setAmount(asAmount(v.get("amount"))); })) - // @formatter:off - // Kurswert Umrechnungskurs CAD/EUR: 1,4595 EUR 8,85 - // @formatter:on - .section("termCurrency", "baseCurrency", "exchangeRate", "gross").optional() // - .match("^Kurswert Umrechnungskurs (?[\\w]{3})\\/(?[\\w]{3}): (?[\\.,\\d]+) [\\w]{3} (?[\\.,\\d]+)$") // - .assign((t, v) -> { - ExtrExchangeRate rate = asExchangeRate(v); - type.getCurrentContext().putType(rate); + .optionalOneOf( // + // @formatter:off + // Kurswert Umrechnungskurs CAD/EUR: 1,4595 EUR 8,85 + // @formatter:on + section -> section // + .attributes("termCurrency", "baseCurrency", "exchangeRate", "gross") // + .match("^Kurswert Umrechnungskurs (?[\\w]{3})\\/(?[\\w]{3}): (?[\\.,\\d]+) [\\w]{3} (?[\\.,\\d]+)$") // + .assign((t, v) -> { + ExtrExchangeRate rate = asExchangeRate(v); + type.getCurrentContext().putType(rate); - Money gross = Money.of(rate.getBaseCurrency(), asAmount(v.get("gross"))); - Money fxGross = rate.convert(rate.getTermCurrency(), gross); + Money gross = Money.of(rate.getBaseCurrency(), asAmount(v.get("gross"))); + Money fxGross = rate.convert(rate.getTermCurrency(), gross); - checkAndSetGrossUnit(gross, fxGross, t, type.getCurrentContext()); - }) + checkAndSetGrossUnit(gross, fxGross, t, type.getCurrentContext()); + }), + // @formatter:off + // Umrechnungskurs: EUR/USD 1,09084 + // Bruttobetrag USD 232,00 + // Bruttobetrag EUR 212,68 + // @formatter:on + section -> section // + .attributes("baseCurrency", "termCurrency", "exchangeRate", "fxGross", "gross") // + .match("^(Umrechnungskurs|Exchange Rate): (?[\\w]{3})\\/(?[\\w]{3}) (?[\\.,\\d]+)$") // + .match("^(Bruttobetrag|Gross Amount) [\\w]{3} (?[\\.,\\d]+)$") // + .match("^(Bruttobetrag|Gross Amount) [\\w]{3} (?[\\.,\\d]+)$") // + .assign((t, v) -> { + ExtrExchangeRate rate = asExchangeRate(v); + type.getCurrentContext().putType(rate); + + Money gross = Money.of(rate.getBaseCurrency(), asAmount(v.get("gross"))); + Money fxGross = Money.of(rate.getTermCurrency(), asAmount(v.get("fxGross"))); + + checkAndSetGrossUnit(gross, fxGross, t, type.getCurrentContext()); + })) // @formatter:off // Vorgangs-Nr.: 184714818 @@ -258,9 +311,11 @@ private void addBuySellTransaction() // @formatter:off // Spitzenregulierung KOPIE + // Ablauf der Optionsfrist + // Obligatorische Barabfindung // @formatter:on .section("note").optional() // - .match("^(?Spitzenregulierung).*$") // + .match("^(?(Spitzenregulierung|Ablauf der Optionsfrist|Obligatorische Barabfindung)).*$") // .assign((t, v) -> t.setNote(concatenate(t.getNote(), trim(v.get("note")), " | "))) // @formatter:off @@ -284,7 +339,7 @@ private void addBuySellTransaction() private void addBuySellCryptoTransaction() { - DocumentType type = new DocumentType("Abrechnung über den Kauf von Kryptowerten"); + final DocumentType type = new DocumentType("Abrechnung über den Kauf von Kryptowerten"); this.addDocumentTyp(type); Transaction pdfTransaction = new Transaction<>(); @@ -349,7 +404,7 @@ private void addBuySellCryptoTransaction() private void addDividendeTransaction() { - DocumentType type = new DocumentType("(Fondsaussch.ttung" // + final DocumentType type = new DocumentType("(Fondsaussch.ttung" // + "|Ertragsthesaurierung" // + "|Dividendenabrechnung" // + "|Aussch.ttung aus" // @@ -357,7 +412,7 @@ private void addDividendeTransaction() + "|Fund Distribution" // + "|Dividend Statement" // + "|Dividende" // - + "|Reklassifizierung" + + "|Reklassifizierung" // + "|Zinsabrechnung)", "(Kontoauszug|Account Statement)"); this.addDocumentTyp(type); @@ -505,7 +560,7 @@ private void addDividendeTransaction() // Bruttobetrag USD 3,94 // Bruttobetrag EUR 3,44 // @formatter:on - section -> section + section -> section // .attributes("baseCurrency", "termCurrency", "exchangeRate", "fxGross", "gross") // .match("^(Umrechnungskurs|Exchange Rate): (?[\\w]{3})\\/(?[\\w]{3}) (?[\\.,\\d]+)$") // .match("^(Bruttobetrag|Gross Amount) [\\w]{3} (?[\\.,\\d]+)$") // @@ -523,7 +578,7 @@ private void addDividendeTransaction() // Umrechnungskurs: EUR/USD 1,0878000 // Bruttobetrag USD 14,40 // @formatter:on - section -> section + section -> section // .attributes("baseCurrency", "termCurrency", "exchangeRate", "gross") // .match("^(Umrechnungskurs|Exchange Rate): (?[\\w]{3})\\/(?[\\w]{3}) (?[\\.,\\d]+)$") // .match("^(Bruttobetrag|Gross Amount) [\\w]{3} (?[\\.,\\d]+)$") // @@ -565,8 +620,10 @@ private void addDividendeTransaction() private void addAdvanceTaxTransaction() { - DocumentType type = new DocumentType("(Vorabpauschale|Advance Lump Sum)", // - "(Wertpapierabrechnung|Steuerausgleichsrechnung|Transaction Statement)"); + final DocumentType type = new DocumentType("(Vorabpauschale|Advance Lump Sum)", // + "(Wertpapierabrechnung" // + + "|Steuerausgleichsrechnung" // + + "|Transaction Statement)"); this.addDocumentTyp(type); Transaction pdfTransaction = new Transaction<>(); @@ -690,7 +747,7 @@ private void addAdvanceTaxTransaction() private void addTaxAdjustmentTransaction() { - DocumentType type = new DocumentType("Steuerausgleichsrechnung"); + final DocumentType type = new DocumentType("Steuerausgleichsrechnung"); this.addDocumentTyp(type); Transaction pdfTransaction = new Transaction<>(); @@ -920,7 +977,7 @@ private void addDepotStatementTransaction() private void addFeesAssetManagerTransaction() { - DocumentType type = new DocumentType("Verg.tung des Verm.gensverwalters"); + final DocumentType type = new DocumentType("Verg.tung des Verm.gensverwalters"); this.addDocumentTyp(type); Transaction pdfTransaction = new Transaction<>(); @@ -1040,7 +1097,7 @@ private void addInterestTransaction() private void addDeliveryInOutBoundTransaction() { - DocumentType type = new DocumentType("Kapitalerh.hung gegen Bareinzahlung"); + final DocumentType type = new DocumentType("Kapitalerh.hung gegen Bareinzahlung"); this.addDocumentTyp(type); Transaction pdfTransaction = new Transaction<>(); @@ -1053,17 +1110,18 @@ private void addDeliveryInOutBoundTransaction() .subject(() -> { PortfolioTransaction portfolioTransaction = new PortfolioTransaction(); - portfolioTransaction.setType(PortfolioTransaction.Type.DELIVERY_OUTBOUND); + portfolioTransaction.setType(PortfolioTransaction.Type.DELIVERY_INBOUND); return portfolioTransaction; }) - // Is type --> "Einbuchung" change from - // DELIVERY_OUTBOUND to DELIVERY_INBOUND + // @formatter:off + // Is type --> "Einbuchung" change from DELIVERY_INBOUND to DELIVERY_OUTBOUND + // @formatter:on .section("type").optional() // - .match("^(?Einbuchung) in Depot .* per [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}$") // + .match("^(?(Einbuchung|Ausbuchung)) (in|aus) Depot .* per [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}$") // .assign((t, v) -> { - if ("Einbuchung".equals(v.get("type"))) - t.setType(PortfolioTransaction.Type.DELIVERY_INBOUND); + if ("Ausbuchung".equals(v.get("type"))) + t.setType(PortfolioTransaction.Type.DELIVERY_OUTBOUND); }) .oneOf( // @@ -1114,11 +1172,10 @@ private void addDeliveryInOutBoundTransaction() .assign((t, v) -> t.setDateTime(asDate(v.get("date")))) // @formatter:off - // Bezugspreis EUR 132,00 - // Bruttobetrag EUR 1.012,00 + // Zu Lasten Konto yyyyyyyyyy Valuta: 09.03.2021 EUR 132,00 // @formatter:on - .section("currency", "amount").optional() // - .match("^(Bezugspreis|Bruttobetrag) (?[\\w]{3}) (?[\\.,\\d]+)$") // + .section("currency", "amount").optional() + .match("^Zu (Gunsten|Lasten) Konto .* (?[\\w]{3}) (?[\\.,\\d]+)$") // .assign((t, v) -> { t.setCurrencyCode(asCurrencyCode(v.get("currency"))); t.setAmount(asAmount(v.get("amount"))); @@ -1134,12 +1191,12 @@ private void addDeliveryInOutBoundTransaction() .wrap(TransactionItem::new); } - private void addTransferOutTransaction() + private void addNonImportableTransaction() { - DocumentType type = new DocumentType("(Ablauf der Optionsfrist|Obligatorische Barabfindung)"); + final DocumentType type = new DocumentType("Fusion \\/ Zusammenlegung"); this.addDocumentTyp(type); - Transaction pdfTransaction = new Transaction<>(); + Transaction pdfTransaction = new Transaction<>(); Block firstRelevantLine = new Block("^.*(Vorgangs\\-Nr|Transaction No)\\.: .*$"); type.addBlock(firstRelevantLine); @@ -1148,89 +1205,41 @@ private void addTransferOutTransaction() pdfTransaction // .subject(() -> { - BuySellEntry portfolioTransaction = new BuySellEntry(); - portfolioTransaction.setType(PortfolioTransaction.Type.SELL); + PortfolioTransaction portfolioTransaction = new PortfolioTransaction(); + portfolioTransaction.setType(PortfolioTransaction.Type.DELIVERY_OUTBOUND); return portfolioTransaction; }) // @formatter:off - // Nominale ISIN: DE000HB2KBG9 WKN: HB2KBG Barabfindung - // STK 6 UniCredit Bank AG EUR 10,00 p.STK - // HVB Inline 18.05.22 BASF 45-70 + // Ausbuchung aus Depot 1686005753 per 18.01.2024 + // Nominale ISIN: IE000Y77LGG9 WKN: ETF143 + // STK 277,691 Am.ETF-MSCI W.SRI CL.N.Z.AM.P. + // Bear.Shs EUR Acc. oN // @formatter:on - .section("isin", "wkn", "name", "nameContinued", "currency") // - .match("^Nominale ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]) WKN: (?[A-Z0-9]{6}) Barabfindung$") // - .match("^STK [\\.,\\d]+ (?.*) (?[\\w]{3}) .*$") // + .section("date", "isin", "wkn", "shares", "name", "nameContinued") // + .find(".*Ausbuchung aus Depot .* per (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*") // + .match("^Nominale ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9]) WKN: (?[A-Z0-9]{6}).*$") // + .match("^STK (?[\\.,\\d]+) (?.*)$") // .match("^(?.*)$") // .assign((t, v) -> { - if (v.get("nameContinued").endsWith("p.STK")) - v.put("nameContinued", v.get("nameContinued").replace("p.STK", "")); + v.getTransactionContext().put(FAILURE, Messages.MsgErrorTransactionTypeNotSupported); + t.setDateTime(asDate(v.get("date"))); + t.setShares(asShares(v.get("shares"))); t.setSecurity(getOrCreateSecurity(v)); - }) - - // @formatter:off - // STK 6 UniCredit Bank AG EUR 10,00 p.STK - // @formatter:on - .section("shares") // - .match("^STK (?[\\.,\\d]+) .*$") // - .assign((t, v) -> t.setShares(asShares(v.get("shares")))) // - - // @formatter:off - // Ausbuchung aus Depot 1234567001 per 25.05.2022 - // @formatter:on - .section("date") // - .match("^Ausbuchung .* per (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4})$") // - .assign((t, v) -> t.setDate(asDate(v.get("date")))) - - // @formatter:off - // Zu Gunsten Konto 1234567005 Valuta: 25.05.2022 EUR 60,00 - // @formatter:on - .section("date", "currency", "amount") // - .match("^Zu Gunsten Konto [\\d]+ Valuta: (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) (?[\\w]{3}) (?[\\.,\\d]+)$") // - .assign((t, v) -> { - t.setCurrencyCode(asCurrencyCode(v.get("currency"))); - t.setAmount(asAmount(v.get("amount"))); - }) - - // @formatter:off - // Umrechnungskurs: EUR/USD 1,09084 - // Bruttobetrag USD 232,00 - // Bruttobetrag EUR 212,68 - // @formatter:on - .section("baseCurrency", "termCurrency", "exchangeRate", "fxGross", "gross").optional()// - .match("^(Umrechnungskurs|Exchange Rate): (?[\\w]{3})\\/(?[\\w]{3}) (?[\\.,\\d]+)$") // - .match("^(Bruttobetrag|Gross Amount) [\\w]{3} (?[\\.,\\d]+)$") // - .match("^(Bruttobetrag|Gross Amount) [\\w]{3} (?[\\.,\\d]+)$") // - .assign((t, v) -> { - ExtrExchangeRate rate = asExchangeRate(v); - type.getCurrentContext().putType(rate); - - Money gross = Money.of(rate.getBaseCurrency(), asAmount(v.get("gross"))); - Money fxGross = Money.of(rate.getTermCurrency(), asAmount(v.get("fxGross"))); - checkAndSetGrossUnit(gross, fxGross, t, type.getCurrentContext()); + t.setCurrencyCode(asCurrencyCode(t.getSecurity().getCurrencyCode())); + t.setAmount(0L); }) - // @formatter:off - // Vorgangs-Nr.: 25742277 - // @formatter:on - .section("note").optional() // - .match("^.*(?(Vorgangs\\-Nr|Transaction No)\\.: .*)$") // - .assign((t, v) -> t.setNote(trim(v.get("note")))) - - // @formatter:off - // Ablauf der Optionsfrist - // Obligatorische Barabfindung - // @formatter:on - .section("note").optional() // - .match("^(?(Ablauf der Optionsfrist|Obligatorische Barabfindung))$") // - .assign((t, v) -> t.setNote(concatenate(t.getNote(), trim(v.get("note")), " | "))) + .wrap((t, ctx) -> { + TransactionItem item = new TransactionItem(t); - .wrap(BuySellEntryItem::new); + if (ctx.getString(FAILURE) != null) + item.setFailureMessage(ctx.getString(FAILURE)); - addTaxesSectionsTransaction(pdfTransaction, type); - addFeesSectionsTransaction(pdfTransaction, type); + return item; + }); } private > void addTaxesSectionsTransaction(T transaction, DocumentType type) diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/BankSLMPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/BankSLMPDFExtractor.java index 514ad47e55..4c64eb19ff 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/BankSLMPDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/BankSLMPDFExtractor.java @@ -16,6 +16,14 @@ import name.abuchen.portfolio.money.Money; import name.abuchen.portfolio.money.Values; +/** + * @formatter:off + * @implNote Bank SLM AG + * + * @implSpec The VALOR number is the WKN number with 5 to 9 letters. + * @formatter:on + */ + @SuppressWarnings("nls") public class BankSLMPDFExtractor extends AbstractPDFExtractor { @@ -42,75 +50,91 @@ private void addBuySellTransaction() this.addDocumentTyp(type); Transaction pdfTransaction = new Transaction<>(); - pdfTransaction.subject(() -> { - BuySellEntry entry = new BuySellEntry(); - entry.setType(PortfolioTransaction.Type.BUY); - return entry; - }); Block firstRelevantLine = new Block("^B.rsenabrechnung \\- (Kauf|Verkauf)$"); type.addBlock(firstRelevantLine); firstRelevantLine.set(pdfTransaction); - pdfTransaction - .section("type").optional() - .match("^B.rsenabrechnung \\- (?(Kauf|Verkauf))$") - .assign((t, v) -> { - if ("Verkauf".equals(v.get("type"))) - t.setType(PortfolioTransaction.Type.SELL); - }) - - // 17'000 Inhaber-Aktien - // Nokia Corp - // Valor: 472672 - // Total Kurswert EUR -74'120.00 - .section("name1", "name", "wkn", "currency") - .match("^[\\.',\\d]+ (?.*)$") - .match("^(?.*)$") - .match("^Valor: (?.*)$") - .match("^Total Kurswert (?[\\w]{3}) .*$") - .assign((t, v) -> { - v.put("name", v.get("name") + " " + v.get("name1")); - - t.setSecurity(getOrCreateSecurity(v)); - }) - - // 17'000 Inhaber-Aktien Nokia Corp - .section("shares") - .match("^(?[\\.',\\d]+) (?.*)$") - .assign((t, v) -> t.setShares(asShares(v.get("shares")))) - - // Wir haben für Sie am 03.09.2013 gekauft. - // Wir haben für Sie am 22.08.2013 verkauft. - .section("date") - .match("^Wir haben f.r Sie am (?[\\d]{2}+\\.[\\d]{2}+\\.[\\d]{4}) (gekauft|verkauft)\\.$") - .assign((t, v) -> t.setDate(asDate(v.get("date")))) - - // Netto CHF -43'412.10 - // Netto CHF 142'359.40 - .section("amount", "currency") - .match("^Netto (?[\\w]{3}) (\\-)?(?[\\.',\\d]+)$") - .assign((t, v) -> { - t.setAmount(asAmount(v.get("amount"))); - t.setCurrencyCode(asCurrencyCode(v.get("currency"))); - }) - - // Total Kurswert EUR -74'120.00 - // Change EUR/CHF 1.241652 CHF -92'031.25 - .section("fxCurrency", "fxGross", "termCurrency", "baseCurrency", "exchangeRate", "currency", "gross").optional() - .match("^Total Kurswert (?[\\w]{3}) (\\-)?(?[\\.',\\d]+)$") - .match("^Change (?[\\w]{3})\\/(?[\\w]{3}) (?[\\.',\\d]+) (?[\\w]{3}) (\\-)?(?[\\.',\\d]+)$") - .assign((t, v) -> { - ExtrExchangeRate rate = asExchangeRate(v); - type.getCurrentContext().putType(rate); - - Money gross = Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("gross"))); - Money fxGross = Money.of(asCurrencyCode(v.get("fxCurrency")), asAmount(v.get("fxGross"))); - - checkAndSetGrossUnit(gross, fxGross, t, type.getCurrentContext()); - }) - - .wrap(BuySellEntryItem::new); + pdfTransaction // + + .subject(() -> { + BuySellEntry portfolioTransaction = new BuySellEntry(); + portfolioTransaction.setType(PortfolioTransaction.Type.BUY); + return portfolioTransaction; + }) + + // Is type --> "Verkauf" change from BUY to SELL + .section("type").optional() // + .match("^B.rsenabrechnung \\- (?(Kauf|Verkauf))$") // + .assign((t, v) -> { + if ("Verkauf".equals(v.get("type"))) + t.setType(PortfolioTransaction.Type.SELL); + }) + + // @formatter:off + // Wir haben f�r Sie am 03.09.2013 gekauft. + // 17'000 Inhaber-Aktien + // Nokia Corp + // Valor: 472672 + // Total Kurswert EUR -74'120.00 + // @formatter:on + .section("name1", "name", "wkn", "currency") // + .find("Wir haben f.r.*") //) + .match("^[\\.'\\d]+ (?.*)$") // + .match("^(?.*)$") // + .match("^Valor: (?[A-Z0-9]{5,9})$") // + .match("^Total Kurswert (?[\\w]{3}).*$") // + .assign((t, v) -> { + v.put("name", v.get("name") + " " + v.get("name1")); + + t.setSecurity(getOrCreateSecurity(v)); + }) + + // @formatter:off + // 17'000 Inhaber-Aktien Nokia Corp + // @formatter:on + .section("shares") // + .find("Wir haben.*") + .match("^(?[\\.'\\d]+) .*$") // + .assign((t, v) -> t.setShares(asShares(v.get("shares")))) + + // @formatter:off + // Wir haben für Sie am 03.09.2013 gekauft. + // Wir haben für Sie am 22.08.2013 verkauft. + // @formatter:on + .section("date") // + .match("^Wir haben f.r Sie am (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) (gekauft|verkauft)\\.$") // + .assign((t, v) -> t.setDate(asDate(v.get("date")))) + + // @formatter:off + // Netto CHF -43'412.10 + // Netto CHF 142'359.40 + // @formatter:on + .section("amount", "currency") // + .match("^Netto (?[\\w]{3}) (\\-)?(?[\\.'\\d]+)$") // + .assign((t, v) -> { + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + }) + + // @formatter:off + // Total Kurswert EUR -74'120.00 + // Change EUR/CHF 1.241652 CHF -92'031.25 + // @formatter:on + .section("fxGross", "termCurrency", "baseCurrency", "exchangeRate", "gross").optional() // + .match("^Total Kurswert [\\w]{3} (\\-)?(?[\\.'\\d]+)$") // + .match("^Change (?[\\w]{3})\\/(?[\\w]{3}) (?[\\.'\\d]+) [\\w]{3} (\\-)?(?[\\.'\\d]+)$") // + .assign((t, v) -> { + ExtrExchangeRate rate = asExchangeRate(v); + type.getCurrentContext().putType(rate); + + Money gross = Money.of(rate.getTermCurrency(), asAmount(v.get("gross"))); + Money fxGross = Money.of(rate.getBaseCurrency(), asAmount(v.get("fxGross"))); + + checkAndSetGrossUnit(gross, fxGross, t, type.getCurrentContext()); + }) + + .wrap(BuySellEntryItem::new); addTaxesSectionsTransaction(pdfTransaction, type); addFeesSectionsTransaction(pdfTransaction, type); @@ -121,114 +145,143 @@ private void addDividendeTransaction() DocumentType type = new DocumentType("Dividende"); this.addDocumentTyp(type); - Block block = new Block("^Dividende$"); - type.addBlock(block); - Transaction pdfTransaction = new Transaction().subject(() -> { - AccountTransaction entry = new AccountTransaction(); - entry.setType(AccountTransaction.Type.DIVIDENDS); - return entry; - }); - - pdfTransaction - // Namen-Aktien nom CHF 100.00 Ex Datum: 02.05.2016 - // Bank SLM AG - // Valor: 135186 - // ISIN: CH0001351862 - // Brutto (1 * CHF 28.00) CHF 28.00 - .section("name1", "name", "wkn", "isin", "currency") - .match("^(?.*) Ex Datum: [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}$") - .match("^(?.*)$") - .match("^Valor: (?.*)$") - .match("^ISIN: (?.*)$") - .match("^Brutto \\([\\.',\\d]+ \\* [\\w]{3} [\\.',\\d]+\\) (?[\\w]{3}) [\\.',\\d]+$") - .assign((t, v) -> { - v.put("name", v.get("name") + " " + v.get("name1")); - - t.setSecurity(getOrCreateSecurity(v)); - }) - - // Brutto (1 * CHF 28.00) CHF 28.00 - .section("shares") - .match("^Brutto \\((?[\\.',\\d]+) \\* .*$") - .assign((t, v) -> t.setShares(asShares(v.get("shares")))) - - // Am 02.05.2016 wurde folgende Dividende gutgeschrieben: - .section("date") - .match("^Am (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) wurde folgende Dividende gutgeschrieben:$") - .assign((t, v) -> t.setDateTime(asDate(v.get("date")))) - - // Netto CHF 18.20 - .section("amount", "currency") - .match("^Netto (?[\\w]{3}) (?[\\.',\\d]+)$") - .assign((t, v) -> { - t.setAmount(asAmount(v.get("amount"))); - t.setCurrencyCode(asCurrencyCode(v.get("currency"))); - }) - - // Brutto (17'000 * EUR 0.26) EUR 4'420.00 - // Change EUR / CHF 1.067227 CHF 3'302.00 - .section("currency", "gross", "termCurrency", "baseCurrency", "fxCurrency", "exchangeRate").optional() - .match("^Brutto \\([\\.',\\d]+ \\* [\\w]{3} [\\.',\\d]+\\) (?[\\w]{3}) (?[\\.',\\d]+)$") - .match("^Change (?[\\w]{3}) \\/ (?[\\w]{3}) (?[\\.',\\d]+) (?[\\w]{3}) (\\-)?[\\.',\\d]+$") - .assign((t, v) -> { - ExtrExchangeRate rate = asExchangeRate(v); - type.getCurrentContext().putType(rate); - - Money gross = Money.of(asCurrencyCode(v.get("currency")), asAmount(v.get("gross"))); - Money fxGross = rate.convert(asCurrencyCode(v.get("fxCurrency")), gross); - - checkAndSetGrossUnit(gross, fxGross, t, type.getCurrentContext()); - }) - - .wrap(TransactionItem::new); + Transaction pdfTransaction = new Transaction<>(); + + Block firstRelevantLine = new Block("^Dividende$"); + type.addBlock(firstRelevantLine); + firstRelevantLine.set(pdfTransaction); + + pdfTransaction // + + .subject(() -> { + AccountTransaction accountTransaction = new AccountTransaction(); + accountTransaction.setType(AccountTransaction.Type.DIVIDENDS); + return accountTransaction; + }) + + // @formatter:off + // Namen-Aktien nom CHF 100.00 Ex Datum: 02.05.2016 + // Bank SLM AG + // Valor: 135186 + // ISIN: CH0001351862 + // Brutto (1 * CHF 28.00) CHF 28.00 + // @formatter:on + .section("name1", "name", "wkn", "isin", "currency") // + .match("^(?.*) Ex Datum: [\\d]{2}\\.[\\d]{2}\\.[\\d]{4}$") // + .match("^(?.*)$") // + .match("^Valor: (?[A-Z0-9]{5,9})$") // + .match("^ISIN: (?[A-Z]{2}[A-Z0-9]{9}[0-9])$") // + .match("^Brutto \\([\\.'\\d]+ \\* [\\w]{3} [\\.'\\d]+\\) (?[\\w]{3}) [\\.'\\d]+$") // + .assign((t, v) -> { + v.put("name", v.get("name") + " " + v.get("name1")); + + t.setSecurity(getOrCreateSecurity(v)); + }) + + // @formatter:off + // Brutto (1 * CHF 28.00) CHF 28.00 + // @formatter:on + .section("shares") // + .match("^Brutto \\((?[\\.'\\d]+) \\* .*$") // + .assign((t, v) -> t.setShares(asShares(v.get("shares")))) + + // @formatter:off + // Am 02.05.2016 wurde folgende Dividende gutgeschrieben: + // @formatter:on + .section("date") // + .match("^Am (?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}) wurde folgende Dividende gutgeschrieben:$") // + .assign((t, v) -> t.setDateTime(asDate(v.get("date")))) + + // @formatter:off + // Netto CHF 18.20 + // @formatter:on + .section("amount", "currency") // + .match("^Netto (?[\\w]{3}) (?[\\.'\\d]+)$") // + .assign((t, v) -> { + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + }) + + // @formatter:off + // Brutto (17'000 * EUR 0.26) EUR 4'420.00 + // Change EUR / CHF 1.067227 CHF 3'302.00 + // @formatter:on + .section("gross", "termCurrency", "baseCurrency", "exchangeRate").optional() // + .match("^Brutto \\([\\.'\\d]+ \\* [\\w]{3} [\\.'\\d]+\\) >[\\w]{3} (?[\\.'\\d]+)$") // + .match("^Change (?[\\w]{3}) \\/ (?[\\w]{3}) (?[\\.'\\d]+) [\\w]{3} (\\-)?[\\.'\\d]+$") // + .assign((t, v) -> { + ExtrExchangeRate rate = asExchangeRate(v); + type.getCurrentContext().putType(rate); + + Money gross = Money.of(rate.getBaseCurrency(), asAmount(v.get("gross"))); + Money fxGross = rate.convert(rate.getTermCurrency(), gross); + + checkAndSetGrossUnit(gross, fxGross, t, type.getCurrentContext()); + }) + + .wrap(TransactionItem::new); addTaxesSectionsTransaction(pdfTransaction, type); addFeesSectionsTransaction(pdfTransaction, type); - - block.set(pdfTransaction); } private > void addTaxesSectionsTransaction(T transaction, DocumentType type) { - transaction - // Eidg. Umsatzabgabe CHF -138.05 - .section("currency", "tax").optional() - .match("^Eidg\\. Umsatzabgabe (?[\\w]{3}) \\-(?[\\.',\\d]+)$") - .assign((t, v) -> processTaxEntries(t, v, type)) - - // 35% Verrechnungssteuer CHF -9.80 - .section("currency", "tax").optional() - .match("^[\\d]+% Verrechnungssteuer (?[\\w]{3}) \\-(?[\\.',\\d]+)$") - .assign((t, v) -> processTaxEntries(t, v, type)) - - // 20% Quellensteuer EUR -884.00 - .section("currency", "withHoldingTax").optional() - .match("^[\\d]+% Quellensteuer (?[\\w]{3}) \\-(?[\\.',\\d]+)$") - .assign((t, v) -> processWithHoldingTaxEntries(t, v, "withHoldingTax", type)) - - // 10% Nichtrückforderbare Steuern EUR -442.00 - .section("currency", "tax").optional() - .match("^[\\d]+% Nicht r.ckforderbare Steuern (?[\\w]{3}) \\-(?[\\.',\\d]+)$") - .assign((t, v) -> processTaxEntries(t, v, type)); + transaction // + + // @formatter:off + // Eidg. Umsatzabgabe CHF -138.05 + // @formatter:on + .section("currency", "tax").optional() // + .match("^Eidg\\. Umsatzabgabe (?[\\w]{3}) \\-(?[\\.'\\d]+)$") // + .assign((t, v) -> processTaxEntries(t, v, type)) + + // @formatter:off + // 35% Verrechnungssteuer CHF -9.80 + // @formatter:off + .section("currency", "tax").optional() // + .match("^[\\d]+% Verrechnungssteuer (?[\\w]{3}) \\-(?[\\.'\\d]+)$") // + .assign((t, v) -> processTaxEntries(t, v, type)) + + // @formatter:off + // 20% Quellensteuer EUR -884.00 + // @formatter:on + .section("currency", "withHoldingTax").optional() // + .match("^[\\d]+% Quellensteuer (?[\\w]{3}) \\-(?[\\.'\\d]+)$") // + .assign((t, v) -> processWithHoldingTaxEntries(t, v, "withHoldingTax", type)) + + // @formatter:off + // 10% Nichtrückforderbare Steuern EUR -442.00 + // @formatter:on + .section("currency", "tax").optional() // + .match("^[\\d]+% Nicht r.ckforderbare Steuern (?[\\w]{3}) \\-(?[\\.'\\d]+)$") // + .assign((t, v) -> processTaxEntries(t, v, type)); } private > void addFeesSectionsTransaction(T transaction, DocumentType type) { - transaction - // Eigene Courtage CHF -489.15 - .section("currency", "fee").optional() - .match("^Eigene Courtage (?[\\w]{3}) \\-(?[\\.',\\d]+)$") - .assign((t, v) -> processFeeEntries(t, v, type)) - - // Börsengebühr Inland CHF -3.50 - .section("currency", "fee").optional() - .match("^B.rsengeb.hr Inland (?[\\w]{3}) \\-(?[\\.',\\d]+)$") - .assign((t, v) -> processFeeEntries(t, v, type)) - - // Börsengebühr CHF -3.50 - .section("currency", "fee").optional() - .match("^B.rsengeb.hr (?[\\w]{3}) \\-(?[\\.',\\d]+)$") - .assign((t, v) -> processFeeEntries(t, v, type)); + transaction // + + // @formatter:off + // Eigene Courtage CHF -489.15 + // @formatter:on + .section("currency", "fee").optional() // + .match("^Eigene Courtage (?[\\w]{3}) \\-(?[\\.'\\d]+)$") // + .assign((t, v) -> processFeeEntries(t, v, type)) + + // @formatter:off + // Börsengebühr Inland CHF -3.50 + // @formatter:on + .section("currency", "fee").optional() // + .match("^B.rsengeb.hr Inland (?[\\w]{3}) \\-(?[\\.'\\d]+)$") // + .assign((t, v) -> processFeeEntries(t, v, type)) + + // @formatter:off + // Börsengebühr CHF -3.50 + // @formatter:on + .section("currency", "fee").optional() // + .match("^B.rsengeb.hr (?[\\w]{3}) \\-(?[\\.'\\d]+)$") // + .assign((t, v) -> processFeeEntries(t, v, type)); } @Override diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/BigbankPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/BigbankPDFExtractor.java new file mode 100644 index 0000000000..0897870640 --- /dev/null +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/BigbankPDFExtractor.java @@ -0,0 +1,99 @@ +package name.abuchen.portfolio.datatransfer.pdf; + +import name.abuchen.portfolio.datatransfer.ExtractorUtils; +import name.abuchen.portfolio.datatransfer.pdf.PDFParser.Block; +import name.abuchen.portfolio.datatransfer.pdf.PDFParser.DocumentType; +import name.abuchen.portfolio.datatransfer.pdf.PDFParser.Transaction; +import name.abuchen.portfolio.model.AccountTransaction; +import name.abuchen.portfolio.model.Client; +import name.abuchen.portfolio.money.Values; + +@SuppressWarnings("nls") +public class BigbankPDFExtractor extends AbstractPDFExtractor +{ + public BigbankPDFExtractor(Client client) + { + super(client); + + addBankIdentifier("BIGBANK AS"); + + addAccountStatementTransaction(); + } + + @Override + public String getLabel() + { + return "Bigbank AS"; + } + + + private void addAccountStatementTransaction() + { + final DocumentType type = new DocumentType("Kontoauszug", + documentContext -> documentContext + // @formatter:off + // Datum Gegenkonto Buchung Name Betrag in EUR + // @formatter:on + .section("currency") // + .match("^.*Betrag in (?[\\w]{3}).*$") // + .assign((ctx, v) -> ctx.put("currency", asCurrencyCode(v.get("currency"))))); + + this.addDocumentTyp(type); + + // @formatter:off + // 21.03.2024 AT123456789101112131 Einzahlung oDkoRVZEb TxDUxE +1 500,34 + // @formatter:on + Block depositBlock = new Block("^[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}.*Einzahlung.* \\+[\\.,\\d\\s]+$"); + type.addBlock(depositBlock); + depositBlock.set(new Transaction() + + .subject(() -> { + AccountTransaction accountTransaction = new AccountTransaction(); + accountTransaction.setType(AccountTransaction.Type.DEPOSIT); + return accountTransaction; + }) + + .section("date", "amount") // + .documentContext("currency") // + .match("^(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*Einzahlung.* \\+(?[\\.,\\d\\s]+)$") // + .assign((t, v) -> { + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(v.get("currency")); + }) + + .wrap(TransactionItem::new)); + + // @formatter:off + // 25.03.2024 AT123456789101112131 Auszahlung sUBHAKqzf vNNKxT -10,12 + // 28.03.2024 EE123456789101112132 Interne Belastung wMGSJi WajHthpvl -3 500,00 + // @formatter:on + Block removalBlock = new Block( + "^[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}.*(Auszahlung|Interne Belastung).* \\-[\\.,\\d\\s]+$"); + type.addBlock(removalBlock); + removalBlock.set(new Transaction() + + .subject(() -> { + AccountTransaction accountTransaction = new AccountTransaction(); + accountTransaction.setType(AccountTransaction.Type.REMOVAL); + return accountTransaction; + }) + + .section("date", "amount") // + .documentContext("currency") // + .match("^(?[\\d]{2}\\.[\\d]{2}\\.[\\d]{4}).*(Auszahlung|Interne Belastung).* \\-(?[\\.,\\d\\s]+)$") // + .assign((t, v) -> { + t.setDateTime(asDate(v.get("date"))); + t.setAmount(asAmount(v.get("amount"))); + t.setCurrencyCode(v.get("currency")); + }) + + .wrap(TransactionItem::new)); + } + + @Override + protected long asAmount(String value) + { + return ExtractorUtils.convertToNumberLong(value, Values.Amount, "et", "EE"); + } +} diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/CreditSuisseAGPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/CreditSuisseAGPDFExtractor.java index 56fbf0bce0..67c2164a5d 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/CreditSuisseAGPDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/CreditSuisseAGPDFExtractor.java @@ -14,6 +14,14 @@ import name.abuchen.portfolio.model.PortfolioTransaction; import name.abuchen.portfolio.money.Values; +/** + * @formatter:off + * @implNote Credit Suisse AG + * + * @implSpec The VALOR number is the WKN number with 5 to 9 letters. + * @formatter:on + */ + @SuppressWarnings("nls") public class CreditSuisseAGPDFExtractor extends AbstractPDFExtractor { @@ -40,102 +48,124 @@ private void addBuySellTransaction() this.addDocumentTyp(type); Transaction pdfTransaction = new Transaction<>(); - pdfTransaction.subject(() -> { - BuySellEntry entry = new BuySellEntry(); - entry.setType(PortfolioTransaction.Type.BUY); - return entry; - }); Block firstRelevantLine = new Block("^Ihr (Kauf|Verkauf) .*$"); type.addBlock(firstRelevantLine); firstRelevantLine.set(pdfTransaction); - pdfTransaction - // Is type --> "Verkauf" change from BUY to SELL - .section("type").optional() - .match("^Ihr (?(Kauf|Verkauf)) .*$") - .assign((t, v) -> { - if ("Verkauf".equals(v.get("type"))) - t.setType(PortfolioTransaction.Type.SELL); - }) - - // 900 Registered Shs Iron Mountain Inc USD 0.01 - // Valor 26754105, IRM, ISIN US46284V1017 - // Kurswert USD 27,270.00 - .section("name", "isin", "currency").optional() - .match("^(?[\\.,\\d]+) (?.*) [\\w]{3} [\\.,\\d]+$") - .match("^.* ISIN (?[\\w]{12})$") - .match("^Kurswert (?[\\w]{3}) [\\.,\\d]+$") - .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) - - // USD 200,000 6.25 % Fixed Rate Notes Norddeutsche - // Landesbank Girozentrale 2014-10.4.24 Reg-S - // Subord. - // Valor 24160639, NDKH, ISIN XS1055787680 - // Kurswert USD 183,000.00 - .section("name", "isin", "currency").optional() - .match("^[\\w]{3} [\\.,\\d]+ (?.*)$") - .match("^.* ISIN (?[\\w]{12})$") - .match("^Kurswert (?[\\w]{3}) [\\.,\\d]+$") - .assign((t, v) -> t.setSecurity(getOrCreateSecurity(v))) - - .oneOf( - // USD 200,000 6.25 % Fixed Rate Notes Norddeutsche - section -> section - .attributes("shares") - .match("^[\\w]{3} (?[\\.,\\d]+) [\\.,\\d]+ % (?.*)$") - .assign((t, v) -> { - // Percentage quotation, workaround for bonds - BigDecimal shares = asExchangeRate(v.get("shares")); - t.setShares(Values.Share.factorize(shares.doubleValue() / 100)); - }) - , - // 900 Registered Shs Iron Mountain Inc USD 0.01 - section -> section - .attributes("shares") - .match("^(?[\\.,\\d]+) .*$") - .assign((t, v) -> t.setShares(asShares(v.get("shares")))) - ) - - // Ausführungszeit - // 103 14800075391312 18:32:46 XNYS USD 30.30 - .section("time").optional() - .find("Ausf.hrungszeit") - .match("^.* (?