diff --git a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/AccrualBasedAccountingProcessorForLoan.java b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/AccrualBasedAccountingProcessorForLoan.java index f156be428..dc88c592a 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/AccrualBasedAccountingProcessorForLoan.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/accounting/journalentry/service/AccrualBasedAccountingProcessorForLoan.java @@ -45,13 +45,14 @@ public class AccrualBasedAccountingProcessorForLoan implements AccountingProcess ***/ else if (loanTransactionDTO.getTransactionType().isRepayment() || loanTransactionDTO.getTransactionType().isRepaymentAtDisbursement()) { - createJournalEntriesForRepaymentsAndWriteOffs(loanDTO, loanTransactionDTO, office, false); + createJournalEntriesForRepaymentsAndWriteOffs(loanDTO, loanTransactionDTO, office, false, loanTransactionDTO + .getTransactionType().isRepaymentAtDisbursement()); } - /** Handle Write Offs, waivers and thier reversals **/ + /** Handle Write Offs, waivers and their reversals **/ else if ((loanTransactionDTO.getTransactionType().isWriteOff() || loanTransactionDTO.getTransactionType().isWaiveInterest() || loanTransactionDTO .getTransactionType().isWaiveCharges())) { - createJournalEntriesForRepaymentsAndWriteOffs(loanDTO, loanTransactionDTO, office, true); + createJournalEntriesForRepaymentsAndWriteOffs(loanDTO, loanTransactionDTO, office, true, false); } } } @@ -104,8 +105,8 @@ public class AccrualBasedAccountingProcessorForLoan implements AccountingProcess * Interest Repayment:Debits "Fund Source" and and Credits * "Receivable Interest"
* - * Fee Write Repayment:Debits "Fund Source" and and Credits - * "Receivable Fees"
+ * Fee Repayment:Debits "Fund Source" (or "Interest on Loans" in case + * of repayment at disbursement) and and Credits "Receivable Fees"
* * Penalty Repayment: Debits "Fund Source" and and Credits * "Receivable Penalties"
@@ -134,7 +135,7 @@ public class AccrualBasedAccountingProcessorForLoan implements AccountingProcess * */ private void createJournalEntriesForRepaymentsAndWriteOffs(final LoanDTO loanDTO, final LoanTransactionDTO loanTransactionDTO, - final Office office, final boolean writeOff) { + final Office office, final boolean writeOff, final boolean repaymentAtDisbursement) { // loan properties final Long loanProductId = loanDTO.getLoanProductId(); final Long loanId = loanDTO.getLoanId(); @@ -167,8 +168,15 @@ public class AccrualBasedAccountingProcessorForLoan implements AccountingProcess // handle fees payment of writeOff (and reversals) if (feesAmount != null && !(feesAmount.compareTo(BigDecimal.ZERO) == 0)) { totalDebitAmount = totalDebitAmount.add(feesAmount); - helper.createCreditJournalEntryOrReversalForLoan(office, ACCRUAL_ACCOUNTS_FOR_LOAN.FEES_RECEIVABLE, loanProductId, loanId, - transactionId, transactionDate, feesAmount, isReversal); + + ACCRUAL_ACCOUNTS_FOR_LOAN feeAccountToCredit = ACCRUAL_ACCOUNTS_FOR_LOAN.FEES_RECEIVABLE; + + if (repaymentAtDisbursement) { + feeAccountToCredit = ACCRUAL_ACCOUNTS_FOR_LOAN.INCOME_FROM_FEES; + } + + helper.createCreditJournalEntryOrReversalForLoan(office, feeAccountToCredit, loanProductId, loanId, transactionId, + transactionDate, feesAmount, isReversal); } // handle penalties payment of writeOff (and reversals) @@ -222,8 +230,9 @@ public class AccrualBasedAccountingProcessorForLoan implements AccountingProcess // create journal entries for the fees application (or reversal) if (feesAmount != null && !(feesAmount.compareTo(BigDecimal.ZERO) == 0)) { - helper.createAccrualBasedJournalEntriesAndReversalsForLoan(office, ACCRUAL_ACCOUNTS_FOR_LOAN.LOAN_PORTFOLIO, - ACCRUAL_ACCOUNTS_FOR_LOAN.FUND_SOURCE, loanProductId, loanId, transactionId, transactionDate, feesAmount, isReversed); + helper.createAccrualBasedJournalEntriesAndReversalsForLoan(office, ACCRUAL_ACCOUNTS_FOR_LOAN.FEES_RECEIVABLE, + ACCRUAL_ACCOUNTS_FOR_LOAN.INCOME_FROM_FEES, loanProductId, loanId, transactionId, transactionDate, feesAmount, + isReversed); } // create journal entries for the penalties application (or reversal) else if (penaltiesAmount != null && !(penaltiesAmount.compareTo(BigDecimal.ZERO) == 0)) { diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/ChangedTransactionDetail.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/ChangedTransactionDetail.java index 576fb115c..a8f6fc351 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/ChangedTransactionDetail.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/ChangedTransactionDetail.java @@ -19,16 +19,8 @@ public class ChangedTransactionDetail { return this.newTransactions; } - public void setNewTransactions(List newTransactions) { - this.newTransactions = newTransactions; - } - public List getReversedTransactions() { return this.reversedTransactions; } - public void setReversedTransactions(List reversedTransactions) { - this.reversedTransactions = reversedTransactions; - } - } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java index 72fd18df4..e32121b01 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/Loan.java @@ -418,6 +418,7 @@ public class Loan extends AbstractPersistable { for (LoanTransaction transaction : changedTransactionDetail.getNewTransactions()) { transaction.updateLoan(this); } + this.loanTransactions.addAll(changedTransactionDetail.getNewTransactions()); } else { // just reprocess the loan schedule only for now. LoanRepaymentScheduleProcessingWrapper wrapper = new LoanRepaymentScheduleProcessingWrapper(); @@ -1500,6 +1501,7 @@ public class Loan extends AbstractPersistable { for (LoanTransaction newLoanTransaction : changedTransactionDetail.getNewTransactions()) { newLoanTransaction.updateLoan(this); } + this.loanTransactions.addAll(changedTransactionDetail.getNewTransactions()); } updateLoanSummaryDerivedFields();