josehernandezfintecheandomx commented on code in PR #2633:
URL: https://github.com/apache/fineract/pull/2633#discussion_r993022702


##########
fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/transactionprocessor/AbstractLoanRepaymentScheduleTransactionProcessor.java:
##########
@@ -505,6 +507,69 @@ public boolean 
isInterestFirstRepaymentScheduleTransactionProcessor() {
         return false;
     }
 
+    @Override
+    public void handleChargeback(LoanTransaction loanTransaction, 
MonetaryCurrency currency, Money overpaidAmount,
+            List<LoanRepaymentScheduleInstallment> installments) {
+        List<LoanTransactionToRepaymentScheduleMapping> transactionMappings = 
new ArrayList<>();
+        final Comparator<LoanRepaymentScheduleInstallment> byDate = new 
Comparator<LoanRepaymentScheduleInstallment>() {
+
+            @Override
+            public int compare(LoanRepaymentScheduleInstallment ord1, 
LoanRepaymentScheduleInstallment ord2) {
+                return ord1.getDueDate().compareTo(ord2.getDueDate());
+            }
+        };
+        Collections.sort(installments, byDate);
+        final Money zeroMoney = Money.zero(currency);
+        Money transactionAmountUnprocessed = 
loanTransaction.getAmount(currency);
+        if (overpaidAmount.isGreaterThanZero()) {
+            transactionAmountUnprocessed = 
loanTransaction.getAmount(currency).minus(overpaidAmount);
+            if (transactionAmountUnprocessed.isLessThanZero()) {
+                transactionAmountUnprocessed = zeroMoney;
+            } else {
+                loanTransaction.updateOverPayments(zeroMoney);
+            }
+        }
+
+        if (transactionAmountUnprocessed.isGreaterThanZero()) {
+            final LocalDate transactionDate = 
loanTransaction.getTransactionDate();
+            boolean loanTransactionMapped = false;
+            for (final LoanRepaymentScheduleInstallment currentInstallment : 
installments) {
+                if (!currentInstallment.isAdditional() && 
currentInstallment.getDueDate().isAfter(transactionDate)) {
+                    
currentInstallment.addToCredits(transactionAmountUnprocessed.getAmount());
+                    
transactionMappings.add(LoanTransactionToRepaymentScheduleMapping.createFrom(loanTransaction,
 currentInstallment,
+                            transactionAmountUnprocessed, zeroMoney, 
zeroMoney, zeroMoney));
+
+                    loanTransactionMapped = true;
+
+                    break;
+
+                    // If already exists an additional installment just update 
the due date and
+                    // principal from the Loan charge back transaction
+                } else if (currentInstallment.isAdditional()) {
+                    currentInstallment.updateDueChargeback(transactionDate, 
transactionAmountUnprocessed);
+                    loanTransactionMapped = true;
+                    break;
+                }
+            }
+
+            // New installment will be added (N+1 scenario)
+            if (!loanTransactionMapped) {
+                Loan loan = loanTransaction.getLoan();
+                final Set<LoanInterestRecalcualtionAdditionalDetails> 
compoundingDetails = null;
+                final LoanRepaymentScheduleInstallment installment = new 
LoanRepaymentScheduleInstallment(loan, (installments.size() + 1),
+                        transactionDate, transactionDate, 
transactionAmountUnprocessed.getAmount(), zeroMoney.getAmount(),

Review Comment:
   Done!



-- 
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]

Reply via email to