FINERACT-1724: Asset externalization of non-active loans

This commit is contained in:
abraham.menyhart
2023-07-24 20:29:08 +02:00
committed by Adam Saghy
parent 7c80bf2ffc
commit 61915bbcc4
17 changed files with 692 additions and 18 deletions
@@ -119,9 +119,8 @@ public class GlobalConfigurationHelper {
ArrayList<HashMap> expectedGlobalConfigurations = getAllDefaultGlobalConfigurations();
ArrayList<HashMap> actualGlobalConfigurations = getAllGlobalConfigurations(requestSpec, responseSpec);
// There are currently 50 global configurations.
Assertions.assertEquals(51, expectedGlobalConfigurations.size());
Assertions.assertEquals(51, actualGlobalConfigurations.size());
Assertions.assertEquals(52, expectedGlobalConfigurations.size());
Assertions.assertEquals(52, actualGlobalConfigurations.size());
for (int i = 0; i < expectedGlobalConfigurations.size(); i++) {
@@ -566,6 +565,15 @@ public class GlobalConfigurationHelper {
accrualForChargeDate.put("string_value", "due-date");
defaults.add(accrualForChargeDate);
HashMap<String, Object> assetExternalizationOfNonActiveLoans = new HashMap<>();
assetExternalizationOfNonActiveLoans.put("id", 57);
assetExternalizationOfNonActiveLoans.put("name", "asset-externalization-of-non-active-loans");
assetExternalizationOfNonActiveLoans.put("value", 0);
assetExternalizationOfNonActiveLoans.put("enabled", true);
assetExternalizationOfNonActiveLoans.put("trapDoor", false);
assetExternalizationOfNonActiveLoans.put("string_value", "due-date");
defaults.add(assetExternalizationOfNonActiveLoans);
return defaults;
}
@@ -21,7 +21,10 @@ package org.apache.fineract.integrationtests.investor.externalassetowner;
import static org.apache.fineract.client.models.ExternalTransferData.StatusEnum.ACTIVE;
import static org.apache.fineract.client.models.ExternalTransferData.StatusEnum.BUYBACK;
import static org.apache.fineract.client.models.ExternalTransferData.StatusEnum.CANCELLED;
import static org.apache.fineract.client.models.ExternalTransferData.StatusEnum.DECLINED;
import static org.apache.fineract.client.models.ExternalTransferData.StatusEnum.PENDING;
import static org.apache.fineract.client.models.ExternalTransferData.SubStatusEnum.BALANCE_ZERO;
import static org.apache.fineract.client.models.ExternalTransferData.SubStatusEnum.SAMEDAY_TRANSFERS;
import static org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType.BUSINESS_DATE;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -496,6 +499,118 @@ public class InitiateExternalAssetOwnerTransferTest {
}
}
@Test
public void saleIsDeclinedWhenLoanIsCancelled() {
try {
GlobalConfigurationHelper.manageConfigurations(REQUEST_SPEC, RESPONSE_SPEC,
GlobalConfigurationHelper.ENABLE_AUTOGENERATED_EXTERNAL_ID, true);
setInitialBusinessDate("2020-03-02");
Integer clientID = createClient();
Integer loanID = createLoanForClient(clientID);
PostInitiateTransferResponse saleTransferResponse = createSaleTransfer(loanID, "2020-03-06");
updateBusinessDateAndExecuteCOBJob("2020-03-04");
LOAN_TRANSACTION_HELPER.writeOffLoan("04 March 2020", loanID);
getAndValidateExternalAssetOwnerTransferByLoan(loanID,
ExpectedExternalTransferData.expected(PENDING, saleTransferResponse.getResourceExternalId(), "2020-03-06", "2020-03-02",
"2020-03-04"),
ExpectedExternalTransferData.expected(DECLINED, saleTransferResponse.getResourceExternalId(), "2020-03-06",
"2020-03-04", "2020-03-04", BALANCE_ZERO));
} finally {
cleanUpAndRestoreBusinessDate();
}
}
@Test
public void buybackIsExecutedWhenLoanIsCancelled() {
try {
GlobalConfigurationHelper.manageConfigurations(REQUEST_SPEC, RESPONSE_SPEC,
GlobalConfigurationHelper.ENABLE_AUTOGENERATED_EXTERNAL_ID, true);
setInitialBusinessDate("2020-03-02");
Integer clientID = createClient();
Integer loanID = createLoanForClient(clientID);
PostInitiateTransferResponse saleTransferResponse = createSaleTransfer(loanID, "2020-03-04");
updateBusinessDateAndExecuteCOBJob("2020-03-05");
PostInitiateTransferResponse buybackTransferResponse = createBuybackTransfer(loanID, "2020-03-06");
LOAN_TRANSACTION_HELPER.writeOffLoan("04 March 2020", loanID);
getAndValidateExternalAssetOwnerTransferByLoan(loanID,
ExpectedExternalTransferData.expected(PENDING, saleTransferResponse.getResourceExternalId(), "2020-03-04", "2020-03-02",
"2020-03-04"),
ExpectedExternalTransferData.expected(ACTIVE, saleTransferResponse.getResourceExternalId(), "2020-03-04", "2020-03-05",
"2020-03-05", true, new BigDecimal("15757.420000"), new BigDecimal("15000.000000"),
new BigDecimal("757.420000"), new BigDecimal("0.000000"), new BigDecimal("0.000000"),
new BigDecimal("0.000000")),
ExpectedExternalTransferData.expected(BUYBACK, buybackTransferResponse.getResourceExternalId(), "2020-03-06",
"2020-03-05", "2020-03-05", true, new BigDecimal("15757.420000"), new BigDecimal("15000.000000"),
new BigDecimal("757.420000"), new BigDecimal("0.000000"), new BigDecimal("0.000000"),
new BigDecimal("0.000000")));
getAndValidateThereIsNoActiveMapping(saleTransferResponse.getResourceExternalId());
} finally {
cleanUpAndRestoreBusinessDate();
}
}
@Test
public void buybackAndSaleIsCancelledWhenLoanIsCancelled() {
try {
GlobalConfigurationHelper.manageConfigurations(REQUEST_SPEC, RESPONSE_SPEC,
GlobalConfigurationHelper.ENABLE_AUTOGENERATED_EXTERNAL_ID, true);
setInitialBusinessDate("2020-03-02");
Integer clientID = createClient();
Integer loanID = createLoanForClient(clientID);
PostInitiateTransferResponse saleTransferResponse = createSaleTransfer(loanID, "2020-03-04");
PostInitiateTransferResponse buybackTransferResponse = createBuybackTransfer(loanID, "2020-03-06");
LOAN_TRANSACTION_HELPER.writeOffLoan("02 March 2020", loanID);
getAndValidateExternalAssetOwnerTransferByLoan(loanID,
ExpectedExternalTransferData.expected(PENDING, saleTransferResponse.getResourceExternalId(), "2020-03-04", "2020-03-02",
"2020-03-02"),
ExpectedExternalTransferData.expected(BUYBACK, buybackTransferResponse.getResourceExternalId(), "2020-03-06",
"2020-03-02", "2020-03-02"),
ExpectedExternalTransferData.expected(CANCELLED, buybackTransferResponse.getResourceExternalId(), "2020-03-06",
"2020-03-02", "2020-03-02", BALANCE_ZERO),
ExpectedExternalTransferData.expected(CANCELLED, saleTransferResponse.getResourceExternalId(), "2020-03-04",
"2020-03-02", "2020-03-02", BALANCE_ZERO));
} finally {
cleanUpAndRestoreBusinessDate();
}
}
@Test
public void sameDayBuybackAndSaleIsCancelledWhenLoanIsCancelled() {
try {
GlobalConfigurationHelper.manageConfigurations(REQUEST_SPEC, RESPONSE_SPEC,
GlobalConfigurationHelper.ENABLE_AUTOGENERATED_EXTERNAL_ID, true);
setInitialBusinessDate("2020-03-02");
Integer clientID = createClient();
Integer loanID = createLoanForClient(clientID);
PostInitiateTransferResponse saleTransferResponse = createSaleTransfer(loanID, "2020-03-03");
PostInitiateTransferResponse buybackTransferResponse = createBuybackTransfer(loanID, "2020-03-03");
LOAN_TRANSACTION_HELPER.writeOffLoan("02 March 2020", loanID);
getAndValidateExternalAssetOwnerTransferByLoan(loanID,
ExpectedExternalTransferData.expected(PENDING, saleTransferResponse.getResourceExternalId(), "2020-03-03", "2020-03-02",
"2020-03-02"),
ExpectedExternalTransferData.expected(BUYBACK, buybackTransferResponse.getResourceExternalId(), "2020-03-03",
"2020-03-02", "2020-03-02"),
ExpectedExternalTransferData.expected(CANCELLED, buybackTransferResponse.getResourceExternalId(), "2020-03-03",
"2020-03-02", "2020-03-02", SAMEDAY_TRANSFERS),
ExpectedExternalTransferData.expected(CANCELLED, saleTransferResponse.getResourceExternalId(), "2020-03-03",
"2020-03-02", "2020-03-02", SAMEDAY_TRANSFERS));
} finally {
cleanUpAndRestoreBusinessDate();
}
}
@Test
public void saleAndBuybackOnTheSameDay() {
try {
@@ -592,8 +707,11 @@ public class InitiateExternalAssetOwnerTransferTest {
CallFailedRuntimeException exception = assertThrows(CallFailedRuntimeException.class, () -> createBuybackTransfer(1, null));
assertTrue(exception.getMessage().contains("The parameter `settlementDate` is mandatory."));
CallFailedRuntimeException exception2 = assertThrows(CallFailedRuntimeException.class,
() -> createBuybackTransfer(1, "1970-01-01"));
CallFailedRuntimeException exception2 = assertThrows(CallFailedRuntimeException.class, () -> {
Integer clientID = createClient();
Integer loanID = createLoanForClient(clientID);
createBuybackTransfer(loanID, "1970-01-01");
});
assertTrue(exception2.getMessage().contains("Settlement date cannot be in the past"));
CallFailedRuntimeException exception3 = assertThrows(CallFailedRuntimeException.class, () -> {
@@ -839,6 +957,9 @@ public class InitiateExternalAssetOwnerTransferTest {
assertEquals(expected.totalFeeOutstanding, etd.getDetails().getTotalFeeChargesOutstanding());
assertEquals(expected.totalOverpaid, etd.getDetails().getTotalOverpaid());
}
if (expected.subStatus != null) {
assertEquals(expected.subStatus, etd.getSubStatus());
}
}
}
@@ -919,6 +1040,7 @@ public class InitiateExternalAssetOwnerTransferTest {
private final String effectiveFrom;
private final String effectiveTo;
private final ExternalTransferData.SubStatusEnum subStatus;
private final boolean detailsExpected;
private final BigDecimal totalOutstanding;
private final BigDecimal totalPrincipalOutstanding;
@@ -931,11 +1053,22 @@ public class InitiateExternalAssetOwnerTransferTest {
String settlementDate, String effectiveFrom, String effectiveTo, boolean detailsExpected, BigDecimal totalOutstanding,
BigDecimal totalPrincipalOutstanding, BigDecimal totalInterestOutstanding, BigDecimal totalPenaltyOutstanding,
BigDecimal totalFeeOutstanding, BigDecimal totalOverpaid) {
return new ExpectedExternalTransferData(status, transferExternalId, settlementDate, effectiveFrom, effectiveTo, detailsExpected,
totalOutstanding, totalPrincipalOutstanding, totalInterestOutstanding, totalPenaltyOutstanding, totalFeeOutstanding,
totalOverpaid);
return new ExpectedExternalTransferData(status, transferExternalId, settlementDate, effectiveFrom, effectiveTo, null,
detailsExpected, totalOutstanding, totalPrincipalOutstanding, totalInterestOutstanding, totalPenaltyOutstanding,
totalFeeOutstanding, totalOverpaid);
}
static ExpectedExternalTransferData expected(ExternalTransferData.StatusEnum status, String transferExternalId,
String settlementDate, String effectiveFrom, String effectiveTo) {
return new ExpectedExternalTransferData(status, transferExternalId, settlementDate, effectiveFrom, effectiveTo, null, false,
null, null, null, null, null, null);
}
static ExpectedExternalTransferData expected(ExternalTransferData.StatusEnum status, String transferExternalId,
String settlementDate, String effectiveFrom, String effectiveTo, ExternalTransferData.SubStatusEnum subStatus) {
return new ExpectedExternalTransferData(status, transferExternalId, settlementDate, effectiveFrom, effectiveTo, subStatus,
false, null, null, null, null, null, null);
}
}
@RequiredArgsConstructor()