protected static PortfolioOverview mockPortfolioOverview(final int balance) { final PortfolioOverview po = mock(PortfolioOverview.class); when(po.getCzkAvailable()).thenReturn(BigDecimal.valueOf(balance)); when(po.getCzkInvested()).thenReturn(BigDecimal.ZERO); when(po.getCzkInvested(any())).thenReturn(BigDecimal.ZERO); when(po.getCzkAtRisk()).thenReturn(BigDecimal.ZERO); when(po.getCzkAtRisk(any())).thenReturn(BigDecimal.ZERO); when(po.getShareAtRisk()).thenReturn(BigDecimal.ZERO); when(po.getShareOnInvestment(any())).thenReturn(BigDecimal.ZERO); when(po.getAtRiskShareOnInvestment(any())).thenReturn(BigDecimal.ZERO); when(po.getTimestamp()).thenReturn(ZonedDateTime.now()); return po; }
protected static PortfolioOverview mockPortfolioOverview(final int balance) { final PortfolioOverview po = mock(PortfolioOverview.class); when(po.getCzkAvailable()).thenReturn(BigDecimal.valueOf(balance)); when(po.getCzkInvested()).thenReturn(BigDecimal.ZERO); when(po.getCzkInvested(any())).thenReturn(BigDecimal.ZERO); when(po.getCzkAtRisk()).thenReturn(BigDecimal.ZERO); when(po.getCzkAtRisk(any())).thenReturn(BigDecimal.ZERO); when(po.getShareAtRisk()).thenReturn(BigDecimal.ZERO); when(po.getShareOnInvestment(any())).thenReturn(BigDecimal.ZERO); when(po.getAtRiskShareOnInvestment(any())).thenReturn(BigDecimal.ZERO); when(po.getTimestamp()).thenReturn(ZonedDateTime.now()); return po; }
@Override protected Map<String, Object> getData(final LoanRepaidEvent event) { final Map<String, Object> result = super.getData(event); final int invested = event.getPortfolioOverview().getCzkInvested().intValue(); result.put("yield", FinancialCalculator.actualInterestAfterFees(event.getInvestment(), invested)); return result; } }
@Override protected Map<String, Object> getData(final InvestmentSoldEvent event) { final Map<String, Object> result = super.getData(event); final int invested = event.getPortfolioOverview().getCzkInvested().intValue(); result.put("yield", FinancialCalculator.actualInterestAfterFees(event.getInvestment(), invested, true)); return result; } }
@Override protected Map<String, Object> getData(final LoanRepaidEvent event) { final Map<String, Object> result = super.getData(event); final int invested = event.getPortfolioOverview().getCzkInvested().intValue(); result.put("yield", FinancialCalculator.actualInterestAfterFees(event.getInvestment(), invested)); return result; } }
@Override protected Map<String, Object> getData(final InvestmentMadeEvent event) { final Investment i = event.getInvestment(); final Map<String, Object> result = super.getData(event); final long invested = event.getPortfolioOverview().getCzkInvested().longValue(); result.put("yield", FinancialCalculator.expectedInterestAfterFees(i, invested)); final BigDecimal interestRate = FinancialCalculator.expectedInterestRateAfterFees(i, invested); result.put("relativeYield", interestRate); return result; } }
@Override protected Map<String, Object> getData(final InvestmentPurchasedEvent event) { final Investment i = event.getInvestment(); final Map<String, Object> result = super.getData(event); final long invested = event.getPortfolioOverview().getCzkInvested().longValue(); result.put("yield", FinancialCalculator.expectedInterestAfterFees(i, invested)); final BigDecimal interestRate = FinancialCalculator.expectedInterestRateAfterFees(i, invested); result.put("relativeYield", interestRate); return result; } }
@Override protected Map<String, Object> getData(final InvestmentSoldEvent event) { final Map<String, Object> result = super.getData(event); final int invested = event.getPortfolioOverview().getCzkInvested().intValue(); result.put("yield", FinancialCalculator.actualInterestAfterFees(event.getInvestment(), invested, true)); return result; } }
@Override protected Map<String, Object> getData(final InvestmentPurchasedEvent event) { final Investment i = event.getInvestment(); final Map<String, Object> result = super.getData(event); final long invested = event.getPortfolioOverview().getCzkInvested().longValue(); result.put("yield", FinancialCalculator.expectedInterestAfterFees(i, invested)); final BigDecimal interestRate = FinancialCalculator.expectedInterestRateAfterFees(i, invested); result.put("relativeYield", interestRate); return result; } }
@Override protected Map<String, Object> getData(final InvestmentMadeEvent event) { final Investment i = event.getInvestment(); final Map<String, Object> result = super.getData(event); final long invested = event.getPortfolioOverview().getCzkInvested().longValue(); result.put("yield", FinancialCalculator.expectedInterestAfterFees(i, invested)); final BigDecimal interestRate = FinancialCalculator.expectedInterestRateAfterFees(i, invested); result.put("relativeYield", interestRate); return result; } }
static boolean isAcceptable(final ParsedStrategy strategy, final PortfolioOverview portfolio) { final long balance = portfolio.getCzkAvailable().longValue(); if (balance < strategy.getMinimumBalance()) { Decisions.report(logger -> logger.debug("Not recommending any loans due to balance under minimum.")); return false; } final long invested = portfolio.getCzkInvested().longValue(); final long investmentCeiling = strategy.getMaximumInvestmentSizeInCzk(); if (invested >= investmentCeiling) { Decisions.report(logger -> logger.debug("Not recommending any loans due to reaching the ceiling.")); return false; } return true; } }
static boolean isAcceptable(final ParsedStrategy strategy, final PortfolioOverview portfolio) { final long balance = portfolio.getCzkAvailable().longValue(); if (balance < strategy.getMinimumBalance()) { Decisions.report(logger -> logger.debug("Not recommending any loans due to balance under minimum.")); return false; } final long invested = portfolio.getCzkInvested().longValue(); final long investmentCeiling = strategy.getMaximumInvestmentSizeInCzk(); if (invested >= investmentCeiling) { Decisions.report(logger -> logger.debug("Not recommending any loans due to reaching the ceiling.")); return false; } return true; } }
@Test void unacceptablePortfolioDueToLowBalance() { final ParsedStrategy p = new ParsedStrategy(DefaultPortfolio.EMPTY); final PurchaseStrategy s = new NaturalLanguagePurchaseStrategy(p); final PortfolioOverview portfolio = mock(PortfolioOverview.class); when(portfolio.getCzkAvailable()).thenReturn(BigDecimal.ZERO); when(portfolio.getCzkInvested()).thenReturn(BigDecimal.ZERO); final Stream<RecommendedParticipation> result = s.recommend(Collections.singletonList(mockDescriptor()), portfolio, new Restrictions()); assertThat(result).isEmpty(); }
public static Map<String, Object> summarizePortfolioStructure(final PortfolioOverview portfolioOverview) { return Maps.ofEntries( entry("absoluteShare", perRating(portfolioOverview::getCzkInvested)), entry("relativeShare", perRating(portfolioOverview::getShareOnInvestment)), entry("absoluteRisk", perRating(portfolioOverview::getCzkAtRisk)), entry("relativeRisk", perRating(portfolioOverview::getAtRiskShareOnInvestment)), entry("total", portfolioOverview.getCzkInvested()), entry("totalRisk", portfolioOverview.getCzkAtRisk()), entry("totalShare", portfolioOverview.getShareAtRisk()), entry("balance", portfolioOverview.getCzkAvailable()), entry("timestamp", toDate(portfolioOverview.getTimestamp())) ); }
public static Map<String, Object> summarizePortfolioStructure(final PortfolioOverview portfolioOverview) { return Maps.ofEntries( entry("absoluteShare", perRating(portfolioOverview::getCzkInvested)), entry("relativeShare", perRating(portfolioOverview::getShareOnInvestment)), entry("absoluteRisk", perRating(portfolioOverview::getCzkAtRisk)), entry("relativeRisk", perRating(portfolioOverview::getAtRiskShareOnInvestment)), entry("total", portfolioOverview.getCzkInvested()), entry("totalRisk", portfolioOverview.getCzkAtRisk()), entry("totalShare", portfolioOverview.getShareAtRisk()), entry("balance", portfolioOverview.getCzkAvailable()), entry("timestamp", toDate(portfolioOverview.getTimestamp())) ); }
@Test void emptyPortfolioWithAdjustmentsAndRisks() { final BigDecimal adj = BigDecimal.TEN; final Map<Rating, BigDecimal> in = Collections.singletonMap(Rating.D, adj); final PortfolioOverview po = new PortfolioOverviewImpl(BigDecimal.ZERO, in, in); SoftAssertions.assertSoftly(softly -> { softly.assertThat(po.getCzkAvailable()).isEqualTo(BigDecimal.ZERO); softly.assertThat(po.getCzkInvested()).isEqualTo(adj); softly.assertThat(po.getCzkAtRisk()).isEqualTo(adj); final BigDecimal share = divide(po.getCzkAtRisk(), po.getCzkInvested()); softly.assertThat(po.getShareAtRisk()).isEqualTo(share); for (final Rating r : Rating.values()) { final BigDecimal expectedAbsolute = r == Rating.D ? adj : BigDecimal.ZERO; final BigDecimal expectedRelative = r == Rating.D ? BigDecimal.ONE : BigDecimal.ZERO; softly.assertThat(po.getCzkInvested(r)).as(r + " invested").isEqualTo(expectedAbsolute); softly.assertThat(po.getCzkAtRisk(r)).as(r + " at risk").isEqualTo(expectedAbsolute); softly.assertThat(po.getShareOnInvestment(r)) .as(r + " as a share") .isEqualTo(expectedRelative); softly.assertThat(po.getAtRiskShareOnInvestment(r)) .as(r + " at risk as a share") .isEqualTo(expectedRelative); } }); } }
@Test void emptyPortfolio() { final BigDecimal balance = BigDecimal.TEN; final PortfolioOverview po = new PortfolioOverviewImpl(balance, Collections.emptyMap(), Collections.emptyMap()); SoftAssertions.assertSoftly(softly -> { softly.assertThat(po.getCzkAvailable()).isEqualTo(balance); softly.assertThat(po.getCzkInvested()).isEqualTo(BigDecimal.ZERO); softly.assertThat(po.getCzkAtRisk()).isEqualTo(BigDecimal.ZERO); softly.assertThat(po.getShareAtRisk()).isEqualTo(BigDecimal.ZERO); for (final Rating r : Rating.values()) { softly.assertThat(po.getCzkInvested(r)).as(r + " invested").isEqualTo(BigDecimal.ZERO); softly.assertThat(po.getCzkAtRisk(r)).as(r + " at risk").isEqualTo(BigDecimal.ZERO); softly.assertThat(po.getShareOnInvestment(r)) .as(r + " as a share") .isEqualTo(BigDecimal.ZERO); softly.assertThat(po.getAtRiskShareOnInvestment(r)) .as(r + " at risk as a share") .isEqualTo(BigDecimal.ZERO); } }); }