From 36739d8f28ecaaf2381e934b47c91488af66fac7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mika=C3=ABl=20Peltier?= Date: Mon, 24 Feb 2025 17:13:44 +0100 Subject: [PATCH] Enhancement of Arkea Direct Bank importer to import transactions from OST (#4543) Closes #4543 --- .../pdf/arkeadirectbank/Achat05.txt | 21 ++++++ .../pdf/arkeadirectbank/Achat06.txt | 20 ++++++ .../ArkeaDirectBankPDFExtractorTest.java | 66 +++++++++++++++++++ .../pdf/ArkeaDirectBankPDFExtractor.java | 46 +++++++++++++ 4 files changed, 153 insertions(+) create mode 100644 name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/arkeadirectbank/Achat05.txt create mode 100644 name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/arkeadirectbank/Achat06.txt diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/arkeadirectbank/Achat05.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/arkeadirectbank/Achat05.txt new file mode 100644 index 0000000000..eb3162afe4 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/arkeadirectbank/Achat05.txt @@ -0,0 +1,21 @@ +PDFBox Version: 3.0.3 != 1.8.17 +Portfolio Performance Version: 0.74.1.qualifier +System: win32 | x86_64 | 21.0.6+7-LTS | Eclipse Adoptium +----------------------------------------- +RESULTAT D'OST M vcqQDhF snmrmT +Au 8 octobre 2021 2 MKh LFdN JRzQL muNQffxbH +52693 JDvKG oem tRAfguo +VOTRE COMPTE PEA N° 922195031681 M CPFqesd FILJRF +Objet : Souscription avec droits +Monsieur, +Nous vous informons que nous avons procédé à la souscription de 16 titre(s) VEOLIA ENVIRON. (FR0000124141) et contre +présentation de 84 droit(s) VEOLIA ENVIR.DS 21 (FR0014005GA0). +Cette opération a été comptabilisée sur votre compte : +montant net de : - 363,20 EUR +Veuillez agréer, Monsieur, l'expression de nos salutations distinguées. +Le service OST +Duplicata Internet +Page 1/1 +Fortuneo est une marque commerciale d'Arkéa Direct Bank. Arkéa Direct Bank, Société Anonyme à Directoire et Conseil de Surveillance +au capital de 89 198 952 euros. RCS Nanterre 384 288 890. Siège social : Tour Ariane - 5, place de la Pyramide 92088 Paris La Défense. +Courtier en assurance n°ORIAS 07 008 441. Adresse postale : Fortuneo - Service Clients - TSA41707 - 35917 RENNES CEDEX 9. diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/arkeadirectbank/Achat06.txt b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/arkeadirectbank/Achat06.txt new file mode 100644 index 0000000000..4d19fdc977 --- /dev/null +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/arkeadirectbank/Achat06.txt @@ -0,0 +1,20 @@ +PDFBox Version: 3.0.3 != 1.8.17 +Portfolio Performance Version: 0.74.2.qualifier +System: win32 | x86_64 | 21.0.6+7-LTS | Eclipse Adoptium +----------------------------------------- +RESULTAT D'OST M cXAPejn KErjVm +Au 8 octobre 2021 2 gst eBJu gAAqm ZZYZnPSIY +98709 IGeLW irt uQuJqoA +VOTRE COMPTE PEA N° 563408875612 M bnWVzed VqvKpT +Objet : Souscription à titre réductible +Monsieur, +Nous vous informons que nous avons procédé à la souscription de 1 titre(s) VEOLIA ENVIRON. (FR0000124141). +Cette opération a été comptabilisée sur votre compte. +montant net de : - 22,70 EUR +Veuillez agréer, Monsieur, l'expression de nos salutations distinguées. +Le service OST +Duplicata Internet +Page 1/1 +Fortuneo est une marque commerciale d'Arkéa Direct Bank. Arkéa Direct Bank, Société Anonyme à Directoire et Conseil de Surveillance +au capital de 89 198 952 euros. RCS Nanterre 384 288 890. Siège social : Tour Ariane - 5, place de la Pyramide 92088 Paris La Défense. +Courtier en assurance n°ORIAS 07 008 441. Adresse postale : Fortuneo - Service Clients - TSA41707 - 35917 RENNES CEDEX 9. \ No newline at end of file diff --git a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/arkeadirectbank/ArkeaDirectBankPDFExtractorTest.java b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/arkeadirectbank/ArkeaDirectBankPDFExtractorTest.java index 8f02ca6ebd..b842042bc6 100644 --- a/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/arkeadirectbank/ArkeaDirectBankPDFExtractorTest.java +++ b/name.abuchen.portfolio.tests/src/name/abuchen/portfolio/datatransfer/pdf/arkeadirectbank/ArkeaDirectBankPDFExtractorTest.java @@ -193,6 +193,72 @@ public void testCompteAchat04() hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); } + /** + * Test that transaction can be imported from an OST PDF file. + */ + @Test + public void testCompteAchat05() + { + ArkeaDirectBankPDFExtractor extractor = new ArkeaDirectBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Achat05.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, "EUR"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("FR0000124141"), hasWkn(null), hasTicker(null), // + hasName("VEOLIA ENVIRON."), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2021-10-08T00:00:00"), hasShares(16), // + hasSource("Achat05.txt"), // + hasAmount("EUR", 363.20), hasGrossValue("EUR", 363.20), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + } + + /** + * Test that transaction can be imported from an OST PDF file. + */ + @Test + public void testCompteAchat06() + { + ArkeaDirectBankPDFExtractor extractor = new ArkeaDirectBankPDFExtractor(new Client()); + + List errors = new ArrayList<>(); + + List results = extractor.extract(PDFInputFile.loadTestCase(getClass(), "Achat06.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, "EUR"); + + // check security + assertThat(results, hasItem(security( // + hasIsin("FR0000124141"), hasWkn(null), hasTicker(null), // + hasName("VEOLIA ENVIRON."), // + hasCurrencyCode("EUR")))); + + // check buy sell transaction + assertThat(results, hasItem(purchase( // + hasDate("2021-10-08T00:00:00"), hasShares(1), // + hasSource("Achat06.txt"), // + hasAmount("EUR", 22.70), hasGrossValue("EUR", 22.70), // + hasTaxes("EUR", 0.00), hasFees("EUR", 0.00)))); + } + @Test public void testDividende01() { diff --git a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ArkeaDirectBankPDFExtractor.java b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ArkeaDirectBankPDFExtractor.java index 4cd79d3f08..7dc1edbf29 100644 --- a/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ArkeaDirectBankPDFExtractor.java +++ b/name.abuchen.portfolio/src/name/abuchen/portfolio/datatransfer/pdf/ArkeaDirectBankPDFExtractor.java @@ -33,6 +33,52 @@ public String getLabel() } private void addBuySellTransaction() + { + addTransactionFromAvisOperation(); + addTransactionFromOST(); + } + + /** + * Allow to import BUY transaction at a preferential price of a security + * from an OST PDF file. + */ + private void addTransactionFromOST() + { + final DocumentType type = new DocumentType("(Souscription avec droits|Souscription . titre r.ductible)"); + this.addDocumentTyp(type); + + Transaction pdfTransaction = new Transaction<>(); + + // Block firstRelevantLine = new Block("^.*Souscription avec droits$"); + Block firstRelevantLine = new Block("^RESULTAT D'OST.*$"); + type.addBlock(firstRelevantLine); + firstRelevantLine.set(pdfTransaction); + + pdfTransaction // + .subject(() -> { + BuySellEntry portfolioTransaction = new BuySellEntry(); + portfolioTransaction.setType(PortfolioTransaction.Type.BUY); + return portfolioTransaction; + }) + // @formatter:off + // Au 8 octobre 2021 + // Nous vous informons que nous avons procédé à la souscription de 16 titre(s) VEOLIA ENVIRON. (FR0000124141) + // montant net de : - 363,20 EUR + // @formatter:on + .section("shares", "name", "isin", "amount", "currency", "day", "month", "year") // + .match("^Au (?[\\d]{1,2}) (?[A-Za-z]+) (?[\\d]{4}).*$") // + .match("^.*la souscription de (?[\\,\\d\\s]+) titre\\(s\\) (?.*) \\((?[A-Z]{2}[A-Z0-9]{9}[0-9])\\).*$") // + .match("^montant net.* (?[\\,\\d\\s]+) (?[\\w]{3})$") // + .assign((t, v) -> { + t.setSecurity(getOrCreateSecurity(v)); + t.setShares(asShares(v.get("shares"))); + t.setCurrencyCode(asCurrencyCode(v.get("currency"))); + t.setAmount(asAmount(v.get("amount"))); + t.setDate(asDate(v.get("day") + " " + v.get("month") + " " + v.get("year"))); + }).wrap(BuySellEntryItem::new); + } + + private void addTransactionFromAvisOperation() { var securityRange = new Block("^.* (ACTION|TRACKER) : .* \\([A-Z]{2}[A-Z0-9]{9}[0-9]\\)$") // .asRange(section -> section //