Fix Loan Transaction Chargeback outstanding
This commit is contained in:
committed by
Arnold Gálovics
parent
134b6248a1
commit
ce4c1dd137
+16
@@ -164,6 +164,22 @@ final class LoanTransactionsApiResourceSwagger {
|
|||||||
public String reversalExternalId;
|
public String reversalExternalId;
|
||||||
@Schema(example = "[2012, 5, 18]")
|
@Schema(example = "[2012, 5, 18]")
|
||||||
public LocalDate reversedOnDate;
|
public LocalDate reversedOnDate;
|
||||||
|
@Schema(example = "1000.00")
|
||||||
|
public Double netDisbursalAmount;
|
||||||
|
@Schema(example = "240.00")
|
||||||
|
public Double principalPortion;
|
||||||
|
@Schema(example = "23.90")
|
||||||
|
public Double feeChargesPortion;
|
||||||
|
@Schema(example = "12.80")
|
||||||
|
public Double penaltyChargesPortion;
|
||||||
|
@Schema(example = "33.00")
|
||||||
|
public Double overpaymentPortion;
|
||||||
|
@Schema(example = "55.50")
|
||||||
|
public Double unrecognizedIncomePortion;
|
||||||
|
@Schema(example = "100.00")
|
||||||
|
public Double outstandingLoanBalance;
|
||||||
|
@Schema(example = "[2012, 5, 18]")
|
||||||
|
public LocalDate possibleNextRepaymentDate;
|
||||||
public Set<GetLoanTransactionRelation> transactionRelations;
|
public Set<GetLoanTransactionRelation> transactionRelations;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-6
@@ -5656,7 +5656,11 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom {
|
|||||||
} else if (loanTransaction.isChargeback()) {
|
} else if (loanTransaction.isChargeback()) {
|
||||||
Money transactionOutstanding = loanTransaction.getAmount(getCurrency());
|
Money transactionOutstanding = loanTransaction.getAmount(getCurrency());
|
||||||
if (!loanTransaction.getOverPaymentPortion(getCurrency()).isZero()) {
|
if (!loanTransaction.getOverPaymentPortion(getCurrency()).isZero()) {
|
||||||
transactionOutstanding = transactionOutstanding.minus(loanTransaction.getOverPaymentPortion(getCurrency()));
|
transactionOutstanding = loanTransaction.getAmount(getCurrency())
|
||||||
|
.minus(loanTransaction.getOverPaymentPortion(getCurrency()));
|
||||||
|
if (transactionOutstanding.isLessThanZero()) {
|
||||||
|
transactionOutstanding = Money.zero(getCurrency());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
outstanding = outstanding.plus(transactionOutstanding);
|
outstanding = outstanding.plus(transactionOutstanding);
|
||||||
loanTransaction.updateOutstandingLoanBalance(outstanding.getAmount());
|
loanTransaction.updateOutstandingLoanBalance(outstanding.getAmount());
|
||||||
@@ -6120,11 +6124,7 @@ public class Loan extends AbstractAuditableWithUTCDateTimeCustom {
|
|||||||
.determineProcessor(this.transactionProcessingStrategy);
|
.determineProcessor(this.transactionProcessingStrategy);
|
||||||
final Money overpaidAmount = calculateTotalOverpayment(); // Before Transaction
|
final Money overpaidAmount = calculateTotalOverpayment(); // Before Transaction
|
||||||
if (overpaidAmount.isGreaterThanZero()) {
|
if (overpaidAmount.isGreaterThanZero()) {
|
||||||
Money difference = chargebackTransaction.getAmount(getCurrency()).minus(overpaidAmount);
|
chargebackTransaction.setOverPayments(overpaidAmount);
|
||||||
if (difference.isLessThanZero()) {
|
|
||||||
difference = null;
|
|
||||||
}
|
|
||||||
chargebackTransaction.setOverPayments(difference);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chargebackTransaction.isNotZero(loanCurrency())) {
|
if (chargebackTransaction.isNotZero(loanCurrency())) {
|
||||||
|
|||||||
+1
-1
@@ -1286,7 +1286,7 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
|
|||||||
|
|
||||||
businessEventNotifierService.notifyPostBusinessEvent(new LoanChargebackTransactionBusinessEvent(loanTransaction));
|
businessEventNotifierService.notifyPostBusinessEvent(new LoanChargebackTransactionBusinessEvent(loanTransaction));
|
||||||
|
|
||||||
return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(transactionId)
|
return new CommandProcessingResultBuilder().withCommandId(command.commandId()).withEntityId(newTransaction.getId())
|
||||||
.withOfficeId(loan.getOfficeId()).withClientId(loan.getClientId()).withGroupId(loan.getGroupId()).withLoanId(loanId)
|
.withOfficeId(loan.getOfficeId()).withClientId(loan.getClientId()).withGroupId(loan.getGroupId()).withLoanId(loanId)
|
||||||
.with(changes).build();
|
.with(changes).build();
|
||||||
}
|
}
|
||||||
|
|||||||
+31
-18
@@ -97,11 +97,12 @@ public class LoanTransactionChargebackTest {
|
|||||||
assertNotNull(getLoansLoanIdResponse);
|
assertNotNull(getLoansLoanIdResponse);
|
||||||
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met");
|
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met");
|
||||||
|
|
||||||
reviewLoanTransactionRelations(loanId, transactionId, 0);
|
reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00"));
|
||||||
|
|
||||||
final Integer chargebackTransactionId = applyChargebackTransaction(loanId, transactionId, "1000.00", 0, responseSpec);
|
final Integer chargebackTransactionId = applyChargebackTransaction(loanId, transactionId, "1000.00", 0, responseSpec);
|
||||||
|
|
||||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
|
reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00"));
|
||||||
|
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("1000.00"));
|
||||||
|
|
||||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||||
assertNotNull(getLoansLoanIdResponse);
|
assertNotNull(getLoansLoanIdResponse);
|
||||||
@@ -138,10 +139,11 @@ public class LoanTransactionChargebackTest {
|
|||||||
loanId);
|
loanId);
|
||||||
assertNotNull(loanIdTransactionsResponse);
|
assertNotNull(loanIdTransactionsResponse);
|
||||||
final Integer transactionId = loanIdTransactionsResponse.getResourceId();
|
final Integer transactionId = loanIdTransactionsResponse.getResourceId();
|
||||||
reviewLoanTransactionRelations(loanId, transactionId, 0);
|
reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("666.67"));
|
||||||
|
|
||||||
final Integer chargebackTransactionId = applyChargebackTransaction(loanId, transactionId, amount.toString(), 0, responseSpec);
|
final Integer chargebackTransactionId = applyChargebackTransaction(loanId, transactionId, amount.toString(), 0, responseSpec);
|
||||||
reviewLoanTransactionRelations(loanId, transactionId, 1);
|
reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("666.67"));
|
||||||
|
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("1000.00"));
|
||||||
|
|
||||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||||
assertNotNull(getLoansLoanIdResponse);
|
assertNotNull(getLoansLoanIdResponse);
|
||||||
@@ -203,11 +205,12 @@ public class LoanTransactionChargebackTest {
|
|||||||
assertNotNull(getLoansLoanIdResponse);
|
assertNotNull(getLoansLoanIdResponse);
|
||||||
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met");
|
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met");
|
||||||
|
|
||||||
reviewLoanTransactionRelations(loanId, transactionId, 0);
|
reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00"));
|
||||||
|
|
||||||
Integer chargebackTransactionId = applyChargebackTransaction(loanId, transactionId, "500.00", 0, responseSpec);
|
Integer chargebackTransactionId = applyChargebackTransaction(loanId, transactionId, "500.00", 0, responseSpec);
|
||||||
|
|
||||||
reviewLoanTransactionRelations(loanId, transactionId, 1);
|
reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00"));
|
||||||
|
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("500.00"));
|
||||||
|
|
||||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||||
assertNotNull(getLoansLoanIdResponse);
|
assertNotNull(getLoansLoanIdResponse);
|
||||||
@@ -231,7 +234,8 @@ public class LoanTransactionChargebackTest {
|
|||||||
|
|
||||||
chargebackTransactionId = applyChargebackTransaction(loanId, transactionId, "300.00", 0, responseSpec);
|
chargebackTransactionId = applyChargebackTransaction(loanId, transactionId, "300.00", 0, responseSpec);
|
||||||
|
|
||||||
reviewLoanTransactionRelations(loanId, transactionId, 2);
|
reviewLoanTransactionRelations(loanId, transactionId, 2, Double.valueOf("0.00"));
|
||||||
|
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("800.00"));
|
||||||
|
|
||||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||||
assertNotNull(getLoansLoanIdResponse);
|
assertNotNull(getLoansLoanIdResponse);
|
||||||
@@ -274,11 +278,12 @@ public class LoanTransactionChargebackTest {
|
|||||||
assertNotNull(getLoansLoanIdResponse);
|
assertNotNull(getLoansLoanIdResponse);
|
||||||
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.overpaid");
|
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.overpaid");
|
||||||
|
|
||||||
reviewLoanTransactionRelations(loanId, transactionId, 0);
|
reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00"));
|
||||||
|
|
||||||
final Integer chargebackTransactionId = applyChargebackTransaction(loanId, transactionId, "200.00", 0, responseSpec);
|
final Integer chargebackTransactionId = applyChargebackTransaction(loanId, transactionId, "200.00", 0, responseSpec);
|
||||||
|
|
||||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
|
reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00"));
|
||||||
|
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("100.00"));
|
||||||
|
|
||||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||||
assertNotNull(getLoansLoanIdResponse);
|
assertNotNull(getLoansLoanIdResponse);
|
||||||
@@ -307,11 +312,12 @@ public class LoanTransactionChargebackTest {
|
|||||||
assertNotNull(getLoansLoanIdResponse);
|
assertNotNull(getLoansLoanIdResponse);
|
||||||
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.overpaid");
|
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.overpaid");
|
||||||
|
|
||||||
reviewLoanTransactionRelations(loanId, transactionId, 0);
|
reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00"));
|
||||||
|
|
||||||
final Integer chargebackTransactionId = applyChargebackTransaction(loanId, transactionId, "100.00", 0, responseSpec);
|
final Integer chargebackTransactionId = applyChargebackTransaction(loanId, transactionId, "100.00", 0, responseSpec);
|
||||||
|
|
||||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
|
reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00"));
|
||||||
|
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("0.00"));
|
||||||
|
|
||||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||||
assertNotNull(getLoansLoanIdResponse);
|
assertNotNull(getLoansLoanIdResponse);
|
||||||
@@ -340,11 +346,12 @@ public class LoanTransactionChargebackTest {
|
|||||||
assertNotNull(getLoansLoanIdResponse);
|
assertNotNull(getLoansLoanIdResponse);
|
||||||
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.overpaid");
|
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.overpaid");
|
||||||
|
|
||||||
reviewLoanTransactionRelations(loanId, transactionId, 0);
|
reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00"));
|
||||||
|
|
||||||
final Integer chargebackTransactionId = applyChargebackTransaction(loanId, transactionId, "50.00", 0, responseSpec);
|
final Integer chargebackTransactionId = applyChargebackTransaction(loanId, transactionId, "50.00", 0, responseSpec);
|
||||||
|
|
||||||
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 1);
|
reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00"));
|
||||||
|
reviewLoanTransactionRelations(loanId, chargebackTransactionId, 0, Double.valueOf("0.00"));
|
||||||
|
|
||||||
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
getLoansLoanIdResponse = loanTransactionHelper.getLoan(requestSpec, responseSpec, loanId);
|
||||||
assertNotNull(getLoansLoanIdResponse);
|
assertNotNull(getLoansLoanIdResponse);
|
||||||
@@ -374,7 +381,7 @@ public class LoanTransactionChargebackTest {
|
|||||||
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met");
|
loanTransactionHelper.validateLoanStatus(getLoansLoanIdResponse, "loanStatusType.closed.obligations.met");
|
||||||
|
|
||||||
// First round, empty array
|
// First round, empty array
|
||||||
reviewLoanTransactionRelations(loanId, transactionId, 0);
|
reviewLoanTransactionRelations(loanId, transactionId, 0, Double.valueOf("0.00"));
|
||||||
|
|
||||||
applyChargebackTransaction(loanId, transactionId, "200.00", 0, responseSpec);
|
applyChargebackTransaction(loanId, transactionId, "200.00", 0, responseSpec);
|
||||||
|
|
||||||
@@ -384,7 +391,7 @@ public class LoanTransactionChargebackTest {
|
|||||||
evaluateLoanSummaryAdjustments(getLoansLoanIdResponse, Double.valueOf("200.00"));
|
evaluateLoanSummaryAdjustments(getLoansLoanIdResponse, Double.valueOf("200.00"));
|
||||||
|
|
||||||
// Second round, array size equal to 1
|
// Second round, array size equal to 1
|
||||||
reviewLoanTransactionRelations(loanId, transactionId, 1);
|
reviewLoanTransactionRelations(loanId, transactionId, 1, Double.valueOf("0.00"));
|
||||||
|
|
||||||
applyChargebackTransaction(loanId, transactionId, "300.00", 1, responseSpec);
|
applyChargebackTransaction(loanId, transactionId, "300.00", 1, responseSpec);
|
||||||
|
|
||||||
@@ -394,7 +401,7 @@ public class LoanTransactionChargebackTest {
|
|||||||
evaluateLoanSummaryAdjustments(getLoansLoanIdResponse, Double.valueOf("500.00"));
|
evaluateLoanSummaryAdjustments(getLoansLoanIdResponse, Double.valueOf("500.00"));
|
||||||
|
|
||||||
// Third round, array size equal to 2
|
// Third round, array size equal to 2
|
||||||
reviewLoanTransactionRelations(loanId, transactionId, 2);
|
reviewLoanTransactionRelations(loanId, transactionId, 2, Double.valueOf("0.00"));
|
||||||
|
|
||||||
applyChargebackTransaction(loanId, transactionId, "500.00", 0, responseSpec);
|
applyChargebackTransaction(loanId, transactionId, "500.00", 0, responseSpec);
|
||||||
|
|
||||||
@@ -465,13 +472,19 @@ public class LoanTransactionChargebackTest {
|
|||||||
return postLoansTransactionCommandResponse.getResourceId();
|
return postLoansTransactionCommandResponse.getResourceId();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void reviewLoanTransactionRelations(final Integer loanId, final Integer transactionId, final Integer expectedSize) {
|
private void reviewLoanTransactionRelations(final Integer loanId, final Integer transactionId, final Integer expectedSize,
|
||||||
|
final Double outstandingBalance) {
|
||||||
|
log.info("Loan Transaction Id: {} {}", loanId, transactionId);
|
||||||
|
|
||||||
GetLoansLoanIdTransactionsTransactionIdResponse getLoansTransactionResponse = loanTransactionHelper.getLoanTransaction(loanId,
|
GetLoansLoanIdTransactionsTransactionIdResponse getLoansTransactionResponse = loanTransactionHelper.getLoanTransaction(loanId,
|
||||||
transactionId);
|
transactionId);
|
||||||
|
log.info("Loan with {} Chargeback Transactions and balance {}", getLoansTransactionResponse.getTransactionRelations().size(),
|
||||||
|
getLoansTransactionResponse.getOutstandingLoanBalance());
|
||||||
assertNotNull(getLoansTransactionResponse);
|
assertNotNull(getLoansTransactionResponse);
|
||||||
assertNotNull(getLoansTransactionResponse.getTransactionRelations());
|
assertNotNull(getLoansTransactionResponse.getTransactionRelations());
|
||||||
assertEquals(expectedSize, getLoansTransactionResponse.getTransactionRelations().size());
|
assertEquals(expectedSize, getLoansTransactionResponse.getTransactionRelations().size());
|
||||||
log.info("Loan with {} Chargeback Transactions", getLoansTransactionResponse.getTransactionRelations().size());
|
// Outstanding amount
|
||||||
|
assertEquals(outstandingBalance, getLoansTransactionResponse.getOutstandingLoanBalance());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void evaluateLoanSummaryAdjustments(GetLoansLoanIdResponse getLoansLoanIdResponse, Double amountExpected) {
|
private void evaluateLoanSummaryAdjustments(GetLoansLoanIdResponse getLoansLoanIdResponse, Double amountExpected) {
|
||||||
|
|||||||
Reference in New Issue
Block a user