public PurchaseRequest(final Participation participation) { this.amount = participation.getRemainingPrincipal(); }
@Override public BigDecimal getRemainingPrincipal() { return participation.getRemainingPrincipal(); }
@Override public BigDecimal getRemainingPrincipal() { return participation.getRemainingPrincipal(); }
public PurchaseRequest(final Participation participation) { this.amount = participation.getRemainingPrincipal(); }
@Override public BigDecimal amount() { return participationDescriptor.item().getRemainingPrincipal(); }
public Optional<RecommendedParticipation> recommend() { return recommend(participation.getRemainingPrincipal()); }
@Override public BigDecimal amount() { return participationDescriptor.item().getRemainingPrincipal(); }
public Optional<RecommendedParticipation> recommend() { return recommend(participation.getRemainingPrincipal()); }
@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)); }
@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 actualPurchase(final Participation participation) { try { tenant.run(zonky -> zonky.purchase(participation)); LOGGER.info("Purchased a participation worth {} CZK.", participation.getRemainingPrincipal()); return true; } catch (final Exception ex) { LOGGER.debug("Failed purchasing {}. Likely someone's beaten us to it.", ex); return false; } }
private static Participation mockParticipation(final BigDecimal amount) { final Participation p = mock(Participation.class); when(p.getRemainingPrincipal()).thenReturn(amount); return p; }
private static Participation mockParticipation() { final Participation p = mock(Participation.class); when(p.getRemainingPrincipal()).thenReturn(BigDecimal.TEN); return p; }
boolean sizeMatchesStrategy(final Participation participation, final BigDecimal balance) { final int id = participation.getLoanId(); final long participationId = participation.getId(); final int[] recommended = getRecommendationBoundaries(participation); final int minimumRecommendation = recommended[0]; final int maximumRecommendation = recommended[1]; Decisions.report(logger -> logger.trace("Loan #{} (participation #{}) recommended range <{}; {}> CZK.", id, participationId, minimumRecommendation, maximumRecommendation)); // round to nearest lower increment final double price = participation.getRemainingPrincipal().doubleValue(); if (balance.doubleValue() < price) { Decisions.report(logger -> logger.debug("Loan #{} (participation #{}) not recommended; over balance.", id, participationId)); } else if (minimumRecommendation > price) { Decisions.report(logger -> logger.debug("Loan #{} (participation #{}) not recommended; below minimum.", id, participationId)); } else if (price > maximumRecommendation) { Decisions.report(logger -> logger.debug("Loan #{} (participation #{}) not recommended; over maximum.", id, participationId)); } else { Decisions.report(logger -> logger.debug("Final recommendation: buy loan #{} (participation #{}).", id, participationId)); return true; } return false; }
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); }
@Test void purchase() { final ControlApi control = mock(ControlApi.class); final Api<ControlApi> ca = mockApi(control); final Zonky z = mockZonkyControl(ca); final Participation p = mock(Participation.class); when(p.getRemainingPrincipal()).thenReturn(BigDecimal.TEN); when(p.getId()).thenReturn(1L); z.purchase(p); verify(control).purchase(eq(p.getId()), any()); }
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); }
@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(); }
@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); }); }
@Test void values() { final ParticipationDescriptor original = new ParticipationDescriptor(PARTICIPATION, () -> LOAN); final Wrapper<ParticipationDescriptor> w = Wrapper.wrap(original); assertSoftly(softly -> { softly.assertThat(w.isInsuranceActive()).isEqualTo(PARTICIPATION.isInsuranceActive()); softly.assertThat(w.getInterestRate()).isEqualTo(PARTICIPATION.getInterestRate()); softly.assertThat(w.getRegion()).isEqualTo(LOAN.getRegion()); softly.assertThat(w.getRating()).isEqualTo(PARTICIPATION.getRating()); softly.assertThat(w.getMainIncomeType()).isEqualTo(LOAN.getMainIncomeType()); softly.assertThat(w.getPurpose()).isEqualTo(LOAN.getPurpose()); softly.assertThat(w.getOriginalAmount()).isEqualTo(LOAN.getAmount()); softly.assertThat(w.getRemainingPrincipal()).isEqualTo(PARTICIPATION.getRemainingPrincipal()); softly.assertThat(w.getOriginal()).isSameAs(original); softly.assertThat(w.getStory()).isEqualTo(LOAN.getStory()); softly.assertThat(w.getOriginalTermInMonths()).isEqualTo(PARTICIPATION.getOriginalInstalmentCount()); softly.assertThat(w.getRemainingTermInMonths()).isEqualTo(PARTICIPATION.getRemainingInstalmentCount()); softly.assertThat(w.toString()).isNotNull(); }); }