group collection sheet apis

This commit is contained in:
Nayan Ambali
2013-03-19 19:44:49 +05:30
parent cb8b8e72d1
commit a5b52492d5
9 changed files with 760 additions and 0 deletions
@@ -5,9 +5,17 @@
*/
package org.mifosplatform.infrastructure.core.service;
import java.util.ArrayList;
import java.util.List;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.mifosplatform.infrastructure.core.data.ApiParameterError;
import org.mifosplatform.infrastructure.core.domain.MifosPlatformTenant;
import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException;
public class DateUtils {
@@ -27,4 +35,19 @@ public class DateUtils {
return today;
}
public static LocalDate parseLocalDate(final String stringDate, final String pattern) {
try {
DateTimeFormatter dateStringFormat = DateTimeFormat.forPattern(pattern);
DateTime dateTime = dateStringFormat.parseDateTime(stringDate);
return dateTime.toLocalDate();
} catch (IllegalArgumentException e) {
List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
ApiParameterError error = ApiParameterError.parameterError("validation.msg.invalid.date.pattern", "The parameter date ("
+ stringDate + ") is invalid w.r.t. pattern " + pattern, "date", stringDate, pattern);
dataValidationErrors.add(error);
throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.",
dataValidationErrors);
}
}
}
@@ -0,0 +1,75 @@
package org.mifosplatform.portfolio.collectionsheet.api;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriInfo;
import org.joda.time.LocalDate;
import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper;
import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
import org.mifosplatform.infrastructure.core.serialization.ToApiJsonSerializer;
import org.mifosplatform.infrastructure.core.service.DateUtils;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.portfolio.collectionsheet.data.JLGCollectionSheetData;
import org.mifosplatform.portfolio.collectionsheet.service.CollectionSheetReadPlatformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
/*
* At present API supports groups/{groupId}
* Future version supports staffs/{staffId}
* Future version supports offices/{officeId}
*/
@Path("/groups/{groupId}/collectionsheet")
@Component
@Scope("singleton")
public class CollectionSheetApiResource {
private final Set<String> COLLECTIONSHEET_DATA_PARAMETERS = new HashSet<String>(Arrays.asList("dueDate", "groups"));
/*
* dueDate format is ISO 8601 Calendar Date (YYYYMMDD)
*/
private final String datePattern = "YYYYMMDD";
private final PlatformSecurityContext context;
private final CollectionSheetReadPlatformService collectionSheetReadPlatformService;
private final ToApiJsonSerializer<JLGCollectionSheetData> toApiJsonSerializer;
private final ApiRequestParameterHelper apiRequestParameterHelper;
@Autowired
public CollectionSheetApiResource(final PlatformSecurityContext context,
final CollectionSheetReadPlatformService collectionSheetReadPlatformService,
final ToApiJsonSerializer<JLGCollectionSheetData> toApiJsonSerializer, final ApiRequestParameterHelper apiRequestParameterHelper) {
this.context = context;
this.collectionSheetReadPlatformService = collectionSheetReadPlatformService;
this.toApiJsonSerializer = toApiJsonSerializer;
this.apiRequestParameterHelper = apiRequestParameterHelper;
}
@GET
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String collectionSheetData(@Context final UriInfo uriInfo, @PathParam("groupId") final Long groupId,
@QueryParam("dueDate") final String dueDate) {
this.context.authenticatedUser().validateHasReadPermission("COLLECTIONSHEET");
final LocalDate localDate = DateUtils.parseLocalDate(dueDate, this.datePattern);
final JLGCollectionSheetData collectionSheet = this.collectionSheetReadPlatformService.retriveCollectionSheet(localDate, groupId);
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
return this.toApiJsonSerializer.serialize(settings, collectionSheet, this.COLLECTIONSHEET_DATA_PARAMETERS);
}
}
@@ -0,0 +1,47 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.portfolio.collectionsheet.data;
import java.util.Collection;
/**
* Immutable data object for clients with loans due for disbursement or collection.
*/
public class ClientLoansData {
private final Long clientId;
private final String clientName;
private Collection<LoanDueData> loans;
public ClientLoansData(final Long clientId, final String clientName, final Collection<LoanDueData> loans) {
this.clientId = clientId;
this.clientName = clientName;
this.loans = loans;
}
public ClientLoansData(final Long clientId, final String clientName) {
this.clientId = clientId;
this.clientName = clientName;
this.loans = null;
}
public Long getClientId() {
return this.clientId;
}
public String getClientName() {
return this.clientName;
}
public Collection<LoanDueData> getLoans() {
return this.loans;
}
public void setLoans(final Collection<LoanDueData> loans) {
this.loans = loans;
}
}
@@ -0,0 +1,64 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.portfolio.collectionsheet.data;
import java.util.Collection;
/**
* Immutable data object for groups with clients due for disbursement or collection.
*/
public class JLGClientsData {
private final Long groupId;
private final String groupName;
private final Long staffId;
private final String staffName;
private final Long levelId;
private final String levelName;
private Collection<ClientLoansData> clients;
public JLGClientsData(final Long groupId, final String groupName, final Long staffId, final String staffName, final Long levelId,
final String levelName) {
this.groupId = groupId;
this.groupName = groupName;
this.staffId = staffId;
this.staffName = staffName;
this.levelId = levelId;
this.levelName = levelName;
}
public Long getGroupId() {
return this.groupId;
}
public String getGroupName() {
return this.groupName;
}
public Long getStaffId() {
return this.staffId;
}
public String getStaffName() {
return this.staffName;
}
public Long getLevelId() {
return this.levelId;
}
public String getLevelName() {
return this.levelName;
}
public Collection<ClientLoansData> getCutomers() {
return this.clients;
}
public void setClients(final Collection<ClientLoansData> clients) {
this.clients = clients;
}
}
@@ -0,0 +1,33 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.portfolio.collectionsheet.data;
import java.util.Collection;
import org.joda.time.LocalDate;
/**
* Immutable data object for join liability group's collection sheet.
*/
public class JLGCollectionSheetData {
private final LocalDate dueDate;
private final Collection<JLGClientsData> groups;
public JLGCollectionSheetData(final LocalDate date, final Collection<JLGClientsData> groups) {
this.dueDate = date;
this.groups = groups;
}
public LocalDate getDate() {
return this.dueDate;
}
public Collection<JLGClientsData> getGroups() {
return this.groups;
}
}
@@ -0,0 +1,164 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.portfolio.collectionsheet.data;
import java.math.BigDecimal;
/**
* Immutable data object for extracting flat data for joint liability group's collection sheet.
*/
public class JLGCollectionSheetFlatData {
private final String groupName;
private final Long groupId;
private final Long staffId;
private final String staffName;
private final Long levelId;
private final String levelName;
private final String clientName;
private final Long clientId;
private final Long loanId;
private final String accountId;
private final Integer accountStatusId;
private final String productShortName;
private final Long productId;
private final String currencyCode;
private final Integer currencyDigits;
private BigDecimal disbursementAmount = BigDecimal.ZERO;
private BigDecimal principalDue = BigDecimal.ZERO;
private BigDecimal principalPaid = BigDecimal.ZERO;
private BigDecimal interestDue = BigDecimal.ZERO;
private BigDecimal interestPaid = BigDecimal.ZERO;
private BigDecimal chargesDue = BigDecimal.ZERO;
public JLGCollectionSheetFlatData(final String groupName, final Long groupId, final Long staffId, final String staffName,
final Long levelId, final String levelName, final String clientName, final Long clientId, final Long loanId,
final String accountId, final Integer accountStatusId, final String productShortName, final Long productId,
final String currencyCode, final Integer currencyDigits, final BigDecimal disbursementAmount, final BigDecimal principalDue,
final BigDecimal principalPaid, final BigDecimal interestDue, final BigDecimal interestPaid, final BigDecimal chargesDue) {
this.groupName = groupName;
this.groupId = groupId;
this.staffId = staffId;
this.staffName = staffName;
this.levelId = levelId;
this.levelName = levelName;
this.clientName = clientName;
this.clientId = clientId;
this.loanId = loanId;
this.accountId = accountId;
this.accountStatusId = accountStatusId;
this.productShortName = productShortName;
this.productId = productId;
this.currencyCode = currencyCode;
this.currencyDigits = currencyDigits;
this.disbursementAmount = disbursementAmount;
this.principalDue = principalDue;
this.principalPaid = principalPaid;
this.interestDue = interestDue;
this.interestPaid = interestPaid;
this.chargesDue = chargesDue;
}
public String getGroupName() {
return this.groupName;
}
public Long getGroupId() {
return this.groupId;
}
public Long getStaffId() {
return this.staffId;
}
public String getStaffName() {
return this.staffName;
}
public Long getLevelId() {
return this.levelId;
}
public String getLevelName() {
return this.levelName;
}
public String getClientName() {
return this.clientName;
}
public Long getClientId() {
return this.clientId;
}
public Long getLoanId() {
return this.loanId;
}
public String getAccountId() {
return this.accountId;
}
public Integer getAccountStatusId() {
return this.accountStatusId;
}
public String getProductShortName() {
return this.productShortName;
}
public Long getProductId() {
return this.productId;
}
public String getCurrencyCode() {
return this.currencyCode;
}
public Integer getCurrencyDigits() {
return this.currencyDigits;
}
public BigDecimal getDisbursementAmount() {
return this.disbursementAmount;
}
public BigDecimal getPrincipalDue() {
return this.principalDue;
}
public BigDecimal getPrincipalPaid() {
return this.principalPaid;
}
public BigDecimal getInterestDue() {
return this.interestDue;
}
public BigDecimal getInterestPaid() {
return this.interestPaid;
}
public BigDecimal getChargesDue() {
return this.chargesDue;
}
public LoanDueData getLoanDueData() {
return new LoanDueData(this.loanId, this.accountId, this.accountStatusId, this.productShortName, this.productId, this.currencyCode,
this.currencyDigits, this.disbursementAmount, this.principalDue, this.principalPaid, this.interestDue, this.interestPaid,
this.chargesDue);
}
public ClientLoansData getClientLoansData() {
return new ClientLoansData(this.clientId, this.clientName);
}
public JLGClientsData getJLGClientsData() {
return new JLGClientsData(this.groupId, this.groupName, this.staffId, this.staffName, this.levelId, this.levelName);
}
}
@@ -0,0 +1,100 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.portfolio.collectionsheet.data;
import java.math.BigDecimal;
/**
* Immutable data object for representing loan with dues (example: loan is due for disbursement, repayments).
*/
public class LoanDueData {
private final Long loanId;
private final String accountId;
private final Integer accountStatusId;
private final String productShortName;
private final Long productId;
private final String currencyCode;
private final Integer currencyDigits;
private BigDecimal disbursementAmount = BigDecimal.ZERO;
private BigDecimal principalDue = BigDecimal.ZERO;
private BigDecimal principalPaid = BigDecimal.ZERO;
private BigDecimal interestDue = BigDecimal.ZERO;
private BigDecimal interestPaid = BigDecimal.ZERO;
private BigDecimal chargesDue = BigDecimal.ZERO;
public LoanDueData(final Long loanId, final String accountId, final Integer accountStatusId, final String productShortName,
final Long productId, final String currencyCode, final Integer currencyDigits, final BigDecimal disbursementAmount,
final BigDecimal principalDue, final BigDecimal principalPaid, final BigDecimal interestDue, final BigDecimal interestPaid,
final BigDecimal chargesDue) {
this.loanId = loanId;
this.accountId = accountId;
this.accountStatusId = accountStatusId;
this.productShortName = productShortName;
this.productId = productId;
this.currencyCode = currencyCode;
this.currencyDigits = currencyDigits;
this.disbursementAmount = disbursementAmount;
this.principalDue = principalDue;
this.principalPaid = principalPaid;
this.interestDue = interestDue;
this.interestPaid = interestPaid;
this.chargesDue = chargesDue;
}
public Long getLoanId() {
return this.loanId;
}
public String getAccountId() {
return this.accountId;
}
public Integer getAccountStatusId() {
return this.accountStatusId;
}
public String getProductShortName() {
return this.productShortName;
}
public Long getProductId() {
return this.productId;
}
public String getCurrencyCode() {
return this.currencyCode;
}
public Integer getCurrencyDigits() {
return this.currencyDigits;
}
public BigDecimal getDisbursementAmount() {
return this.disbursementAmount;
}
public BigDecimal getPrincipalDue() {
return this.principalDue;
}
public BigDecimal getPrincipalPaid() {
return this.principalPaid;
}
public BigDecimal getInterestDue() {
return this.interestDue;
}
public BigDecimal getInterestPaid() {
return this.interestPaid;
}
public BigDecimal getChargesDue() {
return this.chargesDue;
}
}
@@ -0,0 +1,15 @@
package org.mifosplatform.portfolio.collectionsheet.service;
import java.util.Collection;
import org.joda.time.LocalDate;
import org.mifosplatform.portfolio.collectionsheet.data.JLGCollectionSheetData;
import org.mifosplatform.portfolio.collectionsheet.data.JLGCollectionSheetFlatData;
public interface CollectionSheetReadPlatformService {
JLGCollectionSheetData retriveCollectionSheet(LocalDate localDate, Long groupId);
Collection<JLGCollectionSheetFlatData> retriveJLGCollectionSheet(String groupHierarchy, String officeHierarchy, LocalDate dueDate);
}
@@ -0,0 +1,239 @@
package org.mifosplatform.portfolio.collectionsheet.service;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.joda.time.LocalDate;
import org.mifosplatform.infrastructure.core.domain.JdbcSupport;
import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.portfolio.collectionsheet.data.ClientLoansData;
import org.mifosplatform.portfolio.collectionsheet.data.JLGClientsData;
import org.mifosplatform.portfolio.collectionsheet.data.JLGCollectionSheetData;
import org.mifosplatform.portfolio.collectionsheet.data.JLGCollectionSheetFlatData;
import org.mifosplatform.portfolio.collectionsheet.data.LoanDueData;
import org.mifosplatform.portfolio.group.data.GroupData;
import org.mifosplatform.portfolio.group.exception.GroupNotFoundException;
import org.mifosplatform.portfolio.group.service.GroupReadPlatformServiceImpl;
import org.mifosplatform.useradministration.domain.AppUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Service;
@Service
public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetReadPlatformService {
private final PlatformSecurityContext context;
private final NamedParameterJdbcTemplate namedParameterjdbcTemplate;
private final GroupReadPlatformServiceImpl groupReadPlatformServiceImpl;
@Autowired
public CollectionSheetReadPlatformServiceImpl(final PlatformSecurityContext context, final TenantAwareRoutingDataSource dataSource,
final GroupReadPlatformServiceImpl groupReadPlatformServiceImpl) {
this.context = context;
this.namedParameterjdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
this.groupReadPlatformServiceImpl = groupReadPlatformServiceImpl;
}
@Override
public JLGCollectionSheetData retriveCollectionSheet(final LocalDate dueDate, final Long groupId) {
final AppUser currentUser = this.context.authenticatedUser();
final String hierarchy = currentUser.getOffice().getHierarchy();
final String officeHierarchy = hierarchy + "%";
final GroupData groupData = this.groupReadPlatformServiceImpl.retrieveGroup(groupId);
if (groupData == null) { throw new GroupNotFoundException(groupId); }
final String groupHierarchy = groupData.getHierarchy() + "%";
final JLGCollectionSheetData jlgCollectionSheetData = buildJLGCollectionSheet(groupHierarchy, officeHierarchy, dueDate);
return jlgCollectionSheetData;
}
/**
* @param groupHierarchy
* @param officeHierarchy
* @param dueDate
* @return
*
* Reads all the loans which are due for disbursement or collection
* and builds hierarchical data structure for collections sheet with
* hierarchy Groups >> Clients >> Loans.
*
*/
@SuppressWarnings("null")
private JLGCollectionSheetData buildJLGCollectionSheet(final String groupHierarchy, final String officeHierarchy,
final LocalDate dueDate) {
final Collection<JLGCollectionSheetFlatData> jlgCollectionSheetFlatData = retriveJLGCollectionSheet(groupHierarchy,
officeHierarchy, dueDate);
boolean firstTime = true;
Long prevGroupId = null;
Long prevClientId = null;
final List<JLGClientsData> jlgClientsDatas = new ArrayList<JLGClientsData>();
List<ClientLoansData> clientLoansDatas = new ArrayList<ClientLoansData>();
List<LoanDueData> loanDueDatas = new ArrayList<LoanDueData>();
JLGCollectionSheetData jlgCollectionSheetData = null;
JLGCollectionSheetFlatData prevCollectioSheetFlatData = null;
JLGCollectionSheetFlatData corrCollectioSheetFlatData = null;
if (jlgCollectionSheetFlatData != null) {
for (final JLGCollectionSheetFlatData collectionSheetFlatData : jlgCollectionSheetFlatData) {
corrCollectioSheetFlatData = collectionSheetFlatData;
if (firstTime || collectionSheetFlatData.getGroupId().equals(prevGroupId)) {
if (firstTime || collectionSheetFlatData.getClientId().equals(prevClientId)) {
if (collectionSheetFlatData.getLoanId() != null) {
loanDueDatas.add(collectionSheetFlatData.getLoanDueData());
}
} else {
final ClientLoansData clientLoansData = prevCollectioSheetFlatData.getClientLoansData();
clientLoansData.setLoans(loanDueDatas);
clientLoansDatas.add(clientLoansData);
loanDueDatas = new ArrayList<LoanDueData>();
if (collectionSheetFlatData.getLoanId() != null) {
loanDueDatas.add(collectionSheetFlatData.getLoanDueData());
}
}
} else {
final ClientLoansData clientLoansData = prevCollectioSheetFlatData.getClientLoansData();
clientLoansData.setLoans(loanDueDatas);
clientLoansDatas.add(clientLoansData);
final JLGClientsData jlgClientsData = prevCollectioSheetFlatData.getJLGClientsData();
jlgClientsData.setClients(clientLoansDatas);
jlgClientsDatas.add(jlgClientsData);
loanDueDatas = new ArrayList<LoanDueData>();
clientLoansDatas = new ArrayList<ClientLoansData>();
if (collectionSheetFlatData.getLoanId() != null) {
loanDueDatas.add(collectionSheetFlatData.getLoanDueData());
}
}
prevClientId = collectionSheetFlatData.getClientId();
prevGroupId = collectionSheetFlatData.getGroupId();
prevCollectioSheetFlatData = collectionSheetFlatData;
firstTime = false;
}
// FIXME Need to check last loan is added under previous
// client/group or new client / previous group or new client / new
// group
final ClientLoansData lastClientLoansData = corrCollectioSheetFlatData.getClientLoansData();
lastClientLoansData.setLoans(loanDueDatas);
clientLoansDatas.add(lastClientLoansData);
final JLGClientsData jlgClientsData = corrCollectioSheetFlatData.getJLGClientsData();
jlgClientsData.setClients(clientLoansDatas);
jlgClientsDatas.add(jlgClientsData);
jlgCollectionSheetData = new JLGCollectionSheetData(dueDate, jlgClientsDatas);
}
return jlgCollectionSheetData;
}
@Override
public Collection<JLGCollectionSheetFlatData> retriveJLGCollectionSheet(final String groupHierarchy, final String officeHierarchy,
final LocalDate dueDate) {
final JLGCollectionSheetFaltDataMapper mapper = new JLGCollectionSheetFaltDataMapper();
final String sql = mapper.collectionSheetSchema();
final SqlParameterSource namedParameters = new MapSqlParameterSource().addValue("hierarchy", groupHierarchy)
.addValue("dueDate", dueDate).addValue("officeHierarchy", officeHierarchy);
return this.namedParameterjdbcTemplate.query(sql, namedParameters, mapper);
}
private static final class JLGCollectionSheetFaltDataMapper implements RowMapper<JLGCollectionSheetFlatData> {
public String collectionSheetSchema() {
return "SELECT gp.name As groupName, "
+ "gp.id As groupId, "
+ "cl.display_name As clientName, "
+ "sf.id As staffId, "
+ "sf.display_name As staffName, "
+ "gl.id As levelId, "
+ "gl.level_name As levelName, "
+ "cl.id As clientId, "
+ "ln.id As loanId, "
+ "ln.account_no As accountId, "
+ "ln.loan_status_id As accountStatusId, "
+ "pl.name As productShortName, "
+ "ln.product_id As productId, "
+ "ln.currency_code As currencyCode, "
+ "ln.currency_digits As currencyDigits, "
+ "if(ln.loan_status_id = 200 , ln.principal_amount , null) As disbursementAmount, "
+ "sum(ls.principal_amount - ls.principal_completed_derived) As principalDue, "
+ "ln.principal_repaid_derived As principalPaid, "
+ "sum(ls.interest_amount - ls.interest_completed_derived) As interestDue, "
+ "ln.interest_repaid_derived As interestPaid, "
+ "sum(lc.amount_outstanding_derived) as chargesDue "
+ "FROM m_group gp "
+ "LEFT JOIN m_office of ON of.id = gp.office_id AND of.hierarchy like :officeHierarchy "
+ "JOIN m_group_level gl ON gl.id = gp.level_Id "
+ "LEFT JOIN m_staff sf ON sf.id = gp.staff_id "
+ "JOIN m_group_client gc ON gc.group_id = gp.id "
+ "JOIN m_client cl ON cl.id = gc.client_id "
+ "LEFT JOIN m_loan ln ON cl.id = ln.client_id AND ln.group_id is not null AND ( ln.loan_status_id = 300 OR ( ln.loan_status_id =200 AND ln.expected_disbursedon_date <= :dueDate )) "
+ "LEFT JOIN m_product_loan pl ON pl.id = ln.product_id "
+ "LEFT JOIN m_loan_repayment_schedule ls ON ls.loan_id = ln.id AND ls.completed_derived = 0 AND ls.duedate <= :dueDate "
+ "LEFT JOIN m_loan_charge lc ON lc.loan_id = ln.id AND lc.is_paid_derived = 0 AND ( lc.due_for_collection_as_of_date <= :dueDate OR lc.charge_time_enum = 1) "
+ "WHERE gp.hierarchy like :hierarchy " + "GROUP BY gp.id ,cl.id , ln.id " + "ORDER BY gp.id , cl.id , ln.id ";
}
@Override
public JLGCollectionSheetFlatData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
final String groupName = rs.getString("groupName");
final Long groupId = JdbcSupport.getLong(rs, "groupId");
final Long staffId = JdbcSupport.getLong(rs, "staffId");
final String staffName = rs.getString("staffName");
final Long levelId = JdbcSupport.getLong(rs, "levelId");
final String levelName = rs.getString("levelName");
final String clientName = rs.getString("clientName");
final Long clientId = JdbcSupport.getLong(rs, "clientId");
final Long loanId = JdbcSupport.getLong(rs, "loanId");
final String accountId = rs.getString("accountId");
final Integer accountStatusId = JdbcSupport.getInteger(rs, "accountStatusId");
final String productShortName = rs.getString("productShortName");
final Long productId = JdbcSupport.getLong(rs, "productId");
final String currencyCode = rs.getString("currencyCode");
final Integer currencyDigits = JdbcSupport.getInteger(rs, "currencyDigits");
final BigDecimal disbursementAmount = rs.getBigDecimal("disbursementAmount");
final BigDecimal principalDue = rs.getBigDecimal("principalDue");
final BigDecimal principalPaid = rs.getBigDecimal("principalPaid");
final BigDecimal interestDue = rs.getBigDecimal("interestDue");
final BigDecimal interestPaid = rs.getBigDecimal("interestPaid");
final BigDecimal chargesDue = rs.getBigDecimal("chargesDue");
return new JLGCollectionSheetFlatData(groupName, groupId, staffId, staffName, levelId, levelName, clientName, clientId, loanId,
accountId, accountStatusId, productShortName, productId, currencyCode, currencyDigits, disbursementAmount,
principalDue, principalPaid, interestDue, interestPaid, chargesDue);
}
}
}