Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -922,6 +922,14 @@ public CommandWrapperBuilder creditBalanceRefundWorkingCapitalLoanTransaction(fi
return this;
}

public CommandWrapperBuilder updatePeriodPaymentRateWorkingCapitalLoanApplication(final Long loanId) {
this.actionName = "UPDATERATE";
this.entityName = "WORKINGCAPITALLOAN";
this.entityId = loanId;
this.href = "/workingcapitalloans/" + loanId;
return this;
}

public CommandWrapperBuilder createClientIdentifier(final Long clientId) {
this.actionName = ACTION_CREATE;
this.entityName = ENTITY_CLIENTIDENTIFIER;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ public enum DefaultWorkingCapitalLoanProduct implements WorkingCapitalLoanProduc
WCLP_BREACH, //
WCLP_BREACH_NEAR_BREACH, //
WCLP_BREACH_DISALLOW_ATTRIBUTES_OVERRIDE, //
WCLP_BREACH_NEAR_BREACH_DISALLOW_ATTRIBUTES_OVERRIDE; //
WCLP_BREACH_NEAR_BREACH_DISALLOW_ATTRIBUTES_OVERRIDE, //
WCLP_PERIOD_PAYMENT_RATE; //

@Override
public String getName() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
import org.apache.fineract.client.models.PostWorkingCapitalLoansDelinquencyActionRequest;
import org.apache.fineract.client.models.PostWorkingCapitalLoansLoanIdRequest;
import org.apache.fineract.client.models.PostWorkingCapitalLoansRequest;
import org.apache.fineract.client.models.PutWorkingCapitalLoansLoanIdDiscountRequest;
import org.apache.fineract.client.models.PutWorkingCapitalLoansLoanIdRateRequest;
import org.apache.fineract.client.models.PutWorkingCapitalLoansLoanIdRequest;
import org.apache.fineract.test.data.workingcapitalproduct.DefaultWorkingCapitalLoanProduct;
import org.apache.fineract.test.data.workingcapitalproduct.WorkingCapitalLoanProductResolver;
Expand All @@ -40,9 +42,11 @@ public class WorkingCapitalLoanRequestFactory {
public static final String DEFAULT_LOCALE = "en";
public static final DefaultWorkingCapitalLoanProduct DEFAULT_WORKING_CAPITAL_LOAN_PRODUCT = DefaultWorkingCapitalLoanProduct.WCLP;
public static final BigDecimal DEFAULT_PRINCIPAL = new BigDecimal(100);
public static final BigDecimal DEFAULT_DISCOUNT = new BigDecimal(100);
public static final BigDecimal DEFAULT_TOTAL_PAYMENT = new BigDecimal(100);
public static final BigDecimal DEFAULT_PERIOD_PAYMENT_RATE = new BigDecimal(1);
public static final BigDecimal DEFAULT_DISCOUNT_ZERO = BigDecimal.ZERO;
public static final BigDecimal DEFAULT_PAYMENT_RATE = new BigDecimal(15);

public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(DATE_FORMAT);
public static final String DATE_SUBMIT_STRING = FORMATTER.format(Utils.now().minusMonths(1L));
Expand Down Expand Up @@ -118,4 +122,17 @@ public PostWorkingCapitalLoansDelinquencyActionRequest defaultWorkingCapitalLoan
.dateFormat(DATE_FORMAT)//
.locale(DEFAULT_LOCALE);//
}

public PutWorkingCapitalLoansLoanIdDiscountRequest defaultWorkingCapitalLoanUpdateDiscountRequest() {
return new PutWorkingCapitalLoansLoanIdDiscountRequest()//
.discountAmount(DEFAULT_DISCOUNT).note("")//
.dateFormat(DATE_FORMAT)//
.locale(DEFAULT_LOCALE);//
}

public PutWorkingCapitalLoansLoanIdRateRequest defaultWorkingCapitalLoanUpdateRateRequest() {
return new PutWorkingCapitalLoansLoanIdRateRequest() //
.periodPaymentRate(DEFAULT_PAYMENT_RATE) //
.locale(DEFAULT_LOCALE); //
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1117,4 +1117,8 @@ public static String nearBreachMustBeLowerThenBreachFailure() {
public static String nearBreachIdNotFoundFailure(long nearBreachId) {
return String.format("Working Capital Near Breach with id %s was not found.", nearBreachId);
}

public static String periodPaymentRateOnNonActiveLoanFailure() {
return "Period payment rate change is allowed only for active loans";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,14 @@ public class WorkingCapitalAmortizationScheduleStepDef extends AbstractStepDef {

private final FineractFeignClient fineractFeignClient;

@When("Admin generates a projected amortization schedule with originationFeeAmount {double}, netDisbursementAmount {double}, totalPaymentValue {double}, periodPaymentRate {double}, npvDayCount {int}, expectedDisbursementDate {string}")
public void generateAmortizationSchedule(final double originationFeeAmount, final double netDisbursementAmount,
@When("Admin generates a projected amortization schedule with discountFeeAmount {double}, netDisbursementAmount {double}, totalPaymentValue {double}, periodPaymentRate {double}, npvDayCount {int}, expectedDisbursementDate {string}")
public void generateAmortizationSchedule(final double discountFeeAmount, final double netDisbursementAmount,
final double totalPaymentValue, final double periodPaymentRate, final int npvDayCount, final String expectedDisbursementDate) {
final Long loanId = extractLoanId();
final WorkingCapitalLoansApi api = fineractFeignClient.create(WorkingCapitalLoansApi.class);

final ProjectedAmortizationScheduleGenerateRequest request = new ProjectedAmortizationScheduleGenerateRequest();
request.setOriginationFeeAmount(BigDecimal.valueOf(originationFeeAmount));
request.setDiscountFeeAmount(BigDecimal.valueOf(discountFeeAmount));
request.setNetDisbursementAmount(BigDecimal.valueOf(netDisbursementAmount));
request.setTotalPaymentValue(BigDecimal.valueOf(totalPaymentValue));
request.setPeriodPaymentRate(BigDecimal.valueOf(periodPaymentRate));
Expand Down Expand Up @@ -94,13 +94,13 @@ private void verifySummaryFields(final DataTable dataTable) {
final Map<String, String> expected = dataTable.asMaps().getFirst();
final SoftAssertions assertions = new SoftAssertions();

assertDecimal(assertions, "originationFeeAmount", response.getOriginationFeeAmount(), expected.get("originationFeeAmount"));
assertDecimal(assertions, "discountFeeAmount", response.getDiscountFeeAmount(), expected.get("discountFeeAmount"));
assertDecimal(assertions, "netDisbursementAmount", response.getNetDisbursementAmount(), expected.get("netDisbursementAmount"));
assertDecimal(assertions, "totalPaymentValue", response.getTotalPaymentValue(), expected.get("totalPaymentValue"));
assertDecimal(assertions, "periodPaymentRate", response.getPeriodPaymentRate(), expected.get("periodPaymentRate"));
assertInt(assertions, "npvDayCount", response.getNpvDayCount(), expected.get("npvDayCount"));
assertDecimal(assertions, "expectedPaymentAmount", response.getExpectedPaymentAmount(), expected.get("expectedPaymentAmount"));
assertInt(assertions, "loanTerm", response.getLoanTerm(), expected.get("loanTerm"));
assertInt(assertions, "originalPaymentNumber", response.getOriginalPaymentNumber(), expected.get("originalPaymentNumber"));

assertions.assertAll();
}
Expand All @@ -123,18 +123,13 @@ private void verifyPaymentDetails(final DataTable dataTable) {

assertInt(assertions, p + "paymentNo", actual.getPaymentNo(), expected.get("paymentNo"));
assertDate(assertions, p + "date", actual.getPaymentDate(), expected.get("date"));
assertLong(assertions, p + "paymentsLeft", actual.getPaymentsLeft(), expected.get("paymentsLeft"));
assertNullableDecimal(assertions, p + "expectedPaymentAmount", actual.getExpectedPaymentAmount(),
expected.get("expectedPaymentAmount"));
assertNullableDecimal(assertions, p + "forecastPaymentAmount", actual.getForecastPaymentAmount(),
expected.get("forecastPaymentAmount"));
assertOptionalDecimal(assertions, p + "discountFactor", actual.getDiscountFactor(), expected.get("discountFactor"));
assertNullableDecimal(assertions, p + "npvValue", actual.getNpvValue(), expected.get("npvValue"));
assertNullableDecimal(assertions, p + "balance", actual.getBalance(), expected.get("balance"));
assertNullableDecimal(assertions, p + "expectedAmortizationAmount", actual.getExpectedAmortizationAmount(),
expected.get("expectedAmortizationAmount"));
assertNullableDecimal(assertions, p + "netAmortizationAmount", actual.getNetAmortizationAmount(),
expected.get("netAmortizationAmount"));
assertNullableDecimal(assertions, p + "actualPaymentAmount", actual.getActualPaymentAmount(),
expected.get("actualPaymentAmount"));
assertNullableDecimal(assertions, p + "actualAmortizationAmount", actual.getActualAmortizationAmount(),
Expand Down Expand Up @@ -171,13 +166,6 @@ private static void assertInt(final SoftAssertions assertions, final String fiel
assertions.assertThat(WorkingCapitalScheduleMatcher.matchesInteger(actual, expectedStr)).as(field).isTrue();
}

private static void assertLong(final SoftAssertions assertions, final String field, final Long actual, final String expectedStr) {
if (WorkingCapitalScheduleMatcher.isBlank(expectedStr)) {
return;
}
assertions.assertThat(WorkingCapitalScheduleMatcher.matchesLong(actual, expectedStr)).as(field).isTrue();
}

private static void assertDate(final SoftAssertions assertions, final String field, final LocalDate actual, final String expectedStr) {
if (WorkingCapitalScheduleMatcher.isBlank(expectedStr)) {
return;
Expand Down
Loading
Loading