@@ -77,7 +77,7 @@ public class RepaymentPeriod {
7777 private Memo <Money > outstandingBalanceCalculation ;
7878 @ Getter
7979 @ Setter
80- private boolean isInterestMoved = false ;
80+ private boolean isInterestMovedUpward = false ;
8181
8282 @ Setter
8383 private Money totalDisbursedAmount ;
@@ -99,7 +99,7 @@ public class RepaymentPeriod {
9999 private Money creditedInterestMovedDueReAge ;
100100 @ Setter
101101 @ Getter
102- private boolean noUnrecognisedInterest ;
102+ private boolean isInterestMovedDownward ;
103103 @ Setter
104104 @ Getter
105105 private boolean reAged ;
@@ -111,7 +111,7 @@ public class RepaymentPeriod {
111111
112112 protected RepaymentPeriod (RepaymentPeriod previous , LocalDate fromDate , LocalDate dueDate , List <InterestPeriod > interestPeriods ,
113113 Money emi , Money originalEmi , Money paidPrincipal , Money paidInterest , Money futureUnrecognizedInterest , MathContext mc ,
114- ILoanConfigurationDetails loanProductRelatedDetail , boolean noUnrecognisedInterest , boolean reAged ,
114+ ILoanConfigurationDetails loanProductRelatedDetail , boolean isInterestMovedDownward , boolean reAged ,
115115 boolean reAgedEarlyRepaymentHolder , Money fixedInterest ) {
116116 this .previous = previous ;
117117 this .fromDate = fromDate ;
@@ -124,7 +124,7 @@ protected RepaymentPeriod(RepaymentPeriod previous, LocalDate fromDate, LocalDat
124124 this .futureUnrecognizedInterest = futureUnrecognizedInterest ;
125125 this .mc = mc ;
126126 this .loanProductRelatedDetail = loanProductRelatedDetail ;
127- this .noUnrecognisedInterest = noUnrecognisedInterest ;
127+ this .isInterestMovedDownward = isInterestMovedDownward ;
128128 this .reAged = reAged ;
129129 this .reAgedEarlyRepaymentHolder = reAgedEarlyRepaymentHolder ;
130130 this .fixedInterest = fixedInterest ;
@@ -151,13 +151,13 @@ public static RepaymentPeriod copy(RepaymentPeriod previous, RepaymentPeriod rep
151151 final RepaymentPeriod newRepaymentPeriod = new RepaymentPeriod (previous , repaymentPeriod .getFromDate (),
152152 repaymentPeriod .getDueDate (), new ArrayList <>(), repaymentPeriod .getEmi (), repaymentPeriod .getOriginalEmi (),
153153 repaymentPeriod .getPaidPrincipal (), repaymentPeriod .getPaidInterest (), repaymentPeriod .getFutureUnrecognizedInterest (), mc ,
154- repaymentPeriod .getLoanProductRelatedDetail (), repaymentPeriod .isNoUnrecognisedInterest (), repaymentPeriod .isReAged (),
154+ repaymentPeriod .getLoanProductRelatedDetail (), repaymentPeriod .isInterestMovedDownward (), repaymentPeriod .isReAged (),
155155 repaymentPeriod .isReAgedEarlyRepaymentHolder (), repaymentPeriod .getFixedInterest ());
156156 newRepaymentPeriod .setCreditedPrincipalMovedDueReAge (repaymentPeriod .getCreditedPrincipalMovedDueReAge ());
157157 newRepaymentPeriod .setCreditedInterestMovedDueReAge (repaymentPeriod .getCreditedInterestMovedDueReAge ());
158158 newRepaymentPeriod .setTotalDisbursedAmount (repaymentPeriod .getTotalDisbursedAmount ());
159159 newRepaymentPeriod .setTotalCapitalizedIncomeAmount (repaymentPeriod .getTotalCapitalizedIncomeAmount ());
160- newRepaymentPeriod .setInterestMoved (repaymentPeriod .isInterestMoved ());
160+ newRepaymentPeriod .setInterestMovedUpward (repaymentPeriod .isInterestMovedUpward ());
161161 newRepaymentPeriod .setCurrency (repaymentPeriod .getCurrency ());
162162 // There is always at least 1 interest period, by default with same from-due date as repayment period
163163 for (InterestPeriod interestPeriod : repaymentPeriod .getInterestPeriods ()) {
@@ -170,13 +170,16 @@ public static RepaymentPeriod copyWithoutPaidAmounts(RepaymentPeriod previous, R
170170 final Money zero = Money .zero (repaymentPeriod .getCurrency (), mc );
171171 final RepaymentPeriod newRepaymentPeriod = new RepaymentPeriod (previous , repaymentPeriod .getFromDate (),
172172 repaymentPeriod .getDueDate (), new ArrayList <>(), repaymentPeriod .getEmi (), repaymentPeriod .getOriginalEmi (), zero , zero ,
173- zero , mc , repaymentPeriod .getLoanProductRelatedDetail (), repaymentPeriod .isNoUnrecognisedInterest (),
173+ zero , mc , repaymentPeriod .getLoanProductRelatedDetail (), repaymentPeriod .isInterestMovedDownward (),
174174 repaymentPeriod .isReAged (), repaymentPeriod .isReAgedEarlyRepaymentHolder (), repaymentPeriod .getFixedInterest ());
175175 newRepaymentPeriod .setCreditedPrincipalMovedDueReAge (repaymentPeriod .getCreditedPrincipalMovedDueReAge ());
176176 newRepaymentPeriod .setCreditedInterestMovedDueReAge (repaymentPeriod .getCreditedInterestMovedDueReAge ());
177+ if (repaymentPeriod .isInterestMovedDownward ()) {
178+ newRepaymentPeriod .setFixedInterest (repaymentPeriod .getPaidInterest ());
179+ }
177180 newRepaymentPeriod .setTotalDisbursedAmount (repaymentPeriod .getTotalDisbursedAmount ());
178181 newRepaymentPeriod .setTotalCapitalizedIncomeAmount (repaymentPeriod .getTotalCapitalizedIncomeAmount ());
179- newRepaymentPeriod .setInterestMoved (repaymentPeriod .isInterestMoved ());
182+ newRepaymentPeriod .setInterestMovedUpward (repaymentPeriod .isInterestMovedUpward ());
180183 newRepaymentPeriod .setCurrency (repaymentPeriod .getCurrency ());
181184 // There is always at least 1 interest period, by default with same from-due date as repayment period
182185 for (InterestPeriod interestPeriod : repaymentPeriod .getInterestPeriods ()) {
@@ -217,8 +220,9 @@ private BigDecimal calculateRateFactorPlus1() {
217220 @ NotNull
218221 public Money getCalculatedDueInterest () {
219222 if (calculatedDueInterestCalculation == null ) {
220- calculatedDueInterestCalculation = Memo .of (this ::calculateCalculatedDueInterest , () -> new Object [] { previous , interestPeriods ,
221- futureUnrecognizedInterest , isInterestMoved , totalDisbursedAmount , fixedInterest , reAged });
223+ calculatedDueInterestCalculation = Memo .of (this ::calculateCalculatedDueInterest ,
224+ () -> new Object [] { previous , interestPeriods , futureUnrecognizedInterest , isInterestMovedUpward ,
225+ isInterestMovedDownward , totalDisbursedAmount , fixedInterest , reAged });
222226 }
223227 return calculatedDueInterestCalculation .get ();
224228 }
@@ -242,7 +246,7 @@ public Money calculateFixedInterestTillDate() {
242246
243247 public Money calculateCalculatedDueInterest () {
244248 Money calculatedDueInterest = getZero ();
245- if (!isInterestMoved ()) {
249+ if (!isInterestMovedUpward () && ! isInterestMovedDownward ()) {
246250 calculatedDueInterest = Money .of (getEmi ().getCurrencyData (),
247251 getInterestPeriods ().stream ().map (InterestPeriod ::getCalculatedDueInterest ).reduce (BigDecimal .ZERO , BigDecimal ::add ),
248252 mc );
@@ -367,7 +371,7 @@ public boolean isFullyPaid() {
367371 * @return
368372 */
369373 public Money getUnrecognizedInterest () {
370- return noUnrecognisedInterest ? getZero () : getCalculatedDueInterest ().minus (getDueInterest (), getMc ());
374+ return MathUtil . negativeToZero ( getCalculatedDueInterest ().minus (getDueInterest (), getMc () ), getMc ());
371375 }
372376
373377 public Money getCreditedAmounts () {
0 commit comments