use of name.abuchen.portfolio.snapshot.filter.ClientClassificationFilter in project portfolio by buchen.
the class SecurityTaxAndFeeAccountTransactionsTestCase method checkTaxonomyWihtSecurityAndAccountAssignment.
@Test
public void checkTaxonomyWihtSecurityAndAccountAssignment() {
// if account and security are both classified, only the tax
// transactions are converted to deposits or removals
Taxonomy case3 = client.getTaxonomies().stream().filter(t -> "case_full_classification_adidas_with_account".equals(t.getName())).findAny().orElseThrow(IllegalArgumentException::new);
Classification classification = case3.getAllClassifications().stream().filter(c -> "category_security".equals(c.getName())).findAny().orElseThrow(IllegalArgumentException::new);
Client filteredClient = new ClientClassificationFilter(classification).filter(client);
List<AccountTransaction> txa1 = filteredClient.getAccounts().stream().flatMap(a1 -> a1.getTransactions().stream()).collect(Collectors.toList());
// expect 7 transactions: the original 6 plus the removal of the taxes
// as
// part of the buy
assertThat(txa1.size(), is(7));
// check for additional transactions
assertThat(txa1, hasItem(allOf(//
hasProperty("dateTime", is(LocalDateTime.parse("2017-01-09T00:00"))), //
hasProperty("type", is(AccountTransaction.Type.FEES)), hasProperty("monetaryAmount", is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(10.0)))))));
assertThat(txa1, hasItem(allOf(//
hasProperty("dateTime", is(LocalDateTime.parse("2017-01-10T00:00"))), //
hasProperty("type", is(AccountTransaction.Type.FEES_REFUND)), hasProperty("monetaryAmount", is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.0)))))));
assertThat(txa1, hasItem(allOf(//
hasProperty("dateTime", is(LocalDateTime.parse("2017-01-11T00:00"))), //
hasProperty("type", is(AccountTransaction.Type.REMOVAL)), hasProperty("monetaryAmount", is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(25.0)))))));
assertThat(txa1, hasItem(allOf(//
hasProperty("dateTime", is(LocalDateTime.parse("2017-01-12T00:00"))), //
hasProperty("type", is(AccountTransaction.Type.DEPOSIT)), hasProperty("monetaryAmount", is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5.0)))))));
// if the account is fully classified, but the security only partially,
// there must be offset transactions to make sure that the balance of
// the account remains correct
Taxonomy case4 = client.getTaxonomies().stream().filter(t -> "case_partial_classification_adidas_with_account".equals(t.getName())).findAny().orElseThrow(IllegalArgumentException::new);
classification = case4.getAllClassifications().stream().filter(c -> "category_security".equals(c.getName())).findAny().orElseThrow(IllegalArgumentException::new);
filteredClient = new ClientClassificationFilter(classification).filter(client);
List<AccountTransaction> txa = filteredClient.getAccounts().stream().flatMap(a -> a.getTransactions().stream()).collect(Collectors.toList());
// expect 9 transactions: the original 6 plus the removal of the fees as
// part of the buy + partial transactions to offset fees
assertThat(txa.size(), is(9));
// check for additional transactions
assertThat(txa, hasItem(allOf(//
hasProperty("dateTime", is(LocalDateTime.parse("2017-01-09T00:00"))), //
hasProperty("type", is(AccountTransaction.Type.FEES)), hasProperty("monetaryAmount", is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5)))))));
assertThat(txa, hasItem(allOf(//
hasProperty("dateTime", is(LocalDateTime.parse("2017-01-09T00:00"))), //
hasProperty("type", is(AccountTransaction.Type.REMOVAL)), hasProperty("monetaryAmount", is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(5)))))));
assertThat(txa, hasItem(allOf(//
hasProperty("dateTime", is(LocalDateTime.parse("2017-01-10T00:00"))), //
hasProperty("type", is(AccountTransaction.Type.FEES_REFUND)), hasProperty("monetaryAmount", is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.5)))))));
assertThat(txa, hasItem(allOf(//
hasProperty("dateTime", is(LocalDateTime.parse("2017-01-10T00:00"))), //
hasProperty("type", is(AccountTransaction.Type.DEPOSIT)), hasProperty("monetaryAmount", is(Money.of(CurrencyUnit.EUR, Values.Amount.factorize(2.5)))))));
}
Aggregations