@@ -96,10 +96,13 @@ public class RepaymentPeriod {
9696 @ Setter
9797 @ Getter
9898 private boolean reAgedEarlyRepaymentHolder = false ;
99+ @ Getter
100+ @ Setter
101+ private Money reAgedInterest ;
99102
100103 protected RepaymentPeriod (RepaymentPeriod previous , LocalDate fromDate , LocalDate dueDate , List <InterestPeriod > interestPeriods ,
101104 Money emi , Money originalEmi , Money paidPrincipal , Money paidInterest , Money futureUnrecognizedInterest , MathContext mc ,
102- LoanProductMinimumRepaymentScheduleRelatedDetail loanProductRelatedDetail , boolean noUnrecognisedInterest , boolean reAged , boolean reAgedEarlyRepaymentHolder ) {
105+ LoanProductMinimumRepaymentScheduleRelatedDetail loanProductRelatedDetail , boolean noUnrecognisedInterest , boolean reAged , boolean reAgedEarlyRepaymentHolder , Money reAgedInterest ) {
103106 this .previous = previous ;
104107 this .fromDate = fromDate ;
105108 this .dueDate = dueDate ;
@@ -114,19 +117,20 @@ protected RepaymentPeriod(RepaymentPeriod previous, LocalDate fromDate, LocalDat
114117 this .noUnrecognisedInterest = noUnrecognisedInterest ;
115118 this .reAged = reAged ;
116119 this .reAgedEarlyRepaymentHolder = reAgedEarlyRepaymentHolder ;
120+ this .reAgedInterest = reAgedInterest ;
117121 }
118122
119123 public static RepaymentPeriod empty (RepaymentPeriod previous , MathContext mc ,
120124 LoanProductMinimumRepaymentScheduleRelatedDetail loanProductRelatedDetail ) {
121125 return new RepaymentPeriod (previous , null , null , new ArrayList <>(), null , null , null , null , null , mc , loanProductRelatedDetail ,
122- false , false , false );
126+ false , false , false , null );
123127 }
124128
125129 public static RepaymentPeriod create (RepaymentPeriod previous , LocalDate fromDate , LocalDate dueDate , Money emi , MathContext mc ,
126130 LoanProductMinimumRepaymentScheduleRelatedDetail loanProductRelatedDetail ) {
127131 final Money zero = emi .zero ();
128132 final RepaymentPeriod newRepaymentPeriod = new RepaymentPeriod (previous , fromDate , dueDate , new ArrayList <>(), emi , emi , zero , zero ,
129- zero , mc , loanProductRelatedDetail , false , false , false );
133+ zero , mc , loanProductRelatedDetail , false , false , false , zero );
130134 // There is always at least 1 interest period, by default with same from-due date as repayment period
131135 newRepaymentPeriod .getInterestPeriods ().add (InterestPeriod .withEmptyAmounts (newRepaymentPeriod , fromDate , dueDate ));
132136 return newRepaymentPeriod ;
@@ -136,7 +140,7 @@ public static RepaymentPeriod copy(RepaymentPeriod previous, RepaymentPeriod rep
136140 final RepaymentPeriod newRepaymentPeriod = new RepaymentPeriod (previous , repaymentPeriod .getFromDate (),
137141 repaymentPeriod .getDueDate (), new ArrayList <>(), repaymentPeriod .getEmi (), repaymentPeriod .getOriginalEmi (),
138142 repaymentPeriod .getPaidPrincipal (), repaymentPeriod .getPaidInterest (), repaymentPeriod .getFutureUnrecognizedInterest (), mc ,
139- repaymentPeriod .getLoanProductRelatedDetail (), repaymentPeriod .isNoUnrecognisedInterest (), repaymentPeriod .isReAged (), repaymentPeriod .isReAgedEarlyRepaymentHolder ());
143+ repaymentPeriod .getLoanProductRelatedDetail (), repaymentPeriod .isNoUnrecognisedInterest (), repaymentPeriod .isReAged (), repaymentPeriod .isReAgedEarlyRepaymentHolder (), repaymentPeriod . getReAgedInterest () );
140144 // There is always at least 1 interest period, by default with same from-due date as repayment period
141145 for (InterestPeriod interestPeriod : repaymentPeriod .getInterestPeriods ()) {
142146 newRepaymentPeriod .getInterestPeriods ().add (InterestPeriod .copy (newRepaymentPeriod , interestPeriod , mc ));
@@ -148,7 +152,7 @@ public static RepaymentPeriod copyWithoutPaidAmounts(RepaymentPeriod previous, R
148152 final Money zero = Money .zero (repaymentPeriod .getCurrency (), mc );
149153 final RepaymentPeriod newRepaymentPeriod = new RepaymentPeriod (previous , repaymentPeriod .getFromDate (),
150154 repaymentPeriod .getDueDate (), new ArrayList <>(), repaymentPeriod .getEmi (), repaymentPeriod .getOriginalEmi (), zero , zero ,
151- zero , mc , repaymentPeriod .getLoanProductRelatedDetail (), repaymentPeriod .isNoUnrecognisedInterest (), repaymentPeriod .isReAged (), repaymentPeriod .isReAgedEarlyRepaymentHolder ());
155+ zero , mc , repaymentPeriod .getLoanProductRelatedDetail (), repaymentPeriod .isNoUnrecognisedInterest (), repaymentPeriod .isReAged (), repaymentPeriod .isReAgedEarlyRepaymentHolder (), repaymentPeriod . getReAgedInterest () );
152156 // There is always at least 1 interest period, by default with same from-due date as repayment period
153157 for (InterestPeriod interestPeriod : repaymentPeriod .getInterestPeriods ()) {
154158 var interestPeriodCopy = InterestPeriod .copy (newRepaymentPeriod , interestPeriod );
@@ -188,8 +192,8 @@ private BigDecimal calculateRateFactorPlus1() {
188192 @ NotNull
189193 public Money getCalculatedDueInterest () {
190194 if (calculatedDueInterestCalculation == null ) {
191- calculatedDueInterestCalculation = Memo .of (this ::calculateCalculatedDueInterest , () -> new Object [] { this . previous ,
192- this . interestPeriods , this . futureUnrecognizedInterest , this . isInterestMoved , this . totalDisbursedAmount });
195+ calculatedDueInterestCalculation = Memo .of (this ::calculateCalculatedDueInterest , () -> new Object [] { previous ,
196+ interestPeriods , futureUnrecognizedInterest , isInterestMoved , totalDisbursedAmount , reAgedInterest , reAged });
193197 }
194198 return calculatedDueInterestCalculation .get ();
195199 }
@@ -201,6 +205,7 @@ public Money calculateCalculatedDueInterest() {
201205 getInterestPeriods ().stream ().map (InterestPeriod ::getCalculatedDueInterest ).reduce (BigDecimal .ZERO , BigDecimal ::add ),
202206 mc );
203207 }
208+ calculatedDueInterest = calculatedDueInterest .add (reAgedInterest );
204209 calculatedDueInterest = calculatedDueInterest .add (getFutureUnrecognizedInterest (), getMc ());
205210 if (getPrevious ().isPresent ()) {
206211 calculatedDueInterest = calculatedDueInterest .add (getPrevious ().get ().getUnrecognizedInterest (), getMc ());
@@ -220,7 +225,7 @@ public Money getDueInterest() {
220225 () -> MathUtil .max (getPaidPrincipal ().isGreaterThan (getCalculatedDuePrincipal ()) ? getPaidInterest ()
221226 : MathUtil .min (getCalculatedDueInterest (), getEmiPlusCreditedAmountsPlusFutureUnrecognizedInterest (), false ),
222227 getPaidInterest (), false ),
223- () -> new Object [] { paidPrincipal , paidInterest , interestPeriods , futureUnrecognizedInterest , totalDisbursedAmount ,
228+ () -> new Object [] { paidPrincipal , paidInterest , interestPeriods , futureUnrecognizedInterest , totalDisbursedAmount , reAgedInterest , reAged ,
224229 emi });
225230 }
226231 return dueInterestCalculation .get ();
@@ -296,7 +301,7 @@ public Money getDuePrincipal() {
296301 * @return
297302 */
298303 public Money getTotalCreditedAmount () {
299- return getCreditedPrincipal ().plus (getCreditedInterest (), getMc ());
304+ return getCreditedPrincipal ().plus (getCreditedInterest (), getMc ()). plus ( getReAgedInterest ()) ;
300305 }
301306
302307 /**
0 commit comments