|
39 | 39 | import java.util.Set; |
40 | 40 | import java.util.stream.Collectors; |
41 | 41 | import lombok.RequiredArgsConstructor; |
| 42 | +import lombok.extern.slf4j.Slf4j; |
42 | 43 | import org.apache.commons.lang3.StringUtils; |
43 | 44 | import org.apache.fineract.infrastructure.codes.data.CodeValueData; |
44 | 45 | import org.apache.fineract.infrastructure.codes.service.CodeValueReadPlatformService; |
|
159 | 160 | import org.springframework.transaction.annotation.Transactional; |
160 | 161 | import org.springframework.util.CollectionUtils; |
161 | 162 |
|
| 163 | +@Slf4j |
162 | 164 | @RequiredArgsConstructor |
163 | 165 | @Transactional(readOnly = true) |
164 | 166 | public class LoanReadPlatformServiceImpl implements LoanReadPlatformService, LoanReadPlatformServiceCommon { |
@@ -540,14 +542,11 @@ public LoanTransactionData retrieveLoanTransactionTemplate(final Long loanId, fi |
540 | 542 |
|
541 | 543 | @Override |
542 | 544 | public LoanTransactionData retrieveLoanTransactionTemplate(final Long loanId) { |
543 | | - |
544 | 545 | this.context.authenticatedUser(); |
545 | 546 |
|
546 | | - RepaymentTransactionTemplateMapper mapper = new RepaymentTransactionTemplateMapper(sqlGenerator); |
547 | | - String sql = "select " + mapper.schema(); |
548 | | - LoanTransactionData loanTransactionData = this.jdbcTemplate.queryForObject(sql, mapper, // NOSONAR |
549 | | - LoanTransactionType.REPAYMENT.getValue(), LoanTransactionType.DOWN_PAYMENT.getValue(), |
550 | | - LoanTransactionType.REPAYMENT.getValue(), LoanTransactionType.DOWN_PAYMENT.getValue(), loanId, loanId); |
| 547 | + final RepaymentTransactionTemplateMapper mapper = new RepaymentTransactionTemplateMapper(sqlGenerator); |
| 548 | + LoanTransactionData loanTransactionData = this.jdbcTemplate.queryForObject("select " + mapper.schema(), mapper, // NOSONAR |
| 549 | + LoanTransactionType.REPAYMENT.getValue(), LoanTransactionType.DOWN_PAYMENT.getValue(), loanId); |
551 | 550 | final Collection<PaymentTypeData> paymentOptions = this.paymentTypeReadPlatformService.retrieveAllPaymentTypes(); |
552 | 551 | return LoanTransactionData.templateOnTop(loanTransactionData, paymentOptions); |
553 | 552 | } |
@@ -2125,33 +2124,21 @@ private static final class RepaymentTransactionTemplateMapper implements RowMapp |
2125 | 2124 |
|
2126 | 2125 | public String schema() { |
2127 | 2126 | // TODO: investigate whether it can be refactored to be more efficient |
2128 | | - StringBuilder sqlBuilder = new StringBuilder(); |
2129 | | - sqlBuilder.append("(CASE "); |
2130 | | - sqlBuilder.append( |
2131 | | - "WHEN (select max(tr.transaction_date) as transaction_date from m_loan_transaction tr where tr.loan_id = l.id AND tr.transaction_type_enum in (?,?) AND tr.is_reversed = false) > ls.dueDate "); |
2132 | | - sqlBuilder.append( |
2133 | | - "THEN (select max(tr.transaction_date) as transaction_date from m_loan_transaction tr where tr.loan_id = l.id AND tr.transaction_type_enum in (?,?) AND tr.is_reversed = false) "); |
2134 | | - sqlBuilder.append("ELSE ls.dueDate END) as transactionDate, "); |
2135 | | - sqlBuilder.append( |
2136 | | - "ls.principal_amount - coalesce(ls.principal_writtenoff_derived, 0) - coalesce(ls.principal_completed_derived, 0) as principalDue, "); |
2137 | | - sqlBuilder.append( |
2138 | | - "ls.interest_amount - coalesce(ls.interest_completed_derived, 0) - coalesce(ls.interest_waived_derived, 0) - coalesce(ls.interest_writtenoff_derived, 0) as interestDue, "); |
2139 | | - sqlBuilder.append( |
2140 | | - "ls.fee_charges_amount - coalesce(ls.fee_charges_completed_derived, 0) - coalesce(ls.fee_charges_writtenoff_derived, 0) - coalesce(ls.fee_charges_waived_derived, 0) as feeDue, "); |
2141 | | - sqlBuilder.append( |
2142 | | - "ls.penalty_charges_amount - coalesce(ls.penalty_charges_completed_derived, 0) - coalesce(ls.penalty_charges_writtenoff_derived, 0) - coalesce(ls.penalty_charges_waived_derived, 0) as penaltyDue, "); |
2143 | | - sqlBuilder.append( |
2144 | | - "l.currency_code as currencyCode, l.currency_digits as currencyDigits, l.currency_multiplesof as inMultiplesOf, l.net_disbursal_amount as netDisbursalAmount, "); |
2145 | | - sqlBuilder.append("rc." + sqlGenerator.escape("name") |
2146 | | - + " as currencyName, rc.display_symbol as currencyDisplaySymbol, rc.internationalized_name_code as currencyNameCode "); |
2147 | | - sqlBuilder.append("FROM m_loan l "); |
2148 | | - sqlBuilder.append("JOIN m_currency rc on rc." + sqlGenerator.escape("code") + " = l.currency_code "); |
2149 | | - sqlBuilder.append("JOIN m_loan_repayment_schedule ls ON ls.loan_id = l.id AND ls.completed_derived = false "); |
2150 | | - sqlBuilder.append( |
2151 | | - "JOIN((SELECT ls.loan_id, ls.duedate as datedue FROM m_loan_repayment_schedule ls WHERE ls.loan_id = ? and ls.completed_derived = false ORDER BY ls.duedate LIMIT 1)) asq on asq.loan_id = ls.loan_id "); |
2152 | | - sqlBuilder.append("AND asq.datedue = ls.duedate "); |
2153 | | - sqlBuilder.append("WHERE l.id = ? LIMIT 1"); |
2154 | | - return sqlBuilder.toString(); |
| 2127 | + return " GREATEST(loan_transaction.transaction_date, ls.dueDate) as transactionDate," |
| 2128 | + + " coalesce(ls.principal_amount, 0) - coalesce(ls.principal_writtenoff_derived, 0) - coalesce(ls.principal_completed_derived, 0) as principalDue," |
| 2129 | + + " coalesce(ls.interest_amount, 0) - coalesce(ls.interest_completed_derived, 0) - coalesce(ls.interest_waived_derived, 0) - coalesce(ls.interest_writtenoff_derived, 0) as interestDue," |
| 2130 | + + " coalesce(ls.fee_charges_amount, 0) - coalesce(ls.fee_charges_completed_derived, 0) - coalesce(ls.fee_charges_writtenoff_derived, 0) - coalesce(ls.fee_charges_waived_derived, 0) as feeDue," |
| 2131 | + + " coalesce(ls.penalty_charges_amount, 0) - coalesce(ls.penalty_charges_completed_derived, 0) - coalesce(ls.penalty_charges_writtenoff_derived, 0) - coalesce(ls.penalty_charges_waived_derived, 0) as penaltyDue," |
| 2132 | + + " l.currency_code as currencyCode," + " l.currency_digits as currencyDigits," |
| 2133 | + + " l.currency_multiplesof as inMultiplesOf," + " l.net_disbursal_amount as netDisbursalAmount," + " rc." |
| 2134 | + + sqlGenerator.escape("name") + " as currencyName," + " rc.display_symbol as currencyDisplaySymbol," |
| 2135 | + + " rc.internationalized_name_code as currencyNameCode" + " FROM" + " m_loan l" + " JOIN m_currency rc on rc." |
| 2136 | + + sqlGenerator.escape("code") + " = l.currency_code" |
| 2137 | + + " JOIN m_loan_repayment_schedule ls ON ls.loan_id = l.id AND (l.loan_status_id >= 600 OR ls.completed_derived = false)" |
| 2138 | + + " LEFT JOIN (" + " select tr.loan_id, max(tr.transaction_date) as transaction_date" + " from m_loan_transaction tr" |
| 2139 | + + " where tr.transaction_type_enum in (?,?)" + " AND tr.is_reversed = false" + " group by tr.loan_id" |
| 2140 | + + " ) loan_transaction ON loan_transaction.loan_id = l.id" + " WHERE l.id = ?" + " ORDER BY ls.installment" |
| 2141 | + + " LIMIT 1"; |
2155 | 2142 | } |
2156 | 2143 |
|
2157 | 2144 | @Override |
|
0 commit comments