FINERACT-1818-Loan-Retrieve-Api-data-addition
Fineract Build & Test - MySQL / build (push) Canceled after 0s
Fineract Build & Test - PostgreSQL / build (push) Canceled after 0s
Fineract Docker build - MariaDB / build (push) Canceled after 0s
Fineract Docker build - PostgreSQL / build (push) Canceled after 0s
Fineract Documentation build / build (push) Canceled after 0s
Fineract Build & Test - MariaDB / build (push) Canceled after 0s

This commit is contained in:
Ruchi Dhamankar
2022-12-06 13:52:48 +01:00
committed by Arnold Gálovics
parent 5478435567
commit 29b900cccd
5 changed files with 370 additions and 2 deletions
@@ -119,6 +119,7 @@ import org.apache.fineract.portfolio.loanaccount.data.LoanAccountData;
import org.apache.fineract.portfolio.loanaccount.data.LoanApprovalData;
import org.apache.fineract.portfolio.loanaccount.data.LoanChargeData;
import org.apache.fineract.portfolio.loanaccount.data.LoanCollateralManagementData;
import org.apache.fineract.portfolio.loanaccount.data.LoanSummaryData;
import org.apache.fineract.portfolio.loanaccount.data.LoanTermVariationsData;
import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData;
import org.apache.fineract.portfolio.loanaccount.data.PaidInAdvanceData;
@@ -713,6 +714,11 @@ public class LoansApiResource {
rates = this.rateReadService.retrieveLoanRates(loanId);
}
// updating summary with transaction amounts summary
if (loanRepayments != null) {
loanBasicDetails.setSummary(LoanSummaryData.withTransactionAmountsSummary(loanBasicDetails.getSummary(), loanRepayments));
}
final LoanAccountData loanAccount = LoanAccountData.associationsAndTemplate(loanBasicDetails, repaymentSchedule, loanRepayments,
charges, loanCollateralManagementData, guarantors, meeting, productOptions, loanTermFrequencyTypeOptions,
repaymentFrequencyTypeOptions, repaymentFrequencyNthDayTypeOptions, repaymentFrequencyDayOfWeekTypeOptions,
@@ -561,6 +561,32 @@ final class LoansApiResourceSwagger {
public Boolean inArrears;
@Schema(example = "false")
public Boolean isNPA;
@Schema(example = "0.000000")
public Double totalMerchantRefund;
@Schema(example = "0.000000")
public Double totalMerchantRefundReversed;
@Schema(example = "0.000000")
public Double totalPayoutRefund;
@Schema(example = "0.000000")
public Double totalPayoutRefundReversed;
@Schema(example = "0.000000")
public Double totalGoodwillCredit;
@Schema(example = "0.000000")
public Double totalGoodwillCreditReversed;
@Schema(example = "0.000000")
public Double totalChargeAdjustment;
@Schema(example = "0.000000")
public Double totalChargeAdjustmentReversed;
@Schema(example = "0.000000")
public Double totalChargeback;
@Schema(example = "0.000000")
public Double totalCreditBalanceRefund;
@Schema(example = "0.000000")
public Double totalCreditBalanceRefundReversed;
@Schema(example = "0.000000")
public Double totalRepaymentTransaction;
@Schema(example = "0.000000")
public Double totalRepaymentTransactionReversed;
public Set<GetLoansLoanIdOverdueCharges> overdueCharges;
}
@@ -20,13 +20,17 @@ package org.apache.fineract.portfolio.loanaccount.data;
import java.math.BigDecimal;
import java.time.LocalDate;
import lombok.Getter;
import java.util.Collection;
import lombok.Data;
import lombok.experimental.Accessors;
import org.apache.fineract.organisation.monetary.data.CurrencyData;
import org.apache.fineract.portfolio.loanaccount.domain.LoanTransactionType;
/**
* Immutable data object representing loan summary information.
*/
@Getter
@Data
@Accessors(chain = true)
public class LoanSummaryData {
private final CurrencyData currency;
@@ -68,6 +72,21 @@ public class LoanSummaryData {
private final Long writeoffReasonId;
private final String writeoffReason;
// Adding fields for transaction summary
private BigDecimal totalMerchantRefund;
private BigDecimal totalMerchantRefundReversed;
private BigDecimal totalPayoutRefund;
private BigDecimal totalPayoutRefundReversed;
private BigDecimal totalGoodwillCredit;
private BigDecimal totalGoodwillCreditReversed;
private BigDecimal totalChargeAdjustment;
private BigDecimal totalChargeAdjustmentReversed;
private BigDecimal totalChargeback;
private BigDecimal totalCreditBalanceRefund;
private BigDecimal totalCreditBalanceRefundReversed;
private BigDecimal totalRepaymentTransaction;
private BigDecimal totalRepaymentTransactionReversed;
public LoanSummaryData(final CurrencyData currency, final BigDecimal principalDisbursed, final BigDecimal principalAdjustments,
final BigDecimal principalPaid, final BigDecimal principalWrittenOff, final BigDecimal principalOutstanding,
final BigDecimal principalOverdue, final BigDecimal interestCharged, final BigDecimal interestPaid,
@@ -120,4 +139,70 @@ public class LoanSummaryData {
this.writeoffReason = writeoffReason;
this.totalRecovered = totalRecovered;
}
public static LoanSummaryData withTransactionAmountsSummary(final LoanSummaryData defaultSummaryData,
final Collection<LoanTransactionData> loanTransactions) {
BigDecimal totalMerchantRefund = computeTotalAmountForNonReversedTransactions(LoanTransactionType.MERCHANT_ISSUED_REFUND,
loanTransactions);
BigDecimal totalMerchantRefundReversed = computeTotalAmountForReversedTransactions(LoanTransactionType.MERCHANT_ISSUED_REFUND,
loanTransactions);
BigDecimal totalPayoutRefund = computeTotalAmountForNonReversedTransactions(LoanTransactionType.PAYOUT_REFUND, loanTransactions);
BigDecimal totalPayoutRefundReversed = computeTotalAmountForReversedTransactions(LoanTransactionType.PAYOUT_REFUND,
loanTransactions);
BigDecimal totalGoodwillCredit = computeTotalAmountForNonReversedTransactions(LoanTransactionType.GOODWILL_CREDIT,
loanTransactions);
BigDecimal totalGoodwillCreditReversed = computeTotalAmountForReversedTransactions(LoanTransactionType.GOODWILL_CREDIT,
loanTransactions);
BigDecimal totalChargeAdjustment = computeTotalAmountForNonReversedTransactions(LoanTransactionType.CHARGE_ADJUSTMENT,
loanTransactions);
BigDecimal totalChargeAdjustmentReversed = computeTotalAmountForReversedTransactions(LoanTransactionType.CHARGE_ADJUSTMENT,
loanTransactions);
BigDecimal totalChargeback = computeTotalAmountForNonReversedTransactions(LoanTransactionType.CHARGEBACK, loanTransactions);
BigDecimal totalCreditBalanceRefund = computeTotalAmountForNonReversedTransactions(LoanTransactionType.CREDIT_BALANCE_REFUND,
loanTransactions);
BigDecimal totalCreditBalanceRefundReversed = computeTotalAmountForReversedTransactions(LoanTransactionType.CREDIT_BALANCE_REFUND,
loanTransactions);
BigDecimal totalRepaymentTransaction = computeTotalAmountForNonReversedTransactions(LoanTransactionType.REPAYMENT,
loanTransactions);
BigDecimal totalRepaymentTransactionReversed = computeTotalAmountForReversedTransactions(LoanTransactionType.REPAYMENT,
loanTransactions);
return new LoanSummaryData(defaultSummaryData.currency, defaultSummaryData.principalDisbursed,
defaultSummaryData.principalAdjustments, defaultSummaryData.principalPaid, defaultSummaryData.principalWrittenOff,
defaultSummaryData.principalOutstanding, defaultSummaryData.principalOverdue, defaultSummaryData.interestCharged,
defaultSummaryData.interestPaid, defaultSummaryData.interestWaived, defaultSummaryData.interestWrittenOff,
defaultSummaryData.interestOutstanding, defaultSummaryData.interestOverdue, defaultSummaryData.feeChargesCharged,
defaultSummaryData.feeChargesDueAtDisbursementCharged, defaultSummaryData.feeChargesPaid,
defaultSummaryData.feeChargesWaived, defaultSummaryData.feeChargesWrittenOff, defaultSummaryData.feeChargesOutstanding,
defaultSummaryData.feeChargesOverdue, defaultSummaryData.penaltyChargesCharged, defaultSummaryData.penaltyChargesPaid,
defaultSummaryData.penaltyChargesWaived, defaultSummaryData.penaltyChargesWrittenOff,
defaultSummaryData.penaltyChargesOutstanding, defaultSummaryData.penaltyChargesOverdue,
defaultSummaryData.totalExpectedRepayment, defaultSummaryData.totalRepayment, defaultSummaryData.totalExpectedCostOfLoan,
defaultSummaryData.totalCostOfLoan, defaultSummaryData.totalWaived, defaultSummaryData.totalWrittenOff,
defaultSummaryData.totalOutstanding, defaultSummaryData.totalOverdue, defaultSummaryData.overdueSinceDate,
defaultSummaryData.writeoffReasonId, defaultSummaryData.writeoffReason, defaultSummaryData.totalRecovered)
.setTotalMerchantRefund(totalMerchantRefund).setTotalMerchantRefundReversed(totalMerchantRefundReversed)
.setTotalPayoutRefund(totalPayoutRefund).setTotalPayoutRefundReversed(totalPayoutRefundReversed)
.setTotalGoodwillCredit(totalGoodwillCredit).setTotalGoodwillCreditReversed(totalGoodwillCreditReversed)
.setTotalChargeAdjustment(totalChargeAdjustment).setTotalChargeAdjustmentReversed(totalChargeAdjustmentReversed)
.setTotalChargeback(totalChargeback).setTotalCreditBalanceRefund(totalCreditBalanceRefund)
.setTotalCreditBalanceRefundReversed(totalCreditBalanceRefundReversed)
.setTotalRepaymentTransaction(totalRepaymentTransaction)
.setTotalRepaymentTransactionReversed(totalRepaymentTransactionReversed);
}
private static BigDecimal computeTotalAmountForReversedTransactions(LoanTransactionType transactionType,
Collection<LoanTransactionData> loanTransactions) {
return loanTransactions.stream().filter(
transaction -> transaction.getType().getCode().equals(transactionType.getCode()) && transaction.getReversedOnDate() != null)
.map(txn -> txn.getAmount()).reduce(BigDecimal.ZERO, BigDecimal::add);
}
private static BigDecimal computeTotalAmountForNonReversedTransactions(LoanTransactionType transactionType,
Collection<LoanTransactionData> loanTransactions) {
return loanTransactions.stream().filter(
transaction -> transaction.getType().getCode().equals(transactionType.getCode()) && transaction.getReversedOnDate() == null)
.map(txn -> txn.getAmount()).reduce(BigDecimal.ZERO, BigDecimal::add);
}
}
@@ -434,6 +434,32 @@ final class SelfLoansApiResourceSwagger {
public Boolean inArrears;
@Schema(example = "false")
public Boolean isNPA;
@Schema(example = "0.000000")
public Double totalMerchantRefund;
@Schema(example = "0.000000")
public Double totalMerchantRefundReversed;
@Schema(example = "0.000000")
public Double totalPayoutRefund;
@Schema(example = "0.000000")
public Double totalPayoutRefundReversed;
@Schema(example = "0.000000")
public Double totalGoodwillCredit;
@Schema(example = "0.000000")
public Double totalGoodwillCreditReversed;
@Schema(example = "0.000000")
public Double totalChargeAdjustment;
@Schema(example = "0.000000")
public Double totalChargeAdjustmentReversed;
@Schema(example = "0.000000")
public Double totalChargeback;
@Schema(example = "0.000000")
public Double totalCreditBalanceRefund;
@Schema(example = "0.000000")
public Double totalCreditBalanceRefundReversed;
@Schema(example = "0.000000")
public Double totalRepaymentTransaction;
@Schema(example = "0.000000")
public Double totalRepaymentTransactionReversed;
public Set<GetLoansLoanIdOverdueCharges> overdueCharges;
}