Merge pull request #347 from vishwasbabu/mifosx-413
fixes for penalty and charges appropriation in Loan Repayment transactio...
This commit is contained in:
+27
-3
@@ -5,6 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.mifosplatform.portfolio.loanaccount.domain.transactionprocessor;
|
package org.mifosplatform.portfolio.loanaccount.domain.transactionprocessor;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@@ -142,15 +143,18 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen
|
|||||||
installmentIndex++;
|
installmentIndex++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Set<LoanCharge> loanFees = extractFeeCharges(charges);
|
||||||
|
Set<LoanCharge> loanPenalties = extractPenaltyCharges(charges);
|
||||||
|
|
||||||
if (loanTransaction.isNotWaiver()) {
|
if (loanTransaction.isNotWaiver()) {
|
||||||
Money feeCharges = loanTransaction.getFeeChargesPortion(currency);
|
Money feeCharges = loanTransaction.getFeeChargesPortion(currency);
|
||||||
if (feeCharges.isGreaterThanZero()) {
|
if (feeCharges.isGreaterThanZero()) {
|
||||||
updateFeeChargesPaidAmountBy(loanTransaction, feeCharges, charges);
|
updateFeeChargesPaidAmountBy(loanTransaction, feeCharges, loanFees);
|
||||||
}
|
}
|
||||||
|
|
||||||
Money penaltyCharges = loanTransaction.getPenaltyChargesPortion(currency);
|
Money penaltyCharges = loanTransaction.getPenaltyChargesPortion(currency);
|
||||||
if (penaltyCharges.isGreaterThanZero()) {
|
if (penaltyCharges.isGreaterThanZero()) {
|
||||||
updatePenaltyChargesPaidAmountBy(loanTransaction, penaltyCharges, charges);
|
updatePenaltyChargesPaidAmountBy(loanTransaction, penaltyCharges, loanPenalties);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -159,6 +163,26 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Set<LoanCharge> extractFeeCharges(Set<LoanCharge> loanCharges) {
|
||||||
|
final Set<LoanCharge> feeCharges = new HashSet<LoanCharge>();
|
||||||
|
for (LoanCharge loanCharge : loanCharges) {
|
||||||
|
if (loanCharge.isFeeCharge()) {
|
||||||
|
feeCharges.add(loanCharge);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return feeCharges;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<LoanCharge> extractPenaltyCharges(Set<LoanCharge> loanCharges) {
|
||||||
|
final Set<LoanCharge> penaltyCharges = new HashSet<LoanCharge>();
|
||||||
|
for (LoanCharge loanCharge : loanCharges) {
|
||||||
|
if (loanCharge.isPenaltyCharge()) {
|
||||||
|
penaltyCharges.add(loanCharge);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return penaltyCharges;
|
||||||
|
}
|
||||||
|
|
||||||
private void updateFeeChargesPaidAmountBy(final LoanTransaction loanTransaction, final Money feeCharges, final Set<LoanCharge> charges) {
|
private void updateFeeChargesPaidAmountBy(final LoanTransaction loanTransaction, final Money feeCharges, final Set<LoanCharge> charges) {
|
||||||
|
|
||||||
Money amountRemaining = feeCharges;
|
Money amountRemaining = feeCharges;
|
||||||
@@ -185,7 +209,7 @@ public abstract class AbstractLoanRepaymentScheduleTransactionProcessor implemen
|
|||||||
for (LoanCharge loanCharge : charges) {
|
for (LoanCharge loanCharge : charges) {
|
||||||
if (!loanCharge.isDueAtDisbursement()) {
|
if (!loanCharge.isDueAtDisbursement()) {
|
||||||
|
|
||||||
if (loanCharge.isPenaltyCharge() && amountRemaining.isGreaterThanZero()) {
|
if (loanCharge.isPenaltyCharge() && loanCharge.isNotFullyPaid() && amountRemaining.isGreaterThanZero()) {
|
||||||
final LoanCharge unpaidCharge = findEarliestUnpaidChargeFromUnOrderedSet(charges);
|
final LoanCharge unpaidCharge = findEarliestUnpaidChargeFromUnOrderedSet(charges);
|
||||||
Money amountPaidTowardsCharge = unpaidCharge.updatePaidAmountBy(amountRemaining);
|
Money amountPaidTowardsCharge = unpaidCharge.updatePaidAmountBy(amountRemaining);
|
||||||
if (!amountPaidTowardsCharge.isZero()) {
|
if (!amountPaidTowardsCharge.isZero()) {
|
||||||
|
|||||||
+1
-1
@@ -171,7 +171,7 @@ public class LoanProductsApiResource {
|
|||||||
paymentChannelToFundSourceMappings = accountMappingReadPlatformService
|
paymentChannelToFundSourceMappings = accountMappingReadPlatformService
|
||||||
.fetchPaymentTypeToFundSourceMappingsForLoanProduct(productId);
|
.fetchPaymentTypeToFundSourceMappingsForLoanProduct(productId);
|
||||||
feeToGLAccountMappings = accountMappingReadPlatformService.fetchFeeToIncomeAccountMappingsForLoanProduct(productId);
|
feeToGLAccountMappings = accountMappingReadPlatformService.fetchFeeToIncomeAccountMappingsForLoanProduct(productId);
|
||||||
penaltyToGLAccountMappings = accountMappingReadPlatformService.fetchFeeToIncomeAccountMappingsForLoanProduct(productId);
|
penaltyToGLAccountMappings = accountMappingReadPlatformService.fetchPenaltyToIncomeAccountMappingsForLoanProduct(productId);
|
||||||
loanProduct = LoanProductData.withAccountingDetails(loanProduct, accountingMappings, paymentChannelToFundSourceMappings,
|
loanProduct = LoanProductData.withAccountingDetails(loanProduct, accountingMappings, paymentChannelToFundSourceMappings,
|
||||||
feeToGLAccountMappings, penaltyToGLAccountMappings);
|
feeToGLAccountMappings, penaltyToGLAccountMappings);
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-7
@@ -516,14 +516,16 @@ public final class LoanProductDataValidator {
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
do {
|
do {
|
||||||
final JsonObject jsonObject = paymentChannelMappingArray.get(i).getAsJsonObject();
|
final JsonObject jsonObject = paymentChannelMappingArray.get(i).getAsJsonObject();
|
||||||
final Long paymentTypeId = jsonObject.get(LOAN_PRODUCT_ACCOUNTING_PARAMS.PAYMENT_TYPE.getValue()).getAsLong();
|
final Long paymentTypeId = fromApiJsonHelper.extractLongNamed(LOAN_PRODUCT_ACCOUNTING_PARAMS.PAYMENT_TYPE.getValue(),
|
||||||
final Long paymentSpecificFundAccountId = jsonObject.get(LOAN_PRODUCT_ACCOUNTING_PARAMS.FUND_SOURCE.getValue())
|
jsonObject);
|
||||||
.getAsLong();
|
final Long paymentSpecificFundAccountId = fromApiJsonHelper.extractLongNamed(
|
||||||
|
LOAN_PRODUCT_ACCOUNTING_PARAMS.FUND_SOURCE.getValue(), jsonObject);
|
||||||
|
|
||||||
baseDataValidator
|
baseDataValidator
|
||||||
.reset()
|
.reset()
|
||||||
.parameter(
|
.parameter(
|
||||||
LOAN_PRODUCT_ACCOUNTING_PARAMS.PAYMENT_CHANNEL_FUND_SOURCE_MAPPING.getValue() + "[" + i + "]."
|
LOAN_PRODUCT_ACCOUNTING_PARAMS.PAYMENT_CHANNEL_FUND_SOURCE_MAPPING.getValue() + "[" + i + "]."
|
||||||
+ LOAN_PRODUCT_ACCOUNTING_PARAMS.PAYMENT_TYPE.toString()).value(paymentTypeId).notNull()
|
+ LOAN_PRODUCT_ACCOUNTING_PARAMS.PAYMENT_TYPE.getValue()).value(paymentTypeId).notNull()
|
||||||
.integerGreaterThanZero();
|
.integerGreaterThanZero();
|
||||||
baseDataValidator
|
baseDataValidator
|
||||||
.reset()
|
.reset()
|
||||||
@@ -558,10 +560,12 @@ public final class LoanProductDataValidator {
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
do {
|
do {
|
||||||
final JsonObject jsonObject = chargeToIncomeAccountMappingArray.get(i).getAsJsonObject();
|
final JsonObject jsonObject = chargeToIncomeAccountMappingArray.get(i).getAsJsonObject();
|
||||||
final Long chargeId = jsonObject.get(LOAN_PRODUCT_ACCOUNTING_PARAMS.CHARGE_ID.getValue()).getAsLong();
|
final Long chargeId = fromApiJsonHelper.extractLongNamed(LOAN_PRODUCT_ACCOUNTING_PARAMS.CHARGE_ID.getValue(),
|
||||||
final Long incomeAccountId = jsonObject.get(LOAN_PRODUCT_ACCOUNTING_PARAMS.INCOME_ACCOUNT_ID.getValue()).getAsLong();
|
jsonObject);
|
||||||
|
final Long incomeAccountId = fromApiJsonHelper.extractLongNamed(
|
||||||
|
LOAN_PRODUCT_ACCOUNTING_PARAMS.INCOME_ACCOUNT_ID.getValue(), jsonObject);
|
||||||
baseDataValidator.reset()
|
baseDataValidator.reset()
|
||||||
.parameter(parameterName + "[" + i + "]." + LOAN_PRODUCT_ACCOUNTING_PARAMS.CHARGE_ID.toString())
|
.parameter(parameterName + "[" + i + "]." + LOAN_PRODUCT_ACCOUNTING_PARAMS.CHARGE_ID.getValue())
|
||||||
.value(chargeId).notNull().integerGreaterThanZero();
|
.value(chargeId).notNull().integerGreaterThanZero();
|
||||||
baseDataValidator.reset()
|
baseDataValidator.reset()
|
||||||
.parameter(parameterName + "[" + i + "]." + LOAN_PRODUCT_ACCOUNTING_PARAMS.INCOME_ACCOUNT_ID.getValue())
|
.parameter(parameterName + "[" + i + "]." + LOAN_PRODUCT_ACCOUNTING_PARAMS.INCOME_ACCOUNT_ID.getValue())
|
||||||
|
|||||||
Reference in New Issue
Block a user