From 906beef7df85cfa49ef2f7aa60d09fd64ec9c4c7 Mon Sep 17 00:00:00 2001 From: Pramod Nuthakki Date: Wed, 6 Nov 2013 15:33:11 +0530 Subject: [PATCH] added loan charge update for installment fees --- ...mn_for_actual_fee_amount_or_percentage.sql | 2 ++ .../LoanChargeCannotBeUpdatedException.java | 9 ++--- .../loanaccount/data/LoanChargeData.java | 33 +++++++++++-------- .../portfolio/loanaccount/domain/Loan.java | 6 +--- .../loanaccount/domain/LoanCharge.java | 11 +++++-- .../LoanChargeReadPlatformServiceImpl.java | 4 ++- ...WritePlatformServiceJpaRepositoryImpl.java | 5 --- 7 files changed, 37 insertions(+), 33 deletions(-) create mode 100755 mifosng-db/migrations/core_db/V125__added_column_for_actual_fee_amount_or_percentage.sql diff --git a/mifosng-db/migrations/core_db/V125__added_column_for_actual_fee_amount_or_percentage.sql b/mifosng-db/migrations/core_db/V125__added_column_for_actual_fee_amount_or_percentage.sql new file mode 100755 index 000000000..400c6580e --- /dev/null +++ b/mifosng-db/migrations/core_db/V125__added_column_for_actual_fee_amount_or_percentage.sql @@ -0,0 +1,2 @@ +ALTER TABLE `m_loan_charge` + ADD COLUMN `charge_amount_or_percentage` DECIMAL(19,6) NULL DEFAULT NULL AFTER `calculation_on_amount`; \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/exception/LoanChargeCannotBeUpdatedException.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/exception/LoanChargeCannotBeUpdatedException.java index dbd5e97e4..9496410cc 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/exception/LoanChargeCannotBeUpdatedException.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/charge/exception/LoanChargeCannotBeUpdatedException.java @@ -11,7 +11,7 @@ public class LoanChargeCannotBeUpdatedException extends AbstractPlatformDomainRu /*** enum of reasons of why Loan Charge cannot be waived **/ public static enum LOAN_CHARGE_CANNOT_BE_UPDATED_REASON { - ALREADY_PAID, ALREADY_WAIVED, LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE,CHARGE_INSTALLMENT_FEE; + ALREADY_PAID, ALREADY_WAIVED, LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE; public String errorMessage() { if (name().toString().equalsIgnoreCase("ALREADY_PAID")) { @@ -20,10 +20,7 @@ public class LoanChargeCannotBeUpdatedException extends AbstractPlatformDomainRu return "This loan charge has already been waived"; } else if (name().toString().equalsIgnoreCase("LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE")) { return "This charge cannot be updated as the loan it is associated with is not in submitted and pending approval stage"; - } else if(name().toString().equalsIgnoreCase("CHARGE_INSTALLMENT_FEE")){ - return "Installment charge update is not allowed"; - } - + } return name().toString(); } @@ -34,8 +31,6 @@ public class LoanChargeCannotBeUpdatedException extends AbstractPlatformDomainRu return "error.msg.loan.charge.already.waived"; } else if (name().toString().equalsIgnoreCase("LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE")) { return "error.msg.loan.charge.associated.loan.not.in.submitted.and.pending.approval.stage"; - } else if(name().toString().equalsIgnoreCase("CHARGE_INSTALLMENT_FEE")){ - return "error.msg.loan.charge.installment.fee.update.not.allowed"; } return name().toString(); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanChargeData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanChargeData.java index 98c41b79e..9b581120a 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanChargeData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanChargeData.java @@ -80,7 +80,7 @@ public class LoanChargeData { public static LoanChargeData template(final Collection chargeOptions) { return new LoanChargeData(null, null, null, null, null, null, null, null, chargeOptions, false, null, false, false, null, null, - null); + null,null); } /** @@ -92,7 +92,7 @@ public class LoanChargeData { final EnumOptionData chargeCalculationType, final boolean penalty, final EnumOptionData chargePaymentMode, final BigDecimal minCap, final BigDecimal maxCap) { return new LoanChargeData(null, chargeId, name, currency, amount, percentage, chargeTimeType, chargeCalculationType, null, penalty, - chargePaymentMode, false, false, null, minCap, maxCap); + chargePaymentMode, false, false, null, minCap, maxCap,amount); } public LoanChargeData(final Long id, final Long chargeId, final String name, final CurrencyData currency, final BigDecimal amount, @@ -100,7 +100,7 @@ public class LoanChargeData { final BigDecimal amountOutstanding, final EnumOptionData chargeTimeType, final LocalDate dueDate, final EnumOptionData chargeCalculationType, final BigDecimal percentage, final BigDecimal amountPercentageAppliedTo, final boolean penalty, final EnumOptionData chargePaymentMode, final boolean paid, final boolean waived, final Long loanId, - final BigDecimal minCap, final BigDecimal maxCap) { + final BigDecimal minCap, final BigDecimal maxCap,final BigDecimal amountOrPercentage) { this.id = id; this.chargeId = chargeId; this.name = name; @@ -121,11 +121,14 @@ public class LoanChargeData { this.waived = waived; this.minCap = minCap; this.maxCap = maxCap; - - if (chargeCalculationType != null && chargeCalculationType.getId().intValue() > 1) { - this.amountOrPercentage = this.percentage; - } else { - this.amountOrPercentage = amount; + if(amountOrPercentage == null){ + if (chargeCalculationType != null && chargeCalculationType.getId().intValue() > 1) { + this.amountOrPercentage = this.percentage; + } else { + this.amountOrPercentage = amount; + } + }else{ + this.amountOrPercentage = amountOrPercentage; } this.chargeOptions = null; @@ -136,7 +139,7 @@ public class LoanChargeData { private LoanChargeData(final Long id, final Long chargeId, final String name, final CurrencyData currency, final BigDecimal amount, final BigDecimal percentage, final EnumOptionData chargeTimeType, final EnumOptionData chargeCalculationType, final Collection chargeOptions, final boolean penalty, final EnumOptionData chargePaymentMode, final boolean paid, - final boolean waived, final Long loanId, final BigDecimal minCap, final BigDecimal maxCap) { + final boolean waived, final Long loanId, final BigDecimal minCap, final BigDecimal maxCap,final BigDecimal amountOrPercentage) { this.id = id; this.chargeId = chargeId; this.name = name; @@ -156,10 +159,14 @@ public class LoanChargeData { this.paid = paid; this.waived = waived; - if (chargeCalculationType != null && chargeCalculationType.getId().intValue() > 1) { - this.amountOrPercentage = this.percentage; - } else { - this.amountOrPercentage = amount; + if(amountOrPercentage == null){ + if (chargeCalculationType != null && chargeCalculationType.getId().intValue() > 1) { + this.amountOrPercentage = this.percentage; + } else { + this.amountOrPercentage = amount; + } + }else{ + this.amountOrPercentage = amountOrPercentage; } this.chargeOptions = chargeOptions; 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 7b9306c51..8ec114388 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 @@ -641,11 +641,7 @@ public class Loan extends AbstractPersistable { validateLoanIsNotClosed(loanCharge); if (setOfLoanCharges().contains(loanCharge)) { BigDecimal amount = calculateAmountPercentageAppliedTo(loanCharge); - BigDecimal totalChargeAmt = BigDecimal.ZERO; - if(loanCharge.isInstalmentFee()){ - totalChargeAmt = calculatePerInstallmentChargeAmount(loanCharge); - } - final Map loanChargeChanges = loanCharge.update(command, amount, totalChargeAmt); + final Map loanChargeChanges = loanCharge.update(command, amount); actualChanges.putAll(loanChargeChanges); updateSummaryWithTotalFeeChargesDueAtDisbursement(deriveSumTotalOfChargesDueAtDisbursement()); } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java index 2f1edd6d9..d89afcec5 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/domain/LoanCharge.java @@ -65,6 +65,10 @@ public class LoanCharge extends AbstractPersistable { @Column(name = "calculation_on_amount", scale = 6, precision = 19, nullable = true) private BigDecimal amountPercentageAppliedTo; + @SuppressWarnings("unused") + @Column(name = "charge_amount_or_percentage", scale = 6, precision = 19, nullable = false) + private BigDecimal amountOrPercentage; + @Column(name = "amount", scale = 6, precision = 19, nullable = false) private BigDecimal amount; @@ -232,6 +236,7 @@ public class LoanCharge extends AbstractPersistable { this.amountWrittenOff = null; break; } + this.amountOrPercentage = chargeAmount; } public void markAsFullyPaid() { @@ -302,10 +307,11 @@ public class LoanCharge extends AbstractPersistable { this.amountOutstanding = calculateOutstanding(); break; } + this.amountOrPercentage = amount; } } - public Map update(final JsonCommand command, final BigDecimal amount, BigDecimal loanCharge) { + public Map update(final JsonCommand command, final BigDecimal amount) { final Map actualChanges = new LinkedHashMap(7); @@ -343,6 +349,7 @@ public class LoanCharge extends AbstractPersistable { case PERCENT_OF_INTEREST: this.percentage = newValue; this.amountPercentageAppliedTo = amount; + BigDecimal loanCharge = loan.calculatePerInstallmentChargeAmount(ChargeCalculationType.fromInt(this.chargeCalculation),percentage); if(loanCharge.compareTo(BigDecimal.ZERO) == 0){ loanCharge = percentageOf(this.amountPercentageAppliedTo); } @@ -350,8 +357,8 @@ public class LoanCharge extends AbstractPersistable { this.amountOutstanding = calculateOutstanding(); break; } + this.amountOrPercentage = newValue; } - return actualChanges; } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java index 26f18b154..b82c6f860 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanChargeReadPlatformServiceImpl.java @@ -59,6 +59,7 @@ public class LoanChargeReadPlatformServiceImpl implements LoanChargeReadPlatform + "lc.is_paid_derived as paid, " + "lc.waived as waied, " + "lc.min_cap as minCap, lc.max_cap as maxCap, " + + "lc.charge_amount_or_percentage as amountOrPercentage, " + "c.currency_code as currencyCode, oc.name as currencyName, " + "oc.decimal_places as currencyDecimalPlaces, oc.currency_multiplesof as inMultiplesOf, oc.display_symbol as currencyDisplaySymbol, " + "oc.internationalized_name_code as currencyNameCode from m_charge c " @@ -105,10 +106,11 @@ public class LoanChargeReadPlatformServiceImpl implements LoanChargeReadPlatform final boolean waived = rs.getBoolean("waied"); final BigDecimal minCap = rs.getBigDecimal("minCap"); final BigDecimal maxCap = rs.getBigDecimal("maxCap"); + final BigDecimal amountOrPercentage = rs.getBigDecimal("amountOrPercentage"); return new LoanChargeData(id, chargeId, name, currency, amount, amountPaid, amountWaived, amountWrittenOff, amountOutstanding, chargeTimeType, dueAsOfDate, chargeCalculationType, percentageOf, amountPercentageAppliedTo, penalty, paymentMode, - paid, waived, null,minCap,maxCap); + paid, waived, null,minCap,maxCap,amountOrPercentage); } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java index b20cf8319..ebe68b3e5 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/service/LoanWritePlatformServiceJpaRepositoryImpl.java @@ -890,11 +890,6 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf // yet to be approved (are in submitted and pending status) if (!loan.status().isSubmittedAndPendingApproval()) { throw new LoanChargeCannotBeUpdatedException( LOAN_CHARGE_CANNOT_BE_UPDATED_REASON.LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE, loanCharge.getId()); } - - if(loanCharge.isInstalmentFee()){ - throw new LoanChargeCannotBeUpdatedException( - LOAN_CHARGE_CANNOT_BE_UPDATED_REASON.CHARGE_INSTALLMENT_FEE, loanCharge.getId()); - } final Map changes = loan.updateLoanCharge(loanCharge, command);