diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferSubStatus.java b/fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferSubStatus.java index 7899b49a8..76743d866 100644 --- a/fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferSubStatus.java +++ b/fineract-investor/src/main/java/org/apache/fineract/investor/data/ExternalTransferSubStatus.java @@ -19,5 +19,5 @@ package org.apache.fineract.investor.data; public enum ExternalTransferSubStatus { - BALANCE_ZERO, BALANCE_NEGATIVE, SAMEDAY_TRANSFERS, USER_REQUESTED + BALANCE_ZERO, BALANCE_NEGATIVE, SAMEDAY_TRANSFERS, USER_REQUESTED, UNSOLD } diff --git a/fineract-investor/src/main/java/org/apache/fineract/investor/service/LoanAccountOwnerTransferServiceImpl.java b/fineract-investor/src/main/java/org/apache/fineract/investor/service/LoanAccountOwnerTransferServiceImpl.java index b87625126..69aa5da5a 100644 --- a/fineract-investor/src/main/java/org/apache/fineract/investor/service/LoanAccountOwnerTransferServiceImpl.java +++ b/fineract-investor/src/main/java/org/apache/fineract/investor/service/LoanAccountOwnerTransferServiceImpl.java @@ -26,6 +26,7 @@ import static org.apache.fineract.investor.data.ExternalTransferStatus.PENDING; import static org.apache.fineract.investor.data.ExternalTransferSubStatus.BALANCE_NEGATIVE; import static org.apache.fineract.investor.data.ExternalTransferSubStatus.BALANCE_ZERO; import static org.apache.fineract.investor.data.ExternalTransferSubStatus.SAMEDAY_TRANSFERS; +import static org.apache.fineract.investor.data.ExternalTransferSubStatus.UNSOLD; import java.math.BigDecimal; import java.time.LocalDate; @@ -67,39 +68,36 @@ public class LoanAccountOwnerTransferServiceImpl implements LoanAccountOwnerTran if (transferDataList.size() == 2) { ExternalTransferSubStatus subStatus; + ExternalAssetOwnerTransfer pendingSaleTransfer = transferDataList.get(0); + ExternalAssetOwnerTransfer pendingBuybackTransfer = transferDataList.get(1); if (isSameDayTransfers(transferDataList)) { subStatus = SAMEDAY_TRANSFERS; + cancelTransfer(loan, pendingSaleTransfer, subStatus); + cancelTransfer(loan, pendingBuybackTransfer, subStatus); } else { - subStatus = isBiggerThanZero(loan.getTotalOverpaid()) ? BALANCE_NEGATIVE : BALANCE_ZERO; + declineTransfer(loan, pendingSaleTransfer); + cancelTransfer(loan, pendingBuybackTransfer, UNSOLD); } - cancelPendingSaleAndBuybackTransfer(loan, transferDataList, subStatus); } else if (transferDataList.size() == 1) { ExternalAssetOwnerTransfer transfer = transferDataList.get(0); if (PENDING.equals(transfer.getStatus())) { - declinePendingSaleTransfer(loan, transfer); + declineTransfer(loan, transfer); } else if (BUYBACK.equals(transfer.getStatus())) { executePendingBuybackTransfer(loan, transfer); } } } - private void cancelPendingSaleAndBuybackTransfer(Loan loan, List transferDataList, - ExternalTransferSubStatus subStatus) { - ExternalAssetOwnerTransfer pendingSaleTransfer = transferDataList.get(0); - updatePendingTransfer(pendingSaleTransfer); - ExternalAssetOwnerTransfer cancelledSaleTransfer = createCancelledTransfer(pendingSaleTransfer, subStatus); + private void cancelTransfer(Loan loan, ExternalAssetOwnerTransfer pendingTransfer, ExternalTransferSubStatus subStatus) { + updatePendingTransfer(pendingTransfer); + ExternalAssetOwnerTransfer cancelledTransfer = createCancelledTransfer(pendingTransfer, subStatus); - ExternalAssetOwnerTransfer pendingBuybackTransfer = transferDataList.get(1); - updatePendingTransfer(pendingBuybackTransfer); - ExternalAssetOwnerTransfer cancelledBuybackTransfer = createCancelledTransfer(pendingBuybackTransfer, subStatus); - - businessEventNotifierService.notifyPostBusinessEvent(new LoanOwnershipTransferBusinessEvent(cancelledSaleTransfer, loan)); - businessEventNotifierService.notifyPostBusinessEvent(new LoanOwnershipTransferBusinessEvent(cancelledBuybackTransfer, loan)); + businessEventNotifierService.notifyPostBusinessEvent(new LoanOwnershipTransferBusinessEvent(cancelledTransfer, loan)); } - private void declinePendingSaleTransfer(Loan loan, ExternalAssetOwnerTransfer pendingSaleTransfer) { - ExternalAssetOwnerTransfer declinedSaleTransfer = createDeclinedTransfer(pendingSaleTransfer, loan); - updatePendingTransfer(pendingSaleTransfer); + private void declineTransfer(Loan loan, ExternalAssetOwnerTransfer pendingTransfer) { + ExternalAssetOwnerTransfer declinedSaleTransfer = createDeclinedTransfer(pendingTransfer, loan); + updatePendingTransfer(pendingTransfer); businessEventNotifierService.notifyPostBusinessEvent(new LoanOwnershipTransferBusinessEvent(declinedSaleTransfer, loan)); } diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/InitiateExternalAssetOwnerTransferTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/InitiateExternalAssetOwnerTransferTest.java index bb745e5bb..646d455ce 100644 --- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/InitiateExternalAssetOwnerTransferTest.java +++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/investor/externalassetowner/InitiateExternalAssetOwnerTransferTest.java @@ -25,6 +25,7 @@ import static org.apache.fineract.client.models.ExternalTransferData.StatusEnum. 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.client.models.ExternalTransferData.SubStatusEnum.UNSOLD; 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; @@ -575,8 +576,8 @@ public class InitiateExternalAssetOwnerTransferTest { 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", UNSOLD), + ExpectedExternalTransferData.expected(DECLINED, saleTransferResponse.getResourceExternalId(), "2020-03-04", "2020-03-02", "2020-03-02", BALANCE_ZERO)); } finally { cleanUpAndRestoreBusinessDate();