@Override public BigDecimal getRemainingPrincipal() { return participation.getRemainingPrincipal(); }
@Override public int getRemainingTermInMonths() { return participation.getRemainingInstalmentCount(); }
@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)); }
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; }
@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(); }); }
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()); }
@Override public long identify(final ParticipationDescriptor descriptor) { return descriptor.item().getId(); }
static Investment fresh(final Participation participation, final Loan loan, final BigDecimal amount) { return Investment.fresh(loan, amount) .setId(participation.getInvestmentId()) .setRemainingMonths(participation.getRemainingInstalmentCount()) .setInvestmentDate(DateUtil.offsetNow()) .build(); }
private static Participation mockParticipation(final Loan loan) { final Participation p = mock(Participation.class); when(p.getPurpose()).thenReturn(loan.getPurpose()); when(p.getRating()).thenReturn(loan.getRating()); when(p.getIncomeType()).thenReturn(loan.getMainIncomeType()); return p; }
private static ParticipationDescriptor toDescriptor(final Participation p, final Tenant tenant) { return new ParticipationDescriptor(p, () -> tenant.getLoan(p.getLoanId())); }
@Override public MainIncomeType getMainIncomeType() { return participation.getIncomeType(); }
@Override public int getOriginalTermInMonths() { return participation.getOriginalInstalmentCount(); }
@Override public BigDecimal getInterestRate() { return participation.getInterestRate(); }
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; }
@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 long identify(final ParticipationDescriptor descriptor) { return descriptor.item().getId(); }
static Investment fresh(final Participation participation, final Loan loan, final BigDecimal amount) { return Investment.fresh(loan, amount) .setId(participation.getInvestmentId()) .setRemainingMonths(participation.getRemainingInstalmentCount()) .setInvestmentDate(DateUtil.offsetNow()) .build(); }
private static ParticipationDescriptor toDescriptor(final Participation p, final Tenant tenant) { return new ParticipationDescriptor(p, () -> LoanCache.get().getLoan(p.getLoanId(), tenant)); }