Skip to content

Commit 7eb7b78

Browse files
authored
Merge pull request #5702 from openMF/FINERACT-2455/WC-Delinquency-Management-Classification
FINERACT-2455: WC - Delinquency Management - Delinquency days & Delinquency Bucket handling
2 parents 4a8bdc5 + 6508f88 commit 7eb7b78

35 files changed

Lines changed: 1867 additions & 46 deletions

File tree

fineract-core/src/main/java/org/apache/fineract/infrastructure/configuration/api/GlobalConfigurationConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ public final class GlobalConfigurationConstants {
8181
public static final String ALLOWED_LOAN_STATUSES_OF_DELAYED_SETTLEMENT_FOR_EXTERNAL_ASSET_TRANSFER = "allowed-loan-statuses-of-delayed-settlement-for-external-asset-transfer";
8282
public static final String MAX_LOGIN_RETRY_ATTEMPTS = "max-login-retry-attempts";
8383
public static final String ENABLE_ORIGINATOR_CREATION_DURING_LOAN_APPLICATION = "enable-originator-creation-during-loan-application";
84+
public static final String ENABLE_INSTANT_DELINQUENCY_CALCULATION = "enable-instant-delinquency-calculation";
8485
public static final String PASSWORD_REUSE_CHECK_HISTORY_COUNT = "password-reuse-check-history-count";
8586
public static final String FORCE_WITHDRAWAL_ON_SAVINGS_ACCOUNT = "allow-force-withdrawal-on-savings-account";
8687
public static final String FORCE_WITHDRAWAL_ON_SAVINGS_ACCOUNT_LIMIT = "force-withdrawal-on-savings-account-limit";

fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/WorkingCapitalLoanAccountStepDef.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -869,10 +869,10 @@ private void createWorkingCapitalLoanAccount(final List<String> loanData) {
869869

870870
@SuppressWarnings("unchecked")
871871
private void trackLoanIdIfEnabled(final Long loanId) {
872-
final List<Long> trackedIds = testContext().get(TestContextKey.WC_LOAN_IDS);
873-
if (trackedIds != null) {
874-
trackedIds.add(loanId);
872+
if (testContext().get(TestContextKey.WC_LOAN_IDS) == null) {
873+
testContext().set(TestContextKey.WC_LOAN_IDS, new ArrayList<>());
875874
}
875+
((List<Long>) testContext().get(TestContextKey.WC_LOAN_IDS)).add(loanId);
876876
}
877877

878878
private void modifyWorkingCapitalLoanAccount(final List<String> loanData) {

fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/stepdef/loan/WorkingCapitalStepDef.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import io.cucumber.java.en.Then;
2727
import io.cucumber.java.en.When;
2828
import java.math.BigDecimal;
29+
import java.time.LocalDate;
2930
import java.util.List;
3031
import java.util.Map;
3132
import java.util.UUID;
@@ -38,13 +39,16 @@
3839
import org.apache.fineract.client.models.DeleteWorkingCapitalLoanProductsProductIdResponse;
3940
import org.apache.fineract.client.models.GetConfigurableAttributes;
4041
import org.apache.fineract.client.models.GetPaymentAllocation;
42+
import org.apache.fineract.client.models.GetWorkingCapitalLoanDelinquencyRangeScheduleTagHistoryResponse;
4143
import org.apache.fineract.client.models.GetWorkingCapitalLoanProductsProductIdResponse;
4244
import org.apache.fineract.client.models.GetWorkingCapitalLoanProductsResponse;
4345
import org.apache.fineract.client.models.GetWorkingCapitalLoanProductsTemplateResponse;
46+
import org.apache.fineract.client.models.InternalWorkingCapitalLoanPaymentRequest;
4447
import org.apache.fineract.client.models.PostAllowAttributeOverrides;
4548
import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest;
4649
import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsRequest.AccountingRuleEnum;
4750
import org.apache.fineract.client.models.PostWorkingCapitalLoanProductsResponse;
51+
import org.apache.fineract.client.models.PostWorkingCapitalLoansResponse;
4852
import org.apache.fineract.client.models.PutWorkingCapitalLoanProductsProductIdRequest;
4953
import org.apache.fineract.client.models.PutWorkingCapitalLoanProductsProductIdResponse;
5054
import org.apache.fineract.client.models.StringEnumOptionData;
@@ -59,6 +63,7 @@
5963
import org.apache.fineract.test.stepdef.AbstractStepDef;
6064
import org.apache.fineract.test.support.TestContextKey;
6165
import org.assertj.core.api.SoftAssertions;
66+
import org.junit.jupiter.api.Assertions;
6267

6368
@Slf4j
6469
@RequiredArgsConstructor
@@ -719,6 +724,53 @@ private void assertGLAccountMappingId(final Map<String, ?> mappings, final Strin
719724
assertions.assertAll();
720725
}
721726

727+
private Long getWorkingCapitalLoanResourceId() {
728+
PostWorkingCapitalLoansResponse response = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
729+
return response.getResourceId();
730+
}
731+
732+
@When("Admin makes Internal Payment {string} on {string}")
733+
public void internalPayWCLoan(String amount, String transactionDate) {
734+
Long resourceId = getWorkingCapitalLoanResourceId();
735+
fineractFeignClient.workingCapitalLoans().payment(resourceId, new InternalWorkingCapitalLoanPaymentRequest()
736+
.amount(BigDecimal.valueOf(Double.parseDouble(amount))).transactionDate(LocalDate.parse(transactionDate)));
737+
}
738+
739+
@Then("Delinquency Tag History for Working Capital loan has lines:")
740+
public void checkDelinquencyHistory(final DataTable table) {
741+
Long resourceId = getWorkingCapitalLoanResourceId();
742+
List<GetWorkingCapitalLoanDelinquencyRangeScheduleTagHistoryResponse> actualLines = ok(
743+
() -> fineractFeignClient.workingCapitalLoans().getDelinquencyRangeScheduleTagHistoryById(resourceId));
744+
745+
// Sort by addedOnDate (descending), then by periodNumber (descending)
746+
actualLines.sort((a, b) -> {
747+
int dateCompare = b.getAddedOnDate().compareTo(a.getAddedOnDate());
748+
if (dateCompare != 0) {
749+
return dateCompare;
750+
}
751+
return b.getPeriodNumber().compareTo(a.getPeriodNumber());
752+
});
753+
754+
log.debug("Sorted Loan Delinquency History: {}", actualLines);
755+
List<List<String>> rows = table.asLists();
756+
Assertions.assertEquals(rows.size() - 1, actualLines.size());
757+
for (int i = 0; i < rows.size() - 1; i++) {
758+
GetWorkingCapitalLoanDelinquencyRangeScheduleTagHistoryResponse actual = actualLines.get(i);
759+
Assertions.assertNotNull(actual);
760+
List<String> expected = rows.get(i + 1);
761+
Assertions.assertEquals(expected.get(0), actual.getPeriodNumber() != null ? actual.getPeriodNumber().toString() : null);
762+
Assertions.assertEquals(expected.get(1), actual.getAddedOnDate() != null ? actual.getAddedOnDate().toString() : null);
763+
Assertions.assertEquals(expected.get(2), actual.getLiftedOnDate() != null ? actual.getLiftedOnDate().toString() : null);
764+
765+
Assertions.assertNotNull(actual.getDelinquencyRange());
766+
Assertions.assertEquals(expected.get(3), actual.getDelinquencyRange().getClassification());
767+
Assertions.assertEquals(expected.get(4), actual.getDelinquencyRange().getMinimumAgeDays() == null ? null
768+
: actual.getDelinquencyRange().getMinimumAgeDays().toString());
769+
Assertions.assertEquals(expected.get(5), actual.getDelinquencyRange().getMaximumAgeDays() == null ? null
770+
: actual.getDelinquencyRange().getMaximumAgeDays().toString());
771+
}
772+
}
773+
722774
public PostWorkingCapitalLoanProductsResponse createWorkingCapitalLoanProduct(
723775
PostWorkingCapitalLoanProductsRequest workingCapitalProductRequest) {
724776
String workingCapitalProductName = workingCapitalProductRequest.getName();

fineract-e2e-tests-runner/src/test/java/org/apache/fineract/test/initializer/global/WcpCobBusinessStepInitializerStep.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public class WcpCobBusinessStepInitializerStep implements FineractGlobalInitiali
4141
public void initialize() throws Exception {
4242
try {
4343
JobBusinessStepConfigData response = workFlowJobHelper.getConfiguredWorkflowSteps(WCP_COB_JOB_NAME);
44-
log.info("WCP COB configured business steps: {}", response.getBusinessSteps());
44+
log.debug("WCP COB configured business steps: {}", response.getBusinessSteps());
4545
} catch (CallFailedRuntimeException e) {
4646
log.warn("WCP COB business steps retrieval failed (expected if WCP COB not deployed): {}", e.getMessage());
4747
log.debug("Full stack trace:", e);

0 commit comments

Comments
 (0)