Merge remote-tracking branch 'nayan/workspace'

This commit is contained in:
Keith Woodlock
2013-03-15 10:35:47 +00:00
10 changed files with 138 additions and 96 deletions
@@ -0,0 +1,5 @@
ALTER TABLE m_group MODIFY name VARCHAR(100) NOT NULL;
ALTER TABLE m_group DROP INDEX name;
ALTER TABLE m_group DROP INDEX external_id;
ALTER TABLE m_group ADD UNIQUE INDEX name (name, level_Id);
ALTER TABLE m_group ADD UNIQUE INDEX external_id (external_id, level_Id);
@@ -45,9 +45,13 @@ import org.springframework.stereotype.Component;
@Scope("singleton") @Scope("singleton")
public class GroupsApiResource { public class GroupsApiResource {
private static final Set<String> GROUP_DATA_PARAMETERS = new HashSet<String>(Arrays.asList("id", "officeId", "name", "externalId", /*
"clientMembers", "allowedClients", "allowedOffices", "allowedParentGroups", "groupLevel", "allowedStaffs", "childGroups")); * GROUP_DATA_PARAMETERS is used by ToApiJsonSerializer<E>, make sure E's properties and E_PARAMETERS are in same
*/
private static final Set<String> GROUP_DATA_PARAMETERS = new HashSet<String>(Arrays.asList("id", "name", "externalId", "officeId",
"officeName", "staffId", "staffName", "parentId", "parentName", "hierarchy", "groupSummaryData", "groupLevelData",
"clientMembers", "allowedClients", "allowedOffices", "allowedParentGroups", "allowedStaffs", "childGroups"));
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final GroupReadPlatformService groupReadPlatformService; private final GroupReadPlatformService groupReadPlatformService;
private final ToApiJsonSerializer<GroupData> toApiJsonSerializer; private final ToApiJsonSerializer<GroupData> toApiJsonSerializer;
@@ -23,12 +23,11 @@ public class GroupData {
private final String officeName; private final String officeName;
private final Long staffId; private final Long staffId;
private final String staffName; private final String staffName;
private final Long groupLevel;
private final Long parentId; private final Long parentId;
private final String parentName; private final String parentName;
private final String hierarchy; private final String hierarchy;
@SuppressWarnings("unused") @SuppressWarnings("unused")
private final GroupSummaryData groupSummaryData; private final GroupSummary groupSummaryData;
@SuppressWarnings("unused") @SuppressWarnings("unused")
private final GroupLevelData groupLevelData; private final GroupLevelData groupLevelData;
private final Collection<ClientLookup> clientMembers; private final Collection<ClientLookup> clientMembers;
@@ -37,21 +36,19 @@ public class GroupData {
@SuppressWarnings("unused") @SuppressWarnings("unused")
private final Collection<OfficeData> allowedOffices; private final Collection<OfficeData> allowedOffices;
@SuppressWarnings("unused") @SuppressWarnings("unused")
private final Collection<GroupLookupData> allowedParentGroups; private final Collection<GroupLookup> allowedParentGroups;
@SuppressWarnings("unused") @SuppressWarnings("unused")
private final Collection<StaffData> allowedStaffs; private final Collection<StaffData> allowedStaffs;
@SuppressWarnings("unused") @SuppressWarnings("unused")
private final Collection<GroupLookupData> childGroups; private final Collection<GroupLookup> childGroups;
public GroupData(final Long id, final Long officeId, final String officeName, final String name, final String externalId, public GroupData(final Long id, final Long officeId, final String officeName, final String name, final String externalId,
final Long groupLevel, final Long parentId, final String parentName, final Long staffId, final String staffName, final Long parentId, final String parentName, final Long staffId, final String staffName, final String hierarchy) {
final String hierarchy) {
this.id = id; this.id = id;
this.officeId = officeId; this.officeId = officeId;
this.officeName = officeName; this.officeName = officeName;
this.name = name; this.name = name;
this.externalId = externalId; this.externalId = externalId;
this.groupLevel = groupLevel;
this.parentId = parentId; this.parentId = parentId;
this.parentName = parentName; this.parentName = parentName;
this.staffId = staffId; this.staffId = staffId;
@@ -68,15 +65,14 @@ public class GroupData {
} }
public GroupData(final GroupData group, final Collection<ClientLookup> clientMembers, final Collection<ClientLookup> allowedClients, public GroupData(final GroupData group, final Collection<ClientLookup> clientMembers, final Collection<ClientLookup> allowedClients,
final Collection<OfficeData> allowedOffices, final Collection<GroupLookupData> allowedParentGroups, final Collection<OfficeData> allowedOffices, final Collection<GroupLookup> allowedParentGroups,
final GroupLevelData groupLevelData, final Collection<StaffData> allowedStaffs, final Collection<GroupLookupData> childGroups, final GroupLevelData groupLevelData, final Collection<StaffData> allowedStaffs, final Collection<GroupLookup> childGroups,
final GroupSummaryData groupSummaryData) { final GroupSummary groupSummaryData) {
this.id = group.getId(); this.id = group.getId();
this.officeId = group.getOfficeId(); this.officeId = group.getOfficeId();
this.officeName = group.getOfficeName(); this.officeName = group.getOfficeName();
this.name = group.getName(); this.name = group.getName();
this.externalId = group.getExternalId(); this.externalId = group.getExternalId();
this.groupLevel = group.getGroupLevel();
this.parentId = group.getParentId(); this.parentId = group.getParentId();
this.parentName = group.getParentName(); this.parentName = group.getParentName();
this.staffId = group.getStaffId(); this.staffId = group.getStaffId();
@@ -94,7 +90,7 @@ public class GroupData {
} }
public GroupData(final Long officeId, final Collection<ClientLookup> allowedClients, final Collection<OfficeData> allowedOffices, public GroupData(final Long officeId, final Collection<ClientLookup> allowedClients, final Collection<OfficeData> allowedOffices,
final Collection<GroupLookupData> allowedParentGroups, final GroupLevelData groupLevelData, final Collection<GroupLookup> allowedParentGroups, final GroupLevelData groupLevelData,
final Collection<StaffData> allowedStaffs) { final Collection<StaffData> allowedStaffs) {
this.id = null; this.id = null;
this.officeId = officeId; this.officeId = officeId;
@@ -102,7 +98,6 @@ public class GroupData {
this.name = null; this.name = null;
this.externalId = null; this.externalId = null;
this.clientMembers = null; this.clientMembers = null;
this.groupLevel = null;
this.parentId = null; this.parentId = null;
this.parentName = null; this.parentName = null;
this.staffId = null; this.staffId = null;
@@ -137,10 +132,6 @@ public class GroupData {
return this.officeName; return this.officeName;
} }
public Long getGroupLevel() {
return this.groupLevel;
}
public Long getParentId() { public Long getParentId() {
return this.parentId; return this.parentId;
} }
@@ -8,12 +8,12 @@ package org.mifosplatform.portfolio.group.data;
/** /**
* Immutable data object representing groups. * Immutable data object representing groups.
*/ */
public class GroupLookupData { public class GroupLookup {
private final Long id; private final Long id;
private final String name; private final String name;
public GroupLookupData(final Long id, final String name) { public GroupLookup(final Long id, final String name) {
this.id = id; this.id = id;
this.name = name; this.name = name;
} }
@@ -9,14 +9,14 @@ import java.util.Collection;
import org.mifosplatform.organisation.monetary.data.MoneyData; import org.mifosplatform.organisation.monetary.data.MoneyData;
public class GroupSummaryData { public class GroupSummary {
private final Long totalActiveClients; private final Long totalActiveClients;
private final Long totalChildGroups; private final Long totalChildGroups;
private final Collection<MoneyData> totalLoanPortfolio; private final Collection<MoneyData> totalLoanPortfolio;
private final Collection<MoneyData> totalSavings; private final Collection<MoneyData> totalSavings;
public GroupSummaryData(final Long totalActiveClients, final Long totalChildGroups, final Collection<MoneyData> totalLoanPortfolio, public GroupSummary(final Long totalActiveClients, final Long totalChildGroups, final Collection<MoneyData> totalLoanPortfolio,
final Collection<MoneyData> totalSavings) { final Collection<MoneyData> totalSavings) {
this.totalActiveClients = totalActiveClients; this.totalActiveClients = totalActiveClients;
this.totalChildGroups = totalChildGroups; this.totalChildGroups = totalChildGroups;
@@ -80,6 +80,13 @@ public final class GroupCommandFromApiJsonDeserializer extends AbstractFromApiJs
final List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>(); final List<ApiParameterError> dataValidationErrors = new ArrayList<ApiParameterError>();
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("group"); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("group");
/*
* Name is a mandatory field and not exceeding length 100 character
*/
final String nameParameterName = "name";
final String name = this.fromApiJsonHelper.extractStringNamed(nameParameterName, element);
baseDataValidator.reset().parameter(nameParameterName).value(name).notNull().notExceedingLengthOf(100);
final String externalIdParameterName = "externalId"; final String externalIdParameterName = "externalId";
if (this.fromApiJsonHelper.parameterExists(externalIdParameterName, element)) { if (this.fromApiJsonHelper.parameterExists(externalIdParameterName, element)) {
@@ -87,22 +94,24 @@ public final class GroupCommandFromApiJsonDeserializer extends AbstractFromApiJs
baseDataValidator.reset().parameter(externalIdParameterName).value(externalId).ignoreIfNull().notExceedingLengthOf(100); baseDataValidator.reset().parameter(externalIdParameterName).value(externalId).ignoreIfNull().notExceedingLengthOf(100);
} }
final String officeIdParameterName = "officeId"; /*
if (this.fromApiJsonHelper.parameterExists(officeIdParameterName, element)) { * Either OfficeId or ParentId is mandatory to have value
final Long officeId = this.fromApiJsonHelper.extractLongNamed(officeIdParameterName, element); */
baseDataValidator.reset().parameter(officeIdParameterName).value(officeId).notNull().integerGreaterThanZero();
}
final String parentIdParameterName = "parentId"; final String parentIdParameterName = "parentId";
if (this.fromApiJsonHelper.parameterExists(parentIdParameterName, element)) { if (this.fromApiJsonHelper.parameterExists(parentIdParameterName, element)) {
final Long parentId = this.fromApiJsonHelper.extractLongNamed(parentIdParameterName, element); final Long parentId = this.fromApiJsonHelper.extractLongNamed(parentIdParameterName, element);
baseDataValidator.reset().parameter(parentIdParameterName).value(parentId).notNull().integerGreaterThanZero(); baseDataValidator.reset().parameter(parentIdParameterName).value(parentId).notNull().integerGreaterThanZero();
}else{
final String officeIdParameterName = "officeId";
final Long officeId = this.fromApiJsonHelper.extractLongNamed(officeIdParameterName, element);
baseDataValidator.reset().parameter(officeIdParameterName).value(officeId).notNull().integerGreaterThanZero();
} }
final String staffIdParameterName = "staffId"; final String staffIdParameterName = "staffId";
if (this.fromApiJsonHelper.parameterExists(staffIdParameterName, element)) { if (this.fromApiJsonHelper.parameterExists(staffIdParameterName, element)) {
final Long staffId = this.fromApiJsonHelper.extractLongNamed(staffIdParameterName, element); final Long staffId = this.fromApiJsonHelper.extractLongNamed(staffIdParameterName, element);
baseDataValidator.reset().parameter(staffIdParameterName).value(staffId).notNull().integerGreaterThanZero(); baseDataValidator.reset().parameter(staffIdParameterName).value(staffId).ignoreIfNull().integerGreaterThanZero();
} }
if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist",
@@ -137,13 +146,13 @@ public final class GroupCommandFromApiJsonDeserializer extends AbstractFromApiJs
final String parentIdParameterName = "parentId"; final String parentIdParameterName = "parentId";
if (this.fromApiJsonHelper.parameterExists(parentIdParameterName, element)) { if (this.fromApiJsonHelper.parameterExists(parentIdParameterName, element)) {
final Long parentId = this.fromApiJsonHelper.extractLongNamed(parentIdParameterName, element); final Long parentId = this.fromApiJsonHelper.extractLongNamed(parentIdParameterName, element);
baseDataValidator.reset().parameter(parentIdParameterName).value(parentId).notNull().integerGreaterThanZero(); baseDataValidator.reset().parameter(parentIdParameterName).value(parentId).ignoreIfNull().integerGreaterThanZero();
} }
final String staffIdParameterName = "staffId"; final String staffIdParameterName = "staffId";
if (this.fromApiJsonHelper.parameterExists(staffIdParameterName, element)) { if (this.fromApiJsonHelper.parameterExists(staffIdParameterName, element)) {
final Long staffId = this.fromApiJsonHelper.extractLongNamed(staffIdParameterName, element); final Long staffId = this.fromApiJsonHelper.extractLongNamed(staffIdParameterName, element);
baseDataValidator.reset().parameter(staffIdParameterName).value(staffId).notNull().integerGreaterThanZero(); baseDataValidator.reset().parameter(staffIdParameterName).value(staffId).ignoreIfNull().integerGreaterThanZero();
} }
if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist",
@@ -155,9 +164,6 @@ public final class GroupCommandFromApiJsonDeserializer extends AbstractFromApiJs
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType(); final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
/*
* Office updated is not supported
*/
final Set<String> supportedParametersUnassignStaff = new HashSet<String>(Arrays.asList("staffId")); final Set<String> supportedParametersUnassignStaff = new HashSet<String>(Arrays.asList("staffId"));
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParametersUnassignStaff); this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParametersUnassignStaff);
@@ -168,10 +174,8 @@ public final class GroupCommandFromApiJsonDeserializer extends AbstractFromApiJs
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("group"); final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("group");
final String staffIdParameterName = "staffId"; final String staffIdParameterName = "staffId";
if (this.fromApiJsonHelper.parameterExists(staffIdParameterName, element)) { final Long staffId = this.fromApiJsonHelper.extractLongNamed(staffIdParameterName, element);
final Long staffId = this.fromApiJsonHelper.extractLongNamed(staffIdParameterName, element); baseDataValidator.reset().parameter(staffIdParameterName).value(staffId).notNull().integerGreaterThanZero();
baseDataValidator.reset().parameter(staffIdParameterName).value(staffId).notNull().integerGreaterThanZero();
}
if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist",
"Validation errors exist.", dataValidationErrors); } "Validation errors exist.", dataValidationErrors); }
@@ -9,6 +9,7 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Collection; import java.util.Collection;
import org.mifosplatform.infrastructure.core.domain.JdbcSupport;
import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource; import org.mifosplatform.infrastructure.core.service.TenantAwareRoutingDataSource;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.portfolio.group.data.GroupLevelData; import org.mifosplatform.portfolio.group.data.GroupLevelData;
@@ -54,9 +55,9 @@ public class GroupLevelReadPlatformServiceImpl implements GroupLevelReadPlatform
final Long levelId = rs.getLong("id"); final Long levelId = rs.getLong("id");
final String levelName = rs.getString("levelName"); final String levelName = rs.getString("levelName");
final Long parentLevelId = rs.getLong("parentLevelId"); final Long parentLevelId = JdbcSupport.getLong(rs, "parentLevelId");
final String parentLevelName = rs.getString("parentName"); final String parentLevelName = rs.getString("parentName");
final Long childLevelId = rs.getLong("childLevelId"); final Long childLevelId = JdbcSupport.getLong(rs, "childLevelId");
final String childLevelName = rs.getString("childLevelName"); final String childLevelName = rs.getString("childLevelName");
final boolean superParent = rs.getBoolean("superParent"); final boolean superParent = rs.getBoolean("superParent");
final boolean recursable = rs.getBoolean("recursable"); final boolean recursable = rs.getBoolean("recursable");
@@ -14,7 +14,7 @@ import org.mifosplatform.portfolio.group.data.GroupAccountSummaryCollectionData;
import org.mifosplatform.portfolio.group.data.GroupAccountSummaryData; import org.mifosplatform.portfolio.group.data.GroupAccountSummaryData;
import org.mifosplatform.portfolio.group.data.GroupData; import org.mifosplatform.portfolio.group.data.GroupData;
import org.mifosplatform.portfolio.group.data.GroupLevelData; import org.mifosplatform.portfolio.group.data.GroupLevelData;
import org.mifosplatform.portfolio.group.data.GroupLookupData; import org.mifosplatform.portfolio.group.data.GroupLookup;
public interface GroupReadPlatformService { public interface GroupReadPlatformService {
@@ -30,7 +30,7 @@ public interface GroupReadPlatformService {
Collection<GroupAccountSummaryData> retrieveGroupLoanAccountsByLoanOfficerId(Long groupId, Long loanOfficerId); Collection<GroupAccountSummaryData> retrieveGroupLoanAccountsByLoanOfficerId(Long groupId, Long loanOfficerId);
Collection<GroupLookupData> retrieveAllGroupsbyOfficeIdAndLevelId(Long officeId, Long levelId); Collection<GroupLookup> retrieveAllGroupsbyOfficeIdAndLevelId(Long officeId, Long levelId);
GroupLevelData retrieveGroupLevelDetails(Long levelId); GroupLevelData retrieveGroupLevelDetails(Long levelId);
@@ -38,7 +38,7 @@ public interface GroupReadPlatformService {
GroupData retrieveGroupDetails(Long groupId, boolean template); GroupData retrieveGroupDetails(Long groupId, boolean template);
Collection<GroupLookupData> retrieveChildGroupsbyGroupId(Long groupId); Collection<GroupLookup> retrieveChildGroupsbyGroupId(Long groupId);
Long retrieveTotalNoOfChildGroups(Long groupId); Long retrieveTotalNoOfChildGroups(Long groupId);
@@ -49,4 +49,6 @@ public interface GroupReadPlatformService {
GroupData retrieveNewChildGroupDetails(Long officeId, Long levelId, Long parentGroupId); GroupData retrieveNewChildGroupDetails(Long officeId, Long levelId, Long parentGroupId);
StaffData retrieveStaffsbyId(Long staffId); StaffData retrieveStaffsbyId(Long staffId);
Long getLevelIdByGroupId(final Long groupId);
} }
@@ -28,12 +28,13 @@ import org.mifosplatform.portfolio.group.data.GroupAccountSummaryCollectionData;
import org.mifosplatform.portfolio.group.data.GroupAccountSummaryData; import org.mifosplatform.portfolio.group.data.GroupAccountSummaryData;
import org.mifosplatform.portfolio.group.data.GroupData; import org.mifosplatform.portfolio.group.data.GroupData;
import org.mifosplatform.portfolio.group.data.GroupLevelData; import org.mifosplatform.portfolio.group.data.GroupLevelData;
import org.mifosplatform.portfolio.group.data.GroupLookupData; import org.mifosplatform.portfolio.group.data.GroupLookup;
import org.mifosplatform.portfolio.group.data.GroupSummaryData; import org.mifosplatform.portfolio.group.data.GroupSummary;
import org.mifosplatform.portfolio.group.domain.Group; import org.mifosplatform.portfolio.group.domain.Group;
import org.mifosplatform.portfolio.group.domain.GroupRepository; import org.mifosplatform.portfolio.group.domain.GroupRepository;
import org.mifosplatform.portfolio.group.exception.GroupLevelNotFoundException; import org.mifosplatform.portfolio.group.exception.GroupLevelNotFoundException;
import org.mifosplatform.portfolio.group.exception.GroupNotFoundException; import org.mifosplatform.portfolio.group.exception.GroupNotFoundException;
import org.mifosplatform.useradministration.domain.AppUser;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
@@ -64,16 +65,20 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
public Collection<GroupData> retrieveAllGroups(final String extraCriteria) { public Collection<GroupData> retrieveAllGroups(final String extraCriteria) {
this.context.authenticatedUser(); this.context.authenticatedUser();
AppUser currentUser = context.authenticatedUser();
String hierarchy = currentUser.getOffice().getHierarchy();
String hierarchySearchString = hierarchy + "%";
final GroupDataMapper rm = new GroupDataMapper(); final GroupDataMapper rm = new GroupDataMapper();
String sql = "select " + rm.groupSchema() + " where g.is_deleted=0"; String sql = "select " + rm.groupSchema() + " where o.hierarchy like ? and g.is_deleted=0 ";
if (StringUtils.isNotBlank(extraCriteria)) { if (StringUtils.isNotBlank(extraCriteria)) {
sql += " and (" + extraCriteria + ")"; sql += " and (" + extraCriteria + ")";
} }
return this.jdbcTemplate.query(sql, rm, new Object[] {}); return this.jdbcTemplate.query(sql, rm, new Object[] {hierarchySearchString});
} }
@Override @Override
@@ -93,7 +98,7 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
} }
@Override @Override
public Collection<GroupLookupData> retrieveAllGroupsbyOfficeIdAndLevelId(final Long officeId, final Long levelId) { public Collection<GroupLookup> retrieveAllGroupsbyOfficeIdAndLevelId(final Long officeId, final Long levelId) {
this.context.authenticatedUser(); this.context.authenticatedUser();
final GroupLookupMapper rm = new GroupLookupMapper(); final GroupLookupMapper rm = new GroupLookupMapper();
@@ -101,7 +106,7 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
return this.jdbcTemplate.query(sql, rm, new Object[] { officeId, levelId }); return this.jdbcTemplate.query(sql, rm, new Object[] { officeId, levelId });
} }
private GroupLookupData retrieveGroupbyId(final Long parentGroupId) { private GroupLookup retrieveGroupbyId(final Long parentGroupId) {
try { try {
this.context.authenticatedUser(); this.context.authenticatedUser();
final GroupLookupMapper rm = new GroupLookupMapper(); final GroupLookupMapper rm = new GroupLookupMapper();
@@ -114,7 +119,7 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
} }
@Override @Override
public Collection<GroupLookupData> retrieveChildGroupsbyGroupId(final Long groupId) { public Collection<GroupLookup> retrieveChildGroupsbyGroupId(final Long groupId) {
this.context.authenticatedUser(); this.context.authenticatedUser();
final GroupLookupMapper rm = new GroupLookupMapper(); final GroupLookupMapper rm = new GroupLookupMapper();
@@ -155,10 +160,10 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
final List<OfficeData> allowedOffices = new ArrayList<OfficeData>(this.officeReadPlatformService.retrieveAllOfficesForDropdown()); final List<OfficeData> allowedOffices = new ArrayList<OfficeData>(this.officeReadPlatformService.retrieveAllOfficesForDropdown());
List<GroupLookupData> allowedParentGroups = null; List<GroupLookup> allowedParentGroups = null;
if (groupLevelData.getParentLevelId() != null) { if (groupLevelData.getParentLevelId() != null) {
allowedParentGroups = new ArrayList<GroupLookupData>(retrieveAllGroupsbyOfficeIdAndLevelId(officeId, allowedParentGroups = new ArrayList<GroupLookup>(retrieveAllGroupsbyOfficeIdAndLevelId(officeId,
groupLevelData.getParentLevelId())); groupLevelData.getParentLevelId()));
} }
@@ -190,7 +195,7 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
final List<OfficeData> allowedOffices = new ArrayList<OfficeData>(); final List<OfficeData> allowedOffices = new ArrayList<OfficeData>();
allowedOffices.add(this.officeReadPlatformService.retrieveOffice(officeId)); allowedOffices.add(this.officeReadPlatformService.retrieveOffice(officeId));
final List<GroupLookupData> allowedParentGroups = new ArrayList<GroupLookupData>(); final List<GroupLookup> allowedParentGroups = new ArrayList<GroupLookup>();
allowedParentGroups.add(retrieveGroupbyId(parentGroupId)); allowedParentGroups.add(retrieveGroupbyId(parentGroupId));
final List<StaffData> allowedStaffs = new ArrayList<StaffData>(); final List<StaffData> allowedStaffs = new ArrayList<StaffData>();
@@ -206,17 +211,17 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
final Collection<ClientLookup> clientMembers = retrieveClientMembers(groupId); final Collection<ClientLookup> clientMembers = retrieveClientMembers(groupId);
Collection<ClientLookup> availableClients = null; Collection<ClientLookup> availableClients = null;
Collection<OfficeData> allowedOffices = null; Collection<OfficeData> allowedOffices = null;
Collection<GroupLookupData> allowedParentGroups = null; Collection<GroupLookup> allowedParentGroups = null;
final GroupLevelData groupLevelData = retrieveGroupLevelDetails(group.getGroupLevel()); final GroupLevelData groupLevelData = retrieveGroupLevelDetails(getLevelIdByGroupId(groupId));
; ;
Collection<StaffData> allowedStaffs = null; Collection<StaffData> allowedStaffs = null;
final Collection<GroupLookupData> childGroups = retrieveChildGroupsbyGroupId(groupId); final Collection<GroupLookup> childGroups = retrieveChildGroupsbyGroupId(groupId);
final Long totalActiveClients = retrieveTotalClients(group.getHierarchy()); final Long totalActiveClients = retrieveTotalClients(group.getHierarchy());
final Long totalChildGroups = retrieveTotalNoOfChildGroups(groupId); final Long totalChildGroups = retrieveTotalNoOfChildGroups(groupId);
final Collection<MoneyData> totalLoanPortfolio = retrieveGroupLoanPortfolio(group.getHierarchy()); final Collection<MoneyData> totalLoanPortfolio = retrieveGroupLoanPortfolio(group.getHierarchy());
final GroupSummaryData groupSummaryData = new GroupSummaryData(totalActiveClients, totalChildGroups, totalLoanPortfolio, null); final GroupSummary groupSummaryData = new GroupSummary(totalActiveClients, totalChildGroups, totalLoanPortfolio, null);
group = new GroupData(group, clientMembers, availableClients, allowedOffices, allowedParentGroups, groupLevelData, allowedStaffs, group = new GroupData(group, clientMembers, availableClients, allowedOffices, allowedParentGroups, groupLevelData, allowedStaffs,
childGroups, groupSummaryData); childGroups, groupSummaryData);
@@ -265,6 +270,15 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
} }
} }
@Override
public Long getLevelIdByGroupId(final Long groupId){
this.context.authenticatedUser();
final String sqlTotalClients = "SELECT g.level_Id as levelId FROM m_group g WHERE g.id = ?";
return this.jdbcTemplate.queryForLong(sqlTotalClients, new Object[] { groupId });
}
@Override @Override
public Long retrieveTotalClients(final String hierarchy) { public Long retrieveTotalClients(final String hierarchy) {
@@ -323,10 +337,10 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
private static final class GroupDataMapper implements RowMapper<GroupData> { private static final class GroupDataMapper implements RowMapper<GroupData> {
public String groupSchema() { public String groupSchema() {
return "g.office_id as officeId, g.level_id as groupLevel , g.parent_id as parentId , o.name as officeName," return "g.office_id as officeId, g.parent_id as parentId , o.name as officeName,"
+ " g.id as id, g.external_id as externalId, g.name as name , s.display_name as staffName , pg.name as" + " g.id as id, g.external_id as externalId, g.name as name , s.display_name as staffName , pg.name as"
+ " parentName , g.staff_id as staffId , g.hierarchy as hierarchy from m_group g join m_office o on o.id = g.office_id left join " + " parentName , g.staff_id as staffId , g.hierarchy as hierarchy from m_group g join m_office o on o.id = g.office_id left join"
+ "m_staff s on s.id = g.staff_id left join m_group pg on pg.id = g.parent_id"; + " m_staff s on s.id = g.staff_id left join m_group pg on pg.id = g.parent_id";
} }
@Override @Override
@@ -337,32 +351,31 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService {
final String externalId = rs.getString("externalId"); final String externalId = rs.getString("externalId");
final Long officeId = rs.getLong("officeId"); final Long officeId = rs.getLong("officeId");
final String officeName = rs.getString("officeName"); final String officeName = rs.getString("officeName");
final Long groupLevel = rs.getLong("groupLevel");
final Long parentId = JdbcSupport.getLong(rs, "parentId"); final Long parentId = JdbcSupport.getLong(rs, "parentId");
final String parentName = rs.getString("parentName"); final String parentName = rs.getString("parentName");
final Long staffId = JdbcSupport.getLong(rs, "staffId"); final Long staffId = JdbcSupport.getLong(rs, "staffId");
final String staffName = rs.getString("staffName"); final String staffName = rs.getString("staffName");
final String hierarchy = rs.getString("hierarchy"); final String hierarchy = rs.getString("hierarchy");
return new GroupData(id, officeId, officeName, name, externalId, groupLevel, parentId, parentName, staffId, staffName, return new GroupData(id, officeId, officeName, name, externalId, parentId, parentName, staffId, staffName,
hierarchy); hierarchy);
} }
} }
private static final class GroupLookupMapper implements RowMapper<GroupLookupData> { private static final class GroupLookupMapper implements RowMapper<GroupLookup> {
public String groupLookupSchema() { public String groupLookupSchema() {
return "g.id as id, g.name as name "; return "g.id as id, g.name as name ";
} }
@Override @Override
public GroupLookupData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { public GroupLookup 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("name"); final String name = rs.getString("name");
return new GroupLookupData(id, name); return new GroupLookup(id, name);
} }
} }
@@ -73,6 +73,8 @@ public class GroupWritePlatformServiceJpaRepositoryImpl implements GroupWritePla
@Transactional @Transactional
@Override @Override
public CommandProcessingResult createGroup(final JsonCommand command) { public CommandProcessingResult createGroup(final JsonCommand command) {
GroupLevel groupLevel = null;
try { try {
this.context.authenticatedUser(); this.context.authenticatedUser();
@@ -84,7 +86,7 @@ public class GroupWritePlatformServiceJpaRepositoryImpl implements GroupWritePla
final Long parentId = command.longValueOfParameterNamed("parentId"); final Long parentId = command.longValueOfParameterNamed("parentId");
Long officeId = null; Long officeId = null;
GroupLevel groupLevel = null;
Group parentGroup = null; Group parentGroup = null;
if (parentId == null) { if (parentId == null) {
@@ -152,7 +154,7 @@ public class GroupWritePlatformServiceJpaRepositoryImpl implements GroupWritePla
.build(); .build();
} catch (final DataIntegrityViolationException dve) { } catch (final DataIntegrityViolationException dve) {
handleGroupDataIntegrityIssues(command, dve); handleGroupDataIntegrityIssues(command, dve , groupLevel );
return new CommandProcessingResult(Long.valueOf(-1)); return new CommandProcessingResult(Long.valueOf(-1));
} }
} }
@@ -161,6 +163,8 @@ public class GroupWritePlatformServiceJpaRepositoryImpl implements GroupWritePla
@Override @Override
public CommandProcessingResult updateGroup(final Long grouptId, final JsonCommand command) { public CommandProcessingResult updateGroup(final Long grouptId, final JsonCommand command) {
GroupLevel groupLevel = null;
try { try {
this.context.authenticatedUser(); this.context.authenticatedUser();
@@ -197,12 +201,16 @@ public class GroupWritePlatformServiceJpaRepositoryImpl implements GroupWritePla
if (command.isChangeInLongParameterNamed(staffIdParamName, presentStaffId)) { if (command.isChangeInLongParameterNamed(staffIdParamName, presentStaffId)) {
final Long newValue = command.longValueOfParameterNamed(staffIdParamName); final Long newValue = command.longValueOfParameterNamed(staffIdParamName);
actualChanges.put(staffIdParamName, newValue); actualChanges.put(staffIdParamName, newValue);
final Staff newStaff = this.staffRepository.findByOffice(newValue, officeId);
if (newStaff == null) { throw new StaffNotFoundException(newValue); } Staff newStaff = null;
if(newValue != null){
newStaff = this.staffRepository.findByOffice(newValue, officeId);
if (newStaff == null) { throw new StaffNotFoundException(newValue); }
}
groupForUpdate.setStaff(newStaff); groupForUpdate.setStaff(newStaff);
} }
final GroupLevel groupLevel = this.groupLevelRepository.findOne(groupForUpdate.getGroupLevel().getId()); groupLevel = this.groupLevelRepository.findOne(groupForUpdate.getGroupLevel().getId());
/* /*
* Ignoring parentId param, if group for update is super parent. * Ignoring parentId param, if group for update is super parent.
@@ -216,27 +224,28 @@ public class GroupWritePlatformServiceJpaRepositoryImpl implements GroupWritePla
final Long newValue = command.longValueOfParameterNamed(parentIdParamName); final Long newValue = command.longValueOfParameterNamed(parentIdParamName);
actualChanges.put(parentIdParamName, newValue); actualChanges.put(parentIdParamName, newValue);
final Group newParentGroup = this.groupRepository.findOne(newValue); Group newParentGroup = null;
if (newValue != null) {
newParentGroup = this.groupRepository.findOne(newValue);
if (newParentGroup == null || newParentGroup.isDeleted()) { throw new StaffNotFoundException(newValue); }
if (newParentGroup == null || newParentGroup.isDeleted()) { throw new StaffNotFoundException(newValue); } if (!newParentGroup.isOfficeIdentifiedBy(officeId)) {
final String errorMessage = "Group and parent group must have the same office";
throw new InvalidOfficeException("group", "attach.to.parent.group", errorMessage);
}
/*
* If Group is not super parent then validate group
* level's parent level is same as group parent's level
* this check makes sure new group is added at immediate
* next level in hierarchy
*/
if (!newParentGroup.isOfficeIdentifiedBy(officeId)) { if (!groupForUpdate.getGroupLevel().isIdentifiedByParentId(newParentGroup.getGroupLevel().getId())) {
final String errorMessage = "Group and parent group must have the same office"; final String errorMessage = "Parent group's level is not equal to child level's parent level ";
throw new InvalidOfficeException("group", "attach.to.parent.group", errorMessage); throw new InvalidGroupLevelException("add", "invalid.level", errorMessage);
}
} }
/*
* If Group is not super parent then validate group level's
* parent level is same as group parent's level this check
* makes sure new group is added at immediate next level in
* hierarchy
*/
if (!groupForUpdate.getGroupLevel().isIdentifiedByParentId(newParentGroup.getGroupLevel().getId())) {
final String errorMessage = "Parent group's level is not equal to child level's parent level ";
throw new InvalidGroupLevelException("add", "invalid.level", errorMessage);
}
groupForUpdate.setParent(newParentGroup); groupForUpdate.setParent(newParentGroup);
} }
} }
@@ -262,7 +271,7 @@ public class GroupWritePlatformServiceJpaRepositoryImpl implements GroupWritePla
.build(); .build();
} catch (final DataIntegrityViolationException dve) { } catch (final DataIntegrityViolationException dve) {
handleGroupDataIntegrityIssues(command, dve); handleGroupDataIntegrityIssues(command, dve , groupLevel);
return new CommandProcessingResult(Long.valueOf(-1)); return new CommandProcessingResult(Long.valueOf(-1));
} }
} }
@@ -378,14 +387,27 @@ public class GroupWritePlatformServiceJpaRepositoryImpl implements GroupWritePla
* Guaranteed to throw an exception no matter what the data integrity issue * Guaranteed to throw an exception no matter what the data integrity issue
* is. * is.
*/ */
private void handleGroupDataIntegrityIssues(final JsonCommand command, final DataIntegrityViolationException dve) { private void handleGroupDataIntegrityIssues(final JsonCommand command, final DataIntegrityViolationException dve, GroupLevel groupLevel) {
final Throwable realCause = dve.getMostSpecificCause(); final Throwable realCause = dve.getMostSpecificCause();
String errorMessageForUser = null;
String errorMessageForMachine = null;
if (realCause.getMessage().contains("external_id")) { if (realCause.getMessage().contains("external_id")) {
throw new PlatformDataIntegrityException("error.msg.group.duplicate.externalId", "Group with externalId {0} already exists",
"externalId", command.stringValueOfParameterNamed("externalId")); errorMessageForUser = groupLevel.getLevelName() + " with externalId {0} already exists";
} else if (realCause.getMessage().contains("name")) { throw new PlatformDataIntegrityException("error.msg.group.duplicate.name", errorMessageForMachine = "error.msg." + groupLevel.getLevelName().toLowerCase() + ".duplicate.externalId";
"Group with name {0} already exists", "name", command.stringValueOfParameterNamed("name")); } throw new PlatformDataIntegrityException(errorMessageForMachine, errorMessageForUser, "externalId",
command.stringValueOfParameterNamed("externalId"));
} else if (realCause.getMessage().contains("name")) {
errorMessageForUser = groupLevel.getLevelName() + " with name {0} already exists";
errorMessageForMachine = "error.msg." + groupLevel.getLevelName().toLowerCase() + ".duplicate.name";
throw new PlatformDataIntegrityException(errorMessageForMachine, errorMessageForUser, "name",
command.stringValueOfParameterNamed("name"));
}
logger.error(dve.getMessage(), dve); logger.error(dve.getMessage(), dve);
throw new PlatformDataIntegrityException("error.msg.group.unknown.data.integrity.issue", throw new PlatformDataIntegrityException("error.msg.group.unknown.data.integrity.issue",