janez89 commented on code in PR #4099:
URL: https://github.com/apache/fineract/pull/4099#discussion_r1801420976


##########
fineract-progressive-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/loanschedule/data/ProgressiveLoanInterestScheduleModel.java:
##########
@@ -19,45 +19,167 @@
 package org.apache.fineract.portfolio.loanaccount.loanschedule.data;
 
 import java.math.BigDecimal;
-import java.math.MathContext;
 import java.time.LocalDate;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
+import java.util.function.Consumer;
+import lombok.Data;
+import lombok.experimental.Accessors;
+import org.apache.fineract.organisation.monetary.domain.Money;
 import 
org.apache.fineract.portfolio.loanproduct.domain.LoanProductRelatedDetail;
 
-public record 
ProgressiveLoanInterestScheduleModel(List<ProgressiveLoanInterestRepaymentModel>
 repayments, //
-        List<ProgressiveLoanInterestRate> interestRates, //
-        LoanProductRelatedDetail loanProductRelatedDetail, //
-        Integer installmentAmountInMultiplesOf, //
-        MathContext mc) {
+@Data
+@Accessors(fluent = true)
+public class ProgressiveLoanInterestScheduleModel {
 
-    public 
ProgressiveLoanInterestScheduleModel(List<ProgressiveLoanInterestRepaymentModel>
 repayments,
-            LoanProductRelatedDetail loanProductRelatedDetail, Integer 
installmentAmountInMultiplesOf, MathContext mc) {
-        this(repayments, new ArrayList<>(1), loanProductRelatedDetail, 
installmentAmountInMultiplesOf, mc);
+    private final List<RepaymentPeriod> repaymentPeriods;
+    private final List<InterestRate> interestRates;
+    private final LoanProductRelatedDetail loanProductRelatedDetail;
+    private final Integer installmentAmountInMultiplesOf;
+
+    public ProgressiveLoanInterestScheduleModel(List<RepaymentPeriod> 
repaymentPeriods, LoanProductRelatedDetail loanProductRelatedDetail,
+            Integer installmentAmountInMultiplesOf) {
+        this.repaymentPeriods = repaymentPeriods;
+        this.interestRates = new ArrayList<>();
+        this.loanProductRelatedDetail = loanProductRelatedDetail;
+        this.installmentAmountInMultiplesOf = installmentAmountInMultiplesOf;
+    }
+
+    private ProgressiveLoanInterestScheduleModel(List<RepaymentPeriod> 
repaymentPeriods, final List<InterestRate> interestRates,
+            LoanProductRelatedDetail loanProductRelatedDetail, Integer 
installmentAmountInMultiplesOf) {
+        this.repaymentPeriods = copyRepaymentPeriods(repaymentPeriods);
+        this.interestRates = new ArrayList<>(interestRates);
+        this.loanProductRelatedDetail = loanProductRelatedDetail;
+        this.installmentAmountInMultiplesOf = installmentAmountInMultiplesOf;
+    }
+
+    public ProgressiveLoanInterestScheduleModel deepCopy() {
+        return new ProgressiveLoanInterestScheduleModel(repaymentPeriods, 
interestRates, loanProductRelatedDetail,
+                installmentAmountInMultiplesOf);
     }
 
-    public void addInterestRate(final LocalDate newInterestDueDate, final 
BigDecimal newInterestRate) {
-        interestRates.add(new ProgressiveLoanInterestRate(newInterestDueDate, 
newInterestDueDate.plusDays(1), newInterestRate));
-        interestRates.sort(Collections.reverseOrder());
+    private List<RepaymentPeriod> copyRepaymentPeriods(final 
List<RepaymentPeriod> repaymentPeriods) {
+        final List<RepaymentPeriod> repaymentCopies = new 
ArrayList<>(repaymentPeriods.size());
+        RepaymentPeriod previousPeriod = null;
+        for (RepaymentPeriod repaymentPeriod : repaymentPeriods) {
+            RepaymentPeriod currentPeriod = new 
RepaymentPeriod(previousPeriod, repaymentPeriod);
+            previousPeriod = currentPeriod;
+            repaymentCopies.add(currentPeriod);
+        }
+        return repaymentCopies;
     }
 
     public BigDecimal getInterestRate(final LocalDate effectiveDate) {
         return interestRates.isEmpty() ? 
loanProductRelatedDetail.getAnnualNominalInterestRate() : 
findInterestRate(effectiveDate);
     }
 
     private BigDecimal findInterestRate(final LocalDate effectiveDate) {
-        return interestRates.stream().filter(ir -> 
!ir.effectiveFrom().isAfter(effectiveDate))
-                
.map(ProgressiveLoanInterestRate::interestRate).findFirst().orElse(loanProductRelatedDetail.getAnnualNominalInterestRate());
+        return interestRates.stream().filter(ir -> 
!ir.effectiveFrom().isAfter(effectiveDate)).map(InterestRate::interestRate).findFirst()
+                
.orElse(loanProductRelatedDetail.getAnnualNominalInterestRate());
+    }
+
+    public Optional<RepaymentPeriod> findRepaymentPeriod(final LocalDate 
repaymentPeriodDueDate) {
+        if (repaymentPeriodDueDate == null) {
+            return Optional.empty();
+        }
+        return repaymentPeriods.stream()//
+                .filter(repaymentPeriodItem -> 
repaymentPeriodItem.getDueDate().isEqual(repaymentPeriodDueDate))//
+                .findFirst();
+    }
+
+    public List<RepaymentPeriod> getRelatedRepaymentPeriods(final LocalDate 
calculateFromRepaymentPeriodDueDate) {
+        if (calculateFromRepaymentPeriodDueDate == null) {
+            return repaymentPeriods;
+        }
+        return repaymentPeriods.stream()//
+                .filter(period -> 
!period.getDueDate().isBefore(calculateFromRepaymentPeriodDueDate))//
+                .toList();//
     }
 
     public int getLoanTermInDays() {
-        if (repayments.isEmpty()) {
+        if (repaymentPeriods.isEmpty()) {
             return 0;
         }
-        final var firstPeriod = repayments.get(0);
-        final var lastPeriod = repayments.size() > 1 ? 
repayments.get(repayments.size() - 1) : firstPeriod;
+        final RepaymentPeriod firstPeriod = repaymentPeriods.get(0);
+        final RepaymentPeriod lastPeriod = repaymentPeriods.size() > 1 ? 
repaymentPeriods.get(repaymentPeriods.size() - 1) : firstPeriod;

Review Comment:
   Which condition leads to non-existing invariance?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to