FINERACT-1926: Fix sale error handling

This commit is contained in:
Adam Saghy
2023-06-07 22:09:46 +02:00
parent af062d1ac5
commit 2e534d7ba5
@@ -78,7 +78,6 @@ 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());
Long loanId = command.getLoanId(); Long loanId = command.getLoanId();
LoanIdAndExternalIdAndStatus loanIdAndExternalIdAndStatus = fetchLoanDetails(loanId); LoanIdAndExternalIdAndStatus loanIdAndExternalIdAndStatus = fetchLoanDetails(loanId);
validateLoanStatus(loanIdAndExternalIdAndStatus); validateLoanStatus(loanIdAndExternalIdAndStatus);
@@ -107,8 +106,19 @@ public class ExternalAssetOwnersWriteServiceImpl implements ExternalAssetOwnersW
List<ExternalAssetOwnerTransfer> effectiveTransfers = externalAssetOwnerTransferRepository List<ExternalAssetOwnerTransfer> effectiveTransfers = externalAssetOwnerTransferRepository
.findEffectiveTransfers(externalAssetOwnerTransfer.getLoanId(), externalAssetOwnerTransfer.getSettlementDate()); .findEffectiveTransfers(externalAssetOwnerTransfer.getLoanId(), externalAssetOwnerTransfer.getSettlementDate());
if (effectiveTransfers.size() > 0) { if (effectiveTransfers.size() == 2) {
throw new ExternalAssetOwnerInitiateTransferException("This loan cannot be sold, there is already an in progress transfer"); throw new ExternalAssetOwnerInitiateTransferException("This loan cannot be sold, there is already an in progress transfer");
} else if (effectiveTransfers.size() == 1) {
if (ExternalTransferStatus.PENDING.equals(effectiveTransfers.get(0).getStatus())) {
throw new ExternalAssetOwnerInitiateTransferException(
"External asset owner transfer is already in PENDING state for this loan");
} else if (ExternalTransferStatus.ACTIVE.equals(effectiveTransfers.get(0).getStatus())) {
throw new ExternalAssetOwnerInitiateTransferException(
"This loan cannot be sold, because it is owned by an external asset owner");
} else {
throw new ExternalAssetOwnerInitiateTransferException(String.format(
"This loan cannot be sold, because it is incorrect state! (transferId = %s)", effectiveTransfers.get(0).getId()));
}
} }
} }
@@ -170,14 +180,11 @@ public class ExternalAssetOwnersWriteServiceImpl implements ExternalAssetOwnersW
private void validateSale(ExternalAssetOwnerTransfer externalAssetOwnerTransfer) { private void validateSale(ExternalAssetOwnerTransfer externalAssetOwnerTransfer) {
validateSettlementDate(externalAssetOwnerTransfer); validateSettlementDate(externalAssetOwnerTransfer);
validateTransferStatusForSale(externalAssetOwnerTransfer);
validateEffectiveTransferForSale(externalAssetOwnerTransfer); validateEffectiveTransferForSale(externalAssetOwnerTransfer);
} }
private void validateSettlementDate(ExternalAssetOwnerTransfer externalAssetOwnerTransfer) { private void validateSettlementDate(ExternalAssetOwnerTransfer externalAssetOwnerTransfer) {
if (externalAssetOwnerTransfer.getSettlementDate().isBefore(ThreadLocalContextUtil.getBusinessDate())) { validateSettlementDate(externalAssetOwnerTransfer.getSettlementDate());
throw new ExternalAssetOwnerInitiateTransferException("Settlement date cannot be in the past");
}
} }
private void validateSettlementDate(LocalDate settlementDate) { private void validateSettlementDate(LocalDate settlementDate) {
@@ -192,22 +199,6 @@ public class ExternalAssetOwnersWriteServiceImpl implements ExternalAssetOwnersW
} }
} }
private void validateTransferStatusForSale(ExternalAssetOwnerTransfer externalAssetOwnerTransfer) {
Optional<ExternalAssetOwnerTransfer> latestTransferOptional = externalAssetOwnerTransferRepository
.findLatestByLoanId(externalAssetOwnerTransfer.getLoanId());
if (latestTransferOptional.isPresent()) {
ExternalAssetOwnerTransfer latestTransfer = latestTransferOptional.get();
ExternalTransferStatus latestTransferStatus = latestTransfer.getStatus();
if (latestTransferStatus.equals(ExternalTransferStatus.PENDING)) {
throw new ExternalAssetOwnerInitiateTransferException(
"External asset owner transfer is already in PENDING state for this loan");
} else if (latestTransferStatus.equals(ExternalTransferStatus.ACTIVE)) {
throw new ExternalAssetOwnerInitiateTransferException(
"This loan cannot be sold, because it is owned by an external asset owner");
}
}
}
private ExternalAssetOwnerTransfer createSaleTransfer(Long loanId, String apiRequestBodyAsJson, ExternalId externalLoanId) { private ExternalAssetOwnerTransfer createSaleTransfer(Long loanId, String apiRequestBodyAsJson, ExternalId externalLoanId) {
ExternalAssetOwnerTransfer externalAssetOwnerTransfer = new ExternalAssetOwnerTransfer(); ExternalAssetOwnerTransfer externalAssetOwnerTransfer = new ExternalAssetOwnerTransfer();
LocalDate effectiveFrom = ThreadLocalContextUtil.getBusinessDate(); LocalDate effectiveFrom = ThreadLocalContextUtil.getBusinessDate();