Skip to content

Commit 1d1876e

Browse files
Jose Alberto Hernandezadamsaghy
authored andcommitted
FINERACT-2421: Disbursement charge amount incorrect calculation
1 parent 2620c61 commit 1d1876e

File tree

22 files changed

+136
-116
lines changed

22 files changed

+136
-116
lines changed

fineract-core/src/main/java/org/apache/fineract/portfolio/charge/domain/ChargeTimeType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,4 +221,9 @@ public boolean isSharesPurchase() {
221221
public boolean isSharesRedeem() {
222222
return this.equals(ChargeTimeType.SHARE_REDEEM);
223223
}
224+
225+
public boolean isDisbursementOrTrancheDisbursementCharge() {
226+
return isTimeOfDisbursement() || isTrancheDisbursement();
227+
}
228+
224229
}

fineract-e2e-tests-runner/src/test/resources/features/LoanCharge.feature

Lines changed: 49 additions & 56 deletions
Large diffs are not rendered by default.

fineract-loan/src/main/java/org/apache/fineract/portfolio/delinquency/service/DelinquencyReadPlatformServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ public BigDecimal calculateAvailableDisbursementAmountWithOverApplied(@NonNull f
216216
// Calculate available amount: (approved + over applied) - expected tranches - disbursed - capitalized income
217217
if (loan.isMultiDisburmentLoan() && loan.getDisbursementDetails() != null) {
218218
final BigDecimal expectedDisbursementAmount = loan.getDisbursementDetails().stream()
219-
.filter(detail -> detail.actualDisbursementDate() == null).map(LoanDisbursementDetails::principal)
219+
.filter(detail -> detail.actualDisbursementDate() == null).map(LoanDisbursementDetails::getPrincipal)
220220
.reduce(BigDecimal.ZERO, BigDecimal::add);
221221
approvedWithOverApplied = approvedWithOverApplied.subtract(expectedDisbursementAmount);
222222
}

fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/data/DisbursementData.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import java.time.LocalDate;
2323
import lombok.Getter;
2424
import lombok.RequiredArgsConstructor;
25+
import lombok.Setter;
26+
import lombok.experimental.Accessors;
2527
import org.apache.fineract.infrastructure.core.service.DateUtils;
2628
import org.apache.fineract.portfolio.loanaccount.loanschedule.domain.LoanScheduleType;
2729

@@ -30,6 +32,7 @@
3032
*/
3133
@RequiredArgsConstructor
3234
@Getter
35+
@Accessors(chain = true)
3336
public final class DisbursementData implements LoanPrincipalRelatedDataHolder, Comparable<DisbursementData> {
3437

3538
private final Long id;
@@ -41,6 +44,8 @@ public final class DisbursementData implements LoanPrincipalRelatedDataHolder, C
4144
private final String loanChargeId;
4245
private final BigDecimal chargeAmount;
4346
private final BigDecimal waivedChargeAmount;
47+
@Setter
48+
private BigDecimal disburseChargeAmount;
4449

4550
// import fields
4651
private transient Integer rowIndex;

fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/Loan.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,7 @@ public BigDecimal getDisbursedAmount() {
814814
if (isMultiDisburmentLoan()) {
815815
for (LoanDisbursementDetails disbursementDetail : getDisbursementDetails()) {
816816
if (disbursementDetail.actualDisbursementDate() != null) {
817-
principal = principal.add(disbursementDetail.principal());
817+
principal = principal.add(disbursementDetail.getPrincipal());
818818
}
819819
}
820820
return principal;
@@ -999,7 +999,7 @@ public BigDecimal getDisburseAmountForTemplate() {
999999
if (!details.isEmpty()) {
10001000
principal = BigDecimal.ZERO;
10011001
for (LoanDisbursementDetails disbursementDetails : details) {
1002-
principal = principal.add(disbursementDetails.principal());
1002+
principal = principal.add(disbursementDetails.getPrincipal());
10031003
}
10041004
}
10051005
return principal;
@@ -1303,7 +1303,7 @@ public void clearDisbursementDetails() {
13031303
public LoanDisbursementDetails getDisbursementDetails(final LocalDate transactionDate, final BigDecimal transactionAmount) {
13041304
for (LoanDisbursementDetails disbursementDetail : this.disbursementDetails) {
13051305
if (!disbursementDetail.isReversed() && disbursementDetail.getDisbursementDate().equals(transactionDate)
1306-
&& (disbursementDetail.principal().compareTo(transactionAmount) == 0)) {
1306+
&& (disbursementDetail.getPrincipal().compareTo(transactionAmount) == 0)) {
13071307
return disbursementDetail;
13081308
}
13091309
}
@@ -1317,7 +1317,7 @@ public BigDecimal getPrincipalAmountForRepaymentSchedule() {
13171317
Collection<LoanDisbursementDetails> loanDisburseDetails = this.getDisbursementDetails();
13181318
for (LoanDisbursementDetails details : loanDisburseDetails) {
13191319
if (details.actualDisbursementDate() != null) {
1320-
principalAmount = principalAmount.add(details.principal());
1320+
principalAmount = principalAmount.add(details.getPrincipal());
13211321
}
13221322
}
13231323
} else if (isApproved()) {

fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanDisbursementDetails.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@
2626
import java.math.BigDecimal;
2727
import java.time.LocalDate;
2828
import java.util.Objects;
29+
import lombok.Getter;
2930
import org.apache.fineract.infrastructure.core.domain.AbstractPersistableCustom;
3031
import org.apache.fineract.infrastructure.core.service.DateUtils;
3132
import org.apache.fineract.portfolio.loanaccount.data.DisbursementData;
3233

34+
@Getter
3335
@Entity
3436
@Table(name = "m_loan_disbursement_detail")
3537
public class LoanDisbursementDetails extends AbstractPersistableCustom<Long> {
@@ -107,10 +109,6 @@ public LocalDate actualDisbursementDate() {
107109
return this.actualDisbursementDate;
108110
}
109111

110-
public BigDecimal principal() {
111-
return this.principal;
112-
}
113-
114112
public void updatePrincipal(BigDecimal principal) {
115113
this.principal = principal;
116114
}

fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanRepaymentScheduleProcessingWrapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ private Money cumulativeFeeChargesDueWithin(final LocalDate periodStart, final L
108108
&& loanCharge.getLoan().isMultiDisburmentLoan()) {
109109
for (final LoanDisbursementDetails loanDisbursementDetails : loanCharge.getLoan().getDisbursementDetails()) {
110110
if (!DateUtils.isAfter(loanDisbursementDetails.expectedDisbursementDate(), loanCharge.getDueDate())) {
111-
amount = amount.add(loanDisbursementDetails.principal());
111+
amount = amount.add(loanDisbursementDetails.getPrincipal());
112112
}
113113
}
114114
} else {

fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/SingleLoanChargeRepaymentScheduleProcessingWrapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ private Money calcChargeDue(final LocalDate periodStart, final LocalDate periodE
132132
// Then we need to get as of this loan charge due date how much amount disbursed.
133133
for (final LoanDisbursementDetails loanDisbursementDetails : loan.getDisbursementDetails()) {
134134
if (!DateUtils.isAfter(loanDisbursementDetails.expectedDisbursementDate(), loanCharge.getDueDate())) {
135-
baseAmount = MathUtil.add(baseAmount, loanDisbursementDetails.principal());
135+
baseAmount = MathUtil.add(baseAmount, loanDisbursementDetails.getPrincipal());
136136
}
137137
}
138138
} else {

fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/mapper/LoanMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public List<DisbursementData> getDisbursementData(final Loan loan) {
9494
BigDecimal waivedChargeAmount = null;
9595
disbursementData.add(
9696
new DisbursementData(loanDisbursementDetails.getId(), loan.getId(), expectedDisbursementDate, actualDisbursementDate,
97-
loanDisbursementDetails.principal(), loan.getNetDisbursalAmount(), null, null, waivedChargeAmount));
97+
loanDisbursementDetails.getPrincipal(), loan.getNetDisbursalAmount(), null, null, waivedChargeAmount));
9898
}
9999

100100
return disbursementData;

fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanApprovedAmountWritePlatformServiceImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public CommandProcessingResult modifyLoanAvailableDisbursementAmount(Long loanId
8888
changes.put("oldApprovedAmount", loan.getApprovedPrincipal());
8989

9090
BigDecimal expectedDisbursementAmount = loan.getDisbursementDetails().stream().filter(t -> t.actualDisbursementDate() == null)
91-
.map(LoanDisbursementDetails::principal).reduce(BigDecimal.ZERO, BigDecimal::add);
91+
.map(LoanDisbursementDetails::getPrincipal).reduce(BigDecimal.ZERO, BigDecimal::add);
9292

9393
BigDecimal oldAvailableDisbursement = loan.getApprovedPrincipal().subtract(loan.getSummary().getTotalPrincipal())
9494
.subtract(expectedDisbursementAmount);

0 commit comments

Comments
 (0)