MIFOSX-1828:EntityMapping Feature

This commit is contained in:
MithunKashyap
2015-02-16 09:51:32 +05:30
parent 7ba9a81e53
commit f22cac3feb
27 changed files with 1519 additions and 244 deletions
@@ -258,7 +258,7 @@ public class CommandWrapper {
public boolean isAccountNumberFormatResource() {
return this.entityName.equals(AccountNumberFormatConstants.ENTITY_NAME.toUpperCase());
}
public boolean isApprove() {
return this.actionName.equalsIgnoreCase("APPROVE");
}
@@ -1008,4 +1008,8 @@ public class CommandWrapper {
public boolean isEnableOperation() {
return this.actionName.equalsIgnoreCase("ENABLE");
}
public boolean isEntityMappingResource() {
return this.entityName.equalsIgnoreCase("ENTITYMAPPING");
}
}
@@ -1425,7 +1425,7 @@ public class CommandWrapperBuilder {
this.href = "/groups/" + groupId + "?command=saveCollectionSheet";
return this;
}
public CommandWrapperBuilder saveIndividualCollectionSheet() {
this.actionName = "SAVE";
this.entityName = "COLLECTIONSHEET";
@@ -2327,4 +2327,27 @@ public class CommandWrapperBuilder {
return this;
}
public CommandWrapperBuilder createMap(Long relId) {
this.actionName = "CREATE";
this.entityName = "ENTITYMAPPING";
this.entityId = relId;
this.href = "/entitytoentitymapping/" + relId;
return this;
}
public CommandWrapperBuilder updateMap(Long mapId) {
this.actionName = "UPDATE";
this.entityName = "ENTITYMAPPING";
this.entityId = mapId;
this.href = "/entitytoentitymapping" + mapId;
return this;
}
public CommandWrapperBuilder deleteMap(final Long mapId) {
this.actionName = "DELETE";
this.entityName = "ENTITYMAPPING";
this.entityId = mapId;
this.href = "/entitytoentitymapping/" + mapId;
return this;
}
}
@@ -910,7 +910,17 @@ public class SynchronousCommandProcessingService implements CommandProcessingSer
} else {
throw new UnsupportedCommandException(wrapper.commandName());
}
} else {
} else if (wrapper.isEntityMappingResource()) {
if (wrapper.isCreate()) {
handler = this.applicationContext.getBean("createEntityToEntityMappingCommandHandler", NewCommandSourceHandler.class);
} else if (wrapper.isUpdate()) {
handler = this.applicationContext.getBean("updateEntityToEntityMappingCommandHandler", NewCommandSourceHandler.class);
} else if (wrapper.isDelete()) {
handler = this.applicationContext.getBean("deleteEntityToEntityMappingCommandHandler", NewCommandSourceHandler.class);
} else {
throw new UnsupportedCommandException(wrapper.commandName());
}
}else {
throw new UnsupportedCommandException(wrapper.commandName());
}
@@ -0,0 +1,156 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.api;
import java.util.Collection;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriInfo;
import org.mifosplatform.commands.domain.CommandWrapper;
import org.mifosplatform.commands.service.CommandWrapperBuilder;
import org.mifosplatform.commands.service.PortfolioCommandSourceWritePlatformService;
import org.mifosplatform.infrastructure.core.api.ApiRequestParameterHelper;
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.mifosplatform.infrastructure.entityaccess.data.MifosEntityRelationData;
import org.mifosplatform.infrastructure.entityaccess.data.MifosEntityToEntityMappingData;
import org.mifosplatform.infrastructure.entityaccess.service.MifosEntityAccessReadService;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Path("/entitytoentitymapping")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
@Component
@Scope("singleton")
public class MifosEntityApiResource {
private final PlatformSecurityContext context;
private final MifosEntityAccessReadService readPlatformService;
private final DefaultToApiJsonSerializer<MifosEntityRelationData> toApiJsonSerializer;
private final DefaultToApiJsonSerializer<MifosEntityToEntityMappingData> toApiJsonSerializerOfficeToLoanProducts;
private final ApiRequestParameterHelper apiRequestParameterHelper;
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
@Autowired
public MifosEntityApiResource(final PlatformSecurityContext context, final MifosEntityAccessReadService readPlatformService,
final DefaultToApiJsonSerializer<MifosEntityRelationData> toApiJsonSerializer,
final DefaultToApiJsonSerializer<MifosEntityToEntityMappingData> toApiJsonSerializerOfficeToLoanProducts,
final ApiRequestParameterHelper apiRequestParameterHelper,
final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) {
this.context = context;
this.readPlatformService = readPlatformService;
this.toApiJsonSerializer = toApiJsonSerializer;
this.apiRequestParameterHelper = apiRequestParameterHelper;
this.commandsSourceWritePlatformService = commandsSourceWritePlatformService;
this.toApiJsonSerializerOfficeToLoanProducts = toApiJsonSerializerOfficeToLoanProducts;
}
@GET
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String retrieveAll(@Context final UriInfo uriInfo) {
this.context.authenticatedUser().validateHasReadPermission(MifosEntityApiResourceConstants.MIFOS_ENTITY_RESOURCE_NAME);
final Collection<MifosEntityRelationData> entityMappings = this.readPlatformService.retrieveAllSupportedMappingTypes();
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
return this.toApiJsonSerializer.serialize(settings, entityMappings, MifosEntityApiResourceConstants.RESPONSE_DATA_PARAMETERS);
}
@GET
@Path("/{mapId}")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String retrieveOne(@PathParam("mapId") final Long mapId, @Context final UriInfo uriInfo) {
this.context.authenticatedUser().validateHasReadPermission(MifosEntityApiResourceConstants.MIFOS_ENTITY_RESOURCE_NAME);
final Collection<MifosEntityToEntityMappingData> entityToEntityMappings = this.readPlatformService.retrieveOneMapping(mapId);
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
return this.toApiJsonSerializerOfficeToLoanProducts.serialize(settings, entityToEntityMappings,
MifosEntityApiResourceConstants.FETCH_ENTITY_TO_ENTITY_MAPPINGS);
}
@GET
@Path("/{mapId}/{fromId}/{toId}")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String getEntityToEntityMappings(@PathParam("mapId") final Long mapId, @PathParam("fromId") final Long fromId,
@PathParam("toId") final Long toId, @Context final UriInfo uriInfo) {
this.context.authenticatedUser().validateHasReadPermission(MifosEntityApiResourceConstants.MIFOS_ENTITY_RESOURCE_NAME);
final Collection<MifosEntityToEntityMappingData> entityToEntityMappings = this.readPlatformService.retrieveEntityToEntityMappings(
mapId, fromId, toId);
final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
return this.toApiJsonSerializerOfficeToLoanProducts.serialize(settings, entityToEntityMappings,
MifosEntityApiResourceConstants.FETCH_ENTITY_TO_ENTITY_MAPPINGS);
}
@POST
@Path("/{relId}")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String createMap(@PathParam("relId") final Long relId, final String apiRequestBodyAsJson) {
final CommandWrapper commandRequest = new CommandWrapperBuilder() //
.createMap(relId) //
.withJson(apiRequestBodyAsJson) //
.build(); //
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
return this.toApiJsonSerializer.serialize(result);
}
@PUT
@Path("/{mapId}")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String updateMap(@PathParam("mapId") final Long mapId, final String apiRequestBodyAsJson) {
final CommandWrapper commandRequest = new CommandWrapperBuilder() //
.updateMap(mapId) //
.withJson(apiRequestBodyAsJson) //
.build(); //
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
return this.toApiJsonSerializer.serialize(result);
}
@DELETE
@Path("{mapId}")
@Consumes({ MediaType.APPLICATION_JSON })
@Produces({ MediaType.APPLICATION_JSON })
public String delete(@PathParam("mapId") final Long mapId) {
final CommandWrapper commandRequest = new CommandWrapperBuilder() //
.deleteMap(mapId) //
.build(); //
final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
return this.toApiJsonSerializer.serialize(result);
}
}
@@ -0,0 +1,41 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.api;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class MifosEntityApiResourceConstants {
public static final String MIFOS_ENTITY_RESOURCE_NAME = "MifosEntity";
public static final String mappingTypes = "mappingTypes";
public static final String mapId = "mapId";
public static final String relId = "relId";
public static final String fromEnityType = "fromId";
public static final String toEntityType = "toId";
public static final String startDate = "startDate";
public static final String endDate = "endDate";
public static final String LOCALE = "locale";
public static final String DATE_FORMAT = "dateFormat";
public static final String OFFICE_ACCESS_TO_LOAN_PRODUCTS = " office_access_to_loan_products ";
public static final String OFFICE_ACCESS_TO_SAVINGS_PRODUCTS = " office_access_to_savings_products ";
public static final String OFFICE_ACCESS_TO_CHARGES_FEES = " office_access_to_fees/charges ";
public static final String ROLE_ACCESS_TO_LOAN_PRODUCTS = " role_access_to_loan_products ";
public static final String ROLE_ACCESS_TO_SAVINGS_PRODUCTS = " role_access_to_savings_products ";
public static final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList(mappingTypes));
public static final Set<String> FETCH_ENTITY_TO_ENTITY_MAPPINGS = new HashSet<>(Arrays.asList(mapId,relId,fromEnityType, toEntityType));
public static final Set<String> CREATE_ENTITY_MAPPING_REQUEST_DATA_PARAMETERS = new HashSet<>(Arrays.asList(fromEnityType,
toEntityType, startDate, LOCALE, DATE_FORMAT, endDate));
public static final Set<String> UPDATE_ENTITY_MAPPING_REQUEST_DATA_PARAMETERS = new HashSet<>(Arrays.asList(relId,fromEnityType,
toEntityType, startDate,LOCALE, DATE_FORMAT, endDate));
}
@@ -0,0 +1,204 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.data;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate;
import org.mifosplatform.infrastructure.core.data.ApiParameterError;
import org.mifosplatform.infrastructure.core.data.DataValidatorBuilder;
import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
import org.mifosplatform.infrastructure.core.exception.PlatformApiDataValidationException;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.infrastructure.entityaccess.api.MifosEntityApiResourceConstants;
import org.mifosplatform.organisation.office.domain.OfficeRepositoryWrapper;
import org.mifosplatform.portfolio.charge.domain.ChargeRepositoryWrapper;
import org.mifosplatform.portfolio.loanproduct.domain.LoanProduct;
import org.mifosplatform.portfolio.loanproduct.domain.LoanProductRepository;
import org.mifosplatform.portfolio.loanproduct.exception.LoanProductNotFoundException;
import org.mifosplatform.portfolio.savings.domain.SavingsProduct;
import org.mifosplatform.portfolio.savings.domain.SavingsProductRepository;
import org.mifosplatform.portfolio.savings.exception.SavingsProductNotFoundException;
import org.mifosplatform.useradministration.domain.Role;
import org.mifosplatform.useradministration.domain.RoleRepository;
import org.mifosplatform.useradministration.exception.RoleNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.google.gson.JsonElement;
import com.google.gson.reflect.TypeToken;
@Component
public class MifosEntityDataValidator {
private final FromJsonHelper fromApiJsonHelper;
private final OfficeRepositoryWrapper officeRepositoryWrapper;
private final LoanProductRepository loanProductRepository;
private final SavingsProductRepository savingsProductRepository;
private final ChargeRepositoryWrapper chargeRepositoryWrapper;
private final RoleRepository roleRepository;
@Autowired
public MifosEntityDataValidator(final FromJsonHelper fromApiJsonHelper, final OfficeRepositoryWrapper officeRepositoryWrapper,
final LoanProductRepository loanProductRepository, final SavingsProductRepository savingsProductRepository,
final ChargeRepositoryWrapper chargeRepositoryWrapper, final RoleRepository roleRepository) {
this.fromApiJsonHelper = fromApiJsonHelper;
this.officeRepositoryWrapper = officeRepositoryWrapper;
this.loanProductRepository = loanProductRepository;
this.savingsProductRepository = savingsProductRepository;
this.chargeRepositoryWrapper = chargeRepositoryWrapper;
this.roleRepository = roleRepository;
}
public void validateForCreate(final String json) {
if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json,
MifosEntityApiResourceConstants.CREATE_ENTITY_MAPPING_REQUEST_DATA_PARAMETERS);
final JsonElement element = this.fromApiJsonHelper.parse(json);
final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors)
.resource(MifosEntityApiResourceConstants.MIFOS_ENTITY_RESOURCE_NAME);
if (this.fromApiJsonHelper.parameterExists(MifosEntityApiResourceConstants.fromEnityType, element)) {
final Long fromId = this.fromApiJsonHelper.extractLongNamed(MifosEntityApiResourceConstants.fromEnityType, element);
baseDataValidator.reset().parameter(MifosEntityApiResourceConstants.fromEnityType).value(fromId).notNull()
.integerGreaterThanZero();
}
if (this.fromApiJsonHelper.parameterExists(MifosEntityApiResourceConstants.toEntityType, element)) {
final Long toId = this.fromApiJsonHelper.extractLongNamed(MifosEntityApiResourceConstants.toEntityType, element);
baseDataValidator.reset().parameter(MifosEntityApiResourceConstants.toEntityType).value(toId).notNull()
.integerGreaterThanZero();
}
if (this.fromApiJsonHelper.parameterExists(MifosEntityApiResourceConstants.startDate, element)) {
final LocalDate startDate = this.fromApiJsonHelper.extractLocalDateNamed(MifosEntityApiResourceConstants.startDate, element);
baseDataValidator.reset().parameter(MifosEntityApiResourceConstants.startDate).value(startDate);
}
if (this.fromApiJsonHelper.parameterExists(MifosEntityApiResourceConstants.endDate, element)) {
final LocalDate endDate = this.fromApiJsonHelper.extractLocalDateNamed(MifosEntityApiResourceConstants.endDate, element);
baseDataValidator.reset().parameter(MifosEntityApiResourceConstants.endDate).value(endDate);
}
throwExceptionIfValidationWarningsExist(dataValidationErrors);
}
private void throwExceptionIfValidationWarningsExist(final List<ApiParameterError> dataValidationErrors) {
if (!dataValidationErrors.isEmpty()) {
//
throw new PlatformApiDataValidationException(dataValidationErrors);
}
}
public void checkForEntity(String relId, Long fromId, Long toId) {
switch (relId) {
case "1":
checkForOffice(fromId);
checkForLoanProducts(toId);
break;
case "2":
checkForOffice(fromId);
checkForSavingsProducts(toId);
break;
case "3":
checkForOffice(fromId);
checkForCharges(toId);
break;
case "4":
checkForRoles(fromId);
checkForLoanProducts(toId);
break;
case "5":
checkForRoles(fromId);
checkForSavingsProducts(toId);
break;
}
}
public void checkForOffice(Long id) {
this.officeRepositoryWrapper.findOneWithNotFoundDetection(id);
}
public void checkForLoanProducts(final Long id) {
final LoanProduct loanProduct = this.loanProductRepository.findOne(id);
if (loanProduct == null) { throw new LoanProductNotFoundException(id); }
}
public void checkForSavingsProducts(final Long id) {
final SavingsProduct savingsProduct = this.savingsProductRepository.findOne(id);
if (savingsProduct == null) { throw new SavingsProductNotFoundException(id); }
}
public void checkForCharges(final Long id) {
this.chargeRepositoryWrapper.findOneWithNotFoundDetection(id);
}
public void checkForRoles(final Long id) {
final Role role = this.roleRepository.findOne(id);
if (role == null) { throw new RoleNotFoundException(id); }
}
public void validateForUpdate(final String json) {
if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json,
MifosEntityApiResourceConstants.UPDATE_ENTITY_MAPPING_REQUEST_DATA_PARAMETERS);
final JsonElement element = this.fromApiJsonHelper.parse(json);
final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors)
.resource(MifosEntityApiResourceConstants.MIFOS_ENTITY_RESOURCE_NAME);
boolean atLeastOneParameterPassedForUpdate = false;
if (this.fromApiJsonHelper.parameterExists(MifosEntityApiResourceConstants.fromEnityType, element)) {
atLeastOneParameterPassedForUpdate = true;
final String fromEnityType = this.fromApiJsonHelper.extractStringNamed(MifosEntityApiResourceConstants.fromEnityType, element);
baseDataValidator.reset().parameter(MifosEntityApiResourceConstants.fromEnityType).value(fromEnityType);
}
if (this.fromApiJsonHelper.parameterExists(MifosEntityApiResourceConstants.fromEnityType, element)) {
atLeastOneParameterPassedForUpdate = true;
final String toEnityType = this.fromApiJsonHelper.extractStringNamed(MifosEntityApiResourceConstants.toEntityType, element);
baseDataValidator.reset().parameter(MifosEntityApiResourceConstants.fromEnityType).value(toEnityType);
}
if (this.fromApiJsonHelper.parameterExists(MifosEntityApiResourceConstants.toEntityType, element)) {
atLeastOneParameterPassedForUpdate = true;
}
if (this.fromApiJsonHelper.parameterExists(MifosEntityApiResourceConstants.startDate, element)) {
atLeastOneParameterPassedForUpdate = true;
}
if (this.fromApiJsonHelper.parameterExists(MifosEntityApiResourceConstants.endDate, element)) {
atLeastOneParameterPassedForUpdate = true;
}
if (!atLeastOneParameterPassedForUpdate) {
final Object forceError = null;
baseDataValidator.reset().anyOfNotNull(forceError);
}
throwExceptionIfValidationWarningsExist(dataValidationErrors);
}
}
@@ -0,0 +1,33 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.data;
import java.io.Serializable;
public class MifosEntityRelationData implements Serializable {
@SuppressWarnings("unused")
private final Long id;
@SuppressWarnings("unused")
private final Integer fromEntityType;
@SuppressWarnings("unused")
private final Integer toEntityType;
@SuppressWarnings("unused")
private final String mappingTypes;
public MifosEntityRelationData(final Long id, final Integer fromEntityType, final Integer toEntityType, final String mappingTypes) {
this.id = id;
this.fromEntityType = fromEntityType;
this.toEntityType = toEntityType;
this.mappingTypes = mappingTypes;
}
public static MifosEntityRelationData getMappingTypes(final Long id,final String mappingTypes) {
Integer fromEntityType = null;
final Integer toEntityType = null;
return new MifosEntityRelationData(id, fromEntityType, toEntityType, mappingTypes);
}
}
@@ -0,0 +1,67 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.data;
import java.io.Serializable;
import java.util.Date;
public class MifosEntityToEntityMappingData implements Serializable {
@SuppressWarnings("unused")
private Long mapId;
@SuppressWarnings("unused")
private Long relationId;
@SuppressWarnings("unused")
private Long fromId;
@SuppressWarnings("unused")
private Long toId;
@SuppressWarnings("unused")
private Date startDate;
@SuppressWarnings("unused")
private Date endDate;
@SuppressWarnings("unused")
private final String fromEntity;
@SuppressWarnings("unused")
private final String toEntity;
private MifosEntityToEntityMappingData(final Long mapId, final Long relationId, final Long fromId, final Long toId,
final Date startDate, final Date endDate, final String fromEntity, final String toEntity) {
this.mapId = mapId;
this.relationId = relationId;
this.fromId = fromId;
this.toId = toId;
this.startDate = startDate;
this.endDate = endDate;
this.fromEntity = fromEntity;
this.toEntity = toEntity;
}
public static MifosEntityToEntityMappingData getRelatedEntities(final Long mapId, final Long relationId, final Long fromId,
final Long toId, final Date startDate, final Date endDate ,final String fromEntity, final String toEntity) {
return new MifosEntityToEntityMappingData(mapId, relationId, fromId, toId, startDate, endDate, fromEntity, toEntity);
}
public static MifosEntityToEntityMappingData getRelatedEntities(final Long relationId, final Long fromId, final Long toId,
final Date startDate, final Date endDate) {
final Long mapId = null;
final String fromEntity = null;
final String toEntity = null;
return new MifosEntityToEntityMappingData(mapId, relationId, fromId, toId, startDate, endDate, fromEntity, toEntity);
}
}
@@ -0,0 +1,100 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.domain;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@Table(name = "m_entity_relation")
public class MifosEntityRelation extends AbstractPersistable<Long> {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "relationId", orphanRemoval = true)
private Set<MifosEntityToEntityMapping> mifosEntityToEntityMapping = new HashSet<>();
@Column(name = "from_entity_type", nullable = false, length = 10)
private String fromEntityType;
@Column(name = "to_entity_type", nullable = false, length = 10)
private String toEntityType;
@Column(name = "code_name", nullable = false, length = 50)
private String codeName;
/* private MifosEntityRelation(final String fromEntityType, final String toEntityType, final String codeName) {
this.fromEntityType = fromEntityType;
this.toEntityType = toEntityType;
this.codeName = codeName;
}*/
public MifosEntityRelation() {
// TODO Auto-generated constructor stub
}
public Set<MifosEntityToEntityMapping> getMifosEntityToEntityMapping() {
return this.mifosEntityToEntityMapping;
}
public void setMifosEntityToEntityMapping(Set<MifosEntityToEntityMapping> mifosEntityToEntityMapping) {
this.mifosEntityToEntityMapping = mifosEntityToEntityMapping;
}
public String getFromEntityType() {
return this.fromEntityType;
}
public void setFromEntityType(String fromEntityType) {
this.fromEntityType = fromEntityType;
}
public String getToEntityType() {
return this.toEntityType;
}
public void setToEntityType(String toEntityType) {
this.toEntityType = toEntityType;
}
public String getCodeName() {
return this.codeName;
}
public void setCodeName(String codeName) {
this.codeName = codeName;
}
}
@@ -0,0 +1,13 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.domain;
import org.springframework.data.jpa.repository.JpaRepository;
public interface MifosEntityRelationRepository extends JpaRepository<MifosEntityRelation, Long>{
}
@@ -0,0 +1,29 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.domain;
import org.mifosplatform.infrastructure.entityaccess.exception.MifosEntityAccessNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MifosEntityRelationRepositoryWrapper {
private final MifosEntityRelationRepository mifosEntityRelationRepository;
@Autowired
private MifosEntityRelationRepositoryWrapper(final MifosEntityRelationRepository mifosEntityRelationRepository) {
this.mifosEntityRelationRepository = mifosEntityRelationRepository;
}
public MifosEntityRelation findOneWithNotFoundDetection(final Long id) {
final MifosEntityRelation mifosEntityRelation = this.mifosEntityRelationRepository.findOne(id);
if (mifosEntityRelation == null) { throw new MifosEntityAccessNotFoundException(id); }
return mifosEntityRelation;
}
}
@@ -0,0 +1,124 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.domain;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.entityaccess.api.MifosEntityApiResourceConstants;
import org.mifosplatform.infrastructure.entityaccess.exception.MifosEntityToEntityMappingDateException;
import org.springframework.data.jpa.domain.AbstractPersistable;
@Entity
@Table(name = "m_entity_to_entity_mapping", uniqueConstraints = { @UniqueConstraint(columnNames = { "rel_id", "from_id", "to_id" }) })
public class MifosEntityToEntityMapping extends AbstractPersistable<Long> {
@ManyToOne
@JoinColumn(name = "rel_id")
private MifosEntityRelation relationId;
@Column(name = "from_id")
private Long fromId;
@Column(name = "to_id")
private Long toId;
@Column(name = "start_date", nullable = false)
@Temporal(TemporalType.DATE)
private Date startDate;
@Column(name = "end_date", nullable = false)
@Temporal(TemporalType.DATE)
private Date endDate;
private MifosEntityToEntityMapping(final MifosEntityRelation relationId, final Long fromId, final Long toId, final Date startDate,
final Date endDate) {
this.relationId = relationId;
this.fromId = fromId;
this.toId = toId;
this.startDate = startDate;
this.endDate = endDate;
}
public MifosEntityToEntityMapping() {
//
}
public static MifosEntityToEntityMapping newMap(MifosEntityRelation relationId, Long fromId, Long toId, Date startDate, Date endDate) {
return new MifosEntityToEntityMapping(relationId, fromId, toId, startDate, endDate);
}
public Map<String, Object> updateMap(final JsonCommand command) {
final Map<String, Object> actualChanges = new LinkedHashMap<>(9);
if (command.isChangeInLongParameterNamed(MifosEntityApiResourceConstants.fromEnityType, this.fromId)) {
final Long newValue = command.longValueOfParameterNamed(MifosEntityApiResourceConstants.fromEnityType);
actualChanges.put(MifosEntityApiResourceConstants.fromEnityType, newValue);
this.fromId = newValue;
}
if (command.isChangeInLongParameterNamed(MifosEntityApiResourceConstants.toEntityType, this.toId)) {
final Long newValue = command.longValueOfParameterNamed(MifosEntityApiResourceConstants.toEntityType);
actualChanges.put(MifosEntityApiResourceConstants.toEntityType, newValue);
this.toId = newValue;
}
if (command.isChangeInDateParameterNamed(MifosEntityApiResourceConstants.startDate, this.startDate)) {
final String valueAsInput = command.stringValueOfParameterNamed(MifosEntityApiResourceConstants.startDate);
actualChanges.put(MifosEntityApiResourceConstants.startDate, valueAsInput);
final Date startDate = command.DateValueOfParameterNamed(MifosEntityApiResourceConstants.startDate);
this.startDate = startDate;
}
if (command.isChangeInDateParameterNamed(MifosEntityApiResourceConstants.endDate, this.endDate)) {
final String valueAsInput = command.stringValueOfParameterNamed(MifosEntityApiResourceConstants.endDate);
actualChanges.put(MifosEntityApiResourceConstants.endDate, valueAsInput);
final Date endDate = command.DateValueOfParameterNamed(MifosEntityApiResourceConstants.endDate);
this.endDate = endDate;
}
if (startDate != null && endDate != null) {
if (endDate.before(startDate)) { throw new MifosEntityToEntityMappingDateException(startDate.toString(), endDate.toString()); }
}
return actualChanges;
}
public MifosEntityRelation getRelationId() {
return this.relationId;
}
public void setRelationId(MifosEntityRelation relationId) {
this.relationId = relationId;
}
/*
* public Date getStartDate() { Date startDate = null; if (this.startDate !=
* null) { startDate = Date.fromDateFields(this.startDate); } return
* startDate; }
*/
/*
* public Date getStartDate() { return (Date) ObjectUtils.defaultIfNull(new
* Date(this.startDate), null); }
*/
}
@@ -0,0 +1,15 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.domain;
import org.springframework.data.jpa.repository.JpaRepository;
public interface MifosEntityToEntityMappingRepository extends JpaRepository<MifosEntityToEntityMapping, Long>{
}
@@ -0,0 +1,32 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.domain;
import org.mifosplatform.infrastructure.entityaccess.exception.MifosEntityAccessNotFoundException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MifosEntityToEntityMappingRepositoryWrapper {
private final MifosEntityToEntityMappingRepository mifosEntityToEntityMappingRepository;
@Autowired
public MifosEntityToEntityMappingRepositoryWrapper(final MifosEntityToEntityMappingRepository mifosEntityToEntityMappingRepository) {
this.mifosEntityToEntityMappingRepository = mifosEntityToEntityMappingRepository;
}
public MifosEntityToEntityMapping findOneWithNotFoundDetection(final Long id) {
final MifosEntityToEntityMapping mifosEntityToEntityMapping = this.mifosEntityToEntityMappingRepository.findOne(id);
if (mifosEntityToEntityMapping == null) { throw new MifosEntityAccessNotFoundException(id); }
return mifosEntityToEntityMapping;
}
public void delete(final MifosEntityToEntityMapping mapId) {
this.mifosEntityToEntityMappingRepository.delete(mapId);
}
}
@@ -15,4 +15,5 @@ public class MifosEntityAccessNotFoundException extends AbstractPlatformResource
public MifosEntityAccessNotFoundException(final Long id) {
super("error.msg.entityaccess.id.invalid", "MifosEntityAccess with identifier " + id + " does not exist", id);
}
}
@@ -0,0 +1,16 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.exception;
import org.mifosplatform.infrastructure.core.exception.AbstractPlatformResourceNotFoundException;
public class MifosEntityToEntityMappingDateException extends AbstractPlatformResourceNotFoundException {
public MifosEntityToEntityMappingDateException(final String startDate,final String endDate) {
super("error.msg.invalid.endDate", "EndDate " + endDate + " cannot be before StartDate "+startDate);
}
}
@@ -0,0 +1,15 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.exception;
import org.mifosplatform.infrastructure.core.exception.AbstractPlatformResourceNotFoundException;
public class MifosEntityToEntityMappingNotFoundException extends AbstractPlatformResourceNotFoundException {
public MifosEntityToEntityMappingNotFoundException(final String id) {
super("error.msg.entityaccess.id.invalid", "MifosEntityToEntityMapping with identifier " + id + " does not exist", id);
}
}
@@ -0,0 +1,33 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.handler;
import javax.transaction.Transactional;
import org.mifosplatform.commands.handler.NewCommandSourceHandler;
import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
import org.mifosplatform.infrastructure.entityaccess.service.MifosEntityAccessWriteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class CreateEntityToEntityMappingCommandHandler implements NewCommandSourceHandler {
private final MifosEntityAccessWriteService mifosEntityAccessWriteService;
@Autowired
public CreateEntityToEntityMappingCommandHandler(final MifosEntityAccessWriteService mifosEntityAccessWriteService) {
this.mifosEntityAccessWriteService = mifosEntityAccessWriteService;
}
@Override
@Transactional
public CommandProcessingResult processCommand(JsonCommand command) {
return this.mifosEntityAccessWriteService.createEntityToEntityMapping(command.entityId(),command);
}
}
@@ -0,0 +1,33 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.handler;
import javax.transaction.Transactional;
import org.mifosplatform.commands.handler.NewCommandSourceHandler;
import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
import org.mifosplatform.infrastructure.entityaccess.service.MifosEntityAccessWriteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DeleteEntityToEntityMappingCommandHandler implements NewCommandSourceHandler {
private final MifosEntityAccessWriteService mifosEntityAccessWriteService;
@Autowired
public DeleteEntityToEntityMappingCommandHandler(final MifosEntityAccessWriteService mifosEntityAccessWriteService) {
this.mifosEntityAccessWriteService = mifosEntityAccessWriteService;
}
@Override
@Transactional
public CommandProcessingResult processCommand(JsonCommand command) {
return this.mifosEntityAccessWriteService.deleteEntityToEntityMapping(command.entityId());
}
}
@@ -0,0 +1,33 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package org.mifosplatform.infrastructure.entityaccess.handler;
import javax.transaction.Transactional;
import org.mifosplatform.commands.handler.NewCommandSourceHandler;
import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
import org.mifosplatform.infrastructure.entityaccess.service.MifosEntityAccessWriteService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UpdateEntityToEntityMappingCommandHandler implements NewCommandSourceHandler {
private final MifosEntityAccessWriteService mifosEntityAccessWriteService;
@Autowired
public UpdateEntityToEntityMappingCommandHandler(final MifosEntityAccessWriteService mifosEntityAccessWriteService) {
this.mifosEntityAccessWriteService = mifosEntityAccessWriteService;
}
@Override
@Transactional
public CommandProcessingResult processCommand(JsonCommand command) {
return this.mifosEntityAccessWriteService.updateEntityToEntityMapping(command.entityId(),command);
}
}
@@ -5,28 +5,32 @@
*/
package org.mifosplatform.infrastructure.entityaccess.service;
import java.util.Collection;
import org.mifosplatform.infrastructure.entityaccess.data.MifosEntityAccessData;
import org.mifosplatform.infrastructure.entityaccess.data.MifosEntityRelationData;
import org.mifosplatform.infrastructure.entityaccess.data.MifosEntityToEntityMappingData;
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityAccessType;
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityType;
import java.util.Collection;
public interface MifosEntityAccessReadService {
Collection<MifosEntityAccessData> retrieveEntityAccessFor (Long entityId, MifosEntityType type,
MifosEntityAccessType accessType, MifosEntityType secondType,
boolean includeAllOffices);
String getSQLQueryInClause_WithListOfIDsForEntityAccess (Long entityId, MifosEntityType firstEntityType,
MifosEntityAccessType accessType, MifosEntityType secondEntityType,
boolean includeAllOffices);
String getSQLQueryInClauseIDList_ForLoanProductsForOffice (Long loanProductId,
boolean includeAllOffices);
Collection<MifosEntityAccessData> retrieveEntityAccessFor(Long entityId, MifosEntityType type, MifosEntityAccessType accessType,
MifosEntityType secondType, boolean includeAllOffices);
String getSQLQueryInClauseIDList_ForSavingsProductsForOffice(
Long savingsProductId, boolean includeAllOffices);
String getSQLQueryInClause_WithListOfIDsForEntityAccess(Long entityId, MifosEntityType firstEntityType,
MifosEntityAccessType accessType, MifosEntityType secondEntityType, boolean includeAllOffices);
String getSQLQueryInClauseIDList_ForLoanProductsForOffice(Long loanProductId, boolean includeAllOffices);
String getSQLQueryInClauseIDList_ForSavingsProductsForOffice(Long savingsProductId, boolean includeAllOffices);
String getSQLQueryInClauseIDList_ForChargesForOffice(Long officeId, boolean includeAllOffices);
Collection<MifosEntityRelationData> retrieveAllSupportedMappingTypes();
Collection<MifosEntityToEntityMappingData> retrieveOneMapping(Long mapId);
Collection<MifosEntityToEntityMappingData> retrieveEntityToEntityMappings(Long mapId, Long fromoId, Long toId);
String getSQLQueryInClauseIDList_ForChargesForOffice(Long officeId,
boolean includeAllOffices);
}
@@ -5,10 +5,17 @@
*/
package org.mifosplatform.infrastructure.entityaccess.service;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Date;
import org.mifosplatform.infrastructure.core.service.RoutingDataSource;
import org.mifosplatform.infrastructure.dataqueries.service.GenericDataServiceImpl;
import org.mifosplatform.infrastructure.entityaccess.MifosEntityAccessConstants;
import org.mifosplatform.infrastructure.entityaccess.data.MifosEntityAccessData;
import org.mifosplatform.infrastructure.entityaccess.data.MifosEntityRelationData;
import org.mifosplatform.infrastructure.entityaccess.data.MifosEntityToEntityMappingData;
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntity;
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityAccessType;
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityType;
@@ -22,15 +29,11 @@ import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Service;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
@Service
public class MifosEntityAccessReadServiceImpl implements MifosEntityAccessReadService {
private final PlatformSecurityContext context;
private final JdbcTemplate jdbcTemplate;
private final PlatformSecurityContext context;
private final JdbcTemplate jdbcTemplate;
private final static Logger logger = LoggerFactory.getLogger(GenericDataServiceImpl.class);
@Autowired
@@ -43,73 +46,73 @@ public class MifosEntityAccessReadServiceImpl implements MifosEntityAccessReadSe
/*
* (non-Javadoc)
* @see org.mifosplatform.infrastructure.entityaccess.service.MifosEntityAccessReadService#getSQLQueryWithListOfIDsForEntityAccess
* (Long,
* org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityType,
* org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityAccessType,
* org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityType,
* boolean)
* (Long,
* org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityType,
* org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityAccessType,
* org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityType,
* boolean)
*
* This method returns the list of entity IDs as a comma separated list
* Or null if there is no entity restrictions or if there
*/
@Override
public String getSQLQueryInClause_WithListOfIDsForEntityAccess (
Long firstEntityId,
MifosEntityType firstEntityType,
MifosEntityAccessType accessType,
MifosEntityType secondEntityType,
boolean includeAllOffices) {
Collection<MifosEntityAccessData> accesslist = retrieveEntityAccessFor (
firstEntityId, firstEntityType, accessType, secondEntityType, includeAllOffices);
String returnIdListStr = null;
StringBuffer accessListCSVStrBuf = null;
if ( (accesslist != null) && (accesslist.size() > 0) ) {
logger.debug("Found " + accesslist.size() +
" access type restrictions while getting entity access configuration for " +
firstEntityType.getType() + ":" + firstEntityId +
" with type " + accessType.toStr() + " against " + secondEntityType.getType()
);
accessListCSVStrBuf = new StringBuffer (" ");
for (int i = 0; i < accesslist.size(); i++) {
MifosEntityAccessData accessData = (MifosEntityAccessData) accesslist.toArray()[i];
if (accessData == null) {
throw new MifosEntityAccessConfigurationException(firstEntityId, firstEntityType,
accessType, secondEntityType);
}
if (accessData.getSecondEntity().getId() == 0) { // If there is any ID that zero, then allow access to all
accessListCSVStrBuf = null;
break;
}
if (i>0) {
accessListCSVStrBuf.append(',');
}
accessListCSVStrBuf.append(accessData.getSecondEntity().getId());
}
public String getSQLQueryInClause_WithListOfIDsForEntityAccess (
Long firstEntityId,
MifosEntityType firstEntityType,
MifosEntityAccessType accessType,
MifosEntityType secondEntityType,
boolean includeAllOffices) {
Collection<MifosEntityAccessData> accesslist = retrieveEntityAccessFor (
firstEntityId, firstEntityType, accessType, secondEntityType, includeAllOffices);
String returnIdListStr = null;
StringBuffer accessListCSVStrBuf = null;
if ( (accesslist != null) && (accesslist.size() > 0) ) {
logger.debug("Found " + accesslist.size() +
" access type restrictions while getting entity access configuration for " +
firstEntityType.getType() + ":" + firstEntityId +
" with type " + accessType.toStr() + " against " + secondEntityType.getType()
);
accessListCSVStrBuf = new StringBuffer (" ");
for (int i = 0; i < accesslist.size(); i++) {
MifosEntityAccessData accessData = (MifosEntityAccessData) accesslist.toArray()[i];
if (accessData == null) {
throw new MifosEntityAccessConfigurationException(firstEntityId, firstEntityType,
accessType, secondEntityType);
}
if (accessData.getSecondEntity().getId() == 0) { // If there is any ID that zero, then allow access to all
accessListCSVStrBuf = null;
break;
}
if (i>0) {
accessListCSVStrBuf.append(',');
}
accessListCSVStrBuf.append(accessData.getSecondEntity().getId());
}
} else {
logger.debug("Found zero access type restrictions while getting entity access configuration for " +
firstEntityType.getType() + ":" + firstEntityId +
" with type " + accessType.toStr() + " against " + secondEntityType.getType()
);
accessListCSVStrBuf = new StringBuffer();
accessListCSVStrBuf.append ("false"); // Append false so that no rows will be returned
}
if (accessListCSVStrBuf != null) {
returnIdListStr = accessListCSVStrBuf.toString();
}
logger.debug("List of IDs applicable:" + returnIdListStr);
return returnIdListStr;
} else {
logger.debug("Found zero access type restrictions while getting entity access configuration for " +
firstEntityType.getType() + ":" + firstEntityId +
" with type " + accessType.toStr() + " against " + secondEntityType.getType()
);
accessListCSVStrBuf = new StringBuffer();
accessListCSVStrBuf.append ("false"); // Append false so that no rows will be returned
}
if (accessListCSVStrBuf != null) {
returnIdListStr = accessListCSVStrBuf.toString();
}
logger.debug("List of IDs applicable:" + returnIdListStr);
return returnIdListStr;
}
@Override
public Collection<MifosEntityAccessData> retrieveEntityAccessFor(
Long firstEntityId,
MifosEntityType firstEntityType,
MifosEntityAccessType accessType,
MifosEntityType secondEntityType,
boolean includeAllSubOffices) {
final AppUser currentUser = this.context.authenticatedUser();
@Override
public Collection<MifosEntityAccessData> retrieveEntityAccessFor(
Long firstEntityId,
MifosEntityType firstEntityType,
MifosEntityAccessType accessType,
MifosEntityType secondEntityType,
boolean includeAllSubOffices) {
final AppUser currentUser = this.context.authenticatedUser();
final String hierarchy = currentUser.getOffice().getHierarchy();
String hierarchySearchString = null;
if (includeAllSubOffices) {
@@ -118,62 +121,62 @@ public class MifosEntityAccessReadServiceImpl implements MifosEntityAccessReadSe
hierarchySearchString = hierarchy + "%";
}
String sql = getSQLForRetriveEntityAccessFor(firstEntityType,
accessType, secondEntityType);
accessType, secondEntityType);
Collection<MifosEntityAccessData> entityAccessData = null;
MifosEntityAccessDataMapper mapper = new MifosEntityAccessDataMapper();
if (includeAllSubOffices && (firstEntityType.getTable().equals("m_office")) ) {
sql += " where firstentity.hierarchy like ? order by firstEntity.hierarchy";
entityAccessData = this.jdbcTemplate.query(sql, mapper, new Object[] { firstEntityId, hierarchySearchString });
sql += " where firstentity.hierarchy like ? order by firstEntity.hierarchy";
entityAccessData = this.jdbcTemplate.query(sql, mapper, new Object[] { firstEntityId, hierarchySearchString });
} else {
entityAccessData = this.jdbcTemplate.query(sql, mapper, new Object[] { firstEntityId });
entityAccessData = this.jdbcTemplate.query(sql, mapper, new Object[] { firstEntityId });
}
return entityAccessData;
}
private String getSQLForRetriveEntityAccessFor (
MifosEntityType firstEntityType,
MifosEntityAccessType accessType,
MifosEntityType secondEntityType) {
StringBuffer str = new StringBuffer ("select eea.entity_id as entity_id, entity_type as entity_type, ");
str.append("access_type_code_value_id as access_id, cv.code_value as access_type_desc, c.code_name as code, ");
str.append("firstentity.id as first_entity_id, firstentity.name as entity_name, ");
str.append("otherentity.id as second_entity_id, otherentity.name as second_entity_name, ");
str.append("eea.second_entity_type as second_entity_type ");
str.append("from m_entity_to_entity_access eea ");
str.append("left join m_code_value cv on (cv.code_value = ");
str.append("'");
str.append(accessType.toStr());
str.append("' ");
str.append("and eea.access_type_code_value_id = cv.id) ");
str.append("left join m_code c on (c.code_name = '");
str.append(MifosEntityAccessConstants.ENTITY_ACCESS_CODENAME);
str.append("' and cv.code_id = c.id) ");
str.append("left join ");
str.append(firstEntityType.getTable());
str.append(" firstentity on (eea.entity_type = ");
str.append("'");
str.append(firstEntityType.getType());
str.append("'");
str.append(" and eea.entity_id = firstentity.id) left join ");
str.append(secondEntityType.getTable());
str.append(" otherentity on (eea.second_entity_type = ");
str.append("'");
str.append(secondEntityType.getType());
str.append("' ");
str.append("and eea.second_entity_id = otherentity.id) ");
str.append("where eea.access_type_code_value_id = cv.id ");
str.append("and eea.entity_id = ? ");
logger.debug(str.toString());
return str.toString();
}
private static final class MifosEntityAccessDataMapper implements RowMapper<MifosEntityAccessData> {
@Override
public MifosEntityAccessData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
final String entityType = rs.getString("entity_type");
}
private String getSQLForRetriveEntityAccessFor (
MifosEntityType firstEntityType,
MifosEntityAccessType accessType,
MifosEntityType secondEntityType) {
StringBuffer str = new StringBuffer ("select eea.entity_id as entity_id, entity_type as entity_type, ");
str.append("access_type_code_value_id as access_id, cv.code_value as access_type_desc, c.code_name as code, ");
str.append("firstentity.id as first_entity_id, firstentity.name as entity_name, ");
str.append("otherentity.id as second_entity_id, otherentity.name as second_entity_name, ");
str.append("eea.second_entity_type as second_entity_type ");
str.append("from m_entity_to_entity_access eea ");
str.append("left join m_code_value cv on (cv.code_value = ");
str.append("'");
str.append(accessType.toStr());
str.append("' ");
str.append("and eea.access_type_code_value_id = cv.id) ");
str.append("left join m_code c on (c.code_name = '");
str.append(MifosEntityAccessConstants.ENTITY_ACCESS_CODENAME);
str.append("' and cv.code_id = c.id) ");
str.append("left join ");
str.append(firstEntityType.getTable());
str.append(" firstentity on (eea.entity_type = ");
str.append("'");
str.append(firstEntityType.getType());
str.append("'");
str.append(" and eea.entity_id = firstentity.id) left join ");
str.append(secondEntityType.getTable());
str.append(" otherentity on (eea.second_entity_type = ");
str.append("'");
str.append(secondEntityType.getType());
str.append("' ");
str.append("and eea.second_entity_id = otherentity.id) ");
str.append("where eea.access_type_code_value_id = cv.id ");
str.append("and eea.entity_id = ? ");
logger.debug(str.toString());
return str.toString();
}
private static final class MifosEntityAccessDataMapper implements RowMapper<MifosEntityAccessData> {
@Override
public MifosEntityAccessData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
final String entityType = rs.getString("entity_type");
final Long entityId = rs.getLong("entity_id");
final String entityName = rs.getString("entity_name");
final Long accessId = rs.getLong("access_id");
@@ -186,66 +189,207 @@ public class MifosEntityAccessReadServiceImpl implements MifosEntityAccessReadSe
MifosEntity firstEntity = null;
MifosEntityType etype = MifosEntityType.get(entityType);
if (entityId != null && etype != null) {
firstEntity = new MifosEntity(entityId, etype);
firstEntity = new MifosEntity(entityId, etype);
}
MifosEntity secondEntity = null;
MifosEntityType secondetype = MifosEntityType.get(secondEntityType);
if (entityId != null && etype != null) {
secondEntity = new MifosEntity(secondEntityId, secondetype);
secondEntity = new MifosEntity(secondEntityId, secondetype);
}
MifosEntityAccessType accessType = null;
if (accessTypeDesc != null) {
accessType = MifosEntityAccessType.get(accessTypeDesc);
accessType = MifosEntityAccessType.get(accessTypeDesc);
}
MifosEntityAccessData returnMifosEntityAccessData = null;
if (firstEntity != null && secondEntity != null && accessType != null) {
returnMifosEntityAccessData = new MifosEntityAccessData(firstEntity, accessType, secondEntity);
returnMifosEntityAccessData = new MifosEntityAccessData(firstEntity, accessType, secondEntity);
}
return returnMifosEntityAccessData;
}
}
}
}
@Override
public String getSQLQueryInClauseIDList_ForLoanProductsForOffice(
Long officeId, boolean includeAllOffices) {
MifosEntityType firstEntityType = MifosEntityType.OFFICE;
MifosEntityAccessType accessType = MifosEntityAccessType.OFFICE_ACCESS_TO_LOAN_PRODUCTS;
MifosEntityType secondEntityType = MifosEntityType.LOAN_PRODUCT;
@Override
public String getSQLQueryInClauseIDList_ForLoanProductsForOffice(
Long officeId, boolean includeAllOffices) {
MifosEntityType firstEntityType = MifosEntityType.OFFICE;
MifosEntityAccessType accessType = MifosEntityAccessType.OFFICE_ACCESS_TO_LOAN_PRODUCTS;
MifosEntityType secondEntityType = MifosEntityType.LOAN_PRODUCT;
return getSQLQueryInClause_WithListOfIDsForEntityAccess (
officeId, firstEntityType, accessType,
secondEntityType, includeAllOffices);
}
return getSQLQueryInClause_WithListOfIDsForEntityAccess (
officeId, firstEntityType, accessType,
secondEntityType, includeAllOffices);
}
@Override
public String getSQLQueryInClauseIDList_ForSavingsProductsForOffice(
Long officeId, boolean includeAllOffices) {
MifosEntityType firstEntityType = MifosEntityType.OFFICE;
MifosEntityAccessType accessType = MifosEntityAccessType.OFFICE_ACCESS_TO_SAVINGS_PRODUCTS;
MifosEntityType secondEntityType = MifosEntityType.SAVINGS_PRODUCT;
@Override
public String getSQLQueryInClauseIDList_ForSavingsProductsForOffice(
Long officeId, boolean includeAllOffices) {
MifosEntityType firstEntityType = MifosEntityType.OFFICE;
MifosEntityAccessType accessType = MifosEntityAccessType.OFFICE_ACCESS_TO_SAVINGS_PRODUCTS;
MifosEntityType secondEntityType = MifosEntityType.SAVINGS_PRODUCT;
return getSQLQueryInClause_WithListOfIDsForEntityAccess (
officeId, firstEntityType, accessType,
secondEntityType, includeAllOffices);
}
@Override
public String getSQLQueryInClauseIDList_ForChargesForOffice(
Long officeId, boolean includeAllOffices) {
MifosEntityType firstEntityType = MifosEntityType.OFFICE;
MifosEntityAccessType accessType = MifosEntityAccessType.OFFICE_ACCESS_TO_CHARGES;
MifosEntityType secondEntityType = MifosEntityType.CHARGE;
return getSQLQueryInClause_WithListOfIDsForEntityAccess (
officeId, firstEntityType, accessType,
secondEntityType, includeAllOffices);
}
@Override
public String getSQLQueryInClauseIDList_ForChargesForOffice(
Long officeId, boolean includeAllOffices) {
MifosEntityType firstEntityType = MifosEntityType.OFFICE;
MifosEntityAccessType accessType = MifosEntityAccessType.OFFICE_ACCESS_TO_CHARGES;
MifosEntityType secondEntityType = MifosEntityType.CHARGE;
return getSQLQueryInClause_WithListOfIDsForEntityAccess (
officeId, firstEntityType, accessType,
secondEntityType, includeAllOffices);
}
return getSQLQueryInClause_WithListOfIDsForEntityAccess (
officeId, firstEntityType, accessType,
secondEntityType, includeAllOffices);
}
@Override
public Collection<MifosEntityRelationData> retrieveAllSupportedMappingTypes() {
EntityRelationMapper entityMapper = new EntityRelationMapper();
final String sql = entityMapper.schema();
final Collection<MifosEntityRelationData> mapTypes = this.jdbcTemplate.query(sql, entityMapper, new Object[] {});
return mapTypes;
}
private static final class EntityRelationMapper implements RowMapper<MifosEntityRelationData> {
private final StringBuilder sqlBuilder = new StringBuilder("select id as id,code_name as mapping_Types from m_entity_relation ");
public String schema() {
return this.sqlBuilder.toString();
}
@Override
public MifosEntityRelationData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
final Long mappingTypesId = rs.getLong("id");
final String mappingTypes = rs.getString("mapping_Types");
return MifosEntityRelationData.getMappingTypes(mappingTypesId, mappingTypes);
}
}
@Override
public Collection<MifosEntityToEntityMappingData> retrieveEntityToEntityMappings(Long mapId, Long fromId, Long toId) {
EntityToEntityMapper entityToEntityMapper = new EntityToEntityMapper();
String sql = entityToEntityMapper.schema();
final Collection<MifosEntityToEntityMappingData> mapTypes = this.jdbcTemplate.query(sql, entityToEntityMapper, new Object[] {
mapId, fromId, fromId, toId, toId });
return mapTypes;
}
@Override
public Collection<MifosEntityToEntityMappingData> retrieveOneMapping(Long mapId) {
GetOneEntityMapper entityMapper = new GetOneEntityMapper();
String sql = entityMapper.schema();
final Collection<MifosEntityToEntityMappingData> mapTypes = this.jdbcTemplate.query(sql, entityMapper, new Object[] { mapId });
return mapTypes;
}
private static final class GetOneEntityMapper implements RowMapper<MifosEntityToEntityMappingData> {
private final String schema;
public GetOneEntityMapper() {
StringBuffer str = new StringBuffer("select eem.rel_id as relId, ");
str.append("eem.from_id as fromId,eem.to_Id as toId,eem.start_date as startDate,eem.end_date as endDate ");
str.append("from m_entity_to_entity_mapping eem ");
str.append("where eem.id= ? ");
this.schema = str.toString();
}
public String schema() {
return this.schema;
}
@Override
public MifosEntityToEntityMappingData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
final Long relId = rs.getLong("relId");
final Long fromId = rs.getLong("fromId");
final Long toId = rs.getLong("toId");
final Date startDate = rs.getDate("startDate");
final Date endDate = rs.getDate("endDate");
return MifosEntityToEntityMappingData.getRelatedEntities(relId, fromId, toId, startDate, endDate);
}
}
private static final class EntityToEntityMapper implements RowMapper<MifosEntityToEntityMappingData> {
private final String schema;
public EntityToEntityMapper() {
StringBuffer str = new StringBuffer("select eem.id as mapId, ");
str.append("eem.rel_id as relId, ");
str.append("eem.from_id as from_id, ");
str.append("eem.to_id as to_id, ");
str.append("eem.start_date as startDate, ");
str.append("eem.end_date as endDate, ");
str.append("case er.code_name ");
str.append("when 'office_access_to_loan_products' then ");
str.append("o.name ");
str.append("when 'office_access_to_savings_products' then ");
str.append("o.name ");
str.append("when 'office_access_to_fees/charges' then ");
str.append("o.name ");
str.append("when 'role_access_to_loan_products' then ");
str.append("r.name ");
str.append("when 'role_access_to_savings_products' then ");
str.append("r.name ");
str.append("end as from_name, ");
str.append("case er.code_name ");
str.append("when 'office_access_to_loan_products' then ");
str.append("lp.name ");
str.append("when 'office_access_to_savings_products' then ");
str.append("sp.name ");
str.append("when 'office_access_to_fees/charges' then ");
str.append("charge.name ");
str.append("when 'role_access_to_loan_products' then ");
str.append("lp.name ");
str.append("when 'role_access_to_savings_products' then ");
str.append("sp.name ");
str.append("end as to_name, ");
str.append("er.code_name ");
str.append("from m_entity_to_entity_mapping eem ");
str.append("join m_entity_relation er on eem.rel_id = er.id ");
str.append("left join m_office o on er.from_entity_type = 1 and eem.from_id = o.id ");
str.append("left join m_role r on er.from_entity_type = 5 and eem.from_id = r.id ");
str.append("left join m_product_loan lp on er.to_entity_type = 2 and eem.to_id = lp.id ");
str.append("left join m_savings_product sp on er.to_entity_type = 3 and eem.to_id = sp.id ");
str.append("left join m_charge charge on er.to_entity_type = 4 and eem.to_id = charge.id ");
str.append("where ");
str.append("er.id = ? and ");
str.append("( ? = 0 or from_id = ? ) and ");
str.append("( ? = 0 or to_id = ? ) ");
this.schema = str.toString();
}
public String schema() {
return this.schema;
}
@Override
public MifosEntityToEntityMappingData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException {
final Long mapId = rs.getLong("mapId");
final Long relId = rs.getLong("relId");
final Long fromId = rs.getLong("from_id");
final Long toId = rs.getLong("to_id");
final String fromEntity = rs.getString("from_name");
final String toEntity = rs.getString("to_name");
final Date startDate = rs.getDate("startDate");
final Date endDate = rs.getDate("endDate");
return MifosEntityToEntityMappingData.getRelatedEntities(mapId, relId, fromId, toId, startDate, endDate, fromEntity, toEntity);
}
}
}
@@ -11,20 +11,23 @@ import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
public interface MifosEntityAccessWriteService {
CommandProcessingResult createEntityAccess (
final JsonCommand command);
void addNewEntityAccess (final String entityType, final Long entityId,
final CodeValue accessType,
final String secondEntityType, final Long secondEntityId);
CommandProcessingResult createEntityAccess(final JsonCommand command);
CommandProcessingResult createEntityToEntityMapping(final Long relId,final JsonCommand command);
CommandProcessingResult updateEntityToEntityMapping(final Long mapId, final JsonCommand command);
CommandProcessingResult deleteEntityToEntityMapping(final Long mapId);
void addNewEntityAccess(final String entityType, final Long entityId, final CodeValue accessType, final String secondEntityType,
final Long secondEntityId);
/*
CommandProcessingResult updateEntityAccess (
final Long entityAccessId, final JsonCommand command);
CommandProcessingResult removeEntityAccess (
final String entityType, final Long entityId,
final Long accessType,
final String secondEntityType, final Long secondEntityId);
*/
* CommandProcessingResult updateEntityAccess ( final Long entityAccessId,
* final JsonCommand command);
*
* CommandProcessingResult removeEntityAccess ( final String entityType,
* final Long entityId, final Long accessType, final String
* secondEntityType, final Long secondEntityId);
*/
}
@@ -5,14 +5,25 @@
*/
package org.mifosplatform.infrastructure.entityaccess.service;
import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
import java.util.Date;
import java.util.Map;
import org.mifosplatform.infrastructure.codes.domain.CodeValue;
import org.mifosplatform.infrastructure.codes.domain.CodeValueRepositoryWrapper;
import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
import org.mifosplatform.infrastructure.core.data.CommandProcessingResultBuilder;
import org.mifosplatform.infrastructure.core.exception.PlatformDataIntegrityException;
import org.mifosplatform.infrastructure.entityaccess.api.MifosEntityApiResourceConstants;
import org.mifosplatform.infrastructure.entityaccess.data.MifosEntityDataValidator;
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityAccess;
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityAccessRepository;
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityRelation;
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityRelationRepositoryWrapper;
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityToEntityMapping;
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityToEntityMappingRepository;
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityToEntityMappingRepositoryWrapper;
import org.mifosplatform.infrastructure.entityaccess.exception.MifosEntityToEntityMappingDateException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -21,52 +32,145 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class MifosEntityAccessWriteServiceImpl implements
MifosEntityAccessWriteService {
public class MifosEntityAccessWriteServiceImpl implements MifosEntityAccessWriteService {
private final static Logger logger = LoggerFactory.getLogger(MifosEntityAccessWriteServiceImpl.class);
private final CodeValueRepositoryWrapper codeValueRepositoryWrapper;
private final MifosEntityAccessRepository entityAccessRepository;
private final MifosEntityRelationRepositoryWrapper mifosEntityRelationRepositoryWrapper;
private final MifosEntityToEntityMappingRepository mifosEntityToEntityMappingRepository;
private final MifosEntityToEntityMappingRepositoryWrapper mifosEntityToEntityMappingRepositoryWrapper;
private final MifosEntityDataValidator fromApiJsonDeserializer;
@Autowired
public MifosEntityAccessWriteServiceImpl(
final MifosEntityAccessRepository entityAccessRepository,
final CodeValueRepositoryWrapper codeValueRepositoryWrapper) {
this.entityAccessRepository = entityAccessRepository;
public MifosEntityAccessWriteServiceImpl(final MifosEntityAccessRepository entityAccessRepository,
final CodeValueRepositoryWrapper codeValueRepositoryWrapper,
final MifosEntityRelationRepositoryWrapper mifosEntityRelationRepositoryWrapper,
final MifosEntityToEntityMappingRepository mifosEntityToEntityMappingRepository,
final MifosEntityToEntityMappingRepositoryWrapper mifosEntityToEntityMappingRepositoryWrapper,
MifosEntityDataValidator fromApiJsonDeserializer) {
this.entityAccessRepository = entityAccessRepository;
this.codeValueRepositoryWrapper = codeValueRepositoryWrapper;
this.mifosEntityToEntityMappingRepository = mifosEntityToEntityMappingRepository;
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.mifosEntityRelationRepositoryWrapper = mifosEntityRelationRepositoryWrapper;
this.mifosEntityToEntityMappingRepositoryWrapper = mifosEntityToEntityMappingRepositoryWrapper;
}
@Override
public CommandProcessingResult createEntityAccess(JsonCommand command) {
// TODO Auto-generated method stub
return null;
}
@Override
@Transactional
public void addNewEntityAccess (final String entityType, final Long entityId,
final CodeValue accessType,
final String secondEntityType, final Long secondEntityId) {
MifosEntityAccess entityAccess = MifosEntityAccess.createNew(entityType, entityId,
accessType, secondEntityType, secondEntityId);
entityAccessRepository.save(entityAccess);
}
/*
@Override
public CommandProcessingResult updateEntityAccess(Long entityAccessId,
JsonCommand command) {
// TODO Auto-generated method stub
return null;
}
@Override
public CommandProcessingResult createEntityAccess(JsonCommand command) {
// TODO Auto-generated method stub
return null;
}
@Override
public CommandProcessingResult removeEntityAccess(String entityType,
Long entityId, Long accessType, String secondEntityType,
Long secondEntityId) {
// TODO Auto-generated method stub
return null;
}
*/
@Override
@Transactional
public void addNewEntityAccess(final String entityType, final Long entityId, final CodeValue accessType, final String secondEntityType,
final Long secondEntityId) {
MifosEntityAccess entityAccess = MifosEntityAccess.createNew(entityType, entityId, accessType, secondEntityType, secondEntityId);
entityAccessRepository.save(entityAccess);
}
@Override
@Transactional
public CommandProcessingResult createEntityToEntityMapping(Long relId, JsonCommand command) {
try {
this.fromApiJsonDeserializer.validateForCreate(command.json());
final MifosEntityRelation mapId = this.mifosEntityRelationRepositoryWrapper.findOneWithNotFoundDetection(relId);
final Long fromId = command.longValueOfParameterNamed(MifosEntityApiResourceConstants.fromEnityType);
final Long toId = command.longValueOfParameterNamed(MifosEntityApiResourceConstants.toEntityType);
final Date startDate = command.DateValueOfParameterNamed(MifosEntityApiResourceConstants.startDate);
final Date endDate = command.DateValueOfParameterNamed(MifosEntityApiResourceConstants.endDate);
fromApiJsonDeserializer.checkForEntity(relId.toString(), fromId, toId);
if (startDate != null && endDate != null) {
if (endDate.before(startDate)) { throw new MifosEntityToEntityMappingDateException(startDate.toString(), endDate.toString()); }
}
final MifosEntityToEntityMapping newMap = MifosEntityToEntityMapping.newMap(mapId, fromId, toId, startDate, endDate);
this.mifosEntityToEntityMappingRepository.save(newMap);
return new CommandProcessingResultBuilder().withEntityId(newMap.getId()).withCommandId(command.commandId()).build();
} catch (final DataIntegrityViolationException dve) {
handleDataIntegrityIssues(command, dve);
return CommandProcessingResult.empty();
}
}
@Override
@Transactional
public CommandProcessingResult updateEntityToEntityMapping(Long mapId, JsonCommand command) {
try {
this.fromApiJsonDeserializer.validateForUpdate(command.json());
final MifosEntityToEntityMapping mapForUpdate = this.mifosEntityToEntityMappingRepositoryWrapper
.findOneWithNotFoundDetection(mapId);
String relId = mapForUpdate.getRelationId().getId().toString();
final Long fromId = command.longValueOfParameterNamed(MifosEntityApiResourceConstants.fromEnityType);
final Long toId = command.longValueOfParameterNamed(MifosEntityApiResourceConstants.toEntityType);
fromApiJsonDeserializer.checkForEntity(relId, fromId, toId);
final Map<String, Object> changes = mapForUpdate.updateMap(command);
if (!changes.isEmpty()) {
this.mifosEntityToEntityMappingRepository.saveAndFlush(mapForUpdate);
}
return new CommandProcessingResultBuilder(). //
withEntityId(mapForUpdate.getId()).withCommandId(command.commandId()).build();
} catch (DataIntegrityViolationException dve) {
handleDataIntegrityIssues(command, dve);
return CommandProcessingResult.empty();
}
}
@Transactional
@Override
public CommandProcessingResult deleteEntityToEntityMapping(Long mapId) {
// TODO Auto-generated method stub
final MifosEntityToEntityMapping deleteMap = this.mifosEntityToEntityMappingRepositoryWrapper.findOneWithNotFoundDetection(mapId);
this.mifosEntityToEntityMappingRepository.delete(deleteMap);
return new CommandProcessingResultBuilder(). //
withEntityId(deleteMap.getId()).build();
}
private void handleDataIntegrityIssues(final JsonCommand command, final DataIntegrityViolationException dve) {
final Throwable realCause = dve.getMostSpecificCause();
realCause.printStackTrace();
if (realCause.getMessage().contains("rel_id_from_id_to_id")) {
final String fromId = command.stringValueOfParameterNamed(MifosEntityApiResourceConstants.fromEnityType);
final String toId = command.stringValueOfParameterNamed(MifosEntityApiResourceConstants.toEntityType);
throw new PlatformDataIntegrityException("error.msg.duplicate.entity.mapping", "EntityMapping from " + fromId + " to " + toId
+ " already exist");
}
logAsErrorUnexpectedDataIntegrityException(dve);
throw new PlatformDataIntegrityException("error.msg.entity.mapping", "Unknown data integrity issue with resource.");
}
private void logAsErrorUnexpectedDataIntegrityException(final DataIntegrityViolationException dve) {
logger.error(dve.getMessage(), dve);
}
/*
* @Override public CommandProcessingResult updateEntityAccess(Long
* entityAccessId, JsonCommand command) { // TODO Auto-generated method stub
* return null; }
*
* @Override public CommandProcessingResult removeEntityAccess(String
* entityType, Long entityId, Long accessType, String secondEntityType, Long
* secondEntityId) { // TODO Auto-generated method stub return null; }
*/
}
@@ -94,12 +94,11 @@ public class ClientsApiResource {
clientData = this.clientReadPlatformService.retrieveAllNarrations(ClientApiConstants.CLIENT_CLOSURE_REASON);
} else if (is(commandParam, "acceptTransfer")) {
clientData = this.clientReadPlatformService.retrieveAllNarrations(ClientApiConstants.CLIENT_CLOSURE_REASON);
}else if (is(commandParam, "reject")) {
} else if (is(commandParam, "reject")) {
clientData = this.clientReadPlatformService.retrieveAllNarrations(ClientApiConstants.CLIENT_REJECT_REASON);
}else if (is(commandParam, "withdraw")) {
} else if (is(commandParam, "withdraw")) {
clientData = this.clientReadPlatformService.retrieveAllNarrations(ClientApiConstants.CLIENT_WITHDRAW_REASON);
}
else {
} else {
clientData = this.clientReadPlatformService.retrieveTemplate(officeId, staffInSelectedOfficeOnly);
}
@@ -144,8 +143,7 @@ public class ClientsApiResource {
final ClientData templateData = this.clientReadPlatformService.retrieveTemplate(clientData.officeId(),
staffInSelectedOfficeOnly);
clientData = ClientData.templateOnTop(clientData, templateData);
Collection<SavingsAccountData> savingAccountOptions = this.savingsAccountReadPlatformService.retrieveForLookup(
clientId, null);
Collection<SavingsAccountData> savingAccountOptions = this.savingsAccountReadPlatformService.retrieveForLookup(clientId, null);
if (savingAccountOptions != null && savingAccountOptions.size() > 0) {
clientData = ClientData.templateWithSavingAccountOptions(clientData, savingAccountOptions);
}
@@ -243,21 +241,20 @@ public class ClientsApiResource {
} else if (is(commandParam, "updateSavingsAccount")) {
commandRequest = builder.updateClientSavingsAccount(clientId).build();
result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
}else if (is(commandParam,"reject")){
commandRequest = builder.rejectClient(clientId).build();
} else if (is(commandParam, "reject")) {
commandRequest = builder.rejectClient(clientId).build();
result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
}else if (is(commandParam,"withdraw")){
commandRequest = builder.withdrawClient(clientId).build();
result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
}else if (is(commandParam,"reactivate")){
commandRequest = builder.reActivateClient(clientId).build();
result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
}
} else if (is(commandParam, "withdraw")) {
commandRequest = builder.withdrawClient(clientId).build();
result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
} else if (is(commandParam, "reactivate")) {
commandRequest = builder.reActivateClient(clientId).build();
result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
}
if (result == null) { throw new UnrecognizedQueryParamException("command", commandParam, new Object[] { "activate",
"unassignStaff", "assignStaff", "close", "proposeTransfer", "withdrawTransfer", "acceptTransfer", "rejectTransfer",
"updateSavingsAccount","reject" ,"withdraw","reactivate"}); }
"updateSavingsAccount", "reject", "withdraw", "reactivate" }); }
return this.toApiJsonSerializer.serialize(result);
}
@@ -1,4 +1,10 @@
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
*/
/**
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/.
@@ -0,0 +1,35 @@
CREATE TABLE `m_entity_relation` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`from_entity_type` INT(10) NOT NULL,
`to_entity_type` INT(10) NOT NULL,
`code_name` VARCHAR(50) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `from_entity_type_to_entity_type_code_name` (`from_entity_type`, `to_entity_type`, `code_name`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1
;
CREATE TABLE `m_entity_to_entity_mapping` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`rel_id` BIGINT(20) NOT NULL DEFAULT '0',
`from_id` BIGINT(20) NOT NULL DEFAULT '0',
`to_id` BIGINT(20) UNSIGNED NOT NULL,
`start_date` DATE NULL DEFAULT NULL,
`end_date` DATE NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `rel_id_from_id_to_id` (`rel_id`, `from_id`, `to_id`),
CONSTRAINT `FK__rel_id_m_entity_relation_id` FOREIGN KEY (`rel_id`) REFERENCES `m_entity_relation` (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1
;
INSERT INTO `m_entity_relation` (`from_entity_type`, `to_entity_type`, `code_name`) VALUES (1, 2, 'office_access_to_loan_products');
INSERT INTO `m_entity_relation` (`from_entity_type`, `to_entity_type`, `code_name`) VALUES (1, 3, 'office_access_to_savings_products');
INSERT INTO `m_entity_relation` (`from_entity_type`, `to_entity_type`, `code_name`) VALUES (1, 4, 'office_access_to_fees/charges');
INSERT INTO `m_entity_relation` (`from_entity_type`, `to_entity_type`, `code_name`) VALUES (5, 2, 'role_access_to_loan_products');
INSERT INTO `m_entity_relation` (`from_entity_type`, `to_entity_type`, `code_name`) VALUES (5, 3, 'role_access_to_savings_products');