diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/data/LoanDTO.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/data/LoanDTO.java index 60b50dc806c..e78b3f89b9f 100755 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/data/LoanDTO.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/data/LoanDTO.java @@ -18,6 +18,7 @@ */ package org.apache.fineract.accounting.journalentry.data; +import java.math.BigDecimal; import java.util.List; import lombok.AllArgsConstructor; import lombok.Getter; @@ -45,4 +46,6 @@ public class LoanDTO { private boolean markedAsChargeOff; @Setter private boolean markedAsFraud; + @Setter + private BigDecimal overpaidAmount; } diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java index fec88b4f4df..33956565a37 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccountingProcessorHelper.java @@ -110,6 +110,7 @@ public LoanDTO populateLoanDtoFromMap(final Map accountingBridge boolean isAccountTransfer = (Boolean) accountingBridgeData.get("isAccountTransfer"); boolean isLoanMarkedAsChargeOff = (Boolean) accountingBridgeData.get("isChargeOff"); boolean isLoanMarkedAsFraud = (Boolean) accountingBridgeData.get("isFraud"); + BigDecimal overpaidAmount = (BigDecimal) accountingBridgeData.get("overpaidAmount"); @SuppressWarnings("unchecked") final List> newTransactionsMap = (List>) accountingBridgeData.get("newLoanTransactions"); @@ -164,7 +165,7 @@ public LoanDTO populateLoanDtoFromMap(final Map accountingBridge } return new LoanDTO(loanId, loanProductId, officeId, currencyCode, cashBasedAccountingEnabled, upfrontAccrualBasedAccountingEnabled, - periodicAccrualBasedAccountingEnabled, newLoanTransactions, isLoanMarkedAsChargeOff, isLoanMarkedAsFraud); + periodicAccrualBasedAccountingEnabled, newLoanTransactions, isLoanMarkedAsChargeOff, isLoanMarkedAsFraud, overpaidAmount); } public SavingsDTO populateSavingsDtoFromMap(final Map accountingBridgeData, final boolean cashBasedAccountingEnabled, @@ -786,7 +787,7 @@ public Office getOfficeById(final long officeId) { return this.officeRepository.getReferenceById(officeId); } - private void createCreditJournalEntryOrReversalForLoan(final Office office, final String currencyCode, final int accountMappingTypeId, + public void createCreditJournalEntryOrReversalForLoan(final Office office, final String currencyCode, final int accountMappingTypeId, final Long loanProductId, final Long paymentTypeId, final Long loanId, final String transactionId, final LocalDate transactionDate, final BigDecimal amount, final Boolean isReversal) { final GLAccount account = getLinkedGLAccountForLoanProduct(loanProductId, accountMappingTypeId, paymentTypeId); diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccrualBasedAccountingProcessorForLoan.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccrualBasedAccountingProcessorForLoan.java index 690672d1d11..1b5c167a0a6 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccrualBasedAccountingProcessorForLoan.java +++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/AccrualBasedAccountingProcessorForLoan.java @@ -418,6 +418,7 @@ private void createJournalEntriesForChargeback(LoanDTO loanDTO, LoanTransactionD final Long loanProductId = loanDTO.getLoanProductId(); final Long loanId = loanDTO.getLoanId(); final String currencyCode = loanDTO.getCurrencyCode(); + final BigDecimal overpaidAmount = loanDTO.getOverpaidAmount(); // transaction properties final String transactionId = loanTransactionDTO.getTransactionId(); @@ -426,9 +427,24 @@ private void createJournalEntriesForChargeback(LoanDTO loanDTO, LoanTransactionD final boolean isReversal = loanTransactionDTO.isReversed(); final Long paymentTypeId = loanTransactionDTO.getPaymentTypeId(); - this.helper.createJournalEntriesAndReversalsForLoan(office, currencyCode, AccrualAccountsForLoan.LOAN_PORTFOLIO.getValue(), - AccrualAccountsForLoan.FUND_SOURCE.getValue(), loanProductId, paymentTypeId, loanId, transactionId, transactionDate, amount, - isReversal); + if (BigDecimal.ZERO.compareTo(overpaidAmount) == 0) { + helper.createJournalEntriesAndReversalsForLoan(office, currencyCode, AccrualAccountsForLoan.LOAN_PORTFOLIO.getValue(), + AccrualAccountsForLoan.FUND_SOURCE.getValue(), loanProductId, paymentTypeId, loanId, transactionId, transactionDate, + amount, isReversal); + } else if (overpaidAmount.compareTo(amount) > 0) { + helper.createJournalEntriesAndReversalsForLoan(office, currencyCode, AccrualAccountsForLoan.OVERPAYMENT.getValue(), + AccrualAccountsForLoan.FUND_SOURCE.getValue(), loanProductId, paymentTypeId, loanId, transactionId, transactionDate, + amount, isReversal); + } else { + BigDecimal diff = amount.subtract(overpaidAmount); + helper.createDebitJournalEntryOrReversalForLoan(office, currencyCode, AccrualAccountsForLoan.LOAN_PORTFOLIO.getValue(), + loanProductId, paymentTypeId, loanId, transactionId, transactionDate, diff, isReversal); + helper.createCreditJournalEntryOrReversalForLoan(office, currencyCode, AccrualAccountsForLoan.FUND_SOURCE.getValue(), + loanProductId, paymentTypeId, loanId, transactionId, transactionDate, amount, isReversal); + helper.createDebitJournalEntryOrReversalForLoan(office, currencyCode, AccrualAccountsForLoan.OVERPAYMENT.getValue(), + loanProductId, paymentTypeId, loanId, transactionId, transactionDate, overpaidAmount, isReversal); + } + } /** diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java index e56edebdf98..cf366b18cc2 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java @@ -4492,6 +4492,7 @@ public Map deriveAccountingBridgeData(final String currencyCode, accountingBridgeData.put("isAccountTransfer", isAccountTransfer); accountingBridgeData.put("isChargeOff", isChargedOff()); accountingBridgeData.put("isFraud", isFraud()); + accountingBridgeData.put("overpaidAmount", calculateTotalOverpayment().getAmount().abs()); final List> newLoanTransactions = new ArrayList<>(); for (final LoanTransaction transaction : this.loanTransactions) {