FINERACT-1926: added e2e tests for asset owner event changes with previous owner
This commit is contained in:
committed by
Adam Saghy
parent
4786139882
commit
5b638c682b
+4
@@ -695,6 +695,10 @@ public final class ErrorMessageHelper {
|
|||||||
actual, expected);
|
actual, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String wrongDataInExternalAssetOwnerLoanProductAttribute(String attributeKey, long loanProduct) {
|
||||||
|
return String.format("No attribute %s for loan product %s is found!", attributeKey, loanProduct);
|
||||||
|
}
|
||||||
|
|
||||||
public static String wrongData(String actual, String expected) {
|
public static String wrongData(String actual, String expected) {
|
||||||
return String.format("Wrong data. Actual value is: %s - But expected value is: %s", actual, expected);
|
return String.format("Wrong data. Actual value is: %s - But expected value is: %s", actual, expected);
|
||||||
}
|
}
|
||||||
|
|||||||
+41
@@ -413,6 +413,47 @@ public class EventCheckHelper {
|
|||||||
.isEqualTo(transferStatusReasonExpected);
|
.isEqualTo(transferStatusReasonExpected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void loanOwnershipTransferBusinessEventWithTypeCheck(Long loanId, ExternalTransferData transferData, String transferType,
|
||||||
|
String previousAssetOwner) throws IOException {
|
||||||
|
Response<PageExternalTransferData> response = externalAssetOwnersApi.getTransfers(null, loanId, null, null, null).execute();
|
||||||
|
List<ExternalTransferData> content = response.body().getContent();
|
||||||
|
Long transferId = transferData.getTransferId();
|
||||||
|
String assetOwner = transferData.getOwner() == null ? null : transferData.getOwner().getExternalId();
|
||||||
|
|
||||||
|
ExternalTransferData filtered = content.stream().filter(t -> transferId.equals(t.getTransferId())).reduce((first, second) -> second)
|
||||||
|
.orElseThrow(() -> new IllegalStateException("No element found"));
|
||||||
|
|
||||||
|
BigDecimal totalOutstandingBalanceAmountExpected = filtered.getDetails() == null ? null
|
||||||
|
: zeroConversion(filtered.getDetails().getTotalOutstanding());
|
||||||
|
BigDecimal outstandingPrincipalPortionExpected = filtered.getDetails() == null ? null
|
||||||
|
: zeroConversion(filtered.getDetails().getTotalPrincipalOutstanding());
|
||||||
|
BigDecimal outstandingFeePortionExpected = filtered.getDetails() == null ? null
|
||||||
|
: zeroConversion(filtered.getDetails().getTotalFeeChargesOutstanding());
|
||||||
|
BigDecimal outstandingPenaltyPortionExpected = filtered.getDetails() == null ? null
|
||||||
|
: zeroConversion(filtered.getDetails().getTotalPenaltyChargesOutstanding());
|
||||||
|
BigDecimal outstandingInterestPortionExpected = filtered.getDetails() == null ? null
|
||||||
|
: zeroConversion(filtered.getDetails().getTotalInterestOutstanding());
|
||||||
|
BigDecimal overPaymentPortionExpected = filtered.getDetails() == null ? null
|
||||||
|
: zeroConversion(filtered.getDetails().getTotalOverpaid());
|
||||||
|
|
||||||
|
eventAssertion.assertEvent(LoanOwnershipTransferEvent.class, loanId).extractingData(LoanOwnershipTransferDataV1::getLoanId)
|
||||||
|
.isEqualTo(loanId).extractingData(LoanOwnershipTransferDataV1::getAssetOwnerExternalId)
|
||||||
|
.isEqualTo(filtered.getOwner().getExternalId()).extractingData(LoanOwnershipTransferDataV1::getTransferExternalId)
|
||||||
|
.isEqualTo(filtered.getTransferExternalId()).extractingData(LoanOwnershipTransferDataV1::getSettlementDate)
|
||||||
|
.isEqualTo(FORMATTER_EVENTS.format(filtered.getSettlementDate()))
|
||||||
|
.extractingBigDecimal(LoanOwnershipTransferDataV1::getTotalOutstandingBalanceAmount)
|
||||||
|
.isEqualTo(totalOutstandingBalanceAmountExpected)
|
||||||
|
.extractingBigDecimal(LoanOwnershipTransferDataV1::getOutstandingPrincipalPortion)
|
||||||
|
.isEqualTo(outstandingPrincipalPortionExpected).extractingBigDecimal(LoanOwnershipTransferDataV1::getOutstandingFeePortion)
|
||||||
|
.isEqualTo(outstandingFeePortionExpected).extractingBigDecimal(LoanOwnershipTransferDataV1::getOutstandingPenaltyPortion)
|
||||||
|
.isEqualTo(outstandingPenaltyPortionExpected)
|
||||||
|
.extractingBigDecimal(LoanOwnershipTransferDataV1::getOutstandingInterestPortion)
|
||||||
|
.isEqualTo(outstandingInterestPortionExpected).extractingBigDecimal(LoanOwnershipTransferDataV1::getOverPaymentPortion)
|
||||||
|
.isEqualTo(overPaymentPortionExpected).extractingData(LoanOwnershipTransferDataV1::getType).isEqualTo(transferType)
|
||||||
|
.extractingData(LoanOwnershipTransferDataV1::getAssetOwnerExternalId).isEqualTo(assetOwner)
|
||||||
|
.extractingData(LoanOwnershipTransferDataV1::getPreviousOwnerExternalId).isEqualTo(previousAssetOwner);
|
||||||
|
}
|
||||||
|
|
||||||
public void loanAccountSnapshotBusinessEventCheck(Long loanId, Long transferId) throws IOException {
|
public void loanAccountSnapshotBusinessEventCheck(Long loanId, Long transferId) throws IOException {
|
||||||
Response<PageExternalTransferData> response = externalAssetOwnersApi.getTransfers(null, loanId, null, null, null).execute();
|
Response<PageExternalTransferData> response = externalAssetOwnersApi.getTransfers(null, loanId, null, null, null).execute();
|
||||||
List<ExternalTransferData> content = response.body().getContent();
|
List<ExternalTransferData> content = response.body().getContent();
|
||||||
|
|||||||
+171
-7
@@ -49,22 +49,33 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.fineract.client.models.CommandProcessingResult;
|
||||||
import org.apache.fineract.client.models.ExternalAssetOwnerRequest;
|
import org.apache.fineract.client.models.ExternalAssetOwnerRequest;
|
||||||
import org.apache.fineract.client.models.ExternalOwnerJournalEntryData;
|
import org.apache.fineract.client.models.ExternalOwnerJournalEntryData;
|
||||||
import org.apache.fineract.client.models.ExternalOwnerTransferJournalEntryData;
|
import org.apache.fineract.client.models.ExternalOwnerTransferJournalEntryData;
|
||||||
import org.apache.fineract.client.models.ExternalTransferData;
|
import org.apache.fineract.client.models.ExternalTransferData;
|
||||||
|
import org.apache.fineract.client.models.ExternalTransferLoanProductAttributesData;
|
||||||
|
import org.apache.fineract.client.models.GetLoanProductsResponse;
|
||||||
import org.apache.fineract.client.models.JournalEntryData;
|
import org.apache.fineract.client.models.JournalEntryData;
|
||||||
import org.apache.fineract.client.models.PageExternalTransferData;
|
import org.apache.fineract.client.models.PageExternalTransferData;
|
||||||
|
import org.apache.fineract.client.models.PageExternalTransferLoanProductAttributesData;
|
||||||
|
import org.apache.fineract.client.models.PostExternalAssetOwnerLoanProductAttributeRequest;
|
||||||
import org.apache.fineract.client.models.PostInitiateTransferResponse;
|
import org.apache.fineract.client.models.PostInitiateTransferResponse;
|
||||||
import org.apache.fineract.client.models.PostLoansResponse;
|
import org.apache.fineract.client.models.PostLoansResponse;
|
||||||
|
import org.apache.fineract.client.models.PutExternalAssetOwnerLoanProductAttributeRequest;
|
||||||
|
import org.apache.fineract.client.services.ExternalAssetOwnerLoanProductAttributesApi;
|
||||||
import org.apache.fineract.client.services.ExternalAssetOwnersApi;
|
import org.apache.fineract.client.services.ExternalAssetOwnersApi;
|
||||||
|
import org.apache.fineract.client.services.LoanProductsApi;
|
||||||
|
import org.apache.fineract.client.services.LoansApi;
|
||||||
import org.apache.fineract.client.util.JSON;
|
import org.apache.fineract.client.util.JSON;
|
||||||
import org.apache.fineract.test.data.AssetExternalizationErrorMessage;
|
import org.apache.fineract.test.data.AssetExternalizationErrorMessage;
|
||||||
import org.apache.fineract.test.helper.ErrorHelper;
|
import org.apache.fineract.test.helper.ErrorHelper;
|
||||||
import org.apache.fineract.test.helper.ErrorMessageHelper;
|
import org.apache.fineract.test.helper.ErrorMessageHelper;
|
||||||
import org.apache.fineract.test.helper.ErrorResponse;
|
import org.apache.fineract.test.helper.ErrorResponse;
|
||||||
import org.apache.fineract.test.helper.Utils;
|
import org.apache.fineract.test.helper.Utils;
|
||||||
|
import org.apache.fineract.test.messaging.EventAssertion;
|
||||||
import org.apache.fineract.test.messaging.event.EventCheckHelper;
|
import org.apache.fineract.test.messaging.event.EventCheckHelper;
|
||||||
|
import org.apache.fineract.test.messaging.event.assetexternalization.LoanOwnershipTransferEvent;
|
||||||
import org.apache.fineract.test.stepdef.AbstractStepDef;
|
import org.apache.fineract.test.stepdef.AbstractStepDef;
|
||||||
import org.apache.fineract.test.support.TestContextKey;
|
import org.apache.fineract.test.support.TestContextKey;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -78,6 +89,7 @@ public class AssetExternalizationStepDef extends AbstractStepDef {
|
|||||||
public static final String DEFAULT_LOCALE = "en";
|
public static final String DEFAULT_LOCALE = "en";
|
||||||
public static final String TRANSACTION_TYPE_SALE = "sale";
|
public static final String TRANSACTION_TYPE_SALE = "sale";
|
||||||
public static final String TRANSACTION_TYPE_BUYBACK = "buyback";
|
public static final String TRANSACTION_TYPE_BUYBACK = "buyback";
|
||||||
|
public static final String TRANSACTION_TYPE_INTERMEDIARY_SALE = "intermediarySale";
|
||||||
public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(DATE_FORMAT_ASSET_EXT);
|
public static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(DATE_FORMAT_ASSET_EXT);
|
||||||
private static final Gson GSON = new JSON().getGson();
|
private static final Gson GSON = new JSON().getGson();
|
||||||
|
|
||||||
@@ -87,6 +99,9 @@ public class AssetExternalizationStepDef extends AbstractStepDef {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private EventCheckHelper eventCheckHelper;
|
private EventCheckHelper eventCheckHelper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private EventAssertion eventAssertion;
|
||||||
|
|
||||||
@When("Admin makes asset externalization request by Loan ID with unique ownerExternalId, user-generated transferExternalId and the following data:")
|
@When("Admin makes asset externalization request by Loan ID with unique ownerExternalId, user-generated transferExternalId and the following data:")
|
||||||
public void createAssetExternalizationRequestByLoanIdUserGeneratedExtId(DataTable table) throws IOException {
|
public void createAssetExternalizationRequestByLoanIdUserGeneratedExtId(DataTable table) throws IOException {
|
||||||
// if user created transferExternalId previously, it will use that, otherwise create a new one
|
// if user created transferExternalId previously, it will use that, otherwise create a new one
|
||||||
@@ -130,7 +145,7 @@ public class AssetExternalizationStepDef extends AbstractStepDef {
|
|||||||
response.body().getResourceExternalId());
|
response.body().getResourceExternalId());
|
||||||
ErrorHelper.checkSuccessfulApiCall(response);
|
ErrorHelper.checkSuccessfulApiCall(response);
|
||||||
|
|
||||||
} else if (transferData.get(0).equals(TRANSACTION_TYPE_SALE)) {
|
} else if ((transferData.get(0).equals(TRANSACTION_TYPE_SALE) || transferData.get(0).equals(TRANSACTION_TYPE_INTERMEDIARY_SALE))) {
|
||||||
String ownerExternalId;
|
String ownerExternalId;
|
||||||
if (regenerateOwner) {
|
if (regenerateOwner) {
|
||||||
ownerExternalId = Utils.randomNameGenerator(OWNER_EXTERNAL_ID_PREFIX, 3);
|
ownerExternalId = Utils.randomNameGenerator(OWNER_EXTERNAL_ID_PREFIX, 3);
|
||||||
@@ -151,6 +166,13 @@ public class AssetExternalizationStepDef extends AbstractStepDef {
|
|||||||
testContext().set(TestContextKey.ASSET_EXTERNALIZATION_SALES_TRANSFER_EXTERNAL_ID_FROM_RESPONSE,
|
testContext().set(TestContextKey.ASSET_EXTERNALIZATION_SALES_TRANSFER_EXTERNAL_ID_FROM_RESPONSE,
|
||||||
response.body().getResourceExternalId());
|
response.body().getResourceExternalId());
|
||||||
testContext().set(TestContextKey.ASSET_EXTERNALIZATION_OWNER_EXTERNAL_ID, ownerExternalId);
|
testContext().set(TestContextKey.ASSET_EXTERNALIZATION_OWNER_EXTERNAL_ID, ownerExternalId);
|
||||||
|
if (transferData.get(0).equals(TRANSACTION_TYPE_INTERMEDIARY_SALE)) {
|
||||||
|
assertThat(ownerExternalId).isNotNull();
|
||||||
|
testContext().set(TestContextKey.ASSET_EXTERNALIZATION_PREVIOUS_OWNER_EXTERNAL_ID, ownerExternalId);
|
||||||
|
testContext().set(TestContextKey.ASSET_EXTERNALIZATION_INTERMEDIARY_SALE_TRANSFER_EXTERNAL_ID_FROM_RESPONSE,
|
||||||
|
response.body().getResourceExternalId());
|
||||||
|
}
|
||||||
|
|
||||||
ErrorHelper.checkSuccessfulApiCall(response);
|
ErrorHelper.checkSuccessfulApiCall(response);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -327,18 +349,50 @@ public class AssetExternalizationStepDef extends AbstractStepDef {
|
|||||||
Integer numberOfElementsActual = body.getNumberOfElements();
|
Integer numberOfElementsActual = body.getNumberOfElements();
|
||||||
List<ExternalTransferData> content = body.getContent();
|
List<ExternalTransferData> content = body.getContent();
|
||||||
|
|
||||||
String ownerExternalIdStored = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_OWNER_EXTERNAL_ID);
|
|
||||||
String transferExternalId;
|
String transferExternalId;
|
||||||
|
String ownerExternalIdStored = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_OWNER_EXTERNAL_ID);
|
||||||
|
String ownerExternalId;
|
||||||
|
String previousAssetOwner;
|
||||||
|
String intermediarySaleAssetOwner = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_PREVIOUS_OWNER_EXTERNAL_ID);
|
||||||
|
|
||||||
List<List<String>> data = table.asLists();
|
List<List<String>> data = table.asLists();
|
||||||
for (int i = 1; i < data.size(); i++) {
|
for (int i = 1; i < data.size(); i++) {
|
||||||
List<String> expectedValues = data.get(i);
|
List<String> expectedValues = data.get(i);
|
||||||
|
|
||||||
String transactionType = expectedValues.get(5);
|
String transactionType = expectedValues.get(5);
|
||||||
if (transactionType.equals(ExternalTransferData.StatusEnum.BUYBACK.getValue())) {
|
String status = expectedValues.get(2);
|
||||||
transferExternalId = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_BUYBACK_TRANSFER_EXTERNAL_ID_FROM_RESPONSE);
|
|
||||||
} else {
|
// in case transfer has no previous intermediarySale transfer
|
||||||
transferExternalId = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_SALES_TRANSFER_EXTERNAL_ID_FROM_RESPONSE);
|
if (intermediarySaleAssetOwner == null) {
|
||||||
|
if (transactionType.equalsIgnoreCase(TRANSACTION_TYPE_BUYBACK)
|
||||||
|
&& status.equals(ExternalTransferData.StatusEnum.BUYBACK.getValue())) {
|
||||||
|
previousAssetOwner = ownerExternalIdStored;
|
||||||
|
ownerExternalId = ownerExternalIdStored;
|
||||||
|
transferExternalId = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_BUYBACK_TRANSFER_EXTERNAL_ID_FROM_RESPONSE);
|
||||||
|
} else { // in case of sale or intermediarySale transfer
|
||||||
|
ownerExternalId = ownerExternalIdStored;
|
||||||
|
previousAssetOwner = null;
|
||||||
|
transferExternalId = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_SALES_TRANSFER_EXTERNAL_ID_FROM_RESPONSE);
|
||||||
|
}
|
||||||
|
} else { // in case transfer has previous intermediarySale transfer
|
||||||
|
if (transactionType.equalsIgnoreCase(TRANSACTION_TYPE_SALE)
|
||||||
|
&& (status.equals(ExternalTransferData.StatusEnum.ACTIVE.getValue())
|
||||||
|
|| status.equals(ExternalTransferData.StatusEnum.PENDING.getValue()))) {
|
||||||
|
ownerExternalId = ownerExternalIdStored;
|
||||||
|
previousAssetOwner = intermediarySaleAssetOwner;
|
||||||
|
transferExternalId = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_SALES_TRANSFER_EXTERNAL_ID_FROM_RESPONSE);
|
||||||
|
} else if (transactionType.equalsIgnoreCase(TRANSACTION_TYPE_BUYBACK)
|
||||||
|
&& (status.equals(ExternalTransferData.StatusEnum.BUYBACK.getValue())
|
||||||
|
|| status.equals(ExternalTransferData.StatusEnum.BUYBACK_INTERMEDIATE.getValue()))) {
|
||||||
|
ownerExternalId = ownerExternalIdStored;
|
||||||
|
previousAssetOwner = ownerExternalIdStored;
|
||||||
|
transferExternalId = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_BUYBACK_TRANSFER_EXTERNAL_ID_FROM_RESPONSE);
|
||||||
|
} else {
|
||||||
|
ownerExternalId = intermediarySaleAssetOwner;
|
||||||
|
previousAssetOwner = null;
|
||||||
|
transferExternalId = testContext()
|
||||||
|
.get(TestContextKey.ASSET_EXTERNALIZATION_INTERMEDIARY_SALE_TRANSFER_EXTERNAL_ID_FROM_RESPONSE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<List<String>> actualValuesList = content.stream().map(t -> {
|
List<List<String>> actualValuesList = content.stream().map(t -> {
|
||||||
@@ -375,13 +429,15 @@ public class AssetExternalizationStepDef extends AbstractStepDef {
|
|||||||
: null);
|
: null);
|
||||||
}
|
}
|
||||||
actualValues.add(t.getOwner().getExternalId() == null ? null : t.getOwner().getExternalId());
|
actualValues.add(t.getOwner().getExternalId() == null ? null : t.getOwner().getExternalId());
|
||||||
|
actualValues.add(t.getPreviousOwner() == null ? null : t.getPreviousOwner().getExternalId());
|
||||||
actualValues.add(loanId == null ? null : String.valueOf(t.getLoan().getLoanId()));
|
actualValues.add(loanId == null ? null : String.valueOf(t.getLoan().getLoanId()));
|
||||||
actualValues.add(loanExternalId == null ? null : t.getLoan().getExternalId());
|
actualValues.add(loanExternalId == null ? null : t.getLoan().getExternalId());
|
||||||
actualValues.add(t.getTransferExternalId());
|
actualValues.add(t.getTransferExternalId());
|
||||||
return actualValues;
|
return actualValues;
|
||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
|
|
||||||
expectedValues.add(ownerExternalIdStored);
|
expectedValues.add(ownerExternalId);
|
||||||
|
expectedValues.add(previousAssetOwner);
|
||||||
expectedValues.add(loanId == null ? null : String.valueOf(loanId));
|
expectedValues.add(loanId == null ? null : String.valueOf(loanId));
|
||||||
expectedValues.add(loanExternalId);
|
expectedValues.add(loanExternalId);
|
||||||
expectedValues.add(transferExternalId);
|
expectedValues.add(transferExternalId);
|
||||||
@@ -581,6 +637,29 @@ public class AssetExternalizationStepDef extends AbstractStepDef {
|
|||||||
return result.getTransferId();
|
return result.getTransferId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ExternalTransferData getLastTransferByTransferType(Long loanId, String transferType) throws IOException {
|
||||||
|
String transferExternalId;
|
||||||
|
if (transferType.equalsIgnoreCase(TRANSACTION_TYPE_BUYBACK)) {
|
||||||
|
transferExternalId = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_BUYBACK_TRANSFER_EXTERNAL_ID_FROM_RESPONSE);
|
||||||
|
} else if (transferType.equalsIgnoreCase(TRANSACTION_TYPE_SALE)) {
|
||||||
|
transferExternalId = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_SALES_TRANSFER_EXTERNAL_ID_FROM_RESPONSE);
|
||||||
|
} else if (transferType.equalsIgnoreCase(TRANSACTION_TYPE_INTERMEDIARY_SALE)) {
|
||||||
|
transferExternalId = testContext()
|
||||||
|
.get(TestContextKey.ASSET_EXTERNALIZATION_INTERMEDIARY_SALE_TRANSFER_EXTERNAL_ID_FROM_RESPONSE);
|
||||||
|
} else {
|
||||||
|
transferExternalId = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Response<PageExternalTransferData> transfersResponse = externalAssetOwnersApi.getTransfers(null, loanId, null, null, null)
|
||||||
|
.execute();
|
||||||
|
List<ExternalTransferData> content = transfersResponse.body().getContent();
|
||||||
|
ExternalTransferData result = content.stream().filter(bizEvent -> bizEvent.getTransferExternalId().equals(transferExternalId))
|
||||||
|
.toList().stream().reduce((first, second) -> second)
|
||||||
|
.orElseThrow(() -> new IllegalStateException("transfersResponse.body().getContent() is empty"));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
@Then("The asset external owner has the following OWNER Journal entries:")
|
@Then("The asset external owner has the following OWNER Journal entries:")
|
||||||
public void checkJournalEntriesOwner(DataTable table) throws IOException {
|
public void checkJournalEntriesOwner(DataTable table) throws IOException {
|
||||||
String ownerExternalId = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_OWNER_EXTERNAL_ID);
|
String ownerExternalId = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_OWNER_EXTERNAL_ID);
|
||||||
@@ -635,6 +714,48 @@ public class AssetExternalizationStepDef extends AbstractStepDef {
|
|||||||
eventCheckHelper.loanOwnershipTransferBusinessEventWithStatusCheck(loanId, transferId, transferStatus, transferStatusReason);
|
eventCheckHelper.loanOwnershipTransferBusinessEventWithStatusCheck(loanId, transferId, transferStatus, transferStatusReason);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getPreviousAssetOwner(ExternalTransferData transferData, String transferType, boolean isIntermediarySaleTransfer) {
|
||||||
|
String previousAssetOwner;
|
||||||
|
String intermediarySaleAssetOwner = testContext().get(TestContextKey.ASSET_EXTERNALIZATION_PREVIOUS_OWNER_EXTERNAL_ID);
|
||||||
|
String assetOwner = transferData.getOwner() == null ? null : transferData.getOwner().getExternalId();
|
||||||
|
|
||||||
|
if ((transferType.equalsIgnoreCase(TRANSACTION_TYPE_SALE) || transferType.equalsIgnoreCase(TRANSACTION_TYPE_BUYBACK))
|
||||||
|
&& isIntermediarySaleTransfer) {
|
||||||
|
previousAssetOwner = intermediarySaleAssetOwner;
|
||||||
|
} else if (transferType.equalsIgnoreCase(TRANSACTION_TYPE_BUYBACK)) {
|
||||||
|
previousAssetOwner = assetOwner;
|
||||||
|
} else {
|
||||||
|
// in case - transferType is sale(has no intermediarySale before) or intermediarySale
|
||||||
|
previousAssetOwner = null;
|
||||||
|
}
|
||||||
|
return previousAssetOwner;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Then("LoanOwnershipTransferBusinessEvent with transfer type: {string} and transfer asset owner is created")
|
||||||
|
public void loanOwnershipTransferBusinessEventCheck(String transferType) throws IOException {
|
||||||
|
Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
|
||||||
|
long loanId = loanResponse.body().getLoanId();
|
||||||
|
ExternalTransferData transferData = getLastTransferByTransferType(loanId, transferType);
|
||||||
|
String previousAssetOwner = getPreviousAssetOwner(transferData, transferType, false);
|
||||||
|
|
||||||
|
eventCheckHelper.loanOwnershipTransferBusinessEventWithTypeCheck(loanId, transferData, transferType, previousAssetOwner);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Then("LoanOwnershipTransferBusinessEvent with transfer type: {string} and transfer asset owner based on intermediarySale is created")
|
||||||
|
public void loanOwnershipTransferBusinessEventCheckBasedOnIntermediarySale(String transferType) throws IOException {
|
||||||
|
Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
|
||||||
|
long loanId = loanResponse.body().getLoanId();
|
||||||
|
ExternalTransferData transferData = getLastTransferByTransferType(loanId, transferType);
|
||||||
|
String previousAssetOwner = getPreviousAssetOwner(transferData, transferType, true);
|
||||||
|
|
||||||
|
eventCheckHelper.loanOwnershipTransferBusinessEventWithTypeCheck(loanId, transferData, transferType, previousAssetOwner);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Then("LoanOwnershipTransferBusinessEvent is not created on {string}")
|
||||||
|
public void loanOwnershipTransferBusinessEventIsNotRaised(String date) throws IOException {
|
||||||
|
eventAssertion.assertEventNotRaised(LoanOwnershipTransferEvent.class, em -> FORMATTER.format(em.getBusinessDate()).equals(date));
|
||||||
|
}
|
||||||
|
|
||||||
@Then("LoanAccountSnapshotBusinessEvent is created")
|
@Then("LoanAccountSnapshotBusinessEvent is created")
|
||||||
public void loanAccountSnapshotBusinessEventCheck() throws IOException {
|
public void loanAccountSnapshotBusinessEventCheck() throws IOException {
|
||||||
Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
|
Response<PostLoansResponse> loanResponse = testContext().get(TestContextKey.LOAN_CREATE_RESPONSE);
|
||||||
@@ -783,6 +904,49 @@ public class AssetExternalizationStepDef extends AbstractStepDef {
|
|||||||
ErrorHelper.checkSuccessfulApiCall(response);
|
ErrorHelper.checkSuccessfulApiCall(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private LoansApi loansApi;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private LoanProductsApi loanProductsApi;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ExternalAssetOwnerLoanProductAttributesApi externalAssetOwnerLoanProductAttributesApi;
|
||||||
|
|
||||||
|
@When("Admin set external asset owner loan product attribute {string} value {string} for loan product {string}")
|
||||||
|
public void setAExternalAssetOwnerLoanProductAttribute(String externalAssetOwnerLoanProductAttributeKey,
|
||||||
|
String externalAssetOwnerLoanProductAttributeValue, String loanProductName) throws IOException {
|
||||||
|
Response<List<GetLoanProductsResponse>> loanProducts = loanProductsApi.retrieveAllLoanProducts().execute();
|
||||||
|
long loanProductId = loanProducts.body().stream().filter(loanProduct -> loanProduct.getName().equals(loanProductName)).findFirst()
|
||||||
|
.orElseThrow(() -> new RuntimeException("No loan product is found!")).getId();
|
||||||
|
|
||||||
|
Response<PageExternalTransferLoanProductAttributesData> getExternalAssetOwnerLoanProductAttribute = externalAssetOwnerLoanProductAttributesApi
|
||||||
|
.getExternalAssetOwnerLoanProductAttributes(loanProductId, externalAssetOwnerLoanProductAttributeKey).execute();
|
||||||
|
PageExternalTransferLoanProductAttributesData getExternalAssetOwnerLoanProductAttributeBody = getExternalAssetOwnerLoanProductAttribute
|
||||||
|
.body();
|
||||||
|
|
||||||
|
if (getExternalAssetOwnerLoanProductAttributeBody.getTotalFilteredRecords() == 0) {
|
||||||
|
PostExternalAssetOwnerLoanProductAttributeRequest setLoanProductAttributeRequest = new PostExternalAssetOwnerLoanProductAttributeRequest()
|
||||||
|
.attributeKey(externalAssetOwnerLoanProductAttributeKey).attributeValue(externalAssetOwnerLoanProductAttributeValue);
|
||||||
|
Response<CommandProcessingResult> updateLoanProductAttributerEsponse = externalAssetOwnerLoanProductAttributesApi
|
||||||
|
.postExternalAssetOwnerLoanProductAttribute(loanProductId, setLoanProductAttributeRequest).execute();
|
||||||
|
ErrorHelper.checkSuccessfulApiCall(updateLoanProductAttributerEsponse);
|
||||||
|
} else {
|
||||||
|
List<ExternalTransferLoanProductAttributesData> attributes = getExternalAssetOwnerLoanProductAttributeBody.getPageItems();
|
||||||
|
assert attributes != null;
|
||||||
|
long attributeId = attributes.stream()
|
||||||
|
.filter(attribute -> attribute.getAttributeKey().equals(externalAssetOwnerLoanProductAttributeKey)).findFirst()
|
||||||
|
.orElseThrow(() -> new RuntimeException(ErrorMessageHelper
|
||||||
|
.wrongDataInExternalAssetOwnerLoanProductAttribute(externalAssetOwnerLoanProductAttributeKey, loanProductId)))
|
||||||
|
.getAttributeId();
|
||||||
|
PutExternalAssetOwnerLoanProductAttributeRequest setLoanProductAttributeRequest = new PutExternalAssetOwnerLoanProductAttributeRequest()
|
||||||
|
.attributeKey(externalAssetOwnerLoanProductAttributeKey).attributeValue(externalAssetOwnerLoanProductAttributeValue);
|
||||||
|
Response<CommandProcessingResult> updateLoanProductAttributerEsponse = externalAssetOwnerLoanProductAttributesApi
|
||||||
|
.updateLoanProductAttribute(loanProductId, attributeId, setLoanProductAttributeRequest).execute();
|
||||||
|
ErrorHelper.checkSuccessfulApiCall(updateLoanProductAttributerEsponse);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@When("Admin makes asset externalization request for type {string} by Loan ID with unique ownerExternalId, force generated transferExternalId and without change test owner with following data:")
|
@When("Admin makes asset externalization request for type {string} by Loan ID with unique ownerExternalId, force generated transferExternalId and without change test owner with following data:")
|
||||||
public void createAssetExternalizationRequestByLoanIdUserGeneratedExtIdForceTransferIdNoTestOwner(String type, DataTable table)
|
public void createAssetExternalizationRequestByLoanIdUserGeneratedExtIdForceTransferIdNoTestOwner(String type, DataTable table)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|||||||
+2
@@ -233,8 +233,10 @@ public abstract class TestContextKey {
|
|||||||
public static final String ASSET_EXTERNALIZATION_TRANSFER_EXTERNAL_ID_FROM_RESPONSE = "assetExternalizationTransferExternalIdFromResponse";
|
public static final String ASSET_EXTERNALIZATION_TRANSFER_EXTERNAL_ID_FROM_RESPONSE = "assetExternalizationTransferExternalIdFromResponse";
|
||||||
public static final String ASSET_EXTERNALIZATION_SALES_TRANSFER_EXTERNAL_ID_FROM_RESPONSE = "assetExternalizationSalesTransferExternalIdFromResponse";
|
public static final String ASSET_EXTERNALIZATION_SALES_TRANSFER_EXTERNAL_ID_FROM_RESPONSE = "assetExternalizationSalesTransferExternalIdFromResponse";
|
||||||
public static final String ASSET_EXTERNALIZATION_BUYBACK_TRANSFER_EXTERNAL_ID_FROM_RESPONSE = "assetExternalizationBuybackTransferExternalIdFromResponse";
|
public static final String ASSET_EXTERNALIZATION_BUYBACK_TRANSFER_EXTERNAL_ID_FROM_RESPONSE = "assetExternalizationBuybackTransferExternalIdFromResponse";
|
||||||
|
public static final String ASSET_EXTERNALIZATION_INTERMEDIARY_SALE_TRANSFER_EXTERNAL_ID_FROM_RESPONSE = "assetExternalizationIntermediarySaleTransferExternalIdFromResponse";
|
||||||
public static final String ASSET_EXTERNALIZATION_BUYBACK_TRANSFER_PREFIX = "assetExternalizationTransferPrefix";
|
public static final String ASSET_EXTERNALIZATION_BUYBACK_TRANSFER_PREFIX = "assetExternalizationTransferPrefix";
|
||||||
public static final String ASSET_EXTERNALIZATION_OWNER_EXTERNAL_ID = "assetExternalizationOwnerExternalId";
|
public static final String ASSET_EXTERNALIZATION_OWNER_EXTERNAL_ID = "assetExternalizationOwnerExternalId";
|
||||||
|
public static final String ASSET_EXTERNALIZATION_PREVIOUS_OWNER_EXTERNAL_ID = "assetExternalizationPreviousOwnerExternalId";
|
||||||
public static final String TRANSACTION_EVENT = "transactionEvent";
|
public static final String TRANSACTION_EVENT = "transactionEvent";
|
||||||
public static final String LOAN_WRITE_OFF_RESPONSE = "loanWriteOffResponse";
|
public static final String LOAN_WRITE_OFF_RESPONSE = "loanWriteOffResponse";
|
||||||
public static final String LOAN_DELINQUENCY_ACTION_RESPONSE = "loanDelinquencyActionResponse";
|
public static final String LOAN_DELINQUENCY_ACTION_RESPONSE = "loanDelinquencyActionResponse";
|
||||||
|
|||||||
@@ -1309,6 +1309,8 @@ Feature: Asset Externalization
|
|||||||
| 2023-05-21 | 1 | PENDING | 2023-05-01 | 2023-05-10 |
|
| 2023-05-21 | 1 | PENDING | 2023-05-01 | 2023-05-10 |
|
||||||
| 2023-05-21 | 1 | CANCELLED | 2023-05-01 | 2023-05-10 |
|
| 2023-05-21 | 1 | CANCELLED | 2023-05-01 | 2023-05-10 |
|
||||||
|
|
||||||
|
Then LoanOwnershipTransferBusinessEvent is not created on "21 May 2023"
|
||||||
|
|
||||||
@TestRailId:C2773
|
@TestRailId:C2773
|
||||||
Scenario: Verify that active SALE can not be cancelled
|
Scenario: Verify that active SALE can not be cancelled
|
||||||
When Admin sets the business date to "1 May 2023"
|
When Admin sets the business date to "1 May 2023"
|
||||||
@@ -1332,6 +1334,8 @@ Feature: Asset Externalization
|
|||||||
| 2023-05-21 | 1 | ACTIVE | 2023-05-22 | 9999-12-31 | SALE |
|
| 2023-05-21 | 1 | ACTIVE | 2023-05-22 | 9999-12-31 | SALE |
|
||||||
When Admin send "cancel" command on "SALE" transaction it will throw an error
|
When Admin send "cancel" command on "SALE" transaction it will throw an error
|
||||||
|
|
||||||
|
Then LoanOwnershipTransferBusinessEvent with transfer type: "SALE" and transfer asset owner is created
|
||||||
|
|
||||||
@TestRailId:C2774
|
@TestRailId:C2774
|
||||||
Scenario: Verify that Asset cannot be cancelled after SALE and BUYBACK is completed
|
Scenario: Verify that Asset cannot be cancelled after SALE and BUYBACK is completed
|
||||||
When Admin sets the business date to "1 May 2023"
|
When Admin sets the business date to "1 May 2023"
|
||||||
@@ -1500,6 +1504,7 @@ Feature: Asset Externalization
|
|||||||
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
| 2023-05-21 | 1 | PENDING | 2023-05-01 | 2023-05-21 | SALE |
|
| 2023-05-21 | 1 | PENDING | 2023-05-01 | 2023-05-21 | SALE |
|
||||||
| 2023-05-21 | 1 | ACTIVE | 2023-05-22 | 9999-12-31 | SALE |
|
| 2023-05-21 | 1 | ACTIVE | 2023-05-22 | 9999-12-31 | SALE |
|
||||||
|
Then LoanOwnershipTransferBusinessEvent with transfer type: "SALE" and transfer asset owner is created
|
||||||
When Admin makes asset externalization request by Loan ID with unique ownerExternalId, system-generated transferExternalId and the following data:
|
When Admin makes asset externalization request by Loan ID with unique ownerExternalId, system-generated transferExternalId and the following data:
|
||||||
| Transaction type | settlementDate | purchasePriceRatio |
|
| Transaction type | settlementDate | purchasePriceRatio |
|
||||||
| buyback | 2023-05-30 | |
|
| buyback | 2023-05-30 | |
|
||||||
@@ -1518,6 +1523,7 @@ Feature: Asset Externalization
|
|||||||
| 2023-05-21 | 1 | PENDING | 2023-05-01 | 2023-05-21 | SALE |
|
| 2023-05-21 | 1 | PENDING | 2023-05-01 | 2023-05-21 | SALE |
|
||||||
| 2023-05-21 | 1 | ACTIVE | 2023-05-22 | 2023-05-25 | SALE |
|
| 2023-05-21 | 1 | ACTIVE | 2023-05-22 | 2023-05-25 | SALE |
|
||||||
| 2023-05-30 | 1 | BUYBACK | 2023-05-22 | 2023-05-25 | BUYBACK |
|
| 2023-05-30 | 1 | BUYBACK | 2023-05-22 | 2023-05-25 | BUYBACK |
|
||||||
|
Then LoanOwnershipTransferBusinessEvent with transfer type: "BUYBACK" and transfer asset owner is created
|
||||||
|
|
||||||
@TestRailId:C2788
|
@TestRailId:C2788
|
||||||
Scenario: Verify that when a loan with PENDING BUYBACK is overpaid BUYBACK transaction can be done successfully
|
Scenario: Verify that when a loan with PENDING BUYBACK is overpaid BUYBACK transaction can be done successfully
|
||||||
@@ -1856,3 +1862,160 @@ Feature: Asset Externalization
|
|||||||
| ASSET | 112601 | Loans Receivable | 250.05 | | true |
|
| ASSET | 112601 | Loans Receivable | 250.05 | | true |
|
||||||
| LIABILITY | 145023 | Suspense/Clearing account | | 250.05 | true |
|
| LIABILITY | 145023 | Suspense/Clearing account | | 250.05 | true |
|
||||||
Given Global configuration "asset-externalization-of-non-active-loans" is enabled
|
Given Global configuration "asset-externalization-of-non-active-loans" is enabled
|
||||||
|
|
||||||
|
@TestRailId:C3991
|
||||||
|
Scenario: Verify asset externalization previous owner for intermediarySale transfer with following SALES request - UC1
|
||||||
|
When Admin set external asset owner loan product attribute "SETTLEMENT_MODEL" value "DELAYED_SETTLEMENT" for loan product "LP1_DUE_DATE"
|
||||||
|
When Admin sets the business date to "1 May 2023"
|
||||||
|
When Admin creates a client with random data
|
||||||
|
When Admin creates a fully customized loan with the following data:
|
||||||
|
| LoanProduct | submitted on date | with Principal | ANNUAL interest rate % | interest type | interest calculation period | amortization type | loanTermFrequency | loanTermFrequencyType | repaymentEvery | repaymentFrequencyType | numberOfRepayments | graceOnPrincipalPayment | graceOnInterestPayment | interest free period | Payment strategy |
|
||||||
|
| LP1_DUE_DATE | 01 May 2023 | 1000 | 0 | DECLINING_BALANCE | SAME_AS_REPAYMENT_PERIOD | EQUAL_INSTALLMENTS | 1 | MONTHS | 1 | MONTHS | 1 | 0 | 0 | 0 | PENALTIES_FEES_INTEREST_PRINCIPAL_ORDER |
|
||||||
|
And Admin successfully approves the loan on "1 May 2023" with "1000" amount and expected disbursement date on "1 May 2023"
|
||||||
|
When Admin successfully disburse the loan on "1 May 2023" with "1000" EUR transaction amount
|
||||||
|
Then Loan status will be "ACTIVE"
|
||||||
|
When Admin makes asset externalization request by Loan ID with unique ownerExternalId, system-generated transferExternalId and the following data:
|
||||||
|
| Transaction type | settlementDate | purchasePriceRatio |
|
||||||
|
| intermediarySale | 2023-05-21 | 1 |
|
||||||
|
Then Asset externalization response has the correct Loan ID, transferExternalId
|
||||||
|
Then Fetching Asset externalization details by loan id gives numberOfElements: 1 with correct ownerExternalId and the following data:
|
||||||
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
|
| 2023-05-21 | 1 | PENDING_INTERMEDIATE | 2023-05-01 | 9999-12-31 | INTERMEDIARYSALE |
|
||||||
|
When Admin sets the business date to "22 May 2023"
|
||||||
|
When Admin runs inline COB job for Loan
|
||||||
|
Then Fetching Asset externalization details by loan id gives numberOfElements: 2 with correct ownerExternalId and the following data:
|
||||||
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
|
| 2023-05-21 | 1 | PENDING_INTERMEDIATE | 2023-05-01 | 2023-05-21 | INTERMEDIARYSALE |
|
||||||
|
| 2023-05-21 | 1 | ACTIVE_INTERMEDIATE | 2023-05-22 | 9999-12-31 | INTERMEDIARYSALE |
|
||||||
|
Then LoanOwnershipTransferBusinessEvent with transfer type: "INTERMEDIARYSALE" and transfer asset owner is created
|
||||||
|
When Admin sets the business date to "14 June 2023"
|
||||||
|
When Admin makes asset externalization request by Loan ID with unique ownerExternalId, system-generated transferExternalId and the following data:
|
||||||
|
| Transaction type | settlementDate | purchasePriceRatio |
|
||||||
|
| sale | 2023-06-14 | 1 |
|
||||||
|
Then Fetching Asset externalization details by loan id gives numberOfElements: 3 with correct ownerExternalId and the following data:
|
||||||
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
|
| 2023-05-21 | 1 | PENDING_INTERMEDIATE | 2023-05-01 | 2023-05-21 | INTERMEDIARYSALE |
|
||||||
|
| 2023-05-21 | 1 | ACTIVE_INTERMEDIATE | 2023-05-22 | 9999-12-31 | INTERMEDIARYSALE |
|
||||||
|
| 2023-06-14 | 1 | PENDING | 2023-06-14 | 9999-12-31 | SALE |
|
||||||
|
When Admin sets the business date to "15 June 2023"
|
||||||
|
When Admin runs inline COB job for Loan
|
||||||
|
Then Fetching Asset externalization details by loan id gives numberOfElements: 4 with correct ownerExternalId and the following data:
|
||||||
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
|
| 2023-05-21 | 1 | PENDING_INTERMEDIATE | 2023-05-01 | 2023-05-21 | INTERMEDIARYSALE |
|
||||||
|
| 2023-05-21 | 1 | ACTIVE_INTERMEDIATE | 2023-05-22 | 2023-06-14 | INTERMEDIARYSALE |
|
||||||
|
| 2023-06-14 | 1 | PENDING | 2023-06-14 | 2023-06-14 | SALE |
|
||||||
|
| 2023-06-14 | 1 | ACTIVE | 2023-06-15 | 9999-12-31 | SALE |
|
||||||
|
Then LoanOwnershipTransferBusinessEvent with transfer type: "SALE" and transfer asset owner based on intermediarySale is created
|
||||||
|
When Admin set external asset owner loan product attribute "SETTLEMENT_MODEL" value "DEFAULT_SETTLEMENT" for loan product "LP1_DUE_DATE"
|
||||||
|
|
||||||
|
@TestRailId:C3992
|
||||||
|
Scenario: Verify asset externalization previous owner for intermediarySale transfer with following SALES and BUYBACK requests - UC2
|
||||||
|
When Admin set external asset owner loan product attribute "SETTLEMENT_MODEL" value "DELAYED_SETTLEMENT" for loan product "LP1_DUE_DATE"
|
||||||
|
When Admin sets the business date to "1 May 2023"
|
||||||
|
When Admin creates a client with random data
|
||||||
|
When Admin creates a fully customized loan with the following data:
|
||||||
|
| LoanProduct | submitted on date | with Principal | ANNUAL interest rate % | interest type | interest calculation period | amortization type | loanTermFrequency | loanTermFrequencyType | repaymentEvery | repaymentFrequencyType | numberOfRepayments | graceOnPrincipalPayment | graceOnInterestPayment | interest free period | Payment strategy |
|
||||||
|
| LP1_DUE_DATE | 01 May 2023 | 1000 | 0 | DECLINING_BALANCE | SAME_AS_REPAYMENT_PERIOD | EQUAL_INSTALLMENTS | 1 | MONTHS | 1 | MONTHS | 1 | 0 | 0 | 0 | PENALTIES_FEES_INTEREST_PRINCIPAL_ORDER |
|
||||||
|
And Admin successfully approves the loan on "1 May 2023" with "1000" amount and expected disbursement date on "1 May 2023"
|
||||||
|
When Admin successfully disburse the loan on "1 May 2023" with "1000" EUR transaction amount
|
||||||
|
Then Loan status will be "ACTIVE"
|
||||||
|
When Admin makes asset externalization request by Loan ID with unique ownerExternalId, system-generated transferExternalId and the following data:
|
||||||
|
| Transaction type | settlementDate | purchasePriceRatio |
|
||||||
|
| intermediarySale | 2023-05-21 | 1 |
|
||||||
|
Then Asset externalization response has the correct Loan ID, transferExternalId
|
||||||
|
Then Fetching Asset externalization details by loan id gives numberOfElements: 1 with correct ownerExternalId and the following data:
|
||||||
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
|
| 2023-05-21 | 1 | PENDING_INTERMEDIATE | 2023-05-01 | 9999-12-31 | INTERMEDIARYSALE |
|
||||||
|
When Admin sets the business date to "22 May 2023"
|
||||||
|
When Admin runs inline COB job for Loan
|
||||||
|
Then Fetching Asset externalization details by loan id gives numberOfElements: 2 with correct ownerExternalId and the following data:
|
||||||
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
|
| 2023-05-21 | 1 | PENDING_INTERMEDIATE | 2023-05-01 | 2023-05-21 | INTERMEDIARYSALE |
|
||||||
|
| 2023-05-21 | 1 | ACTIVE_INTERMEDIATE | 2023-05-22 | 9999-12-31 | INTERMEDIARYSALE |
|
||||||
|
Then LoanOwnershipTransferBusinessEvent with transfer type: "INTERMEDIARYSALE" and transfer asset owner is created
|
||||||
|
|
||||||
|
When Admin sets the business date to "14 June 2023"
|
||||||
|
When Admin makes asset externalization request by Loan ID with unique ownerExternalId, system-generated transferExternalId and the following data:
|
||||||
|
| Transaction type | settlementDate | purchasePriceRatio |
|
||||||
|
| sale | 2023-06-14 | 1 |
|
||||||
|
Then Fetching Asset externalization details by loan id gives numberOfElements: 3 with correct ownerExternalId and the following data:
|
||||||
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
|
| 2023-05-21 | 1 | PENDING_INTERMEDIATE | 2023-05-01 | 2023-05-21 | INTERMEDIARYSALE |
|
||||||
|
| 2023-05-21 | 1 | ACTIVE_INTERMEDIATE | 2023-05-22 | 9999-12-31 | INTERMEDIARYSALE |
|
||||||
|
| 2023-06-14 | 1 | PENDING | 2023-06-14 | 9999-12-31 | SALE |
|
||||||
|
When Admin sets the business date to "15 June 2023"
|
||||||
|
When Admin runs inline COB job for Loan
|
||||||
|
Then Fetching Asset externalization details by loan id gives numberOfElements: 4 with correct ownerExternalId and the following data:
|
||||||
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
|
| 2023-05-21 | 1 | PENDING_INTERMEDIATE | 2023-05-01 | 2023-05-21 | INTERMEDIARYSALE |
|
||||||
|
| 2023-05-21 | 1 | ACTIVE_INTERMEDIATE | 2023-05-22 | 2023-06-14 | INTERMEDIARYSALE |
|
||||||
|
| 2023-06-14 | 1 | PENDING | 2023-06-14 | 2023-06-14 | SALE |
|
||||||
|
| 2023-06-14 | 1 | ACTIVE | 2023-06-15 | 9999-12-31 | SALE |
|
||||||
|
Then LoanOwnershipTransferBusinessEvent with transfer type: "SALE" and transfer asset owner based on intermediarySale is created
|
||||||
|
|
||||||
|
When Admin makes asset externalization request by Loan ID with unique ownerExternalId, system-generated transferExternalId and the following data:
|
||||||
|
| Transaction type | settlementDate | purchasePriceRatio |
|
||||||
|
| buyback | 2023-06-16 | |
|
||||||
|
Then Fetching Asset externalization details by loan id gives numberOfElements: 5 with correct ownerExternalId and the following data:
|
||||||
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
|
| 2023-05-21 | 1 | PENDING_INTERMEDIATE | 2023-05-01 | 2023-05-21 | INTERMEDIARYSALE |
|
||||||
|
| 2023-05-21 | 1 | ACTIVE_INTERMEDIATE | 2023-05-22 | 2023-06-14 | INTERMEDIARYSALE |
|
||||||
|
| 2023-06-14 | 1 | PENDING | 2023-06-14 | 2023-06-14 | SALE |
|
||||||
|
| 2023-06-14 | 1 | ACTIVE | 2023-06-15 | 9999-12-31 | SALE |
|
||||||
|
| 2023-06-16 | 1 | BUYBACK | 2023-06-15 | 9999-12-31 | BUYBACK |
|
||||||
|
When Admin sets the business date to "17 June 2023"
|
||||||
|
When Admin runs inline COB job for Loan
|
||||||
|
Then Fetching Asset externalization details by loan id gives numberOfElements: 5 with correct ownerExternalId and the following data:
|
||||||
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
|
| 2023-05-21 | 1 | PENDING_INTERMEDIATE | 2023-05-01 | 2023-05-21 | INTERMEDIARYSALE |
|
||||||
|
| 2023-05-21 | 1 | ACTIVE_INTERMEDIATE | 2023-05-22 | 2023-06-14 | INTERMEDIARYSALE |
|
||||||
|
| 2023-06-14 | 1 | PENDING | 2023-06-14 | 2023-06-14 | SALE |
|
||||||
|
| 2023-06-14 | 1 | ACTIVE | 2023-06-15 | 2023-06-16 | SALE |
|
||||||
|
| 2023-06-16 | 1 | BUYBACK | 2023-06-15 | 2023-06-16 | BUYBACK |
|
||||||
|
Then LoanOwnershipTransferBusinessEvent with transfer type: "BUYBACK" and transfer asset owner is created
|
||||||
|
When Admin set external asset owner loan product attribute "SETTLEMENT_MODEL" value "DEFAULT_SETTLEMENT" for loan product "LP1_DUE_DATE"
|
||||||
|
|
||||||
|
@TestRailId:C3993
|
||||||
|
Scenario: Verify asset externalization previous owner for intermediarySale transfer with following BUYBACK requests - UC3
|
||||||
|
When Admin set external asset owner loan product attribute "SETTLEMENT_MODEL" value "DELAYED_SETTLEMENT" for loan product "LP1_DUE_DATE"
|
||||||
|
When Admin sets the business date to "1 May 2023"
|
||||||
|
When Admin creates a client with random data
|
||||||
|
When Admin creates a fully customized loan with the following data:
|
||||||
|
| LoanProduct | submitted on date | with Principal | ANNUAL interest rate % | interest type | interest calculation period | amortization type | loanTermFrequency | loanTermFrequencyType | repaymentEvery | repaymentFrequencyType | numberOfRepayments | graceOnPrincipalPayment | graceOnInterestPayment | interest free period | Payment strategy |
|
||||||
|
| LP1_DUE_DATE | 01 May 2023 | 1000 | 0 | DECLINING_BALANCE | SAME_AS_REPAYMENT_PERIOD | EQUAL_INSTALLMENTS | 1 | MONTHS | 1 | MONTHS | 1 | 0 | 0 | 0 | PENALTIES_FEES_INTEREST_PRINCIPAL_ORDER |
|
||||||
|
And Admin successfully approves the loan on "1 May 2023" with "1000" amount and expected disbursement date on "1 May 2023"
|
||||||
|
When Admin successfully disburse the loan on "1 May 2023" with "1000" EUR transaction amount
|
||||||
|
Then Loan status will be "ACTIVE"
|
||||||
|
When Admin makes asset externalization request by Loan ID with unique ownerExternalId, system-generated transferExternalId and the following data:
|
||||||
|
| Transaction type | settlementDate | purchasePriceRatio |
|
||||||
|
| intermediarySale | 2023-05-21 | 1 |
|
||||||
|
Then Asset externalization response has the correct Loan ID, transferExternalId
|
||||||
|
Then Fetching Asset externalization details by loan id gives numberOfElements: 1 with correct ownerExternalId and the following data:
|
||||||
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
|
| 2023-05-21 | 1 | PENDING_INTERMEDIATE | 2023-05-01 | 9999-12-31 | INTERMEDIARYSALE |
|
||||||
|
When Admin sets the business date to "22 May 2023"
|
||||||
|
When Admin runs inline COB job for Loan
|
||||||
|
Then Fetching Asset externalization details by loan id gives numberOfElements: 2 with correct ownerExternalId and the following data:
|
||||||
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
|
| 2023-05-21 | 1 | PENDING_INTERMEDIATE | 2023-05-01 | 2023-05-21 | INTERMEDIARYSALE |
|
||||||
|
| 2023-05-21 | 1 | ACTIVE_INTERMEDIATE | 2023-05-22 | 9999-12-31 | INTERMEDIARYSALE |
|
||||||
|
Then LoanOwnershipTransferBusinessEvent with transfer type: "INTERMEDIARYSALE" and transfer asset owner is created
|
||||||
|
When Admin sets the business date to "14 June 2023"
|
||||||
|
When Admin makes asset externalization request by Loan ID with unique ownerExternalId, system-generated transferExternalId and the following data:
|
||||||
|
| Transaction type | settlementDate | purchasePriceRatio |
|
||||||
|
| buyback | 2023-06-14 | |
|
||||||
|
Then Fetching Asset externalization details by loan id gives numberOfElements: 3 with correct ownerExternalId and the following data:
|
||||||
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
|
| 2023-05-21 | 1 | PENDING_INTERMEDIATE | 2023-05-01 | 2023-05-21 | INTERMEDIARYSALE |
|
||||||
|
| 2023-05-21 | 1 | ACTIVE_INTERMEDIATE | 2023-05-22 | 9999-12-31 | INTERMEDIARYSALE |
|
||||||
|
| 2023-06-14 | 1 | BUYBACK_INTERMEDIATE | 2023-06-14 | 9999-12-31 | BUYBACK |
|
||||||
|
When Admin sets the business date to "15 June 2023"
|
||||||
|
When Admin runs inline COB job for Loan
|
||||||
|
Then Fetching Asset externalization details by loan id gives numberOfElements: 3 with correct ownerExternalId and the following data:
|
||||||
|
| settlementDate | purchasePriceRatio | status | effectiveFrom | effectiveTo | Transaction type |
|
||||||
|
| 2023-05-21 | 1 | PENDING_INTERMEDIATE | 2023-05-01 | 2023-05-21 | INTERMEDIARYSALE |
|
||||||
|
| 2023-05-21 | 1 | ACTIVE_INTERMEDIATE | 2023-05-22 | 2023-06-14 | INTERMEDIARYSALE |
|
||||||
|
| 2023-06-14 | 1 | BUYBACK_INTERMEDIATE | 2023-06-14 | 2023-06-14 | BUYBACK |
|
||||||
|
Then LoanOwnershipTransferBusinessEvent with transfer type: "BUYBACK" and transfer asset owner based on intermediarySale is created
|
||||||
|
When Admin set external asset owner loan product attribute "SETTLEMENT_MODEL" value "DEFAULT_SETTLEMENT" for loan product "LP1_DUE_DATE"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user