From 48d35f06304f1168035c760da1862defca6bd7c9 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 17 Jul 2018 21:23:32 +0530 Subject: [PATCH] Implementing parallelizing and paging of periodic accurual --- .../service/LoanReadPlatformService.java | 5 ++ .../service/LoanReadPlatformServiceImpl.java | 73 +++++++++++++------ 2 files changed, 55 insertions(+), 23 deletions(-) mode change 100755 => 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java mode change 100755 => 100644 fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java old mode 100755 new mode 100644 index e205fbf19ed..e50bb800b9f --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformService.java @@ -21,6 +21,7 @@ import java.math.BigDecimal; import java.util.Collection; import java.util.Date; +import java.util.List; import org.apache.fineract.infrastructure.core.service.Page; import org.apache.fineract.infrastructure.core.service.SearchParameters; @@ -134,4 +135,8 @@ LoanScheduleData retrieveRepaymentSchedule(Long loanId, RepaymentScheduleRelated LoanAccountData retrieveLoanByLoanAccount(String loanAccountNumber); Long retrieveLoanIdByAccountNumber(String loanAccountNumber); + + List retrivePeriodicAccrualData(final LocalDate tillDate, int offsetCounter, + int maxPageSize, long maxLoanIdInList, final String officeHierarchy); + } \ No newline at end of file diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java old mode 100755 new mode 100644 index e2464d83bbd..56bf09d029d --- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java +++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/service/LoanReadPlatformServiceImpl.java @@ -1651,29 +1651,34 @@ public Collection retrivePeriodicAccrualData(final Loca } private static final class LoanSchedulePeriodicAccrualMapper implements RowMapper { - - public String schema() { - final StringBuilder sqlBuilder = new StringBuilder(400); - sqlBuilder - .append("loan.id as loanId ,if(loan.client_id is null,mg.office_id,mc.office_id) as officeId,") - .append("loan.accrued_till as accruedTill, loan.repayment_period_frequency_enum as frequencyEnum, ") - .append("loan.interest_calculated_from_date as interestCalculatedFrom, ") - .append("loan.repay_every as repayEvery,") - .append("ls.installment as installmentNumber, ") - .append("ls.duedate as duedate,ls.fromdate as fromdate ,ls.id as scheduleId,loan.product_id as productId,") - .append("ls.interest_amount as interest, ls.interest_waived_derived as interestWaived,") - .append("ls.penalty_charges_amount as penalty, ") - .append("ls.fee_charges_amount as charges, ") - .append("ls.accrual_interest_derived as accinterest,ls.accrual_fee_charges_derived as accfeecharege,ls.accrual_penalty_charges_derived as accpenalty,") - .append(" loan.currency_code as currencyCode,loan.currency_digits as currencyDigits,loan.currency_multiplesof as inMultiplesOf,") - .append("curr.display_symbol as currencyDisplaySymbol,curr.name as currencyName,curr.internationalized_name_code as currencyNameCode") - .append(" from m_loan_repayment_schedule ls ").append(" left join m_loan loan on loan.id=ls.loan_id ") - .append(" left join m_product_loan mpl on mpl.id = loan.product_id") - .append(" left join m_client mc on mc.id = loan.client_id ").append(" left join m_group mg on mg.id = loan.group_id") - .append(" left join m_currency curr on curr.code = loan.currency_code") - .append(" left join m_loan_recalculation_details as recaldet on loan.id = recaldet.loan_id "); - return sqlBuilder.toString(); - } + + public String schema() { + final StringBuilder sqlBuilder = new StringBuilder(400); + sqlBuilder + .append("loan.id as loanId , mc.office_id as officeId, loan.loan_status_id as loanStatusId, ") + .append("loan.accrued_till as accruedTill, loan.repayment_period_frequency_enum as frequencyEnum, ") + .append("loan.interest_calculated_from_date as interestCalculatedFrom, ") + .append("loan.repay_every as repayEvery,loan.is_npa as npa,") + .append("ls.installment as installmentNumber, ") + .append("ls.duedate as duedate,ls.fromdate as fromdate ,ls.id as scheduleId,loan.product_id as productId,") + .append("ls.interest_amount as interest, ls.interest_waived_derived as interestWaived,") + .append("ls.penalty_charges_amount as penalty, ") + .append("ls.fee_charges_amount as charges, ") + .append("ls.accrual_interest_derived as accinterest,ls.accrual_fee_charges_derived as accfeecharege,ls.accrual_penalty_charges_derived as accpenalty,") + .append("loan.currency_code as currencyCode,loan.currency_digits as currencyDigits,loan.currency_multiplesof as inMultiplesOf,") + .append("curr.display_symbol as currencyDisplaySymbol,curr.name as currencyName,curr.internationalized_name_code as currencyNameCode ") + .append("from m_loan_repayment_schedule ls INNER JOIN (SELECT l.id, l.client_id, l.product_id, l.accrued_till, l.repayment_period_frequency_enum,") + .append("l.interest_calculated_from_date, l.repay_every, l.is_npa, l.currency_code, l.currency_digits, l.currency_multiplesof, l.loan_status_id ") + .append("from m_loan l inner join m_client mc on mc.id = l.client_id inner join m_office o on mc.office_id = o.id where ") + .append("l.loan_status_id= ? and l.is_npa=0 and l.maturedon_date >= CURDATE() and l.accrued_till <=? and o.hierarchy like ? ") + .append("and l.id >= ? limit ? ") + .append(") loan on loan.id=ls.loan_id ") + .append("inner join m_product_loan mpl on mpl.id = loan.product_id ") + .append("inner join m_client mc on mc.id = loan.client_id ") + .append("inner join m_currency curr on curr.code = loan.currency_code ") + .append("inner join m_office o on mc.office_id = o.id "); + return sqlBuilder.toString(); + } @Override public LoanScheduleAccrualData mapRow(ResultSet rs, @SuppressWarnings("unused") int rowNum) throws SQLException { @@ -2198,6 +2203,7 @@ public LoanTransactionData mapRow(ResultSet rs, int rowNum) throws SQLException } + @Override public Long retrieveLoanIdByAccountNumber(String loanAccountNumber) { try { @@ -2209,4 +2215,25 @@ public Long retrieveLoanIdByAccountNumber(String loanAccountNumber) { } } + + @Override + public List retrivePeriodicAccrualData(LocalDate tillDate, int offsetCounter, + int maxPageSize, long maxLoanIdInList, + String officeHierarchy) { + LoanSchedulePeriodicAccrualMapper mapper = new LoanSchedulePeriodicAccrualMapper(); + final StringBuilder sqlBuilder = new StringBuilder(400); + sqlBuilder.append("select SQL_CALC_FOUND_ROWS OUTPUT.* from ("); + sqlBuilder + .append("select ") + .append(mapper.schema()) + .append(" where loan.accrued_till < ls.duedate and mpl.accounting_type=? ") + .append(" and ls.completed_derived = 0 and ls.fromdate < ? ") + .append(" order by loan.id, ls.duedate"); + sqlBuilder.append(" ) OUTPUT"); + return this.jdbcTemplate.query(sqlBuilder.toString(), mapper, new Object[] { LoanStatus.ACTIVE.getValue(), formatter.print(tillDate), + officeHierarchy,maxLoanIdInList, maxPageSize, AccountingRuleType.ACCRUAL_PERIODIC.getValue(),formatter.print(tillDate)}); + } + + + }