private static ParticipationDescriptor toDescriptor(final Participation p, final Tenant tenant) { return new ParticipationDescriptor(p, () -> tenant.getLoan(p.getLoanId())); }
@Override public Stream<RecommendedParticipation> recommend(final Collection<ParticipationDescriptor> available, final PortfolioOverview portfolio, final Restrictions restrictions) { if (!Util.isAcceptable(strategy, portfolio)) { return Stream.empty(); } // split available marketplace into buckets per rating final Map<Rating, List<ParticipationDescriptor>> splitByRating = Util.sortByRating(strategy.getApplicableParticipations(available), d -> d.item().getRating()); // recommend amount to invest per strategy return Util.rankRatingsByDemand(strategy, splitByRating.keySet(), portfolio) .flatMap(rating -> splitByRating.get(rating).stream().sorted(COMPARATOR)) .peek(d -> Decisions.report(logger -> logger.trace("Evaluating {}.", d.item()))) .filter(d -> sizeMatchesStrategy(d.item(), portfolio.getCzkAvailable())) .flatMap(d -> d.recommend().map(Stream::of).orElse(Stream.empty())); } }
@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); }); }
private static RecommendedParticipation recommendedParticipation() { final Participation p = mock(Participation.class); when(p.getRemainingPrincipal()).thenReturn(BigDecimal.TEN); return new ParticipationDescriptor(p, () -> Loan.custom().build()).recommend().orElse(null); }
public ParticipationWrapper(final ParticipationDescriptor descriptor) { super(descriptor); this.participation = descriptor.item(); }
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; }
public Optional<RecommendedParticipation> recommend() { return recommend(participation.getRemainingPrincipal()); }
@Test void recommendWrong() { final Participation p = mockParticipation(BigDecimal.TEN); final ParticipationDescriptor pd = new ParticipationDescriptor(p, () -> LOAN); final Optional<RecommendedParticipation> r = pd.recommend(p.getRemainingPrincipal().subtract(BigDecimal.ONE)); assertThat(r).isEmpty(); }
public ParticipationWrapper(final ParticipationDescriptor descriptor) { super(descriptor); this.participation = descriptor.item(); }
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; }
public Optional<RecommendedParticipation> recommend() { return recommend(participation.getRemainingPrincipal()); }
private static ParticipationDescriptor toDescriptor(final Participation p, final Tenant tenant) { return new ParticipationDescriptor(p, () -> LoanCache.get().getLoan(p.getLoanId(), tenant)); }
@Override public Stream<RecommendedParticipation> recommend(final Collection<ParticipationDescriptor> available, final PortfolioOverview portfolio, final Restrictions restrictions) { if (!Util.isAcceptable(strategy, portfolio)) { return Stream.empty(); } // split available marketplace into buckets per rating final Map<Rating, List<ParticipationDescriptor>> splitByRating = Util.sortByRating(strategy.getApplicableParticipations(available), d -> d.item().getRating()); // recommend amount to invest per strategy return Util.rankRatingsByDemand(strategy, splitByRating.keySet(), portfolio) .flatMap(rating -> splitByRating.get(rating).stream().sorted(COMPARATOR)) .peek(d -> Decisions.report(logger -> logger.trace("Evaluating {}.", d.item()))) .filter(d -> sizeMatchesStrategy(d.item(), portfolio.getCzkAvailable())) .flatMap(d -> d.recommend().map(Stream::of).orElse(Stream.empty())); } }
@Override public long identify(final ParticipationDescriptor descriptor) { return descriptor.item().getId(); }
private static ParticipationDescriptor mockParticipationDescriptor(final Loan loan) { final Participation p = mock(Participation.class); doReturn(loan.getTermInMonths()).when(p).getRemainingInstalmentCount(); return new ParticipationDescriptor(p, () -> loan); }
@Override public BigDecimal amount() { return participationDescriptor.item().getRemainingPrincipal(); }
private static ParticipationDescriptor mockParticipationDescriptor(final Loan loan, final int remainingInstalments, final OffsetDateTime deadline) { final Participation p = mock(Participation.class); when(p.getRemainingInstalmentCount()).thenReturn(remainingInstalments); when(p.getDeadline()).thenReturn(deadline); when(p.getRemainingPrincipal()).thenReturn(BigDecimal.valueOf(loan.getAmount())); return new ParticipationDescriptor(p, () -> loan); }
@Override public long identify(final ParticipationDescriptor descriptor) { return descriptor.item().getId(); }
@Test void getters() { final PurchasingOperationDescriptor d = new PurchasingOperationDescriptor(); final Participation p = mock(Participation.class); when(p.getId()).thenReturn(1l); final Loan l = Loan.custom().build(); final ParticipationDescriptor pd = new ParticipationDescriptor(p, () -> l); assertThat(d.identify(pd)).isEqualTo(1); }
@Override public BigDecimal amount() { return participationDescriptor.item().getRemainingPrincipal(); }