FINERACT-1926: Add external id validation for buyback and sale
This commit is contained in:
+16
-4
@@ -78,10 +78,14 @@ public class ExternalAssetOwnersWriteServiceImpl implements ExternalAssetOwnersW
|
|||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public CommandProcessingResult saleLoanByLoanId(JsonCommand command) {
|
public CommandProcessingResult saleLoanByLoanId(JsonCommand command) {
|
||||||
|
final JsonElement json = fromApiJsonHelper.parse(command.json());
|
||||||
|
validateSaleRequestBody(command.json());
|
||||||
|
ExternalId externalId = getTransferExternalIdFromJson(json);
|
||||||
|
validateExternalId(externalId);
|
||||||
Long loanId = command.getLoanId();
|
Long loanId = command.getLoanId();
|
||||||
LoanIdAndExternalIdAndStatus loanIdAndExternalIdAndStatus = fetchLoanDetails(loanId);
|
LoanIdAndExternalIdAndStatus loanIdAndExternalIdAndStatus = fetchLoanDetails(loanId);
|
||||||
validateLoanStatus(loanIdAndExternalIdAndStatus);
|
validateLoanStatus(loanIdAndExternalIdAndStatus);
|
||||||
ExternalAssetOwnerTransfer externalAssetOwnerTransfer = createSaleTransfer(loanId, command.json(),
|
ExternalAssetOwnerTransfer externalAssetOwnerTransfer = createSaleTransfer(loanId, json,
|
||||||
loanIdAndExternalIdAndStatus.getExternalId());
|
loanIdAndExternalIdAndStatus.getExternalId());
|
||||||
validateSale(externalAssetOwnerTransfer);
|
validateSale(externalAssetOwnerTransfer);
|
||||||
externalAssetOwnerTransferRepository.saveAndFlush(externalAssetOwnerTransfer);
|
externalAssetOwnerTransferRepository.saveAndFlush(externalAssetOwnerTransfer);
|
||||||
@@ -98,12 +102,22 @@ public class ExternalAssetOwnersWriteServiceImpl implements ExternalAssetOwnersW
|
|||||||
LocalDate settlementDate = getSettlementDateFromJson(json);
|
LocalDate settlementDate = getSettlementDateFromJson(json);
|
||||||
ExternalId externalId = getTransferExternalIdFromJson(json);
|
ExternalId externalId = getTransferExternalIdFromJson(json);
|
||||||
validateSettlementDate(settlementDate);
|
validateSettlementDate(settlementDate);
|
||||||
|
validateExternalId(externalId);
|
||||||
ExternalAssetOwnerTransfer effectiveTransfer = fetchAndValidateEffectiveTransferForBuyback(loanId, settlementDate);
|
ExternalAssetOwnerTransfer effectiveTransfer = fetchAndValidateEffectiveTransferForBuyback(loanId, settlementDate);
|
||||||
ExternalAssetOwnerTransfer externalAssetOwnerTransfer = createBuybackTransfer(effectiveTransfer, settlementDate, externalId);
|
ExternalAssetOwnerTransfer externalAssetOwnerTransfer = createBuybackTransfer(effectiveTransfer, settlementDate, externalId);
|
||||||
externalAssetOwnerTransferRepository.saveAndFlush(externalAssetOwnerTransfer);
|
externalAssetOwnerTransferRepository.saveAndFlush(externalAssetOwnerTransfer);
|
||||||
return buildResponseData(externalAssetOwnerTransfer);
|
return buildResponseData(externalAssetOwnerTransfer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void validateExternalId(ExternalId externalId) {
|
||||||
|
boolean alreadyExists = externalAssetOwnerTransferRepository
|
||||||
|
.exists((root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("externalId"), externalId));
|
||||||
|
if (alreadyExists) {
|
||||||
|
throw new ExternalAssetOwnerInitiateTransferException(
|
||||||
|
String.format("Already existing an asset transfer with the provided transfer external id: %s", externalId.getValue()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void validateLoan(Long loanId) {
|
private void validateLoan(Long loanId) {
|
||||||
if (!loanRepository.existsById(loanId)) {
|
if (!loanRepository.existsById(loanId)) {
|
||||||
throw new LoanNotFoundException(loanId);
|
throw new LoanNotFoundException(loanId);
|
||||||
@@ -247,11 +261,9 @@ public class ExternalAssetOwnersWriteServiceImpl implements ExternalAssetOwnersW
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private ExternalAssetOwnerTransfer createSaleTransfer(Long loanId, String apiRequestBodyAsJson, ExternalId externalLoanId) {
|
private ExternalAssetOwnerTransfer createSaleTransfer(Long loanId, JsonElement json, ExternalId externalLoanId) {
|
||||||
ExternalAssetOwnerTransfer externalAssetOwnerTransfer = new ExternalAssetOwnerTransfer();
|
ExternalAssetOwnerTransfer externalAssetOwnerTransfer = new ExternalAssetOwnerTransfer();
|
||||||
LocalDate effectiveFrom = ThreadLocalContextUtil.getBusinessDate();
|
LocalDate effectiveFrom = ThreadLocalContextUtil.getBusinessDate();
|
||||||
validateSaleRequestBody(apiRequestBodyAsJson);
|
|
||||||
final JsonElement json = fromApiJsonHelper.parse(apiRequestBodyAsJson);
|
|
||||||
|
|
||||||
ExternalAssetOwner owner = getOwner(json);
|
ExternalAssetOwner owner = getOwner(json);
|
||||||
externalAssetOwnerTransfer.setOwner(owner);
|
externalAssetOwnerTransfer.setOwner(owner);
|
||||||
|
|||||||
+22
@@ -615,6 +615,16 @@ public class InitiateExternalAssetOwnerTransferTest {
|
|||||||
CallFailedRuntimeException exception5 = assertThrows(CallFailedRuntimeException.class,
|
CallFailedRuntimeException exception5 = assertThrows(CallFailedRuntimeException.class,
|
||||||
() -> createBuybackTransfer(-1, "2020-03-03"));
|
() -> createBuybackTransfer(-1, "2020-03-03"));
|
||||||
assertTrue(exception5.getMessage().contains("Loan with identifier -1 does not exist"));
|
assertTrue(exception5.getMessage().contains("Loan with identifier -1 does not exist"));
|
||||||
|
|
||||||
|
String externalId = UUID.randomUUID().toString();
|
||||||
|
CallFailedRuntimeException exception6 = assertThrows(CallFailedRuntimeException.class, () -> {
|
||||||
|
Integer clientID = createClient();
|
||||||
|
Integer loanID = createLoanForClient(clientID);
|
||||||
|
createSaleTransfer(loanID, "2020-03-03", externalId, "1", "1.0");
|
||||||
|
createBuybackTransfer(loanID, "2020-03-02", externalId);
|
||||||
|
});
|
||||||
|
assertTrue(exception6.getMessage()
|
||||||
|
.contains(String.format("Already existing an asset transfer with the provided transfer external id: %s", externalId)));
|
||||||
} finally {
|
} finally {
|
||||||
cleanUpAndRestoreBusinessDate();
|
cleanUpAndRestoreBusinessDate();
|
||||||
}
|
}
|
||||||
@@ -657,6 +667,14 @@ public class InitiateExternalAssetOwnerTransferTest {
|
|||||||
createSaleTransfer(loanID2, "2020-03-05");
|
createSaleTransfer(loanID2, "2020-03-05");
|
||||||
});
|
});
|
||||||
assertTrue(exception6.getMessage().contains("This loan cannot be sold, because it is owned by an external asset owner"));
|
assertTrue(exception6.getMessage().contains("This loan cannot be sold, because it is owned by an external asset owner"));
|
||||||
|
String externalId = UUID.randomUUID().toString();
|
||||||
|
CallFailedRuntimeException exception7 = assertThrows(CallFailedRuntimeException.class, () -> {
|
||||||
|
Integer loanID2 = createLoanForClient(clientID);
|
||||||
|
createSaleTransfer(loanID2, "2020-03-05", externalId, "1", "1.0");
|
||||||
|
createSaleTransfer(loanID2, "2020-03-05", externalId, "1", "1.0");
|
||||||
|
});
|
||||||
|
assertTrue(exception7.getMessage()
|
||||||
|
.contains(String.format("Already existing an asset transfer with the provided transfer external id: %s", externalId)));
|
||||||
} finally {
|
} finally {
|
||||||
cleanUpAndRestoreBusinessDate();
|
cleanUpAndRestoreBusinessDate();
|
||||||
}
|
}
|
||||||
@@ -684,6 +702,10 @@ public class InitiateExternalAssetOwnerTransferTest {
|
|||||||
|
|
||||||
private PostInitiateTransferResponse createBuybackTransfer(Integer loanID, String settlementDate) {
|
private PostInitiateTransferResponse createBuybackTransfer(Integer loanID, String settlementDate) {
|
||||||
String transferExternalId = UUID.randomUUID().toString();
|
String transferExternalId = UUID.randomUUID().toString();
|
||||||
|
return createBuybackTransfer(loanID, settlementDate, transferExternalId);
|
||||||
|
}
|
||||||
|
|
||||||
|
private PostInitiateTransferResponse createBuybackTransfer(Integer loanID, String settlementDate, String transferExternalId) {
|
||||||
PostInitiateTransferResponse saleResponse = EXTERNAL_ASSET_OWNER_HELPER.initiateTransferByLoanId(loanID.longValue(), "buyback",
|
PostInitiateTransferResponse saleResponse = EXTERNAL_ASSET_OWNER_HELPER.initiateTransferByLoanId(loanID.longValue(), "buyback",
|
||||||
new PostInitiateTransferRequest().settlementDate(settlementDate).dateFormat("yyyy-MM-dd").locale("en")
|
new PostInitiateTransferRequest().settlementDate(settlementDate).dateFormat("yyyy-MM-dd").locale("en")
|
||||||
.transferExternalId(transferExternalId));
|
.transferExternalId(transferExternalId));
|
||||||
|
|||||||
Reference in New Issue
Block a user