Skip to content

Commit

Permalink
Enhancement of Arkea Direct Bank importer to import transactions from…
Browse files Browse the repository at this point in the history
… OST (#4543)

Closes #4543
  • Loading branch information
mikaelpeltier committed Feb 24, 2025
1 parent adc35d4 commit 36739d8
Show file tree
Hide file tree
Showing 4 changed files with 153 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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.
Original file line number Diff line number Diff line change
@@ -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.
Original file line number Diff line number Diff line change
Expand Up @@ -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<Exception> errors = new ArrayList<>();

List<Item> 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<Exception> errors = new ArrayList<>();

List<Item> 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()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<BuySellEntry> 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 (?<day>[\\d]{1,2}) (?<month>[A-Za-z]+) (?<year>[\\d]{4}).*$") //
.match("^.*la souscription de (?<shares>[\\,\\d\\s]+) titre\\(s\\) (?<name>.*) \\((?<isin>[A-Z]{2}[A-Z0-9]{9}[0-9])\\).*$") //
.match("^montant net.* (?<amount>[\\,\\d\\s]+) (?<currency>[\\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 //
Expand Down

0 comments on commit 36739d8

Please sign in to comment.