galovics commented on code in PR #4220:
URL: https://github.com/apache/fineract/pull/4220#discussion_r1883592418
##########
fineract-e2e-tests-core/src/test/resources/fineract-test-application.properties:
##########
@@ -23,7 +23,7 @@ fineract-test.api.password=${TEST_PASSWORD:password}
fineract-test.api.strong-password=${TEST_STRONG_PASSWORD:A1b2c3d4e5f$}
fineract-test.api.tenant-id=${TEST_TENANT_ID:default}
-fineract-test.initialization.enabled=${INITIALIZATION_ENABLED:false}
+fineract-test.initialization.enabled=${INITIALIZATION_ENABLED:true}
Review Comment:
Can you pls explain the purpose of this change?
##########
fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/helper/ErrorMessageHelper.java:
##########
@@ -348,9 +348,18 @@ public static String
wrongDataInDelinquentLastRepaymentDate(String actual, Strin
}
public static String wrongLoanStatus(Integer actual, Integer expected) {
+ return wrongLoanStatus(null, actual, expected);
+ }
+
+ public static String wrongLoanStatus(String resourceId, Integer actual,
Integer expected) {
String actualToStr = actual.toString();
String expectedToStr = expected.toString();
- return String.format("Wrong Loan status ID. Actual ID is: %s - But
expected ID is: %s", actualToStr, expectedToStr);
+ String prefx = "Wrong Loan status ID";
+ String postfx = ". Actual ID is: %s - But expected ID is: %s";
+ if (resourceId != null) {
+ return String.format(prefx + " of resource %s" + postfx,
resourceId, actualToStr, expectedToStr);
+ }
+ return String.format(prefx + postfx, actualToStr, expectedToStr);
Review Comment:
I'm not a big fan of this string joining. Why didn't we just have the 2
messages inline?
##########
fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanAccrualActivityProcessingServiceImpl.java:
##########
@@ -46,58 +51,93 @@
public class LoanAccrualActivityProcessingServiceImpl implements
LoanAccrualActivityProcessingService {
private final LoanRepositoryWrapper loanRepositoryWrapper;
- private final LoanWritePlatformService loanWritePlatformService;
private final ExternalIdFactory externalIdFactory;
private final BusinessEventNotifierService businessEventNotifierService;
- private final LoanChargeValidator loanChargeValidator;
+ private final LoanTransactionAssembler loanTransactionAssembler;
+ private final LoanAccountDomainService loanAccountDomainService;
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
- public void makeAccrualActivityTransaction(Long loanId, final LocalDate
currentDate) {
+ public void makeAccrualActivityTransaction(@NotNull Long loanId, @NotNull
LocalDate currentDate) {
Loan loan = loanRepositoryWrapper.findOneWithNotFoundDetection(loanId,
true);
makeAccrualActivityTransaction(loan, currentDate);
}
@Override
- public Loan makeAccrualActivityTransaction(Loan loan, final LocalDate
currentDate) {
- if
(loan.getLoanProductRelatedDetail().isEnableAccrualActivityPosting()) {
- // check if loan has installment due on business day
- Optional<LoanRepaymentScheduleInstallment> first =
loan.getRepaymentScheduleInstallments().stream()
- .filter(loanRepaymentScheduleInstallment ->
loanRepaymentScheduleInstallment.getDueDate().isEqual(currentDate))
- .findFirst();
- if (first.isPresent()) {
- final LoanRepaymentScheduleInstallment installment =
first.get();
- // check if there is no not-replayed-accrual-activity related
to business date
- List<LoanTransaction> loanTransactions =
loan.getLoanTransactions(loanTransaction -> loanTransaction.isNotReversed()
- && loanTransaction.isAccrualActivity() &&
loanTransaction.getTransactionDate().isEqual(currentDate));
- if (loanTransactions.isEmpty()) {
- loan =
loanWritePlatformService.makeAccrualActivityTransaction(loan, installment,
currentDate);
- }
+ public void makeAccrualActivityTransaction(@NotNull Loan loan, @NotNull
LocalDate currentDate) {
+ if
(!loan.getLoanProductRelatedDetail().isEnableAccrualActivityPosting()) {
+ return;
+ }
+ // check if loan has installment in the past or due on current date
+ List<LoanRepaymentScheduleInstallment> installments = loan
+ .getRepaymentScheduleInstallments(i -> !i.isDownPayment() &&
!DateUtils.isBefore(currentDate, i.getDueDate()));
+ for (LoanRepaymentScheduleInstallment installment : installments) {
+ LocalDate dueDate = installment.getDueDate();
+ // check if there is any not-replayed-accrual-activity related to
business date
+ ArrayList<LoanTransaction> existingActivities = new ArrayList<>(
+ loan.getLoanTransactions(t -> t.isNotReversed() &&
t.isAccrualActivity() && t.getTransactionDate().isEqual(dueDate)));
+ if (existingActivities.isEmpty()) {
+ makeAccrualActivityTransaction(loan, installment, dueDate);
+ } else {
+ LoanTransaction existingActivity = existingActivities.get(0);
+ reverseReplayAccrualActivityTransaction(loan,
existingActivity, installment, dueDate);
+ existingActivities.remove(existingActivity);
+
existingActivities.forEach(this::reverseAccrualActivityTransaction);
}
}
- return loan;
}
@Override
@Transactional
- public void processAccrualActivityForLoanClosure(Loan loan) {
+ public void processAccrualActivityForLoanClosure(@NotNull Loan loan) {
+ if
(!loan.getLoanProductRelatedDetail().isEnableAccrualActivityPosting()) {
+ return;
+ }
LocalDate date = loan.isOverPaid() ? loan.getOverpaidOnDate() :
loan.getClosedOnDate();
List<LoanTransaction> accrualActivityTransaction =
loan.getLoanTransactions().stream().filter(LoanTransaction::isNotReversed)
.filter(LoanTransaction::isAccrualActivity).filter(loanTransaction ->
loanTransaction.getDateOf().isAfter(date)).toList();
if (!accrualActivityTransaction.isEmpty()) {
accrualActivityTransaction.forEach(this::reverseAccrualActivityTransaction);
}
LoanTransaction loanTransaction =
assembleClosingAccrualActivityTransaction(loan, date);
- if (loanTransaction.getAmount().compareTo(BigDecimal.ZERO) != 0) {
- loanWritePlatformService.makeAccrualActivityTransaction(loan,
loanTransaction);
+ if (loanTransaction != null) {
+ makeAccrualActivityTransaction(loan, loanTransaction);
}
}
- private void reverseAccrualActivityTransaction(LoanTransaction
loanTransaction) {
-
loanChargeValidator.validateRepaymentTypeTransactionNotBeforeAChargeRefund(loanTransaction.getLoan(),
loanTransaction, "reversed");
- loanTransaction.reverse();
- LoanAdjustTransactionBusinessEvent.Data data = new
LoanAdjustTransactionBusinessEvent.Data(loanTransaction);
- businessEventNotifierService.notifyPostBusinessEvent(new
LoanAdjustTransactionBusinessEvent(data));
+ @Override
+ @Transactional
+ public void processAccrualActivityForLoanReopen(@NotNull Loan loan) {
Review Comment:
As far as I can tell this method existed before but now it's impossible to
verify what was changed here exactly. Can you please revert the method
reordering (same thing for others if it happened)?
if reordering makes sense, feel free to open a separate PR just for that.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]