Updated collection sheet changes raised in GK pilot

This commit is contained in:
ashok-conflux
2013-12-26 19:33:49 +05:30
parent a354b3e664
commit 027b818f27
16 changed files with 279 additions and 174 deletions
+14 -4
View File
@@ -3595,9 +3595,14 @@ GET https://DomainName/mifosng-provider/api/v1/centers/9?associations=groupMembe
<div class="method-section"> <div class="method-section">
<div class="method-description"> <div class="method-description">
<h4>List Centers</h4> <h4>List Centers</h4>
<p>The <i>list</i> capability of centers can support <b>pagination</b> and <b>sorting</b>.</p> <p>The default implementation of <i>list</i> results into 200 entries with optional support for <b>pagination</b> and <b>sorting</b>. The parameter <b>limit</b> with value <b>-1</b> will return all entries.</p>
<h5>Optional Arguments</h5> <h5>Optional Arguments</h5>
<dl class="argument-list"> <dl class="argument-list">
<dt>paged</dt>
<dd>
Boolean <span>optional</span>, defaults to false
</dd>
<dd>If paged is <span>true</span> then results will be paginated.</dd>
<dt>offset</dt> <dt>offset</dt>
<dd> <dd>
Integer <span>optional</span>, defaults to 0 Integer <span>optional</span>, defaults to 0
@@ -3662,7 +3667,7 @@ GET https://DomainName/mifosng-provider/api/v1/centers/9?associations=groupMembe
</div> </div>
<div class="method-example"> <div class="method-example">
<code class="method-declaration"> <code class="method-declaration">
GET https://DomainName/mifosng-provider/api/v1/centers GET https://DomainName/mifosng-provider/api/v1/centers?paged=true
</code> </code>
<code class="method-response"> <code class="method-response">
{ {
@@ -4506,9 +4511,14 @@ DELETE groups/2
<div class="method-section"> <div class="method-section">
<div class="method-description"> <div class="method-description">
<h4>List Groups</h4> <h4>List Groups</h4>
<p>The <i>list</i> capability of groups can support <b>pagination</b> and <b>sorting</b>.</p> <p>The default implementation of <i>list</i> results into 200 entries with optional support for <b>pagination</b> and <b>sorting</b>. The parameter <b>limit</b> with value <b>-1</b> will return all entries.</p>
<h5>Optional Arguments</h5> <h5>Optional Arguments</h5>
<dl class="argument-list"> <dl class="argument-list">
<dt>paged</dt>
<dd>
Boolean <span>optional</span>, defaults to false
</dd>
<dd>If paged is <span>true</span> then results will be paginated.</dd>
<dt>offset</dt> <dt>offset</dt>
<dd> <dd>
Integer <span>optional</span>, defaults to 0 Integer <span>optional</span>, defaults to 0
@@ -4573,7 +4583,7 @@ DELETE groups/2
</div> </div>
<div class="method-example"> <div class="method-example">
<code class="method-declaration"> <code class="method-declaration">
GET https://DomainName/mifosng-provider/api/v1/groups GET https://DomainName/mifosng-provider/api/v1/groups?paged=true
</code> </code>
<code class="method-response"> <code class="method-response">
{ {
@@ -49,7 +49,7 @@ public class StaffApiResource {
* {@link StaffData}. * {@link StaffData}.
*/ */
private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<String>(Arrays.asList("id", "firstname", "lastname", "displayName", private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<String>(Arrays.asList("id", "firstname", "lastname", "displayName",
"officeId", "officeName", "loanOfficerFlag", "externalId", "mobileNo", "allowedOffices")); "officeId", "officeName", "isLoanOfficer", "externalId", "mobileNo", "allowedOffices"));
private final String resourceNameForPermissions = "STAFF"; private final String resourceNameForPermissions = "STAFF";
@@ -78,16 +78,16 @@ public class StaffApiResource {
@Produces({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON })
public String retrieveStaff(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch, public String retrieveStaff(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch,
@QueryParam("officeId") final Long officeId, @QueryParam("officeId") final Long officeId,
@DefaultValue("false") @QueryParam("staffInOfficeHierarchy") final boolean staffInOfficeHierarchy) { @DefaultValue("false") @QueryParam("staffInOfficeHierarchy") final boolean staffInOfficeHierarchy,
@DefaultValue("false") @QueryParam("loanOfficersOnly") final boolean loanOfficersOnly) {
this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions); this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
final Collection<StaffData> staff; final Collection<StaffData> staff;
if (staffInOfficeHierarchy) { if (staffInOfficeHierarchy) {
final boolean loanOfficersOnly = false;
staff = this.readPlatformService.retrieveAllStaffInOfficeAndItsParentOfficeHierarchy(officeId, loanOfficersOnly); staff = this.readPlatformService.retrieveAllStaffInOfficeAndItsParentOfficeHierarchy(officeId, loanOfficersOnly);
} else { } else {
staff = this.readPlatformService.retrieveAllStaff(sqlSearch, officeId); staff = this.readPlatformService.retrieveAllStaff(sqlSearch, officeId, loanOfficersOnly);
} }
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
@@ -23,5 +23,5 @@ public interface StaffReadPlatformService {
*/ */
Collection<StaffData> retrieveAllStaffInOfficeAndItsParentOfficeHierarchy(Long officeId, boolean loanOfficersOnly); Collection<StaffData> retrieveAllStaffInOfficeAndItsParentOfficeHierarchy(Long officeId, boolean loanOfficersOnly);
Collection<StaffData> retrieveAllStaff(String sqlSearch, Long officeId); Collection<StaffData> retrieveAllStaff(String sqlSearch, Long officeId, boolean loanOfficersOnly);
} }
@@ -162,8 +162,8 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService {
} }
@Override @Override
public Collection<StaffData> retrieveAllStaff(final String sqlSearch, final Long officeId) { public Collection<StaffData> retrieveAllStaff(final String sqlSearch, final Long officeId, final boolean loanOfficersOnly) {
final String extraCriteria = getStaffCriteria(sqlSearch, officeId); final String extraCriteria = getStaffCriteria(sqlSearch, officeId, loanOfficersOnly);
return retrieveAllStaff(extraCriteria); return retrieveAllStaff(extraCriteria);
} }
@@ -178,22 +178,26 @@ public class StaffReadPlatformServiceImpl implements StaffReadPlatformService {
return this.jdbcTemplate.query(sql, rm, new Object[] {}); return this.jdbcTemplate.query(sql, rm, new Object[] {});
} }
private String getStaffCriteria(final String sqlSearch, final Long officeId) { private String getStaffCriteria(final String sqlSearch, final Long officeId, final boolean loanOfficersOnly) {
String extraCriteria = ""; final StringBuffer extraCriteria = new StringBuffer(200);
if (sqlSearch != null) { if (sqlSearch != null) {
extraCriteria = " and (" + sqlSearch + ")"; extraCriteria.append(" and (").append(sqlSearch).append(")");
} }
if (officeId != null) { if (officeId != null) {
extraCriteria += " and office_id = " + officeId; extraCriteria.append(" and office_id = ").append(officeId).append(" ");
}
if (loanOfficersOnly) {
extraCriteria.append(" and s.is_loan_officer is true ");
} }
if (StringUtils.isNotBlank(extraCriteria)) { if (StringUtils.isNotBlank(extraCriteria.toString())) {
extraCriteria = extraCriteria.substring(4); extraCriteria.delete(0, 4);
} }
return extraCriteria; //remove begin four letter including a space from the string.
return extraCriteria.toString();
} }
@Override @Override
@@ -14,12 +14,8 @@ import org.mifosplatform.portfolio.collectionsheet.data.JLGCollectionSheetFlatDa
public interface CollectionSheetReadPlatformService { public interface CollectionSheetReadPlatformService {
JLGCollectionSheetData retriveCollectionSheet(LocalDate localDate, Long groupId);
JLGCollectionSheetData generateGroupCollectionSheet(final Long groupId, final JsonQuery query); JLGCollectionSheetData generateGroupCollectionSheet(final Long groupId, final JsonQuery query);
JLGCollectionSheetData generateCenterCollectionSheet(final Long groupId, final JsonQuery query); JLGCollectionSheetData generateCenterCollectionSheet(final Long groupId, final JsonQuery query);
Collection<JLGCollectionSheetFlatData> retriveJLGCollectionSheet(String groupHierarchy, String officeHierarchy, LocalDate dueDate);
} }
@@ -77,24 +77,6 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
this.attendanceDropdownReadPlatformService = attendanceDropdownReadPlatformService; this.attendanceDropdownReadPlatformService = attendanceDropdownReadPlatformService;
} }
@Override
public JLGCollectionSheetData retriveCollectionSheet(final LocalDate dueDate, final Long centerId) {
final AppUser currentUser = this.context.authenticatedUser();
final String hierarchy = currentUser.getOffice().getHierarchy();
final String officeHierarchy = hierarchy + "%";
final CenterData center = this.centerReadPlatformService.retrieveOne(centerId);
final String groupHierarchy = center.getHierarchy() + "%";
final Collection<JLGCollectionSheetFlatData> collectionSheetFlatDatas = retriveJLGCollectionSheet(groupHierarchy, officeHierarchy,
dueDate);
final JLGCollectionSheetData jlgCollectionSheetData = buildJLGCollectionSheet(dueDate, collectionSheetFlatDatas);
return jlgCollectionSheetData;
}
/* /*
* Reads all the loans which are due for disbursement or collection and * Reads all the loans which are due for disbursement or collection and
* builds hierarchical data structure for collections sheet with hierarchy * builds hierarchical data structure for collections sheet with hierarchy
@@ -187,63 +169,59 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
return jlgCollectionSheetData; 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 DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
final String dueDateStr = df.format(dueDate.toDate());
final SqlParameterSource namedParameters = new MapSqlParameterSource().addValue("hierarchy", groupHierarchy)
.addValue("dueDate", dueDateStr).addValue("officeHierarchy", officeHierarchy);
return this.namedParameterjdbcTemplate.query(sql, namedParameters, mapper);
}
private static final class JLGCollectionSheetFaltDataMapper implements RowMapper<JLGCollectionSheetFlatData> { private static final class JLGCollectionSheetFaltDataMapper implements RowMapper<JLGCollectionSheetFlatData> {
public String collectionSheetSchema() { public String collectionSheetSchema(final boolean isCenterCollection) {
StringBuffer sql = new StringBuffer(400);
sql.append("SELECT loandata.*, sum(lc.amount_outstanding_derived) as chargesDue from ")
.append("(SELECT gp.display_name As groupName, ")
.append("gp.id As groupId, ")
.append("cl.display_name As clientName, ")
.append("sf.id As staffId, ")
.append("sf.display_name As staffName, ")
.append("gl.id As levelId, ")
.append("gl.level_name As levelName, ")
.append("cl.id As clientId, ")
.append("ln.id As loanId, ")
.append("ln.account_no As accountId, ")
.append("ln.loan_status_id As accountStatusId, ")
.append("pl.name As productShortName, ")
.append("ln.product_id As productId, ")
.append("ln.currency_code as currencyCode, ln.currency_digits as currencyDigits, ln.currency_multiplesof as inMultiplesOf, rc.`name` as currencyName, rc.display_symbol as currencyDisplaySymbol, rc.internationalized_name_code as currencyNameCode, ")
.append("if(ln.loan_status_id = 200 , ln.principal_amount , null) As disbursementAmount, ")
.append("sum(ifnull(if(ln.loan_status_id = 300, ls.principal_amount, 0.0), 0.0) - ifnull(if(ln.loan_status_id = 300, ls.principal_completed_derived, 0.0), 0.0)) As principalDue, ")
.append("ln.principal_repaid_derived As principalPaid, ")
.append("sum(ifnull(if(ln.loan_status_id = 300, ls.interest_amount, 0.0), 0.0) - ifnull(if(ln.loan_status_id = 300, ls.interest_completed_derived, 0.0), 0.0)) As interestDue, ")
.append("ln.interest_repaid_derived As interestPaid, ")
.append("ca.attendance_type_enum as attendanceTypeId ")
.append("FROM m_group gp ")
.append("LEFT JOIN m_office of ON of.id = gp.office_id AND of.hierarchy like :officeHierarchy ")
.append("JOIN m_group_level gl ON gl.id = gp.level_Id ")
.append("LEFT JOIN m_staff sf ON sf.id = gp.staff_id ")
.append("JOIN m_group_client gc ON gc.group_id = gp.id ")
.append("JOIN m_client cl ON cl.id = gc.client_id ")
.append("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 )) ")
.append("LEFT JOIN m_product_loan pl ON pl.id = ln.product_id ")
.append("LEFT JOIN m_currency rc on rc.`code` = ln.currency_code ")
.append("LEFT JOIN m_loan_repayment_schedule ls ON ls.loan_id = ln.id AND ls.completed_derived = 0 AND ls.duedate <= :dueDate ")
.append("left join m_calendar_instance ci on gp.parent_id = ci.entity_id and ci.entity_type_enum =:entityTypeId ")
.append("left join m_meeting mt on ci.id = mt.calendar_instance_id and mt.meeting_date =:dueDate ")
.append("left join m_client_attendance ca on ca.meeting_id=mt.id and ca.client_id=cl.id ");
return "SELECT gp.display_name As groupName, " if (isCenterCollection) {
+ "gp.id As groupId, " sql.append("WHERE gp.parent_id = :centerId ");
+ "cl.display_name As clientName, " } else {
+ "sf.id As staffId, " sql.append("WHERE gp.id = :groupId ");
+ "sf.display_name As staffName, " }
+ "gl.id As levelId, "
+ "gl.level_name As levelName, " sql.append("and (gp.status_enum = 300 or (gp.status_enum = 600 and gp.closedon_date >= :dueDate)) ")
+ "cl.id As clientId, " .append("and (cl.status_enum = 300 or (cl.status_enum = 600 and cl.closedon_date >= :dueDate)) ")
+ "ln.id As loanId, " .append("GROUP BY gp.id ,cl.id , ln.id ORDER BY gp.id , cl.id , ln.id ").append(") loandata ")
+ "ln.account_no As accountId, " .append("LEFT JOIN m_loan_charge lc ON lc.loan_id = loandata.loanId AND lc.is_paid_derived = 0 ")
+ "ln.loan_status_id As accountStatusId, " .append("AND ( lc.due_for_collection_as_of_date <= :dueDate OR lc.charge_time_enum = 1)");
+ "pl.name As productShortName, "
+ "ln.product_id As productId, " return sql.toString();
+ "ln.currency_code as currencyCode, ln.currency_digits as currencyDigits, ln.currency_multiplesof as inMultiplesOf, rc.`name` as currencyName, rc.display_symbol as currencyDisplaySymbol, rc.internationalized_name_code as currencyNameCode, "
+ "if(ln.loan_status_id = 200 , ln.principal_amount , null) As disbursementAmount, "
+ "sum(ifnull(if(ln.loan_status_id = 300, ls.principal_amount, 0.0), 0.0) - ifnull(if(ln.loan_status_id = 300, ls.principal_completed_derived, 0.0), 0.0)) As principalDue, "
+ "ln.principal_repaid_derived As principalPaid, "
+ "sum(ifnull(if(ln.loan_status_id = 300, ls.interest_amount, 0.0), 0.0) - ifnull(if(ln.loan_status_id = 300, ls.interest_completed_derived, 0.0), 0.0)) As interestDue, "
+ "ln.interest_repaid_derived As interestPaid, "
+ "sum(if(ln.loan_status_id = 300, lc.amount_outstanding_derived, 0.0)) as chargesDue, "
+ "ca.attendance_type_enum as attendanceTypeId "
+ "FROM m_group gp "
+ "LEFT JOIN m_office of ON of.id = gp.office_id AND of.hierarchy like :officeHierarchy "
// + "LEFT JOIN m_office of ON of.id = gp.office_id "
+ "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_currency rc on rc.`code` = ln.currency_code "
+ "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) "
+ "left join m_calendar_instance ci on gp.parent_id = ci.entity_id and ci.entity_type_enum =:entityTypeId "
+ "left join m_meeting mt on ci.id = mt.calendar_instance_id and mt.meeting_date =:dueDate "
+ "left join m_client_attendance ca on ca.meeting_id=mt.id and ca.client_id=cl.id ";
// + "WHERE gp.hierarchy like :hierarchy " +
// "GROUP BY gp.id ,cl.id , ln.id " +
// "ORDER BY gp.id , cl.id , ln.id ";
} }
@Override @Override
@@ -316,11 +294,7 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
final JLGCollectionSheetFaltDataMapper mapper = new JLGCollectionSheetFaltDataMapper(); final JLGCollectionSheetFaltDataMapper mapper = new JLGCollectionSheetFaltDataMapper();
final StringBuilder sql = new StringBuilder(mapper.collectionSheetSchema()); final StringBuilder sql = new StringBuilder(mapper.collectionSheetSchema(false));
sql.append(" WHERE gp.id = :groupId ")
.append(" and (gp.status_enum = 300 or (gp.status_enum = 600 and gp.closedon_date >= :dueDate)) ")
.append(" and (cl.status_enum = 300 or (cl.status_enum = 600 and cl.closedon_date >= :dueDate)) ")
.append(" GROUP BY gp.id ,cl.id , ln.id ORDER BY gp.id , cl.id , ln.id ");
// entityType should be center if it's within a center // entityType should be center if it's within a center
final CalendarEntityType entityType = (group.isChildGroup()) ? CalendarEntityType.CENTERS : CalendarEntityType.GROUPS; final CalendarEntityType entityType = (group.isChildGroup()) ? CalendarEntityType.CENTERS : CalendarEntityType.GROUPS;
@@ -352,11 +326,7 @@ public class CollectionSheetReadPlatformServiceImpl implements CollectionSheetRe
final JLGCollectionSheetFaltDataMapper mapper = new JLGCollectionSheetFaltDataMapper(); final JLGCollectionSheetFaltDataMapper mapper = new JLGCollectionSheetFaltDataMapper();
StringBuilder sql = new StringBuilder(mapper.collectionSheetSchema()); StringBuilder sql = new StringBuilder(mapper.collectionSheetSchema(true));
sql.append(" WHERE gp.parent_id = :centerId ")
.append(" and (gp.status_enum = 300 or (gp.status_enum = 600 and gp.closedon_date >= :dueDate)) ")
.append(" and (cl.status_enum = 300 or (cl.status_enum = 600 and cl.closedon_date >= :dueDate)) ")
.append(" GROUP BY gp.id ,cl.id , ln.id ORDER BY gp.id , cl.id , ln.id");
final SqlParameterSource namedParameters = new MapSqlParameterSource().addValue("dueDate", dueDateStr) final SqlParameterSource namedParameters = new MapSqlParameterSource().addValue("dueDate", dueDateStr)
.addValue("centerId", center.getId()).addValue("officeHierarchy", officeHierarchy) .addValue("centerId", center.getId()).addValue("officeHierarchy", officeHierarchy)
@@ -33,6 +33,7 @@ import org.mifosplatform.infrastructure.core.api.ApiParameterHelper;
import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper; import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper;
import org.mifosplatform.infrastructure.core.api.JsonQuery; import org.mifosplatform.infrastructure.core.api.JsonQuery;
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
import org.mifosplatform.infrastructure.core.data.PaginationParameters;
import org.mifosplatform.infrastructure.core.exception.UnrecognizedQueryParamException; import org.mifosplatform.infrastructure.core.exception.UnrecognizedQueryParamException;
import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
@@ -126,18 +127,23 @@ public class CentersApiResource {
@Consumes({ MediaType.APPLICATION_JSON }) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON })
public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch, public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch,
@QueryParam("officeId") final Long officeId, @QueryParam("externalId") final String externalId, @QueryParam("officeId") final Long officeId, @QueryParam("staffId") final Long staffId,
@QueryParam("name") final String name, @QueryParam("underHierarchy") final String hierarchy, @QueryParam("externalId") final String externalId, @QueryParam("name") final String name,
@QueryParam("underHierarchy") final String hierarchy, @QueryParam("paged") final Boolean paged,
@QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
@QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) { @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) {
this.context.authenticatedUser().validateHasReadPermission(GroupingTypesApiConstants.CENTER_RESOURCE_NAME); this.context.authenticatedUser().validateHasReadPermission(GroupingTypesApiConstants.CENTER_RESOURCE_NAME);
final PaginationParameters parameters = PaginationParameters.instance(paged, offset, limit, orderBy, sortOrder);
final SearchParameters searchParameters = SearchParameters.forGroups(sqlSearch, officeId, externalId, name, hierarchy, offset, final SearchParameters searchParameters = SearchParameters.forGroups(sqlSearch, officeId, staffId, externalId, name, hierarchy,
limit, orderBy, sortOrder); offset, limit, orderBy, sortOrder);
final Page<CenterData> centers = this.centerReadPlatformService.retrieveAll(searchParameters);
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
if (parameters.isPaged()) {
final Page<CenterData> centers = this.centerReadPlatformService.retrievePagedAll(searchParameters, parameters);
return this.toApiJsonSerializer.serialize(settings, centers, GroupingTypesApiConstants.CENTER_RESPONSE_DATA_PARAMETERS);
}
final Collection<CenterData> centers = this.centerReadPlatformService.retrieveAll(searchParameters, parameters);
return this.toApiJsonSerializer.serialize(settings, centers, GroupingTypesApiConstants.CENTER_RESPONSE_DATA_PARAMETERS); return this.toApiJsonSerializer.serialize(settings, centers, GroupingTypesApiConstants.CENTER_RESPONSE_DATA_PARAMETERS);
} }
@@ -58,6 +58,7 @@ public class GroupingTypesApiConstants {
public static final String clientOptionsParamName = "clientOptions"; public static final String clientOptionsParamName = "clientOptions";
public static final String collectionMeetingCalendar = "collectionMeetingCalendar"; public static final String collectionMeetingCalendar = "collectionMeetingCalendar";
public static final String timeLine ="timeline"; public static final String timeLine ="timeline";
public static final String closureReasons = "closureReasons";
// group close parameters // group close parameters
public static final String closureDateParamName = "closureDate"; public static final String closureDateParamName = "closureDate";
@@ -81,7 +82,8 @@ public class GroupingTypesApiConstants {
*/ */
public static final Set<String> CENTER_RESPONSE_DATA_PARAMETERS = new HashSet<String>(Arrays.asList(idParamName, nameParamName, public static final Set<String> CENTER_RESPONSE_DATA_PARAMETERS = new HashSet<String>(Arrays.asList(idParamName, nameParamName,
externalIdParamName, officeIdParamName, officeNameParamName, staffIdParamName, staffNameParamName, hierarchyParamName, externalIdParamName, officeIdParamName, officeNameParamName, staffIdParamName, staffNameParamName, hierarchyParamName,
officeOptionsParamName, staffOptionsParamName)); officeOptionsParamName, staffOptionsParamName, statusParamName, activeParamName, activationDateParamName, timeLine,
groupMembersParamName, collectionMeetingCalendar, closureReasons));
public static final Set<String> CENTER_GROUP_RESPONSE_DATA_PARAMETERS = new HashSet<String>(Arrays.asList(idParamName, nameParamName, public static final Set<String> CENTER_GROUP_RESPONSE_DATA_PARAMETERS = new HashSet<String>(Arrays.asList(idParamName, nameParamName,
externalIdParamName, officeIdParamName, officeNameParamName, staffIdParamName, staffNameParamName, hierarchyParamName, externalIdParamName, officeIdParamName, officeNameParamName, staffIdParamName, staffNameParamName, hierarchyParamName,
@@ -89,7 +91,8 @@ public class GroupingTypesApiConstants {
public static final Set<String> GROUP_RESPONSE_DATA_PARAMETERS = new HashSet<String>(Arrays.asList(idParamName, nameParamName, public static final Set<String> GROUP_RESPONSE_DATA_PARAMETERS = new HashSet<String>(Arrays.asList(idParamName, nameParamName,
externalIdParamName, officeIdParamName, officeNameParamName, "parentId", "parentName", staffIdParamName, staffNameParamName, externalIdParamName, officeIdParamName, officeNameParamName, "parentId", "parentName", staffIdParamName, staffNameParamName,
hierarchyParamName, officeOptionsParamName, staffOptionsParamName, clientOptionsParamName,timeLine)); hierarchyParamName, officeOptionsParamName, statusParamName, activeParamName, activationDateParamName, staffOptionsParamName,
clientOptionsParamName, timeLine));
public static final Set<String> ACTIVATION_REQUEST_DATA_PARAMETERS = new HashSet<String>(Arrays.asList(localeParamName, public static final Set<String> ACTIVATION_REQUEST_DATA_PARAMETERS = new HashSet<String>(Arrays.asList(localeParamName,
dateFormatParamName, activationDateParamName)); dateFormatParamName, activationDateParamName));
@@ -34,6 +34,7 @@ import org.mifosplatform.infrastructure.core.api.ApiParameterHelper;
import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper; import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper;
import org.mifosplatform.infrastructure.core.api.JsonQuery; import org.mifosplatform.infrastructure.core.api.JsonQuery;
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult; import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
import org.mifosplatform.infrastructure.core.data.PaginationParameters;
import org.mifosplatform.infrastructure.core.exception.UnrecognizedQueryParamException; import org.mifosplatform.infrastructure.core.exception.UnrecognizedQueryParamException;
import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings; import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
@@ -152,18 +153,24 @@ public class GroupsApiResource {
@Consumes({ MediaType.APPLICATION_JSON }) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON }) @Produces({ MediaType.APPLICATION_JSON })
public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch, public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch,
@QueryParam("officeId") final Long officeId, @QueryParam("externalId") final String externalId, @QueryParam("officeId") final Long officeId, @QueryParam("staffId") final Long staffId,
@QueryParam("name") final String name, @QueryParam("underHierarchy") final String hierarchy, @QueryParam("externalId") final String externalId, @QueryParam("name") final String name,
@QueryParam("underHierarchy") final String hierarchy, @QueryParam("paged") final Boolean paged,
@QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
@QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) { @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) {
this.context.authenticatedUser().validateHasReadPermission(GroupingTypesApiConstants.GROUP_RESOURCE_NAME); this.context.authenticatedUser().validateHasReadPermission(GroupingTypesApiConstants.GROUP_RESOURCE_NAME);
final PaginationParameters parameters = PaginationParameters.instance(paged, offset, limit, orderBy, sortOrder);
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters()); final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
final SearchParameters searchParameters = SearchParameters.forGroups(sqlSearch, officeId, externalId, name, hierarchy, offset, final SearchParameters searchParameters = SearchParameters.forGroups(sqlSearch, officeId, staffId, externalId, name, hierarchy,
limit, orderBy, sortOrder); offset, limit, orderBy, sortOrder);
final Page<GroupGeneralData> groups = this.groupReadPlatformService.retrieveAll(searchParameters); if (parameters.isPaged()) {
final Page<GroupGeneralData> groups = this.groupReadPlatformService.retrievePagedAll(searchParameters, parameters);
return this.toApiJsonSerializer.serialize(settings, groups, GroupingTypesApiConstants.GROUP_RESPONSE_DATA_PARAMETERS);
}
final Collection<GroupGeneralData> groups = this.groupReadPlatformService.retrieveAll(searchParameters, parameters);
return this.toApiJsonSerializer.serialize(settings, groups, GroupingTypesApiConstants.GROUP_RESPONSE_DATA_PARAMETERS); return this.toApiJsonSerializer.serialize(settings, groups, GroupingTypesApiConstants.GROUP_RESPONSE_DATA_PARAMETERS);
} }
@@ -20,30 +20,29 @@ import org.mifosplatform.portfolio.calendar.data.CalendarData;
public class CenterData { public class CenterData {
private final Long id; private final Long id;
private final String name;
private final String externalId; private final String externalId;
private final Long officeId;
private final String officeName;
private final Long staffId;
private final String staffName;
private final String hierarchy;
private final EnumOptionData status; private final EnumOptionData status;
@SuppressWarnings("unused") @SuppressWarnings("unused")
private final boolean active; private final boolean active;
private final LocalDate activationDate; private final LocalDate activationDate;
private final String name;
private final Long officeId;
private final String officeName;
private final Long staffId;
private final String staffName;
private final String hierarchy;
private final GroupTimelineData timeline; private final GroupTimelineData timeline;
// associations // associations
private final Collection<GroupGeneralData> groupMembers; private final Collection<GroupGeneralData> groupMembers;
// template // template
private final Collection<OfficeData> officeOptions;
private final Collection<StaffData> staffOptions;
private final Collection<GroupGeneralData> groupMembersOptions; private final Collection<GroupGeneralData> groupMembersOptions;
private final CalendarData collectionMeetingCalendar; private final CalendarData collectionMeetingCalendar;
private final Collection<CodeValueData> closureReasons; private final Collection<CodeValueData> closureReasons;
private final Collection<OfficeData> officeOptions;
private final Collection<StaffData> staffOptions;
public static CenterData template(final Long officeId, final LocalDate activationDate, final Collection<OfficeData> officeOptions, public static CenterData template(final Long officeId, final LocalDate activationDate, final Collection<OfficeData> officeOptions,
final Collection<StaffData> staffOptions, final Collection<GroupGeneralData> groupMembersOptions) { final Collection<StaffData> staffOptions, final Collection<GroupGeneralData> groupMembersOptions) {
@@ -25,7 +25,7 @@ public final class AllGroupTypesDataMapper implements RowMapper<GroupGeneralData
public AllGroupTypesDataMapper() { public AllGroupTypesDataMapper() {
final StringBuilder sqlBuilder = new StringBuilder(400); final StringBuilder sqlBuilder = new StringBuilder(400);
sqlBuilder.append("g.id as id, g.external_id as externalId, g.display_name as displayName, "); sqlBuilder.append("g.id as id, g.external_id as externalId, g.display_name as name, ");
sqlBuilder.append("g.office_id as officeId, o.name as officeName, "); sqlBuilder.append("g.office_id as officeId, o.name as officeName, ");
sqlBuilder.append("g.parent_id as centerId, pg.display_name as centerName, "); sqlBuilder.append("g.parent_id as centerId, pg.display_name as centerName, ");
sqlBuilder.append("g.staff_id as staffId, s.display_name as staffName, "); sqlBuilder.append("g.staff_id as staffId, s.display_name as staffName, ");
@@ -66,7 +66,7 @@ public final class AllGroupTypesDataMapper implements RowMapper<GroupGeneralData
public GroupGeneralData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { public GroupGeneralData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
final Long id = rs.getLong("id"); final Long id = rs.getLong("id");
final String name = rs.getString("displayName"); final String name = rs.getString("name");
final String externalId = rs.getString("externalId"); final String externalId = rs.getString("externalId");
final Integer statusEnum = JdbcSupport.getInteger(rs, "statusEnum"); final Integer statusEnum = JdbcSupport.getInteger(rs, "statusEnum");
@@ -7,6 +7,7 @@ package org.mifosplatform.portfolio.group.service;
import java.util.Collection; import java.util.Collection;
import org.mifosplatform.infrastructure.core.data.PaginationParameters;
import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.core.service.Page;
import org.mifosplatform.portfolio.group.data.CenterData; import org.mifosplatform.portfolio.group.data.CenterData;
import org.mifosplatform.portfolio.group.data.GroupGeneralData; import org.mifosplatform.portfolio.group.data.GroupGeneralData;
@@ -19,7 +20,9 @@ public interface CenterReadPlatformService {
Collection<CenterData> retrieveAllForDropdown(Long officeId); Collection<CenterData> retrieveAllForDropdown(Long officeId);
Page<CenterData> retrieveAll(SearchParameters searchParameters); Page<CenterData> retrievePagedAll(SearchParameters searchParameters, PaginationParameters parameters);
Collection<CenterData> retrieveAll(SearchParameters searchParameters, PaginationParameters parameters);
GroupGeneralData retrieveCenterGroupTemplate(Long centerId); GroupGeneralData retrieveCenterGroupTemplate(Long centerId);
@@ -10,7 +10,9 @@ import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
@@ -18,6 +20,8 @@ import org.mifosplatform.infrastructure.codes.data.CodeValueData;
import org.mifosplatform.infrastructure.codes.service.CodeValueReadPlatformService; import org.mifosplatform.infrastructure.codes.service.CodeValueReadPlatformService;
import org.mifosplatform.infrastructure.core.api.ApiParameterHelper; import org.mifosplatform.infrastructure.core.api.ApiParameterHelper;
import org.mifosplatform.infrastructure.core.data.EnumOptionData; import org.mifosplatform.infrastructure.core.data.EnumOptionData;
import org.mifosplatform.infrastructure.core.data.PaginationParameters;
import org.mifosplatform.infrastructure.core.data.PaginationParametersDataValidator;
import org.mifosplatform.infrastructure.core.domain.JdbcSupport; import org.mifosplatform.infrastructure.core.domain.JdbcSupport;
import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.core.service.Page;
import org.mifosplatform.infrastructure.core.service.PaginationHelper; import org.mifosplatform.infrastructure.core.service.PaginationHelper;
@@ -63,17 +67,21 @@ public class CenterReadPlatformServiceImpl implements CenterReadPlatformService
private final GroupDataMapper groupDataMapper = new GroupDataMapper(); private final GroupDataMapper groupDataMapper = new GroupDataMapper();
private final PaginationHelper<CenterData> paginationHelper = new PaginationHelper<CenterData>(); private final PaginationHelper<CenterData> paginationHelper = new PaginationHelper<CenterData>();
private final PaginationParametersDataValidator paginationParametersDataValidator;
private final static Set<String> supportedOrderByValues = new HashSet<String>(Arrays.asList("id", "name", "officeId", "officeName"));
@Autowired @Autowired
public CenterReadPlatformServiceImpl(final PlatformSecurityContext context, final RoutingDataSource dataSource, public CenterReadPlatformServiceImpl(final PlatformSecurityContext context, final RoutingDataSource dataSource,
final ClientReadPlatformService clientReadPlatformService, final OfficeReadPlatformService officeReadPlatformService, final ClientReadPlatformService clientReadPlatformService, final OfficeReadPlatformService officeReadPlatformService,
final StaffReadPlatformService staffReadPlatformService, final CodeValueReadPlatformService codeValueReadPlatformService) { final StaffReadPlatformService staffReadPlatformService, final CodeValueReadPlatformService codeValueReadPlatformService,
final PaginationParametersDataValidator paginationParametersDataValidator) {
this.context = context; this.context = context;
this.clientReadPlatformService = clientReadPlatformService; this.clientReadPlatformService = clientReadPlatformService;
this.jdbcTemplate = new JdbcTemplate(dataSource); this.jdbcTemplate = new JdbcTemplate(dataSource);
this.officeReadPlatformService = officeReadPlatformService; this.officeReadPlatformService = officeReadPlatformService;
this.staffReadPlatformService = staffReadPlatformService; this.staffReadPlatformService = staffReadPlatformService;
this.codeValueReadPlatformService = codeValueReadPlatformService; this.codeValueReadPlatformService = codeValueReadPlatformService;
this.paginationParametersDataValidator = paginationParametersDataValidator;
} }
// 'g.' preffix because of ERROR 1052 (23000): Column 'column_name' in where // 'g.' preffix because of ERROR 1052 (23000): Column 'column_name' in where
@@ -81,40 +89,41 @@ public class CenterReadPlatformServiceImpl implements CenterReadPlatformService
// caused by the same name of columns in m_office and m_group tables // caused by the same name of columns in m_office and m_group tables
private String getCenterExtraCriteria(final SearchParameters searchCriteria) { private String getCenterExtraCriteria(final SearchParameters searchCriteria) {
String extraCriteria = " and g.level_id = " + GroupTypes.CENTER.getId(); StringBuffer extraCriteria = new StringBuffer(200);
extraCriteria.append(" and g.level_id = " + GroupTypes.CENTER.getId());
String sqlQueryCriteria = searchCriteria.getSqlSearch(); String sqlQueryCriteria = searchCriteria.getSqlSearch();
if (StringUtils.isNotBlank(sqlQueryCriteria)) { if (StringUtils.isNotBlank(sqlQueryCriteria)) {
sqlQueryCriteria = sqlQueryCriteria.replaceAll(" display_name ", " g.display_name "); sqlQueryCriteria = sqlQueryCriteria.replaceAll(" display_name ", " g.display_name ");
sqlQueryCriteria = sqlQueryCriteria.replaceAll("display_name ", "g.display_name "); sqlQueryCriteria = sqlQueryCriteria.replaceAll("display_name ", "g.display_name ");
extraCriteria += " and (" + sqlQueryCriteria + ")"; extraCriteria.append(" and (").append(sqlQueryCriteria).append(") ");
} }
final Long officeId = searchCriteria.getOfficeId(); final Long officeId = searchCriteria.getOfficeId();
if (officeId != null) { if (officeId != null) {
extraCriteria += " and g.office_id = " + officeId; extraCriteria.append(" and g.office_id = ").append(officeId);
} }
final String externalId = searchCriteria.getExternalId(); final String externalId = searchCriteria.getExternalId();
if (externalId != null) { if (externalId != null) {
extraCriteria += " and g.external_id = " + ApiParameterHelper.sqlEncodeString(externalId); extraCriteria.append(" and g.external_id = ").append(ApiParameterHelper.sqlEncodeString(externalId));
} }
final String name = searchCriteria.getName(); final String name = searchCriteria.getName();
if (name != null) { if (name != null) {
extraCriteria += " and g.display_name like " + ApiParameterHelper.sqlEncodeString(name + "%"); extraCriteria.append(" and g.display_name like ").append(ApiParameterHelper.sqlEncodeString(name + "%"));
} }
final String hierarchy = searchCriteria.getHierarchy(); final String hierarchy = searchCriteria.getHierarchy();
if (hierarchy != null) { if (hierarchy != null) {
extraCriteria += " and o.hierarchy like " + ApiParameterHelper.sqlEncodeString(hierarchy + "%"); extraCriteria.append(" and o.hierarchy like ").append(ApiParameterHelper.sqlEncodeString(hierarchy + "%"));
} }
if (StringUtils.isNotBlank(extraCriteria)) { if (StringUtils.isNotBlank(extraCriteria.toString())) {
extraCriteria = extraCriteria.substring(4); extraCriteria.delete(0, 4);
} }
return extraCriteria; return extraCriteria.toString();
} }
private static final String sqlQuery = "g.id as id, g.external_id as externalId, g.display_name as name, " private static final String sqlQuery = "g.id as id, g.external_id as externalId, g.display_name as name, "
@@ -247,8 +256,9 @@ public class CenterReadPlatformServiceImpl implements CenterReadPlatformService
} }
@Override @Override
public Page<CenterData> retrieveAll(final SearchParameters searchParameters) { public Page<CenterData> retrievePagedAll(final SearchParameters searchParameters, final PaginationParameters parameters) {
this.paginationParametersDataValidator.validateParameterValues(parameters, supportedOrderByValues, "audits");
final AppUser currentUser = this.context.authenticatedUser(); final AppUser currentUser = this.context.authenticatedUser();
final String hierarchy = currentUser.getOffice().getHierarchy(); final String hierarchy = currentUser.getOffice().getHierarchy();
final String hierarchySearchString = hierarchy + "%"; final String hierarchySearchString = hierarchy + "%";
@@ -280,6 +290,39 @@ public class CenterReadPlatformServiceImpl implements CenterReadPlatformService
new Object[] { hierarchySearchString }, this.centerMapper); new Object[] { hierarchySearchString }, this.centerMapper);
} }
@Override
public Collection<CenterData> retrieveAll(SearchParameters searchParameters, PaginationParameters parameters) {
this.paginationParametersDataValidator.validateParameterValues(parameters, supportedOrderByValues, "audits");
final AppUser currentUser = this.context.authenticatedUser();
final String hierarchy = currentUser.getOffice().getHierarchy();
final String hierarchySearchString = hierarchy + "%";
final StringBuilder sqlBuilder = new StringBuilder(200);
sqlBuilder.append("select ");
sqlBuilder.append(this.centerMapper.schema());
sqlBuilder.append(" where o.hierarchy like ?");
final String extraCriteria = getCenterExtraCriteria(searchParameters);
if (StringUtils.isNotBlank(extraCriteria)) {
sqlBuilder.append(" and (").append(extraCriteria).append(")");
}
if (searchParameters.isOrderByRequested()) {
sqlBuilder.append(" order by ").append(searchParameters.getOrderBy()).append(' ').append(searchParameters.getSortOrder());
}
if (searchParameters.isLimited()) {
sqlBuilder.append(" limit ").append(searchParameters.getLimit());
if (searchParameters.isOffset()) {
sqlBuilder.append(" offset ").append(searchParameters.getOffset());
}
}
return this.jdbcTemplate.query(sqlBuilder.toString(), this.centerMapper, new Object[] {hierarchySearchString});
}
@Override @Override
public Collection<CenterData> retrieveAllForDropdown(final Long officeId) { public Collection<CenterData> retrieveAllForDropdown(final Long officeId) {
@@ -7,6 +7,7 @@ package org.mifosplatform.portfolio.group.service;
import java.util.Collection; import java.util.Collection;
import org.mifosplatform.infrastructure.core.data.PaginationParameters;
import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.core.service.Page;
import org.mifosplatform.portfolio.group.data.GroupGeneralData; import org.mifosplatform.portfolio.group.data.GroupGeneralData;
@@ -14,7 +15,9 @@ public interface GroupReadPlatformService {
GroupGeneralData retrieveTemplate(Long officeId, boolean isCenterGroup, boolean staffInSelectedOfficeOnly); GroupGeneralData retrieveTemplate(Long officeId, boolean isCenterGroup, boolean staffInSelectedOfficeOnly);
Page<GroupGeneralData> retrieveAll(SearchParameters searchParameters); Page<GroupGeneralData> retrievePagedAll(SearchParameters searchParameters, PaginationParameters parameters);
Collection<GroupGeneralData> retrieveAll(SearchParameters searchParameters, PaginationParameters parameters);
GroupGeneralData retrieveOne(Long groupId); GroupGeneralData retrieveOne(Long groupId);
@@ -8,13 +8,18 @@ package org.mifosplatform.portfolio.group.service;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.mifosplatform.infrastructure.codes.data.CodeValueData; import org.mifosplatform.infrastructure.codes.data.CodeValueData;
import org.mifosplatform.infrastructure.codes.service.CodeValueReadPlatformService; import org.mifosplatform.infrastructure.codes.service.CodeValueReadPlatformService;
import org.mifosplatform.infrastructure.core.api.ApiParameterHelper; import org.mifosplatform.infrastructure.core.api.ApiParameterHelper;
import org.mifosplatform.infrastructure.core.data.PaginationParameters;
import org.mifosplatform.infrastructure.core.data.PaginationParametersDataValidator;
import org.mifosplatform.infrastructure.core.domain.JdbcSupport; import org.mifosplatform.infrastructure.core.domain.JdbcSupport;
import org.mifosplatform.infrastructure.core.service.Page; import org.mifosplatform.infrastructure.core.service.Page;
import org.mifosplatform.infrastructure.core.service.PaginationHelper; import org.mifosplatform.infrastructure.core.service.PaginationHelper;
@@ -52,12 +57,15 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
private final AllGroupTypesDataMapper allGroupTypesDataMapper = new AllGroupTypesDataMapper(); private final AllGroupTypesDataMapper allGroupTypesDataMapper = new AllGroupTypesDataMapper();
private final PaginationHelper<GroupGeneralData> paginationHelper = new PaginationHelper<GroupGeneralData>(); private final PaginationHelper<GroupGeneralData> paginationHelper = new PaginationHelper<GroupGeneralData>();
private final PaginationParametersDataValidator paginationParametersDataValidator;
private final static Set<String> supportedOrderByValues = new HashSet<String>(Arrays.asList("id", "name", "officeId", "officeName"));
@Autowired @Autowired
public GroupReadPlatformServiceImpl(final PlatformSecurityContext context, final RoutingDataSource dataSource, public GroupReadPlatformServiceImpl(final PlatformSecurityContext context, final RoutingDataSource dataSource,
final CenterReadPlatformService centerReadPlatformService, final ClientReadPlatformService clientReadPlatformService, final CenterReadPlatformService centerReadPlatformService, final ClientReadPlatformService clientReadPlatformService,
final OfficeReadPlatformService officeReadPlatformService, final StaffReadPlatformService staffReadPlatformService, final OfficeReadPlatformService officeReadPlatformService, final StaffReadPlatformService staffReadPlatformService,
final CodeValueReadPlatformService codeValueReadPlatformService) { final CodeValueReadPlatformService codeValueReadPlatformService, final PaginationParametersDataValidator paginationParametersDataValidator) {
this.context = context; this.context = context;
this.jdbcTemplate = new JdbcTemplate(dataSource); this.jdbcTemplate = new JdbcTemplate(dataSource);
this.centerReadPlatformService = centerReadPlatformService; this.centerReadPlatformService = centerReadPlatformService;
@@ -65,6 +73,7 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
this.officeReadPlatformService = officeReadPlatformService; this.officeReadPlatformService = officeReadPlatformService;
this.staffReadPlatformService = staffReadPlatformService; this.staffReadPlatformService = staffReadPlatformService;
this.codeValueReadPlatformService = codeValueReadPlatformService; this.codeValueReadPlatformService = codeValueReadPlatformService;
this.paginationParametersDataValidator = paginationParametersDataValidator;
} }
@Override @Override
@@ -118,8 +127,9 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
} }
@Override @Override
public Page<GroupGeneralData> retrieveAll(final SearchParameters searchParameters) { public Page<GroupGeneralData> retrievePagedAll(final SearchParameters searchParameters, final PaginationParameters parameters) {
this.paginationParametersDataValidator.validateParameterValues(parameters, supportedOrderByValues, "audits");
final AppUser currentUser = this.context.authenticatedUser(); final AppUser currentUser = this.context.authenticatedUser();
final String hierarchy = currentUser.getOffice().getHierarchy(); final String hierarchy = currentUser.getOffice().getHierarchy();
final String hierarchySearchString = hierarchy + "%"; final String hierarchySearchString = hierarchy + "%";
@@ -135,11 +145,11 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
sqlBuilder.append(" and (").append(extraCriteria).append(")"); sqlBuilder.append(" and (").append(extraCriteria).append(")");
} }
if (searchParameters.isOrderByRequested()) { if (parameters.isOrderByRequested()) {
sqlBuilder.append(" order by ").append(searchParameters.getOrderBy()).append(' ').append(searchParameters.getSortOrder()); sqlBuilder.append(" order by ").append(searchParameters.getOrderBy()).append(' ').append(searchParameters.getSortOrder());
} }
if (searchParameters.isLimited()) { if (parameters.isLimited()) {
sqlBuilder.append(" limit ").append(searchParameters.getLimit()); sqlBuilder.append(" limit ").append(searchParameters.getLimit());
if (searchParameters.isOffset()) { if (searchParameters.isOffset()) {
sqlBuilder.append(" offset ").append(searchParameters.getOffset()); sqlBuilder.append(" offset ").append(searchParameters.getOffset());
@@ -151,45 +161,78 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
new Object[] { hierarchySearchString }, this.allGroupTypesDataMapper); new Object[] { hierarchySearchString }, this.allGroupTypesDataMapper);
} }
@Override
public Collection<GroupGeneralData> retrieveAll(SearchParameters searchParameters, final PaginationParameters parameters) {
final AppUser currentUser = this.context.authenticatedUser();
final String hierarchy = currentUser.getOffice().getHierarchy();
final String hierarchySearchString = hierarchy + "%";
final StringBuilder sqlBuilder = new StringBuilder(200);
sqlBuilder.append("select ");
sqlBuilder.append(this.allGroupTypesDataMapper.schema());
sqlBuilder.append(" where o.hierarchy like ?");
final String extraCriteria = getGroupExtraCriteria(searchParameters);
if (StringUtils.isNotBlank(extraCriteria)) {
sqlBuilder.append(" and (").append(extraCriteria).append(")");
}
if (parameters.isOrderByRequested()) {
sqlBuilder.append(parameters.orderBySql());
}
if (parameters.isLimited()) {
sqlBuilder.append(parameters.limitSql());
}
return this.jdbcTemplate.query(sqlBuilder.toString(), this.allGroupTypesDataMapper, new Object[] {hierarchySearchString});
}
// 'g.' preffix because of ERROR 1052 (23000): Column 'column_name' in where // 'g.' preffix because of ERROR 1052 (23000): Column 'column_name' in where
// clause is ambiguous // clause is ambiguous
// caused by the same name of columns in m_office and m_group tables // caused by the same name of columns in m_office and m_group tables
private String getGroupExtraCriteria(final SearchParameters searchCriteria) { private String getGroupExtraCriteria(final SearchParameters searchCriteria) {
String extraCriteria = " and g.level_Id = " + GroupTypes.GROUP.getId(); StringBuffer extraCriteria = new StringBuffer(200);
extraCriteria.append(" and g.level_Id = ").append(GroupTypes.GROUP.getId());
String sqlSearch = searchCriteria.getSqlSearch(); String sqlSearch = searchCriteria.getSqlSearch();
if (sqlSearch != null) { if (sqlSearch != null) {
sqlSearch = sqlSearch.replaceAll(" display_name ", " g.display_name "); sqlSearch = sqlSearch.replaceAll(" display_name ", " g.display_name ");
sqlSearch = sqlSearch.replaceAll("display_name ", "g.display_name "); sqlSearch = sqlSearch.replaceAll("display_name ", "g.display_name ");
extraCriteria += " and (" + sqlSearch + ")"; extraCriteria.append(" and ( ").append(sqlSearch).append(") ");
} }
final Long officeId = searchCriteria.getOfficeId(); final Long officeId = searchCriteria.getOfficeId();
if (officeId != null) { if (officeId != null) {
extraCriteria += " and g.office_id = " + officeId; extraCriteria.append(" and g.office_id = ").append(officeId);
} }
final String externalId = searchCriteria.getExternalId(); final String externalId = searchCriteria.getExternalId();
if (externalId != null) { if (externalId != null) {
extraCriteria += " and g.external_id = " + ApiParameterHelper.sqlEncodeString(externalId); extraCriteria.append(" and g.external_id = ").append(ApiParameterHelper.sqlEncodeString(externalId));
} }
final String name = searchCriteria.getName(); final String name = searchCriteria.getName();
if (name != null) { if (name != null) {
extraCriteria += " and g.display_name like " + ApiParameterHelper.sqlEncodeString("%" + name + "%"); extraCriteria.append(" and g.display_name like ").append(ApiParameterHelper.sqlEncodeString("%" + name + "%"));
} }
final String hierarchy = searchCriteria.getHierarchy(); final String hierarchy = searchCriteria.getHierarchy();
if (hierarchy != null) { if (hierarchy != null) {
extraCriteria += " and o.hierarchy like " + ApiParameterHelper.sqlEncodeString(hierarchy + "%"); extraCriteria.append(" and o.hierarchy like ").append(ApiParameterHelper.sqlEncodeString(hierarchy + "%"));
} }
if (StringUtils.isNotBlank(extraCriteria)) { if (searchCriteria.isStaffIdPassed()){
extraCriteria = extraCriteria.substring(4); extraCriteria.append(" and g.staff_id = ").append(searchCriteria.getStaffId());
} }
return extraCriteria; if (StringUtils.isNotBlank(extraCriteria.toString())) {
extraCriteria.delete(0, 4);
}
return extraCriteria.toString();
} }
@Override @Override
@@ -21,9 +21,13 @@ public final class SearchParameters {
private final String orderBy; private final String orderBy;
private final String sortOrder; private final String sortOrder;
@SuppressWarnings("unused")
private final Long staffId;
public static SearchParameters from(final String sqlSearch, final Long officeId, final String externalId, final String name, public static SearchParameters from(final String sqlSearch, final Long officeId, final String externalId, final String name,
final String hierarchy) { final String hierarchy) {
return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, null, null, null, null); final Long staffId = null;
return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, null, null, null, null, staffId);
} }
public static SearchParameters forClients(final String sqlSearch, final Long officeId, final String externalId, public static SearchParameters forClients(final String sqlSearch, final Long officeId, final String externalId,
@@ -31,46 +35,50 @@ public final class SearchParameters {
final Integer limit, final String orderBy, final String sortOrder) { final Integer limit, final String orderBy, final String sortOrder) {
final Integer maxLimitAllowed = getCheckedLimit(limit); final Integer maxLimitAllowed = getCheckedLimit(limit);
final Long staffId = null;
return new SearchParameters(sqlSearch, officeId, externalId, displayName, hierarchy, firstname, lastname, offset, maxLimitAllowed, return new SearchParameters(sqlSearch, officeId, externalId, displayName, hierarchy, firstname, lastname, offset, maxLimitAllowed,
orderBy, sortOrder); orderBy, sortOrder, staffId);
} }
public static SearchParameters forGroups(final String sqlSearch, final Long officeId, final String externalId, final String name, public static SearchParameters forGroups(final String sqlSearch, final Long officeId, final Long staffId, final String externalId, final String name,
final String hierarchy, final Integer offset, final Integer limit, final String orderBy, final String sortOrder) { final String hierarchy, final Integer offset, final Integer limit, final String orderBy, final String sortOrder) {
final Integer maxLimitAllowed = getCheckedLimit(limit); final Integer maxLimitAllowed = getCheckedLimit(limit);
return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, offset, maxLimitAllowed, orderBy, return new SearchParameters(sqlSearch, officeId, externalId, name, hierarchy, null, null, offset, maxLimitAllowed, orderBy,
sortOrder); sortOrder, staffId);
} }
public static SearchParameters forLoans(final String sqlSearch, final String externalId, final Integer offset, final Integer limit, public static SearchParameters forLoans(final String sqlSearch, final String externalId, final Integer offset, final Integer limit,
final String orderBy, final String sortOrder) { final String orderBy, final String sortOrder) {
final Integer maxLimitAllowed = getCheckedLimit(limit); final Integer maxLimitAllowed = getCheckedLimit(limit);
final Long staffId = null;
return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder); return new SearchParameters(sqlSearch, null, externalId, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId);
} }
public static SearchParameters forJournalEntries(final Long officeId, final Integer offset, final Integer limit, final String orderBy, public static SearchParameters forJournalEntries(final Long officeId, final Integer offset, final Integer limit, final String orderBy,
final String sortOrder) { final String sortOrder) {
final Integer maxLimitAllowed = getCheckedLimit(limit); final Integer maxLimitAllowed = getCheckedLimit(limit);
final Long staffId = null;
return new SearchParameters(null, officeId, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder); return new SearchParameters(null, officeId, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId);
} }
public static SearchParameters forPagination(final Integer offset, final Integer limit, final String orderBy, final String sortOrder) { public static SearchParameters forPagination(final Integer offset, final Integer limit, final String orderBy, final String sortOrder) {
final Integer maxLimitAllowed = getCheckedLimit(limit); final Integer maxLimitAllowed = getCheckedLimit(limit);
final Long staffId = null;
return new SearchParameters(null, null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder); return new SearchParameters(null, null, null, null, null, null, null, offset, maxLimitAllowed, orderBy, sortOrder, staffId);
} }
private SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name, private SearchParameters(final String sqlSearch, final Long officeId, final String externalId, final String name,
final String hierarchy, final String firstname, final String lastname, final Integer offset, final Integer limit, final String hierarchy, final String firstname, final String lastname, final Integer offset, final Integer limit,
final String orderBy, final String sortOrder) { final String orderBy, final String sortOrder, final Long staffId) {
this.sqlSearch = sqlSearch; this.sqlSearch = sqlSearch;
this.officeId = officeId; this.officeId = officeId;
this.externalId = externalId; this.externalId = externalId;
@@ -82,6 +90,7 @@ public final class SearchParameters {
this.limit = limit; this.limit = limit;
this.orderBy = orderBy; this.orderBy = orderBy;
this.sortOrder = sortOrder; this.sortOrder = sortOrder;
this.staffId = staffId;
} }
public boolean isOrderByRequested() { public boolean isOrderByRequested() {
@@ -167,4 +176,13 @@ public final class SearchParameters {
public String getSortOrder() { public String getSortOrder() {
return this.sortOrder; return this.sortOrder;
} }
public boolean isStaffIdPassed() {
return this.staffId != null && this.staffId != 0;
}
public Long getStaffId() {
return this.staffId;
}
} }