@Override public Optional<RecommendedParticipation> recommend(final BigDecimal amount) { if (participation.isWillExceedLoanInvestmentLimit() || !Objects.equals(amount, participation.getRemainingPrincipal())) { return Optional.empty(); } return Optional.of(new RecommendedParticipation(this)); }
private boolean purchase(final RecommendedParticipation recommendation) { tenant.fire(purchaseRequested(recommendation)); final Participation participation = recommendation.descriptor().item(); final Loan l = recommendation.descriptor().related(); final boolean succeeded = tenant.getSessionInfo().isDryRun() || actualPurchase(participation); final Investment i = Investment.fresh(participation, l, recommendation.amount()); discarded.put(recommendation.descriptor()); // don't purchase this one again in dry run if (succeeded) { markSuccessfulPurchase(i); tenant.fire(investmentPurchasedLazy(() -> investmentPurchased(i, l, tenant.getPortfolio().getOverview()))); } return succeeded; }
private void purchase(final PurchaseStrategy strategy) { boolean invested; do { invested = strategy.recommend(getAvailable(), tenant.getPortfolio().getOverview(), tenant.getRestrictions()) .filter(r -> tenant.getPortfolio().getBalance().compareTo(r.amount()) >= 0) .peek(r -> tenant.fire(purchaseRecommended(r))) .anyMatch(this::purchase); // keep trying until investment opportunities are exhausted } while (invested); }
private boolean purchase(final RecommendedParticipation recommendation) { tenant.fire(purchaseRequested(recommendation)); final Participation participation = recommendation.descriptor().item(); final Loan l = recommendation.descriptor().related(); final boolean succeeded = tenant.getSessionInfo().isDryRun() || actualPurchase(participation); final Investment i = Investment.fresh(participation, l, recommendation.amount()); discarded.put(recommendation.descriptor()); // don't purchase this one again in dry run if (succeeded) { markSuccessfulPurchase(i); tenant.fire(investmentPurchasedLazy(() -> investmentPurchased(i, l, tenant.getPortfolio().getOverview()))); } return succeeded; }
private void purchase(final PurchaseStrategy strategy) { boolean invested; do { invested = strategy.recommend(getAvailable(), tenant.getPortfolio().getOverview(), tenant.getRestrictions()) .filter(r -> tenant.getPortfolio().getBalance().compareTo(r.amount()) >= 0) .peek(r -> tenant.fire(purchaseRecommended(r))) .anyMatch(this::purchase); // keep trying until investment opportunities are exhausted } while (invested); }
@Test void recommend() { final Participation p = mockParticipation(BigDecimal.TEN); final ParticipationDescriptor pd = new ParticipationDescriptor(p, () -> LOAN); final Optional<RecommendedParticipation> r = pd.recommend(p.getRemainingPrincipal()); assertThat(r).isPresent(); assertSoftly(softly -> { softly.assertThat(r.get().amount()).isEqualTo(p.getRemainingPrincipal()); softly.assertThat(r.get().descriptor().related()).isSameAs(LOAN); softly.assertThat(r.get().descriptor()).isEqualTo(pd); }); }
@Override public Optional<RecommendedParticipation> recommend(final BigDecimal amount) { if (participation.isWillExceedLoanInvestmentLimit() || !Objects.equals(amount, participation.getRemainingPrincipal())) { return Optional.empty(); } return Optional.of(new RecommendedParticipation(this)); }
@Test void equals() { final Participation p = mockParticipation(); final ParticipationDescriptor d = new ParticipationDescriptor(p, () -> LOAN); final RecommendedParticipation r = new RecommendedParticipation(d); assertSoftly(softly -> { softly.assertThat(r).isNotEqualTo(null); softly.assertThat(r).isNotEqualTo(UUID.randomUUID().toString()); softly.assertThat(r).isEqualTo(r); }); final RecommendedParticipation r2 = new RecommendedParticipation(d); assertSoftly(softly -> { softly.assertThat(r).isEqualTo(r2); softly.assertThat(r2).isEqualTo(r); }); final RecommendedParticipation r3 = new RecommendedParticipation(new ParticipationDescriptor(mockParticipation(), () -> LOAN)); assertThat(r).isNotEqualTo(r3); } }