From 2d44a2860768bf171a65de91c93e4b513db416dc Mon Sep 17 00:00:00 2001 From: Madhukar Date: Tue, 18 Feb 2014 14:31:47 +0530 Subject: [PATCH] MIFOSX-864 Add timeline for list client loans --- .../data/LoanAccountSummaryData.java | 6 +- .../data/SavingsAccountSummaryData.java | 5 +- ...sReadPlatformServiceJpaRepositoryImpl.java | 152 +++++++++++++++++- .../data/LoanApplicationTimelineData.java | 8 + 4 files changed, 164 insertions(+), 7 deletions(-) diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/data/LoanAccountSummaryData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/data/LoanAccountSummaryData.java index 15a64d472..ad5f08dbd 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/data/LoanAccountSummaryData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/data/LoanAccountSummaryData.java @@ -6,6 +6,7 @@ package org.mifosplatform.portfolio.accountdetails.data; import org.mifosplatform.infrastructure.core.data.EnumOptionData; +import org.mifosplatform.portfolio.loanaccount.data.LoanApplicationTimelineData; import org.mifosplatform.portfolio.loanaccount.data.LoanStatusEnumData; /** @@ -22,9 +23,11 @@ public class LoanAccountSummaryData { private final LoanStatusEnumData status; private final EnumOptionData loanType; private final Integer loanCycle; + private final LoanApplicationTimelineData timeline; public LoanAccountSummaryData(final Long id, final String accountNo, final String externalId, final Long productId, - final String loanProductName, final LoanStatusEnumData loanStatus, final EnumOptionData loanType, final Integer loanCycle) { + final String loanProductName, final LoanStatusEnumData loanStatus, final EnumOptionData loanType, final Integer loanCycle, + final LoanApplicationTimelineData timeline) { this.id = id; this.accountNo = accountNo; this.externalId = externalId; @@ -33,5 +36,6 @@ public class LoanAccountSummaryData { this.status = loanStatus; this.loanType = loanType; this.loanCycle = loanCycle; + this.timeline = timeline; } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/data/SavingsAccountSummaryData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/data/SavingsAccountSummaryData.java index ad8fee7fc..b5731bca5 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/data/SavingsAccountSummaryData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/data/SavingsAccountSummaryData.java @@ -9,6 +9,7 @@ import java.math.BigDecimal; import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.organisation.monetary.data.CurrencyData; +import org.mifosplatform.portfolio.savings.data.SavingsAccountApplicationTimelineData; import org.mifosplatform.portfolio.savings.data.SavingsAccountStatusEnumData; /** @@ -26,10 +27,11 @@ public class SavingsAccountSummaryData { private final CurrencyData currency; private final BigDecimal accountBalance; private final EnumOptionData accountType; + private final SavingsAccountApplicationTimelineData timeline; public SavingsAccountSummaryData(final Long id, final String accountNo, final String externalId, final Long productId, final String productName, final SavingsAccountStatusEnumData status, final CurrencyData currency, - final BigDecimal accountBalance, final EnumOptionData accountType) { + final BigDecimal accountBalance, final EnumOptionData accountType, final SavingsAccountApplicationTimelineData timeline) { this.id = id; this.accountNo = accountNo; this.externalId = externalId; @@ -39,5 +41,6 @@ public class SavingsAccountSummaryData { this.currency = currency; this.accountBalance = accountBalance; this.accountType = accountType; + this.timeline = timeline; } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java index 6921b41c9..e667a941f 100755 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/accountdetails/service/AccountDetailsReadPlatformServiceJpaRepositoryImpl.java @@ -6,6 +6,7 @@ import java.sql.SQLException; import java.util.Collection; import java.util.List; +import org.joda.time.LocalDate; import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.infrastructure.core.domain.JdbcSupport; import org.mifosplatform.infrastructure.core.service.RoutingDataSource; @@ -15,8 +16,10 @@ import org.mifosplatform.portfolio.accountdetails.data.LoanAccountSummaryData; import org.mifosplatform.portfolio.accountdetails.data.SavingsAccountSummaryData; import org.mifosplatform.portfolio.client.service.ClientReadPlatformService; import org.mifosplatform.portfolio.group.service.GroupReadPlatformService; +import org.mifosplatform.portfolio.loanaccount.data.LoanApplicationTimelineData; import org.mifosplatform.portfolio.loanaccount.data.LoanStatusEnumData; import org.mifosplatform.portfolio.loanproduct.service.LoanEnumerations; +import org.mifosplatform.portfolio.savings.data.SavingsAccountApplicationTimelineData; import org.mifosplatform.portfolio.savings.data.SavingsAccountStatusEnumData; import org.mifosplatform.portfolio.savings.service.SavingsEnumerations; import org.springframework.beans.factory.annotation.Autowired; @@ -109,6 +112,31 @@ public class AccountDetailsReadPlatformServiceJpaRepositoryImpl implements Accou accountsSummary.append("sa.id as id, sa.account_no as accountNo, sa.external_id as externalId, sa.status_enum as statusEnum, "); accountsSummary.append("sa.account_type_enum as accountType, "); accountsSummary.append("sa.account_balance_derived as accountBalance, "); + + accountsSummary.append("sa.submittedon_date as submittedOnDate,"); + accountsSummary.append("sbu.username as submittedByUsername,"); + accountsSummary.append("sbu.firstname as submittedByFirstname, sbu.lastname as submittedByLastname,"); + + accountsSummary.append("sa.rejectedon_date as rejectedOnDate,"); + accountsSummary.append("rbu.username as rejectedByUsername,"); + accountsSummary.append("rbu.firstname as rejectedByFirstname, rbu.lastname as rejectedByLastname,"); + + accountsSummary.append("sa.withdrawnon_date as withdrawnOnDate,"); + accountsSummary.append("wbu.username as withdrawnByUsername,"); + accountsSummary.append("wbu.firstname as withdrawnByFirstname, wbu.lastname as withdrawnByLastname,"); + + accountsSummary.append("sa.approvedon_date as approvedOnDate,"); + accountsSummary.append("abu.username as approvedByUsername,"); + accountsSummary.append("abu.firstname as approvedByFirstname, abu.lastname as approvedByLastname,"); + + accountsSummary.append("sa.activatedon_date as activatedOnDate,"); + accountsSummary.append("avbu.username as activatedByUsername,"); + accountsSummary.append("avbu.firstname as activatedByFirstname, avbu.lastname as activatedByLastname,"); + + accountsSummary.append("sa.closedon_date as closedOnDate,"); + accountsSummary.append("cbu.username as closedByUsername,"); + accountsSummary.append("cbu.firstname as closedByFirstname, cbu.lastname as closedByLastname,"); + accountsSummary .append("sa.currency_code as currencyCode, sa.currency_digits as currencyDigits, sa.currency_multiplesof as inMultiplesOf, "); accountsSummary.append("curr.name as currencyName, curr.internationalized_name_code as currencyNameCode, "); @@ -117,6 +145,12 @@ public class AccountDetailsReadPlatformServiceJpaRepositoryImpl implements Accou accountsSummary.append("from m_savings_account sa "); accountsSummary.append("join m_savings_product as p on p.id = sa.product_id "); accountsSummary.append("join m_currency curr on curr.code = sa.currency_code "); + accountsSummary.append("left join m_appuser sbu on sbu.id = sa.submittedon_userid "); + accountsSummary.append("left join m_appuser rbu on rbu.id = sa.rejectedon_userid "); + accountsSummary.append("left join m_appuser wbu on wbu.id = sa.withdrawnon_userid "); + accountsSummary.append("left join m_appuser abu on abu.id = sa.approvedon_userid "); + accountsSummary.append("left join m_appuser avbu on rbu.id = sa.activatedon_userid "); + accountsSummary.append("left join m_appuser cbu on cbu.id = sa.closedon_userid "); this.schemaSql = accountsSummary.toString(); } @@ -147,9 +181,46 @@ public class AccountDetailsReadPlatformServiceJpaRepositoryImpl implements Accou final Integer inMultiplesOf = JdbcSupport.getInteger(rs, "inMultiplesOf"); final CurrencyData currency = new CurrencyData(currencyCode, currencyName, currencyDigits, inMultiplesOf, currencyDisplaySymbol, currencyNameCode); + + final LocalDate submittedOnDate = JdbcSupport.getLocalDate(rs, "submittedOnDate"); + final String submittedByUsername = rs.getString("submittedByUsername"); + final String submittedByFirstname = rs.getString("submittedByFirstname"); + final String submittedByLastname = rs.getString("submittedByLastname"); + + final LocalDate rejectedOnDate = JdbcSupport.getLocalDate(rs, "rejectedOnDate"); + final String rejectedByUsername = rs.getString("rejectedByUsername"); + final String rejectedByFirstname = rs.getString("rejectedByFirstname"); + final String rejectedByLastname = rs.getString("rejectedByLastname"); + + final LocalDate withdrawnOnDate = JdbcSupport.getLocalDate(rs, "withdrawnOnDate"); + final String withdrawnByUsername = rs.getString("withdrawnByUsername"); + final String withdrawnByFirstname = rs.getString("withdrawnByFirstname"); + final String withdrawnByLastname = rs.getString("withdrawnByLastname"); + + final LocalDate approvedOnDate = JdbcSupport.getLocalDate(rs, "approvedOnDate"); + final String approvedByUsername = rs.getString("approvedByUsername"); + final String approvedByFirstname = rs.getString("approvedByFirstname"); + final String approvedByLastname = rs.getString("approvedByLastname"); + + final LocalDate activatedOnDate = JdbcSupport.getLocalDate(rs, "activatedOnDate"); + final String activatedByUsername = rs.getString("activatedByUsername"); + final String activatedByFirstname = rs.getString("activatedByFirstname"); + final String activatedByLastname = rs.getString("activatedByLastname"); + + final LocalDate closedOnDate = JdbcSupport.getLocalDate(rs, "closedOnDate"); + final String closedByUsername = rs.getString("closedByUsername"); + final String closedByFirstname = rs.getString("closedByFirstname"); + final String closedByLastname = rs.getString("closedByLastname"); + + final SavingsAccountApplicationTimelineData timeline = new SavingsAccountApplicationTimelineData(submittedOnDate, + submittedByUsername, submittedByFirstname, submittedByLastname, rejectedOnDate, rejectedByUsername, + rejectedByFirstname, rejectedByLastname, withdrawnOnDate, withdrawnByUsername, withdrawnByFirstname, + withdrawnByLastname, approvedOnDate, approvedByUsername, approvedByFirstname, approvedByLastname, activatedOnDate, + activatedByUsername, activatedByFirstname, activatedByLastname, closedOnDate, closedByUsername, closedByFirstname, + closedByLastname); return new SavingsAccountSummaryData(id, accountNo, externalId, productId, productName, status, currency, accountBalance, - accountTypeData); + accountTypeData, timeline); } } @@ -158,9 +229,37 @@ public class AccountDetailsReadPlatformServiceJpaRepositoryImpl implements Accou public String loanAccountSummarySchema() { final StringBuilder accountsSummary = new StringBuilder("l.id as id, l.account_no as accountNo, l.external_id as externalId,"); - accountsSummary.append("l.product_id as productId, lp.name as productName,") - .append("l.loan_status_id as statusId, l.loan_type_enum as loanType, ").append("l.loan_product_counter as loanCycle ") - .append(" from m_loan l ").append("LEFT JOIN m_product_loan AS lp ON lp.id = l.product_id"); + accountsSummary + .append(" l.product_id as productId, lp.name as productName,") + .append(" l.loan_status_id as statusId, l.loan_type_enum as loanType,") + .append(" l.loan_product_counter as loanCycle,") + + .append(" l.submittedon_date as submittedOnDate,") + .append(" sbu.username as submittedByUsername, sbu.firstname as submittedByFirstname, sbu.lastname as submittedByLastname,") + + .append(" l.rejectedon_date as rejectedOnDate,") + .append(" rbu.username as rejectedByUsername, rbu.firstname as rejectedByFirstname, rbu.lastname as rejectedByLastname,") + + .append(" l.withdrawnon_date as withdrawnOnDate,") + .append(" wbu.username as withdrawnByUsername, wbu.firstname as withdrawnByFirstname, wbu.lastname as withdrawnByLastname,") + + .append(" l.approvedon_date as approvedOnDate,") + .append(" abu.username as approvedByUsername, abu.firstname as approvedByFirstname, abu.lastname as approvedByLastname,") + + .append(" l.expected_disbursedon_date as expectedDisbursementDate, l.disbursedon_date as actualDisbursementDate,") + .append(" dbu.username as disbursedByUsername, dbu.firstname as disbursedByFirstname, dbu.lastname as disbursedByLastname,") + + .append(" l.closedon_date as closedOnDate,") + .append(" cbu.username as closedByUsername, cbu.firstname as closedByFirstname, cbu.lastname as closedByLastname,") + .append(" l.writtenoffon_date as writtenOffOnDate, l.expected_maturedon_date as expectedMaturityDate") + + .append(" from m_loan l ").append("LEFT JOIN m_product_loan AS lp ON lp.id = l.product_id") + .append(" left join m_appuser sbu on sbu.id = l.submittedon_userid") + .append(" left join m_appuser rbu on rbu.id = l.rejectedon_userid") + .append(" left join m_appuser wbu on wbu.id = l.withdrawnon_userid") + .append(" left join m_appuser abu on abu.id = l.approvedon_userid") + .append(" left join m_appuser dbu on dbu.id = l.disbursedon_userid") + .append(" left join m_appuser cbu on cbu.id = l.closedon_userid"); return accountsSummary.toString(); } @@ -179,7 +278,50 @@ public class AccountDetailsReadPlatformServiceJpaRepositoryImpl implements Accou final EnumOptionData loanType = AccountEnumerations.loanType(loanTypeId); final Integer loanCycle = JdbcSupport.getInteger(rs, "loanCycle"); - return new LoanAccountSummaryData(id, accountNo, externalId, productId, loanProductName, loanStatus, loanType, loanCycle); + final LocalDate submittedOnDate = JdbcSupport.getLocalDate(rs, "submittedOnDate"); + final String submittedByUsername = rs.getString("submittedByUsername"); + final String submittedByFirstname = rs.getString("submittedByFirstname"); + final String submittedByLastname = rs.getString("submittedByLastname"); + + final LocalDate rejectedOnDate = JdbcSupport.getLocalDate(rs, "rejectedOnDate"); + final String rejectedByUsername = rs.getString("rejectedByUsername"); + final String rejectedByFirstname = rs.getString("rejectedByFirstname"); + final String rejectedByLastname = rs.getString("rejectedByLastname"); + + final LocalDate withdrawnOnDate = JdbcSupport.getLocalDate(rs, "withdrawnOnDate"); + final String withdrawnByUsername = rs.getString("withdrawnByUsername"); + final String withdrawnByFirstname = rs.getString("withdrawnByFirstname"); + final String withdrawnByLastname = rs.getString("withdrawnByLastname"); + + final LocalDate approvedOnDate = JdbcSupport.getLocalDate(rs, "approvedOnDate"); + final String approvedByUsername = rs.getString("approvedByUsername"); + final String approvedByFirstname = rs.getString("approvedByFirstname"); + final String approvedByLastname = rs.getString("approvedByLastname"); + + final LocalDate expectedDisbursementDate = JdbcSupport.getLocalDate(rs, "expectedDisbursementDate"); + final LocalDate actualDisbursementDate = JdbcSupport.getLocalDate(rs, "actualDisbursementDate"); + final String disbursedByUsername = rs.getString("disbursedByUsername"); + final String disbursedByFirstname = rs.getString("disbursedByFirstname"); + final String disbursedByLastname = rs.getString("disbursedByLastname"); + + final LocalDate closedOnDate = JdbcSupport.getLocalDate(rs, "closedOnDate"); + final String closedByUsername = rs.getString("closedByUsername"); + final String closedByFirstname = rs.getString("closedByFirstname"); + final String closedByLastname = rs.getString("closedByLastname"); + + final LocalDate writtenOffOnDate = JdbcSupport.getLocalDate(rs, "writtenOffOnDate"); + + final LocalDate expectedMaturityDate = JdbcSupport.getLocalDate(rs, "expectedMaturityDate"); + + final LoanApplicationTimelineData timeline = new LoanApplicationTimelineData(submittedOnDate, submittedByUsername, + submittedByFirstname, submittedByLastname, rejectedOnDate, rejectedByUsername, rejectedByFirstname, rejectedByLastname, + withdrawnOnDate, withdrawnByUsername, withdrawnByFirstname, withdrawnByLastname, approvedOnDate, approvedByUsername, + approvedByFirstname, approvedByLastname, expectedDisbursementDate, actualDisbursementDate, disbursedByUsername, + disbursedByFirstname, disbursedByLastname, closedOnDate, closedByUsername, closedByFirstname, closedByLastname, + expectedMaturityDate, writtenOffOnDate, closedByUsername, closedByFirstname, closedByLastname); + + return new LoanAccountSummaryData(id, accountNo, externalId, productId, loanProductName, loanStatus, loanType, loanCycle, + timeline); } } diff --git a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanApplicationTimelineData.java b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanApplicationTimelineData.java index 07d235e9f..8a662234b 100644 --- a/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanApplicationTimelineData.java +++ b/mifosng-provider/src/main/java/org/mifosplatform/portfolio/loanaccount/data/LoanApplicationTimelineData.java @@ -38,6 +38,10 @@ public class LoanApplicationTimelineData { private final String disbursedByUsername; private final String disbursedByFirstname; private final String disbursedByLastname; + private final LocalDate closedOnDate; + private final String closedByUsername; + private final String closedByFirstname; + private final String closedByLastname; private final LocalDate expectedMaturityDate; private final LocalDate writeOffOnDate; private final String writeOffByUsername; @@ -115,6 +119,10 @@ public class LoanApplicationTimelineData { this.disbursedByUsername = disbursedByUsername; this.disbursedByFirstname = disbursedByFirstname; this.disbursedByLastname = disbursedByLastname; + this.closedOnDate = closedOnDate; + this.closedByUsername = closedByUsername; + this.closedByFirstname = closedByFirstname; + this.closedByLastname = closedByLastname; this.expectedMaturityDate = expectedMaturityDate; this.writeOffOnDate = writeOffOnDate; this.writeOffByUsername = writeOffByUsername;