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 f8d84c9c0..622a17b6b 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
@@ -39,14 +39,9 @@ public class AccrualBasedAccountingProcessorForLoan implements AccountingProcess
createJournalEntriesForDisbursements(loanDTO, loanTransactionDTO, office);
}
- /*** Handle Interest Postings ***/
- if (loanTransactionDTO.getTransactionType().isApplyInterest()) {
- createJournalEntriesForInterestPostings(loanDTO, loanTransactionDTO, office);
- }
-
- /*** Handle Apply charges ***/
- else if (loanTransactionDTO.getTransactionType().isApplyCharges()) {
- createJournalEntriesForApplyCharges(loanDTO, loanTransactionDTO, office);
+ /*** Handle Accruals ***/
+ if (loanTransactionDTO.getTransactionType().isAccrual()) {
+ createJournalEntriesForAccruals(loanDTO, loanTransactionDTO, office);
}
/***
@@ -98,37 +93,6 @@ public class AccrualBasedAccountingProcessorForLoan implements AccountingProcess
}
- /**
- * Recognise the receivable interest
- * Debit "Interest Receivable" and Credit "Income from Interest"
- *
- * @param loanDTO
- * @param loanTransactionDTO
- * @param office
- */
- private void createJournalEntriesForInterestPostings(final LoanDTO loanDTO, final LoanTransactionDTO loanTransactionDTO,
- final Office office) {
-
- // loan properties
- final Long loanProductId = loanDTO.getLoanProductId();
- final Long loanId = loanDTO.getLoanId();
- final String currencyCode = loanDTO.getCurrencyCode();
-
- // transaction properties
- final String transactionId = loanTransactionDTO.getTransactionId();
- final Date transactionDate = loanTransactionDTO.getTransactionDate();
- final BigDecimal amount = loanTransactionDTO.getAmount();
- final boolean isReversed = loanTransactionDTO.isReversed();
- final Long paymentTypeId = loanTransactionDTO.getPaymentTypeId();
-
- // create journal entries for recognising interest (or reversal)
- if (amount != null && !(amount.compareTo(BigDecimal.ZERO) == 0)) {
- this.helper.createAccrualBasedJournalEntriesAndReversalsForLoan(office, currencyCode,
- ACCRUAL_ACCOUNTS_FOR_LOAN.INTEREST_RECEIVABLE, ACCRUAL_ACCOUNTS_FOR_LOAN.INTEREST_ON_LOANS, loanProductId,
- paymentTypeId, loanId, transactionId, transactionDate, amount, isReversed);
- }
- }
-
/**
*
* Handles repayments using the following posting rules
@@ -238,8 +202,8 @@ public class AccrualBasedAccountingProcessorForLoan implements AccountingProcess
}
/**
- * Create Journal Entries for application of charges (fees and payments)
- * using the following rules
+ * Recognize the receivable interest
+ * Debit "Interest Receivable" and Credit "Income from Interest"
*
* Fees: Debit Fees Receivable and credit Income from
* Fees
@@ -253,7 +217,7 @@ public class AccrualBasedAccountingProcessorForLoan implements AccountingProcess
* @param loanTransactionDTO
* @param office
*/
- private void createJournalEntriesForApplyCharges(final LoanDTO loanDTO, final LoanTransactionDTO loanTransactionDTO, final Office office) {
+ private void createJournalEntriesForAccruals(final LoanDTO loanDTO, final LoanTransactionDTO loanTransactionDTO, final Office office) {
// loan properties
final Long loanProductId = loanDTO.getLoanProductId();
@@ -263,11 +227,18 @@ public class AccrualBasedAccountingProcessorForLoan implements AccountingProcess
// transaction properties
final String transactionId = loanTransactionDTO.getTransactionId();
final Date transactionDate = loanTransactionDTO.getTransactionDate();
+ final BigDecimal interestAmount = loanTransactionDTO.getInterest();
final BigDecimal feesAmount = loanTransactionDTO.getFees();
final BigDecimal penaltiesAmount = loanTransactionDTO.getPenalties();
final boolean isReversed = loanTransactionDTO.isReversed();
final Long paymentTypeId = loanTransactionDTO.getPaymentTypeId();
+ // create journal entries for recognizing interest (or reversal)
+ if (interestAmount != null && !(interestAmount.compareTo(BigDecimal.ZERO) == 0)) {
+ this.helper.createAccrualBasedJournalEntriesAndReversalsForLoan(office, currencyCode,
+ ACCRUAL_ACCOUNTS_FOR_LOAN.INTEREST_RECEIVABLE, ACCRUAL_ACCOUNTS_FOR_LOAN.INTEREST_ON_LOANS, loanProductId,
+ paymentTypeId, loanId, transactionId, transactionDate, interestAmount, isReversed);
+ }
// create journal entries for the fees application (or reversal)
if (feesAmount != null && !(feesAmount.compareTo(BigDecimal.ZERO) == 0)) {
this.helper.createAccrualBasedJournalEntriesAndReversalsForLoan(office, currencyCode,
@@ -275,7 +246,7 @@ public class AccrualBasedAccountingProcessorForLoan implements AccountingProcess
loanId, transactionId, transactionDate, feesAmount, isReversed);
}
// create journal entries for the penalties application (or reversal)
- else if (penaltiesAmount != null && !(penaltiesAmount.compareTo(BigDecimal.ZERO) == 0)) {
+ if (penaltiesAmount != null && !(penaltiesAmount.compareTo(BigDecimal.ZERO) == 0)) {
this.helper.createAccrualBasedJournalEntriesAndReversalsForLoan(office, currencyCode,
ACCRUAL_ACCOUNTS_FOR_LOAN.PENALTIES_RECEIVABLE, ACCRUAL_ACCOUNTS_FOR_LOAN.INCOME_FROM_PENALTIES, loanProductId,
paymentTypeId, loanId, transactionId, transactionDate, penaltiesAmount, isReversed);
diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanTransactionEnumData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanTransactionEnumData.java
index bd896b49e..9cd4b074e 100644
--- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanTransactionEnumData.java
+++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanTransactionEnumData.java
@@ -19,10 +19,9 @@ public class LoanTransactionEnumData {
private final boolean repaymentAtDisbursement;
private final boolean repayment;
private final boolean contra;
- private final boolean applyInterest;
private final boolean waiveInterest;
private final boolean waiveCharges;
- private final boolean applyCharges;
+ private final boolean accrual;
private final boolean writeOff;
private final boolean recoveryRepayment;
private final boolean initiateTransfer;
@@ -42,8 +41,7 @@ public class LoanTransactionEnumData {
this.contra = Long.valueOf(3).equals(this.id);
this.waiveInterest = Long.valueOf(4).equals(this.id);
this.waiveCharges = Long.valueOf(9).equals(this.id);
- this.applyCharges = Long.valueOf(10).equals(this.id);
- this.applyInterest = Long.valueOf(11).equals(this.id);
+ this.accrual = Long.valueOf(10).equals(this.id);
this.writeOff = Long.valueOf(6).equals(this.id);
this.recoveryRepayment = Long.valueOf(8).equals(this.id);
this.initiateTransfer = Long.valueOf(12).equals(this.id);
@@ -105,12 +103,8 @@ public class LoanTransactionEnumData {
return this.recoveryRepayment;
}
- public boolean isApplyCharges() {
- return this.applyCharges;
- }
-
- public boolean isApplyInterest() {
- return this.applyInterest;
+ public boolean isAccrual() {
+ return this.accrual;
}
public boolean isInitiateTransfer() {
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 094ffb7d2..44d5a8b80 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
@@ -555,7 +555,7 @@ public class Loan extends AbstractPersistable {
}
}
- final LoanTransaction applyLoanChargeTransaction = LoanTransaction.applyLoanCharge(this, getOffice(), chargeAmount,
+ final LoanTransaction applyLoanChargeTransaction = LoanTransaction.accrueLoanCharge(this, getOffice(), chargeAmount,
transactionDate, feeCharges, penaltyCharges);
this.loanTransactions.add(applyLoanChargeTransaction);
return applyLoanChargeTransaction;
@@ -1787,9 +1787,17 @@ public class Loan extends AbstractPersistable {
}
final Money interestApplied = Money.of(getCurrency(), this.summary.getTotalInterestCharged());
- final LoanTransaction interestAppliedTransaction = LoanTransaction.applyInterest(getOffice(), this, interestApplied,
- actualDisbursementDate);
- this.loanTransactions.add(interestAppliedTransaction);
+
+ /**
+ * Add an interest applied transaction of the interest is accrued
+ * upfront (Up front accrual)
+ **/
+
+ if (isUpfrontAccrualAccountingEnabledOnLoanProduct()) {
+ final LoanTransaction interestAppliedTransaction = LoanTransaction.accrueInterest(getOffice(), this, interestApplied,
+ actualDisbursementDate);
+ this.loanTransactions.add(interestAppliedTransaction);
+ }
// changedTransactionDetail =
// reprocessTransactionForDisbursement(changedTransactionDetail);
@@ -1990,7 +1998,13 @@ public class Loan extends AbstractPersistable {
disbursentMoney = disbursentMoney.plus(charge.amount());
}
} else {
- handleChargeAppliedTransaction(charge, disbursedOn);
+ /**
+ * create a Charge applied transaction if Upfront Accrual is
+ * enabled
+ **/
+ if (isUpfrontAccrualAccountingEnabledOnLoanProduct()) {
+ handleChargeAppliedTransaction(charge, disbursedOn);
+ }
}
}
if (disbursentMoney.isGreaterThanZero()) {
@@ -3208,8 +3222,12 @@ public class Loan extends AbstractPersistable {
return this.loanProduct.isCashBasedAccountingEnabled();
}
- private Boolean isAccrualBasedAccountingEnabledOnLoanProduct() {
- return this.loanProduct.isAccrualBasedAccountingEnabled();
+ public Boolean isUpfrontAccrualAccountingEnabledOnLoanProduct() {
+ return this.loanProduct.isUpfrontAccrualAccountingEnabled();
+ }
+
+ private Boolean isPeriodicAccrualAccountingEnabledOnLoanProduct() {
+ return this.loanProduct.isPeriodicAccrualAccountingEnabled();
}
private Long productId() {
@@ -3238,8 +3256,8 @@ public class Loan extends AbstractPersistable {
accountingBridgeData.put("currency", currencyData);
accountingBridgeData.put("calculatedInterest", this.summary.getTotalInterestCharged());
accountingBridgeData.put("cashBasedAccountingEnabled", isCashBasedAccountingEnabledOnLoanProduct());
- accountingBridgeData.put("upfrontAccrualBasedAccountingEnabled", isAccrualBasedAccountingEnabledOnLoanProduct());
- accountingBridgeData.put("periodicAccrualBasedAccountingEnabled", isAccrualBasedAccountingEnabledOnLoanProduct());
+ accountingBridgeData.put("upfrontAccrualBasedAccountingEnabled", isUpfrontAccrualAccountingEnabledOnLoanProduct());
+ accountingBridgeData.put("periodicAccrualBasedAccountingEnabled", isPeriodicAccrualAccountingEnabledOnLoanProduct());
final List