FINERACT-2081: chargeback integration tests
This commit is contained in:
+175
@@ -40,6 +40,8 @@ import java.util.concurrent.atomic.AtomicLong;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import org.apache.fineract.client.models.AdvancedPaymentData;
|
import org.apache.fineract.client.models.AdvancedPaymentData;
|
||||||
import org.apache.fineract.client.models.BusinessDateRequest;
|
import org.apache.fineract.client.models.BusinessDateRequest;
|
||||||
|
import org.apache.fineract.client.models.CreditAllocationData;
|
||||||
|
import org.apache.fineract.client.models.CreditAllocationOrder;
|
||||||
import org.apache.fineract.client.models.GetLoansLoanIdLoanChargeData;
|
import org.apache.fineract.client.models.GetLoansLoanIdLoanChargeData;
|
||||||
import org.apache.fineract.client.models.GetLoansLoanIdRepaymentPeriod;
|
import org.apache.fineract.client.models.GetLoansLoanIdRepaymentPeriod;
|
||||||
import org.apache.fineract.client.models.GetLoansLoanIdResponse;
|
import org.apache.fineract.client.models.GetLoansLoanIdResponse;
|
||||||
@@ -4106,6 +4108,179 @@ public class AdvancedPaymentAllocationLoanRepaymentScheduleTest extends BaseLoan
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testChargebackTransactionForProgressiveWithLoanAdvancedPaymentAllocationStrategyAndChargebackAllocation() {
|
||||||
|
runAt("15 January 2023", () -> {
|
||||||
|
Integer numberOfRepayments = 4;
|
||||||
|
double amount = 1000.0;
|
||||||
|
String loanDisbursementDate = "1 January 2023";
|
||||||
|
|
||||||
|
Long clientId = clientHelper.createClient(ClientHelper.defaultClientCreationRequest()).getClientId();
|
||||||
|
|
||||||
|
LOG.info("------------------------------CREATING NEW LOAN PRODUCT ---------------------------------------");
|
||||||
|
PostLoanProductsResponse loanProductResponse = loanProductHelper
|
||||||
|
.createLoanProduct(createOnePeriod30DaysLongNoInterestPeriodicAccrualProductWithAdvancedPaymentAllocation()
|
||||||
|
.addCreditAllocationItem(createChargebackAllocation())
|
||||||
|
.loanScheduleType(LoanScheduleType.PROGRESSIVE.toString()));
|
||||||
|
|
||||||
|
Long loanId = applyAndApproveLoanProgressiveAdvancedPaymentAllocationStrategyMonthlyRepayments(clientId,
|
||||||
|
loanProductResponse.getResourceId(), numberOfRepayments, loanDisbursementDate, amount);
|
||||||
|
|
||||||
|
verifyRepaymentSchedule(loanId, //
|
||||||
|
installment(1000.0, null, "01 January 2023"), //
|
||||||
|
installment(250.0, false, "01 February 2023"), //
|
||||||
|
installment(250.0, false, "01 March 2023"), //
|
||||||
|
installment(250.0, false, "01 April 2023"), //
|
||||||
|
installment(250.0, false, "01 May 2023") //
|
||||||
|
);
|
||||||
|
|
||||||
|
loanTransactionHelper.disburseLoan(loanId, new PostLoansLoanIdRequest().actualDisbursementDate("1 January 2023")
|
||||||
|
.dateFormat(DATETIME_PATTERN).transactionAmount(BigDecimal.valueOf(1000.0)).locale("en"));
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(1000.0, "Disbursement", "01 January 2023", 1000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
|
||||||
|
|
||||||
|
addCharge(loanId, true, 25, "1 January 2023");
|
||||||
|
|
||||||
|
verifyRepaymentSchedule(loanId, //
|
||||||
|
installment(1000.0, null, "01 January 2023"), //
|
||||||
|
installment(250.0, 0, 0, 25, 275.0, false, "01 February 2023", 750.0), //
|
||||||
|
installment(250.0, false, "01 March 2023"), //
|
||||||
|
installment(250.0, false, "01 April 2023"), //
|
||||||
|
installment(250.0, false, "01 May 2023") //
|
||||||
|
);
|
||||||
|
|
||||||
|
Long repayment1TransactionId = addRepaymentForLoan(loanId, 265.0, "2 January 2023");
|
||||||
|
|
||||||
|
assertNotNull(repayment1TransactionId);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(1000.0, "Disbursement", "01 January 2023", 1000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
|
||||||
|
transaction(265.0, "Repayment", "02 January 2023", 760.0, 240.0, 0.0, 0.0, 25.0, 0.0, 0.0));
|
||||||
|
|
||||||
|
verifyRepaymentSchedule(loanId, //
|
||||||
|
installment(1000.0, null, "01 January 2023"), //
|
||||||
|
installment(250.0, 0, 0, 25, 10.0, false, "01 February 2023", 750.0), //
|
||||||
|
installment(250.0, false, "01 March 2023"), //
|
||||||
|
installment(250.0, false, "01 April 2023"), //
|
||||||
|
installment(250.0, false, "01 May 2023") //
|
||||||
|
);
|
||||||
|
|
||||||
|
Long repayment2TransactionId = addRepaymentForLoan(loanId, 250.0, "3 January 2023");
|
||||||
|
|
||||||
|
assertNotNull(repayment2TransactionId);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(1000.0, "Disbursement", "01 January 2023", 1000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
|
||||||
|
transaction(265.0, "Repayment", "02 January 2023", 760.0, 240.0, 0.0, 0.0, 25.0, 0.0, 0.0),
|
||||||
|
transaction(250.0, "Repayment", "03 January 2023", 510.0, 250.0, 0.0, 0.0, 0.0, 0.0, 0.0));
|
||||||
|
|
||||||
|
verifyRepaymentSchedule(loanId, //
|
||||||
|
installment(1000.0, null, "01 January 2023"), //
|
||||||
|
installment(250.0, 0, 0, 25, 0.0, true, "01 February 2023", 750.0), //
|
||||||
|
installment(250.0, 0, 0, 0, 10.0, false, "01 March 2023", 500.0), //
|
||||||
|
installment(250.0, false, "01 April 2023"), //
|
||||||
|
installment(250.0, false, "01 May 2023") //
|
||||||
|
);
|
||||||
|
|
||||||
|
addChargebackForLoan(loanId, repayment2TransactionId, 250.0);
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(1000.0, "Disbursement", "01 January 2023", 1000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
|
||||||
|
transaction(265.0, "Repayment", "02 January 2023", 760.0, 240.0, 0.0, 0.0, 25.0, 0.0, 0.0),
|
||||||
|
transaction(250.0, "Repayment", "03 January 2023", 510.0, 250.0, 0.0, 0.0, 0.0, 0.0, 0.0),
|
||||||
|
transaction(250.0, "Chargeback", "15 January 2023", 760.0, 250.0, 0.0, 0.0, 0.0, 0.0, 0.0));
|
||||||
|
|
||||||
|
verifyRepaymentSchedule(loanId, //
|
||||||
|
installment(1000.0, null, "01 January 2023"), //
|
||||||
|
installment(500.0, 0, 0, 25, 250.0, false, "01 February 2023", 750.0), //
|
||||||
|
installment(250.0, 0, 0, 0, 10.0, false, "01 March 2023", 500.0), //
|
||||||
|
installment(250.0, false, "01 April 2023"), //
|
||||||
|
installment(250.0, false, "01 May 2023") //
|
||||||
|
);
|
||||||
|
|
||||||
|
loanTransactionHelper.reverseRepayment(Math.toIntExact(loanId), Math.toIntExact(repayment1TransactionId), "2 January 2023");
|
||||||
|
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(1000.0, "Disbursement", "01 January 2023", 1000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
|
||||||
|
transaction(265.0, "Repayment", "02 January 2023", 760.0, 240.0, 0.0, 0.0, 25.0, 0.0, 0.0, true),
|
||||||
|
transaction(250.0, "Repayment", "03 January 2023", 775.0, 225.0, 0.0, 0.0, 25.0, 0.0, 0.0),
|
||||||
|
transaction(250.0, "Chargeback", "15 January 2023", 1000.0, 225.0, 0.0, 0.0, 25.0, 0.0, 0.0));
|
||||||
|
|
||||||
|
verifyRepaymentSchedule(loanId, //
|
||||||
|
installment(1000.0, null, "01 January 2023"), //
|
||||||
|
installment(475.0, 0, 0, 50, 275.0, false, "01 February 2023", 750.0), //
|
||||||
|
installment(250.0, 0, 0, 0, 250.0, false, "01 March 2023", 500.0), //
|
||||||
|
installment(250.0, false, "01 April 2023"), //
|
||||||
|
installment(250.0, false, "01 May 2023") //
|
||||||
|
);
|
||||||
|
|
||||||
|
Long repayment3TransactionId = addRepaymentForLoan(loanId, 320.0, "1 January 2023");
|
||||||
|
|
||||||
|
assertNotNull(repayment3TransactionId);
|
||||||
|
verifyTransactions(loanId, //
|
||||||
|
transaction(1000.0, "Disbursement", "01 January 2023", 1000.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0),
|
||||||
|
transaction(265.0, "Repayment", "02 January 2023", 760.0, 240.0, 0.0, 0.0, 25.0, 0.0, 0.0, true),
|
||||||
|
transaction(250.0, "Repayment", "03 January 2023", 455.0, 250.0, 0.0, 0.0, 0, 0.0, 0.0),
|
||||||
|
transaction(250.0, "Chargeback", "15 January 2023", 705.0, 250.0, 0.0, 0.0, 0, 0.0, 0.0),
|
||||||
|
transaction(320.0, "Repayment", "01 January 2023", 705.0, 295.0, 0.0, 0.0, 25.0, 0.0, 0.0));
|
||||||
|
verifyRepaymentSchedule(loanId, //
|
||||||
|
installment(1000.0, null, "01 January 2023"), //
|
||||||
|
installment(500.0, 0, 0, 25, 250.0, false, "01 February 2023", 750.0), //
|
||||||
|
installment(250.0, 0, 0, 0, 0, true, "01 March 2023", 500.0), //
|
||||||
|
installment(250.0, 0, 0, 0, 205, false, "01 April 2023", 250.0), //
|
||||||
|
installment(250.0, false, "01 May 2023") //
|
||||||
|
);
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private Long applyAndApproveLoanProgressiveAdvancedPaymentAllocationStrategyMonthlyRepayments(Long clientId, Long loanProductId,
|
||||||
|
Integer numberOfRepayments, String loanDisbursementDate, double amount) {
|
||||||
|
LOG.info("------------------------------APPLY AND APPROVE LOAN ---------------------------------------");
|
||||||
|
PostLoansRequest applicationRequest = applyLoanRequestProgressiveAdvancedPaymentAllocationStrategyMonthlyRepayments(clientId,
|
||||||
|
loanProductId, amount, numberOfRepayments, loanDisbursementDate);
|
||||||
|
|
||||||
|
PostLoansResponse loanResponse = loanTransactionHelper.applyLoan(applicationRequest);
|
||||||
|
|
||||||
|
Long loanId = loanResponse.getLoanId();
|
||||||
|
|
||||||
|
assertNotNull(loanId);
|
||||||
|
|
||||||
|
loanTransactionHelper.approveLoan(loanId, new PostLoansLoanIdRequest().approvedLoanAmount(BigDecimal.valueOf(amount))
|
||||||
|
.dateFormat(DATETIME_PATTERN).approvedOnDate(loanDisbursementDate).locale("en"));
|
||||||
|
|
||||||
|
return loanId;
|
||||||
|
}
|
||||||
|
|
||||||
|
private PostLoansRequest applyLoanRequestProgressiveAdvancedPaymentAllocationStrategyMonthlyRepayments(Long clientId, Long loanId,
|
||||||
|
double amount, Integer numberOfRepayments, String loanDisbursementDate) {
|
||||||
|
return new PostLoansRequest().clientId(clientId).productId(loanId).submittedOnDate(loanDisbursementDate)
|
||||||
|
.expectedDisbursementDate(loanDisbursementDate).dateFormat(DATETIME_PATTERN).locale("en").loanType("individual")
|
||||||
|
.transactionProcessingStrategyCode(LoanProductTestBuilder.ADVANCED_PAYMENT_ALLOCATION_STRATEGY).amortizationType(1)
|
||||||
|
.interestRatePerPeriod(BigDecimal.ZERO).interestCalculationPeriodType(1).interestType(0)
|
||||||
|
.maxOutstandingLoanBalance(BigDecimal.valueOf(amount)).principal(BigDecimal.valueOf(amount))
|
||||||
|
.loanTermFrequencyType(RepaymentFrequencyType.MONTHS).loanTermFrequency(numberOfRepayments)
|
||||||
|
.repaymentFrequencyType(RepaymentFrequencyType.MONTHS).repaymentEvery(1).numberOfRepayments(numberOfRepayments);
|
||||||
|
}
|
||||||
|
|
||||||
|
private CreditAllocationData createChargebackAllocation() {
|
||||||
|
CreditAllocationData creditAllocationData = new CreditAllocationData();
|
||||||
|
creditAllocationData.setTransactionType("CHARGEBACK");
|
||||||
|
creditAllocationData.setCreditAllocationOrder(createCreditAllocationOrders("PENALTY", "FEE", "INTEREST", "PRINCIPAL"));
|
||||||
|
return creditAllocationData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<CreditAllocationOrder> createCreditAllocationOrders(String... allocationRule) {
|
||||||
|
AtomicInteger integer = new AtomicInteger(1);
|
||||||
|
return Arrays.stream(allocationRule).map(allocation -> {
|
||||||
|
CreditAllocationOrder creditAllocationOrder = new CreditAllocationOrder();
|
||||||
|
creditAllocationOrder.setCreditAllocationRule(allocation);
|
||||||
|
creditAllocationOrder.setOrder(integer.getAndIncrement());
|
||||||
|
return creditAllocationOrder;
|
||||||
|
}).toList();
|
||||||
|
}
|
||||||
|
|
||||||
private void createLoanForRoundingMethodValidation(boolean isHalfDown) {
|
private void createLoanForRoundingMethodValidation(boolean isHalfDown) {
|
||||||
LOG.info("------------------------------ROUNDING HALF DOWN {} ---------------------------------------", isHalfDown);
|
LOG.info("------------------------------ROUNDING HALF DOWN {} ---------------------------------------", isHalfDown);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user