added loan charge update for installment fees
This commit is contained in:
+2
@@ -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`;
|
||||||
+2
-7
@@ -11,7 +11,7 @@ public class LoanChargeCannotBeUpdatedException extends AbstractPlatformDomainRu
|
|||||||
|
|
||||||
/*** enum of reasons of why Loan Charge cannot be waived **/
|
/*** enum of reasons of why Loan Charge cannot be waived **/
|
||||||
public static enum LOAN_CHARGE_CANNOT_BE_UPDATED_REASON {
|
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() {
|
public String errorMessage() {
|
||||||
if (name().toString().equalsIgnoreCase("ALREADY_PAID")) {
|
if (name().toString().equalsIgnoreCase("ALREADY_PAID")) {
|
||||||
@@ -20,10 +20,7 @@ public class LoanChargeCannotBeUpdatedException extends AbstractPlatformDomainRu
|
|||||||
return "This loan charge has already been waived";
|
return "This loan charge has already been waived";
|
||||||
} else if (name().toString().equalsIgnoreCase("LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE")) {
|
} 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";
|
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();
|
return name().toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,8 +31,6 @@ public class LoanChargeCannotBeUpdatedException extends AbstractPlatformDomainRu
|
|||||||
return "error.msg.loan.charge.already.waived";
|
return "error.msg.loan.charge.already.waived";
|
||||||
} else if (name().toString().equalsIgnoreCase("LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE")) {
|
} 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";
|
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();
|
return name().toString();
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-13
@@ -80,7 +80,7 @@ public class LoanChargeData {
|
|||||||
|
|
||||||
public static LoanChargeData template(final Collection<ChargeData> chargeOptions) {
|
public static LoanChargeData template(final Collection<ChargeData> chargeOptions) {
|
||||||
return new LoanChargeData(null, null, null, null, null, null, null, null, chargeOptions, false, null, false, false, null, null,
|
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 EnumOptionData chargeCalculationType, final boolean penalty, final EnumOptionData chargePaymentMode,
|
||||||
final BigDecimal minCap, final BigDecimal maxCap) {
|
final BigDecimal minCap, final BigDecimal maxCap) {
|
||||||
return new LoanChargeData(null, chargeId, name, currency, amount, percentage, chargeTimeType, chargeCalculationType, null, penalty,
|
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,
|
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 BigDecimal amountOutstanding, final EnumOptionData chargeTimeType, final LocalDate dueDate,
|
||||||
final EnumOptionData chargeCalculationType, final BigDecimal percentage, final BigDecimal amountPercentageAppliedTo,
|
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 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.id = id;
|
||||||
this.chargeId = chargeId;
|
this.chargeId = chargeId;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
@@ -121,11 +121,14 @@ public class LoanChargeData {
|
|||||||
this.waived = waived;
|
this.waived = waived;
|
||||||
this.minCap = minCap;
|
this.minCap = minCap;
|
||||||
this.maxCap = maxCap;
|
this.maxCap = maxCap;
|
||||||
|
if(amountOrPercentage == null){
|
||||||
if (chargeCalculationType != null && chargeCalculationType.getId().intValue() > 1) {
|
if (chargeCalculationType != null && chargeCalculationType.getId().intValue() > 1) {
|
||||||
this.amountOrPercentage = this.percentage;
|
this.amountOrPercentage = this.percentage;
|
||||||
} else {
|
} else {
|
||||||
this.amountOrPercentage = amount;
|
this.amountOrPercentage = amount;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
this.amountOrPercentage = amountOrPercentage;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.chargeOptions = null;
|
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,
|
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 BigDecimal percentage, final EnumOptionData chargeTimeType, final EnumOptionData chargeCalculationType,
|
||||||
final Collection<ChargeData> chargeOptions, final boolean penalty, final EnumOptionData chargePaymentMode, final boolean paid,
|
final Collection<ChargeData> 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.id = id;
|
||||||
this.chargeId = chargeId;
|
this.chargeId = chargeId;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
@@ -156,10 +159,14 @@ public class LoanChargeData {
|
|||||||
this.paid = paid;
|
this.paid = paid;
|
||||||
this.waived = waived;
|
this.waived = waived;
|
||||||
|
|
||||||
if (chargeCalculationType != null && chargeCalculationType.getId().intValue() > 1) {
|
if(amountOrPercentage == null){
|
||||||
this.amountOrPercentage = this.percentage;
|
if (chargeCalculationType != null && chargeCalculationType.getId().intValue() > 1) {
|
||||||
} else {
|
this.amountOrPercentage = this.percentage;
|
||||||
this.amountOrPercentage = amount;
|
} else {
|
||||||
|
this.amountOrPercentage = amount;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
this.amountOrPercentage = amountOrPercentage;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.chargeOptions = chargeOptions;
|
this.chargeOptions = chargeOptions;
|
||||||
|
|||||||
+1
-5
@@ -641,11 +641,7 @@ public class Loan extends AbstractPersistable<Long> {
|
|||||||
validateLoanIsNotClosed(loanCharge);
|
validateLoanIsNotClosed(loanCharge);
|
||||||
if (setOfLoanCharges().contains(loanCharge)) {
|
if (setOfLoanCharges().contains(loanCharge)) {
|
||||||
BigDecimal amount = calculateAmountPercentageAppliedTo(loanCharge);
|
BigDecimal amount = calculateAmountPercentageAppliedTo(loanCharge);
|
||||||
BigDecimal totalChargeAmt = BigDecimal.ZERO;
|
final Map<String, Object> loanChargeChanges = loanCharge.update(command, amount);
|
||||||
if(loanCharge.isInstalmentFee()){
|
|
||||||
totalChargeAmt = calculatePerInstallmentChargeAmount(loanCharge);
|
|
||||||
}
|
|
||||||
final Map<String, Object> loanChargeChanges = loanCharge.update(command, amount, totalChargeAmt);
|
|
||||||
actualChanges.putAll(loanChargeChanges);
|
actualChanges.putAll(loanChargeChanges);
|
||||||
updateSummaryWithTotalFeeChargesDueAtDisbursement(deriveSumTotalOfChargesDueAtDisbursement());
|
updateSummaryWithTotalFeeChargesDueAtDisbursement(deriveSumTotalOfChargesDueAtDisbursement());
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-2
@@ -65,6 +65,10 @@ public class LoanCharge extends AbstractPersistable<Long> {
|
|||||||
@Column(name = "calculation_on_amount", scale = 6, precision = 19, nullable = true)
|
@Column(name = "calculation_on_amount", scale = 6, precision = 19, nullable = true)
|
||||||
private BigDecimal amountPercentageAppliedTo;
|
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)
|
@Column(name = "amount", scale = 6, precision = 19, nullable = false)
|
||||||
private BigDecimal amount;
|
private BigDecimal amount;
|
||||||
|
|
||||||
@@ -232,6 +236,7 @@ public class LoanCharge extends AbstractPersistable<Long> {
|
|||||||
this.amountWrittenOff = null;
|
this.amountWrittenOff = null;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
this.amountOrPercentage = chargeAmount;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void markAsFullyPaid() {
|
public void markAsFullyPaid() {
|
||||||
@@ -302,10 +307,11 @@ public class LoanCharge extends AbstractPersistable<Long> {
|
|||||||
this.amountOutstanding = calculateOutstanding();
|
this.amountOutstanding = calculateOutstanding();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
this.amountOrPercentage = amount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, Object> update(final JsonCommand command, final BigDecimal amount, BigDecimal loanCharge) {
|
public Map<String, Object> update(final JsonCommand command, final BigDecimal amount) {
|
||||||
|
|
||||||
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(7);
|
final Map<String, Object> actualChanges = new LinkedHashMap<String, Object>(7);
|
||||||
|
|
||||||
@@ -343,6 +349,7 @@ public class LoanCharge extends AbstractPersistable<Long> {
|
|||||||
case PERCENT_OF_INTEREST:
|
case PERCENT_OF_INTEREST:
|
||||||
this.percentage = newValue;
|
this.percentage = newValue;
|
||||||
this.amountPercentageAppliedTo = amount;
|
this.amountPercentageAppliedTo = amount;
|
||||||
|
BigDecimal loanCharge = loan.calculatePerInstallmentChargeAmount(ChargeCalculationType.fromInt(this.chargeCalculation),percentage);
|
||||||
if(loanCharge.compareTo(BigDecimal.ZERO) == 0){
|
if(loanCharge.compareTo(BigDecimal.ZERO) == 0){
|
||||||
loanCharge = percentageOf(this.amountPercentageAppliedTo);
|
loanCharge = percentageOf(this.amountPercentageAppliedTo);
|
||||||
}
|
}
|
||||||
@@ -350,8 +357,8 @@ public class LoanCharge extends AbstractPersistable<Long> {
|
|||||||
this.amountOutstanding = calculateOutstanding();
|
this.amountOutstanding = calculateOutstanding();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
this.amountOrPercentage = newValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
return actualChanges;
|
return actualChanges;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-1
@@ -59,6 +59,7 @@ public class LoanChargeReadPlatformServiceImpl implements LoanChargeReadPlatform
|
|||||||
+ "lc.is_paid_derived as paid, "
|
+ "lc.is_paid_derived as paid, "
|
||||||
+ "lc.waived as waied, "
|
+ "lc.waived as waied, "
|
||||||
+ "lc.min_cap as minCap, lc.max_cap as maxCap, "
|
+ "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, "
|
+ "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.decimal_places as currencyDecimalPlaces, oc.currency_multiplesof as inMultiplesOf, oc.display_symbol as currencyDisplaySymbol, "
|
||||||
+ "oc.internationalized_name_code as currencyNameCode from m_charge c "
|
+ "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 boolean waived = rs.getBoolean("waied");
|
||||||
final BigDecimal minCap = rs.getBigDecimal("minCap");
|
final BigDecimal minCap = rs.getBigDecimal("minCap");
|
||||||
final BigDecimal maxCap = rs.getBigDecimal("maxCap");
|
final BigDecimal maxCap = rs.getBigDecimal("maxCap");
|
||||||
|
final BigDecimal amountOrPercentage = rs.getBigDecimal("amountOrPercentage");
|
||||||
|
|
||||||
return new LoanChargeData(id, chargeId, name, currency, amount, amountPaid, amountWaived, amountWrittenOff, amountOutstanding,
|
return new LoanChargeData(id, chargeId, name, currency, amount, amountPaid, amountWaived, amountWrittenOff, amountOutstanding,
|
||||||
chargeTimeType, dueAsOfDate, chargeCalculationType, percentageOf, amountPercentageAppliedTo, penalty, paymentMode,
|
chargeTimeType, dueAsOfDate, chargeCalculationType, percentageOf, amountPercentageAppliedTo, penalty, paymentMode,
|
||||||
paid, waived, null,minCap,maxCap);
|
paid, waived, null,minCap,maxCap,amountOrPercentage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
-5
@@ -890,11 +890,6 @@ public class LoanWritePlatformServiceJpaRepositoryImpl implements LoanWritePlatf
|
|||||||
// yet to be approved (are in submitted and pending status)
|
// yet to be approved (are in submitted and pending status)
|
||||||
if (!loan.status().isSubmittedAndPendingApproval()) { throw new LoanChargeCannotBeUpdatedException(
|
if (!loan.status().isSubmittedAndPendingApproval()) { throw new LoanChargeCannotBeUpdatedException(
|
||||||
LOAN_CHARGE_CANNOT_BE_UPDATED_REASON.LOAN_NOT_IN_SUBMITTED_AND_PENDING_APPROVAL_STAGE, loanCharge.getId()); }
|
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<String, Object> changes = loan.updateLoanCharge(loanCharge, command);
|
final Map<String, Object> changes = loan.updateLoanCharge(loanCharge, command);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user