Skip to content
Open
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 @@ -498,8 +498,9 @@ private List<String> extractLoanFieldValues(GetWorkingCapitalLoansLoanIdResponse
final List<String> values = new ArrayList<>();
for (final String field : fields) {
switch (field) {
case "product.name" -> values.add(loan.getProduct() == null ? null : loan.getProduct().getName());
case "submittedOnDate" -> values.add(loan.getSubmittedOnDate() == null ? null : loan.getSubmittedOnDate().toString());
case "product.name" -> values.add(loan.getLoanProductName());
case "submittedOnDate" -> values.add(loan.getTimeline() == null || loan.getTimeline().getSubmittedOnDate() == null ? null
: loan.getTimeline().getSubmittedOnDate().toString());
case "expectedDisbursementDate" ->
values.add(loan.getDisbursementDetails() == null || loan.getDisbursementDetails().isEmpty() ? null
: loan.getDisbursementDetails().getFirst().getExpectedDisbursementDate().toString());
Expand All @@ -512,14 +513,14 @@ private List<String> extractLoanFieldValues(GetWorkingCapitalLoansLoanIdResponse
: new Utils.DoubleFormatter(loan.getApprovedPrincipal().doubleValue()).format());
case "totalPaymentVolume" -> values.add(loan.getTotalPaymentVolume() == null ? null
: new Utils.DoubleFormatter(loan.getTotalPaymentVolume().doubleValue()).format());
case "periodPaymentRate" -> values.add(loan.getPeriodPaymentRate() == null ? null
: new Utils.DoubleFormatter(loan.getPeriodPaymentRate().doubleValue()).format());
case "discount" ->
values.add(loan.getDiscount() == null ? "null" : new Utils.DoubleFormatter(loan.getDiscount().doubleValue()).format());
case "discountProposed" -> values.add(loan.getDiscountProposed() == null ? "null"
: new Utils.DoubleFormatter(loan.getDiscountProposed().doubleValue()).format());
case "discountApproved" -> values.add(loan.getDiscountApproved() == null ? "null"
: new Utils.DoubleFormatter(loan.getDiscountApproved().doubleValue()).format());
case "periodPaymentRate" -> values.add(
loan.getPaymentRate() == null ? null : new Utils.DoubleFormatter(loan.getPaymentRate().doubleValue()).format());
case "discount" -> values.add(
loan.getDiscountFee() == null ? "null" : new Utils.DoubleFormatter(loan.getDiscountFee().doubleValue()).format());
case "discountProposed" -> values.add(loan.getProposedDiscountFee() == null ? "null"
: new Utils.DoubleFormatter(loan.getProposedDiscountFee().doubleValue()).format());
case "discountApproved" -> values.add(loan.getApprovedDiscountFee() == null ? "null"
: new Utils.DoubleFormatter(loan.getApprovedDiscountFee().doubleValue()).format());
default -> throw new IllegalStateException(String.format("Header name %s cannot be found", field));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@
import org.apache.fineract.client.models.PutWorkingCapitalLoansLoanIdResponse;
import org.apache.fineract.client.models.WorkingCapitalLoanCommandTemplateData;
import org.apache.fineract.client.models.WorkingCapitalLoanPeriodPaymentRateChangeData;
import org.apache.fineract.test.data.FundId;
import org.apache.fineract.test.data.LoanStatus;
import org.apache.fineract.test.data.TransactionType;
import org.apache.fineract.test.data.codevalue.CodeNames;
Expand Down Expand Up @@ -186,6 +187,23 @@ public void createWorkingCapitalLoan(final DataTable table) {
createWorkingCapitalLoanAccount(data.get(1));
}

@When("Admin creates a working capital loan with fund and the following data:")
public void createWorkingCapitalLoanWithFund(final DataTable table) {
final List<String> loanData = table.asLists().get(1);
final Long clientId = extractClientId();
final Long loanProductId = resolveLoanProductId(loanData.getFirst());
final PostWorkingCapitalLoansRequest loansRequest = buildCreateLoanRequest(clientId, loanProductId, loanData)
.fundId(FundId.LENDER_A.value);
testContext().set(TestContextKey.LOAN_CREATE_REQUEST, loansRequest);

final PostWorkingCapitalLoansResponse response = ok(
() -> fineractClient.workingCapitalLoans().submitWorkingCapitalLoanApplication(loansRequest));
testContext().set(TestContextKey.LOAN_CREATE_RESPONSE, response);
testContext().set(TestContextKey.WORKING_CAPITAL_LOAN_CREATE_RESPONSE, response);
trackLoanIdIfEnabled(response.getLoanId());
log.info("Working Capital Loan created with fund {}, Loan ID: {}", FundId.LENDER_A.value, response.getLoanId());
}

@When("Admin creates a working capital loan using created product with the following data:")
public void createWorkingCapitalLoanUsingCreatedProduct(final DataTable table) {
submitLoanUsingCreatedProduct(table, null);
Expand Down Expand Up @@ -264,6 +282,65 @@ public void verifyWorkingCapitalLoanAccountData(final DataTable table) {
log.info("Verified working capital loan account data for loan ID: {}", loanId);
}

@Then("Working capital loan details has the auto-generated fields present")
public void verifyAutoGeneratedFieldsPresent() {
final Long loanId = getCreatedLoanId();
final GetWorkingCapitalLoansLoanIdResponse response = retrieveLoanDetails(loanId);

assertThat(response.getId()).as("id").isNotNull();
assertThat(response.getAccountNo()).as("accountNo").isNotNull();
assertThat(response.getExternalId()).as("externalId").isNotNull();
assertThat(response.getClientId()).as("clientId").isNotNull();
}

@Then("Working capital loan details has the following field values:")
public void verifyWorkingCapitalLoanDetailFieldValues(final DataTable table) {
final GetWorkingCapitalLoansLoanIdResponse response = retrieveLoanDetails(getCreatedLoanId());

table.asMap().forEach((field, expected) -> {
final String actual = resolveFieldValue(response, field);
if ("present".equals(expected)) {
assertThat(actual).as("WC loan details field %s", field).isNotEqualTo("null");
} else {
assertThat(actual).as("WC loan details field %s", field).isEqualTo(expected);
}
});
}

private String resolveFieldValue(final Object root, final String path) {
Object current = root;
for (final String segment : path.split("\\.", -1)) {
if (current == null) {
return "null";
}
if (current instanceof List<?> list) {
if ("size".equals(segment)) {
return String.valueOf(list.size());
}
current = list.get(Integer.parseInt(segment));
continue;
}
current = invokeGetter(current, segment);
}
return current instanceof BigDecimal amount ? new Utils.DoubleFormatter(amount.doubleValue()).format() : asString(current);
}

private static Object invokeGetter(final Object owner, final String property) {
final Method getter = Arrays.stream(owner.getClass().getMethods())
.filter(method -> method.getParameterCount() == 0 && method.getName().equalsIgnoreCase("get" + property)).findFirst()
.orElseThrow(
() -> new IllegalStateException(String.format("No getter '%s' on %s", property, owner.getClass().getSimpleName())));
try {
return getter.invoke(owner);
} catch (final ReflectiveOperationException e) {
throw new IllegalStateException(e);
}
}

private static String asString(final Object value) {
return value == null ? "null" : value.toString();
}

@Then("Creating a working capital loan with LP overridables disabled and with the following data will result an error:")
public void creatingWorkingCapitalLoanWithLpOverridablesDisabledWillResultAnError(final DataTable table) {
final List<List<String>> data = table.asLists();
Expand Down Expand Up @@ -527,8 +604,8 @@ public void checkCreateWCLoanAccountBreachDataFromWCLP() {
GetWorkingCapitalLoansLoanIdResponse loanProductResponse = fineractClient.workingCapitalLoans()
.retrieveWorkingCapitalLoanById(loanId);

Assertions.assertNotNull(loanProductResponse.getProduct());
final Long loanProductId = loanProductResponse.getProduct().getId();
Assertions.assertNotNull(loanProductResponse.getLoanProductId());
final Long loanProductId = loanProductResponse.getLoanProductId();
final Long breachIdFromWCLP = getBreachIdFromWCLP(loanProductId);

checkCreateWCLoanAccountBreachData(breachIdFromWCLP);
Expand Down Expand Up @@ -562,7 +639,7 @@ public void checkCreateWCLoanAccountBreachNearBreachDataFromWCLP() {
GetWorkingCapitalLoansLoanIdResponse loanProductResponse = fineractClient.workingCapitalLoans()
.retrieveWorkingCapitalLoanById(loanId);

final Long loanProductId = loanProductResponse.getProduct().getId();
final Long loanProductId = loanProductResponse.getLoanProductId();
final Long breachIdFromWCLP = getBreachIdFromWCLP(loanProductId);
final Long nearBreachIdFromWCLP = getNearBreachIdFromWCLP(loanProductId);

Expand Down Expand Up @@ -1973,9 +2050,10 @@ private List<String> fetchValuesOfWorkingCapitalLoan(final List<String> header,
final List<String> actualValues = new ArrayList<>();
for (final String headerName : header) {
switch (headerName) {
case "product.name" -> actualValues.add(response.getProduct() == null ? null : response.getProduct().getName());
case "product.name" -> actualValues.add(response.getLoanProductName());
case "submittedOnDate" ->
actualValues.add(response.getSubmittedOnDate() == null ? null : response.getSubmittedOnDate().toString());
actualValues.add(response.getTimeline() == null || response.getTimeline().getSubmittedOnDate() == null ? null
: response.getTimeline().getSubmittedOnDate().toString());
case "expectedDisbursementDate" ->
actualValues.add(response.getDisbursementDetails() == null || response.getDisbursementDetails().isEmpty() ? null
: response.getDisbursementDetails().getFirst().getExpectedDisbursementDate().toString());
Expand All @@ -1988,14 +2066,14 @@ private List<String> fetchValuesOfWorkingCapitalLoan(final List<String> header,
: new Utils.DoubleFormatter(response.getApprovedPrincipal().doubleValue()).format());
case "totalPaymentVolume" -> actualValues.add(response.getTotalPaymentVolume() == null ? null
: new Utils.DoubleFormatter(response.getTotalPaymentVolume().doubleValue()).format());
case "periodPaymentRate" -> actualValues.add(response.getPeriodPaymentRate() == null ? null
: new Utils.DoubleFormatter(response.getPeriodPaymentRate().doubleValue()).format());
case "discount" -> actualValues.add(
response.getDiscount() == null ? "null" : new Utils.DoubleFormatter(response.getDiscount().doubleValue()).format());
case "discountProposed" -> actualValues.add(response.getDiscountProposed() == null ? "null"
: new Utils.DoubleFormatter(response.getDiscountProposed().doubleValue()).format());
case "discountApproved" -> actualValues.add(response.getDiscountApproved() == null ? "null"
: new Utils.DoubleFormatter(response.getDiscountApproved().doubleValue()).format());
case "periodPaymentRate" -> actualValues.add(response.getPaymentRate() == null ? null
: new Utils.DoubleFormatter(response.getPaymentRate().doubleValue()).format());
case "discount" -> actualValues.add(response.getDiscountFee() == null ? "null"
: new Utils.DoubleFormatter(response.getDiscountFee().doubleValue()).format());
case "discountProposed" -> actualValues.add(response.getProposedDiscountFee() == null ? "null"
: new Utils.DoubleFormatter(response.getProposedDiscountFee().doubleValue()).format());
case "discountApproved" -> actualValues.add(response.getApprovedDiscountFee() == null ? "null"
: new Utils.DoubleFormatter(response.getApprovedDiscountFee().doubleValue()).format());
case "totalPaidPrincipal" ->
actualValues.add(response.getBalance() == null || response.getBalance().getPrincipalPaid() == null ? null
: new Utils.DoubleFormatter(response.getBalance().getPrincipalPaid().doubleValue()).format());
Expand Down Expand Up @@ -3390,8 +3468,8 @@ public void updatePeriodPaymentRateFailed(String periodPaymentRate, String error

public void checkWorkingCapitalPeriodPaymentRate(Long loanId, String periodPaymentRate) {
final GetWorkingCapitalLoansLoanIdResponse loanDetailsResponse = retrieveLoanDetails(loanId);
assert loanDetailsResponse.getPeriodPaymentRate() != null;
assertThat(loanDetailsResponse.getPeriodPaymentRate().compareTo(new BigDecimal(periodPaymentRate))).isZero();
assert loanDetailsResponse.getPaymentRate() != null;
assertThat(loanDetailsResponse.getPaymentRate().compareTo(new BigDecimal(periodPaymentRate))).isZero();
}

public void checkPeriodPaymentRateChangeHistory(List<List<String>> data,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@
import lombok.RequiredArgsConstructor;
import org.apache.fineract.client.feign.FineractFeignClient;
import org.apache.fineract.client.feign.util.CallFailedRuntimeException;
import org.apache.fineract.client.models.GetLoanOriginatorsResponse;
import org.apache.fineract.client.models.GetWorkingCapitalLoansLoanIdOriginatorData;
import org.apache.fineract.client.models.GetWorkingCapitalLoansLoanIdResponse;
import org.apache.fineract.client.models.LoanOriginatorsResponse;
Expand Down Expand Up @@ -279,7 +278,6 @@ public void detailsHasOriginatorWithAllFields() {
final String expectedExternalId = getExternalId(TestContextKey.ORIGINATOR_EXTERNAL_ID);
final String expectedOriginatorTypeName = testContext().get(TestContextKey.ORIGINATOR_TYPE_NAME);
final String expectedChannelTypeName = testContext().get(TestContextKey.ORIGINATOR_CHANNEL_TYPE_NAME);
final long originatorId = getOriginatorId(TestContextKey.ORIGINATOR_CREATE_RESPONSE);

final List<GetWorkingCapitalLoansLoanIdOriginatorData> originators = retrieveLoanDetails().getOriginators();
assertThat(originators).as("Originators in WC loan details").isNotNull().isNotEmpty();
Expand All @@ -288,15 +286,14 @@ public void detailsHasOriginatorWithAllFields() {
() -> new AssertionError("Originator with externalId " + expectedExternalId + " not found in WC loan details"));

assertThat(originator.getId()).as("Originator id in WC loan details").isNotNull();
assertThat(originator.getExternalId()).as("Originator externalId in WC loan details").isEqualTo(expectedExternalId);
assertThat(originator.getName()).as("Originator name in WC loan details").isNotNull();
assertThat(originator.getStatus()).as("Originator status in WC loan details").isEqualTo("ACTIVE");

final GetLoanOriginatorsResponse originatorDetails = ok(
() -> fineractClient.loanOriginators().retrieveOneLoanOriginator(originatorId));
assertThat(originatorDetails.getOriginatorType()).as("Originator type").isNotNull();
assertThat(originatorDetails.getOriginatorType().getName()).as("Originator type name").isEqualTo(expectedOriginatorTypeName);
assertThat(originatorDetails.getChannelType()).as("Channel type").isNotNull();
assertThat(originatorDetails.getChannelType().getName()).as("Channel type name").isEqualTo(expectedChannelTypeName);
assertThat(originator.getOriginatorType()).as("Originator type in WC loan details").isNotNull();
assertThat(originator.getOriginatorType().getName()).as("Originator type name in WC loan details")
.isEqualTo(expectedOriginatorTypeName);
assertThat(originator.getChannelType()).as("Channel type in WC loan details").isNotNull();
assertThat(originator.getChannelType().getName()).as("Channel type name in WC loan details").isEqualTo(expectedChannelTypeName);
}

@Then("Working capital loan details has originator with name {string}")
Expand Down
Loading
Loading