Merge pull request #1280 from MithunKashyap/New_MIFOSX-1828
Mifosx 1828: Entity to entity mapping feature
This commit is contained in:
@@ -1008,4 +1008,8 @@ public class CommandWrapper {
|
|||||||
public boolean isEnableOperation() {
|
public boolean isEnableOperation() {
|
||||||
return this.actionName.equalsIgnoreCase("ENABLE");
|
return this.actionName.equalsIgnoreCase("ENABLE");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isEntityMappingResource() {
|
||||||
|
return this.entityName.equalsIgnoreCase("ENTITYMAPPING");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+23
@@ -2327,4 +2327,27 @@ public class CommandWrapperBuilder {
|
|||||||
return this;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+10
@@ -910,6 +910,16 @@ public class SynchronousCommandProcessingService implements CommandProcessingSer
|
|||||||
} else {
|
} else {
|
||||||
throw new UnsupportedCommandException(wrapper.commandName());
|
throw new UnsupportedCommandException(wrapper.commandName());
|
||||||
}
|
}
|
||||||
|
} 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 {
|
}else {
|
||||||
|
|
||||||
throw new UnsupportedCommandException(wrapper.commandName());
|
throw new UnsupportedCommandException(wrapper.commandName());
|
||||||
|
|||||||
+156
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+41
@@ -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));
|
||||||
|
|
||||||
|
}
|
||||||
+204
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+33
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
+67
@@ -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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+100
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
+13
@@ -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>{
|
||||||
|
|
||||||
|
}
|
||||||
+29
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+124
@@ -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); }
|
||||||
|
*/
|
||||||
|
|
||||||
|
}
|
||||||
+15
@@ -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>{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
+32
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+1
@@ -15,4 +15,5 @@ public class MifosEntityAccessNotFoundException extends AbstractPlatformResource
|
|||||||
public MifosEntityAccessNotFoundException(final Long id) {
|
public MifosEntityAccessNotFoundException(final Long id) {
|
||||||
super("error.msg.entityaccess.id.invalid", "MifosEntityAccess with identifier " + id + " does not exist", id);
|
super("error.msg.entityaccess.id.invalid", "MifosEntityAccess with identifier " + id + " does not exist", id);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
+16
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
+15
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
+33
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+33
@@ -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());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+33
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+18
-14
@@ -5,28 +5,32 @@
|
|||||||
*/
|
*/
|
||||||
package org.mifosplatform.infrastructure.entityaccess.service;
|
package org.mifosplatform.infrastructure.entityaccess.service;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
import org.mifosplatform.infrastructure.entityaccess.data.MifosEntityAccessData;
|
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.MifosEntityAccessType;
|
||||||
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityType;
|
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityType;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
|
|
||||||
public interface MifosEntityAccessReadService {
|
public interface MifosEntityAccessReadService {
|
||||||
Collection<MifosEntityAccessData> retrieveEntityAccessFor (Long entityId, MifosEntityType type,
|
|
||||||
MifosEntityAccessType accessType, MifosEntityType secondType,
|
Collection<MifosEntityAccessData> retrieveEntityAccessFor(Long entityId, MifosEntityType type, MifosEntityAccessType accessType,
|
||||||
boolean includeAllOffices);
|
MifosEntityType secondType, boolean includeAllOffices);
|
||||||
|
|
||||||
String getSQLQueryInClause_WithListOfIDsForEntityAccess(Long entityId, MifosEntityType firstEntityType,
|
String getSQLQueryInClause_WithListOfIDsForEntityAccess(Long entityId, MifosEntityType firstEntityType,
|
||||||
MifosEntityAccessType accessType, MifosEntityType secondEntityType,
|
MifosEntityAccessType accessType, MifosEntityType secondEntityType, boolean includeAllOffices);
|
||||||
boolean includeAllOffices);
|
|
||||||
|
|
||||||
String getSQLQueryInClauseIDList_ForLoanProductsForOffice (Long loanProductId,
|
String getSQLQueryInClauseIDList_ForLoanProductsForOffice(Long loanProductId, boolean includeAllOffices);
|
||||||
boolean includeAllOffices);
|
|
||||||
|
|
||||||
String getSQLQueryInClauseIDList_ForSavingsProductsForOffice(
|
String getSQLQueryInClauseIDList_ForSavingsProductsForOffice(Long savingsProductId, boolean includeAllOffices);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|||||||
+148
-4
@@ -5,10 +5,17 @@
|
|||||||
*/
|
*/
|
||||||
package org.mifosplatform.infrastructure.entityaccess.service;
|
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.core.service.RoutingDataSource;
|
||||||
import org.mifosplatform.infrastructure.dataqueries.service.GenericDataServiceImpl;
|
import org.mifosplatform.infrastructure.dataqueries.service.GenericDataServiceImpl;
|
||||||
import org.mifosplatform.infrastructure.entityaccess.MifosEntityAccessConstants;
|
import org.mifosplatform.infrastructure.entityaccess.MifosEntityAccessConstants;
|
||||||
import org.mifosplatform.infrastructure.entityaccess.data.MifosEntityAccessData;
|
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.MifosEntity;
|
||||||
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityAccessType;
|
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityAccessType;
|
||||||
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityType;
|
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityType;
|
||||||
@@ -22,10 +29,6 @@ import org.springframework.jdbc.core.JdbcTemplate;
|
|||||||
import org.springframework.jdbc.core.RowMapper;
|
import org.springframework.jdbc.core.RowMapper;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.sql.ResultSet;
|
|
||||||
import java.sql.SQLException;
|
|
||||||
import java.util.Collection;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class MifosEntityAccessReadServiceImpl implements MifosEntityAccessReadService {
|
public class MifosEntityAccessReadServiceImpl implements MifosEntityAccessReadService {
|
||||||
|
|
||||||
@@ -246,6 +249,147 @@ public class MifosEntityAccessReadServiceImpl implements MifosEntityAccessReadSe
|
|||||||
officeId, firstEntityType, accessType,
|
officeId, firstEntityType, accessType,
|
||||||
secondEntityType, includeAllOffices);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+15
-12
@@ -11,20 +11,23 @@ import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
|||||||
|
|
||||||
public interface MifosEntityAccessWriteService {
|
public interface MifosEntityAccessWriteService {
|
||||||
|
|
||||||
CommandProcessingResult createEntityAccess (
|
CommandProcessingResult createEntityAccess(final JsonCommand command);
|
||||||
final JsonCommand command);
|
|
||||||
|
|
||||||
void addNewEntityAccess (final String entityType, final Long entityId,
|
CommandProcessingResult createEntityToEntityMapping(final Long relId,final JsonCommand command);
|
||||||
final CodeValue accessType,
|
|
||||||
final String secondEntityType, final Long secondEntityId);
|
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 (
|
* CommandProcessingResult updateEntityAccess ( final Long entityAccessId,
|
||||||
final Long entityAccessId, final JsonCommand command);
|
* final JsonCommand command);
|
||||||
|
*
|
||||||
CommandProcessingResult removeEntityAccess (
|
* CommandProcessingResult removeEntityAccess ( final String entityType,
|
||||||
final String entityType, final Long entityId,
|
* final Long entityId, final Long accessType, final String
|
||||||
final Long accessType,
|
* secondEntityType, final Long secondEntityId);
|
||||||
final String secondEntityType, final Long secondEntityId);
|
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
+127
-23
@@ -5,14 +5,25 @@
|
|||||||
*/
|
*/
|
||||||
package org.mifosplatform.infrastructure.entityaccess.service;
|
package org.mifosplatform.infrastructure.entityaccess.service;
|
||||||
|
|
||||||
import org.mifosplatform.infrastructure.core.api.JsonCommand;
|
import java.util.Date;
|
||||||
import org.mifosplatform.infrastructure.core.data.CommandProcessingResult;
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
import org.mifosplatform.infrastructure.codes.domain.CodeValue;
|
import org.mifosplatform.infrastructure.codes.domain.CodeValue;
|
||||||
import org.mifosplatform.infrastructure.codes.domain.CodeValueRepositoryWrapper;
|
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.MifosEntityAccess;
|
||||||
import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityAccessRepository;
|
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.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -21,19 +32,29 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
public class MifosEntityAccessWriteServiceImpl implements
|
public class MifosEntityAccessWriteServiceImpl implements MifosEntityAccessWriteService {
|
||||||
MifosEntityAccessWriteService {
|
|
||||||
|
|
||||||
private final static Logger logger = LoggerFactory.getLogger(MifosEntityAccessWriteServiceImpl.class);
|
private final static Logger logger = LoggerFactory.getLogger(MifosEntityAccessWriteServiceImpl.class);
|
||||||
private final CodeValueRepositoryWrapper codeValueRepositoryWrapper;
|
private final CodeValueRepositoryWrapper codeValueRepositoryWrapper;
|
||||||
private final MifosEntityAccessRepository entityAccessRepository;
|
private final MifosEntityAccessRepository entityAccessRepository;
|
||||||
|
private final MifosEntityRelationRepositoryWrapper mifosEntityRelationRepositoryWrapper;
|
||||||
|
private final MifosEntityToEntityMappingRepository mifosEntityToEntityMappingRepository;
|
||||||
|
private final MifosEntityToEntityMappingRepositoryWrapper mifosEntityToEntityMappingRepositoryWrapper;
|
||||||
|
private final MifosEntityDataValidator fromApiJsonDeserializer;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
public MifosEntityAccessWriteServiceImpl(
|
public MifosEntityAccessWriteServiceImpl(final MifosEntityAccessRepository entityAccessRepository,
|
||||||
final MifosEntityAccessRepository entityAccessRepository,
|
final CodeValueRepositoryWrapper codeValueRepositoryWrapper,
|
||||||
final CodeValueRepositoryWrapper codeValueRepositoryWrapper) {
|
final MifosEntityRelationRepositoryWrapper mifosEntityRelationRepositoryWrapper,
|
||||||
|
final MifosEntityToEntityMappingRepository mifosEntityToEntityMappingRepository,
|
||||||
|
final MifosEntityToEntityMappingRepositoryWrapper mifosEntityToEntityMappingRepositoryWrapper,
|
||||||
|
MifosEntityDataValidator fromApiJsonDeserializer) {
|
||||||
this.entityAccessRepository = entityAccessRepository;
|
this.entityAccessRepository = entityAccessRepository;
|
||||||
this.codeValueRepositoryWrapper = codeValueRepositoryWrapper;
|
this.codeValueRepositoryWrapper = codeValueRepositoryWrapper;
|
||||||
|
this.mifosEntityToEntityMappingRepository = mifosEntityToEntityMappingRepository;
|
||||||
|
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
|
||||||
|
this.mifosEntityRelationRepositoryWrapper = mifosEntityRelationRepositoryWrapper;
|
||||||
|
this.mifosEntityToEntityMappingRepositoryWrapper = mifosEntityToEntityMappingRepositoryWrapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -44,29 +65,112 @@ public class MifosEntityAccessWriteServiceImpl implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public void addNewEntityAccess (final String entityType, final Long entityId,
|
public void addNewEntityAccess(final String entityType, final Long entityId, final CodeValue accessType, final String secondEntityType,
|
||||||
final CodeValue accessType,
|
final Long secondEntityId) {
|
||||||
final String secondEntityType, final Long secondEntityId) {
|
MifosEntityAccess entityAccess = MifosEntityAccess.createNew(entityType, entityId, accessType, secondEntityType, secondEntityId);
|
||||||
MifosEntityAccess entityAccess = MifosEntityAccess.createNew(entityType, entityId,
|
|
||||||
accessType, secondEntityType, secondEntityId);
|
|
||||||
entityAccessRepository.save(entityAccess);
|
entityAccessRepository.save(entityAccess);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
@Override
|
@Override
|
||||||
public CommandProcessingResult updateEntityAccess(Long entityAccessId,
|
@Transactional
|
||||||
JsonCommand command) {
|
public CommandProcessingResult createEntityToEntityMapping(Long relId, JsonCommand command) {
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
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
|
@Override
|
||||||
public CommandProcessingResult removeEntityAccess(String entityType,
|
@Transactional
|
||||||
Long entityId, Long accessType, String secondEntityType,
|
public CommandProcessingResult updateEntityToEntityMapping(Long mapId, JsonCommand command) {
|
||||||
Long secondEntityId) {
|
|
||||||
// TODO Auto-generated method stub
|
try {
|
||||||
return null;
|
|
||||||
|
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; }
|
||||||
*/
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
+2
-5
@@ -98,8 +98,7 @@ public class ClientsApiResource {
|
|||||||
clientData = this.clientReadPlatformService.retrieveAllNarrations(ClientApiConstants.CLIENT_REJECT_REASON);
|
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);
|
clientData = this.clientReadPlatformService.retrieveAllNarrations(ClientApiConstants.CLIENT_WITHDRAW_REASON);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
clientData = this.clientReadPlatformService.retrieveTemplate(officeId, staffInSelectedOfficeOnly);
|
clientData = this.clientReadPlatformService.retrieveTemplate(officeId, staffInSelectedOfficeOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,8 +143,7 @@ public class ClientsApiResource {
|
|||||||
final ClientData templateData = this.clientReadPlatformService.retrieveTemplate(clientData.officeId(),
|
final ClientData templateData = this.clientReadPlatformService.retrieveTemplate(clientData.officeId(),
|
||||||
staffInSelectedOfficeOnly);
|
staffInSelectedOfficeOnly);
|
||||||
clientData = ClientData.templateOnTop(clientData, templateData);
|
clientData = ClientData.templateOnTop(clientData, templateData);
|
||||||
Collection<SavingsAccountData> savingAccountOptions = this.savingsAccountReadPlatformService.retrieveForLookup(
|
Collection<SavingsAccountData> savingAccountOptions = this.savingsAccountReadPlatformService.retrieveForLookup(clientId, null);
|
||||||
clientId, null);
|
|
||||||
if (savingAccountOptions != null && savingAccountOptions.size() > 0) {
|
if (savingAccountOptions != null && savingAccountOptions.size() > 0) {
|
||||||
clientData = ClientData.templateWithSavingAccountOptions(clientData, savingAccountOptions);
|
clientData = ClientData.templateWithSavingAccountOptions(clientData, savingAccountOptions);
|
||||||
}
|
}
|
||||||
@@ -254,7 +252,6 @@ public class ClientsApiResource {
|
|||||||
result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
|
result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (result == null) { throw new UnrecognizedQueryParamException("command", commandParam, new Object[] { "activate",
|
if (result == null) { throw new UnrecognizedQueryParamException("command", commandParam, new Object[] { "activate",
|
||||||
"unassignStaff", "assignStaff", "close", "proposeTransfer", "withdrawTransfer", "acceptTransfer", "rejectTransfer",
|
"unassignStaff", "assignStaff", "close", "proposeTransfer", "withdrawTransfer", "acceptTransfer", "rejectTransfer",
|
||||||
"updateSavingsAccount", "reject", "withdraw", "reactivate" }); }
|
"updateSavingsAccount", "reject", "withdraw", "reactivate" }); }
|
||||||
|
|||||||
+6
@@ -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
|
* 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,
|
* 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/.
|
* You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||||
|
|||||||
+38
@@ -0,0 +1,38 @@
|
|||||||
|
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');
|
||||||
|
|
||||||
|
INSERT INTO `m_permission` (`grouping`, `code`, `entity_name`, `action_name`, `can_maker_checker`) VALUES ('infrastructure', 'CREATE_ENTITYMAPPING', 'ENTITYMAPPING', 'CREATE', 0);
|
||||||
|
INSERT INTO `m_permission` (`grouping`, `code`, `entity_name`, `action_name`, `can_maker_checker`) VALUES ('infrastructure', 'UPDATE_ENTITYMAPPING', 'ENTITYMAPPING', 'UPDATE', 0);
|
||||||
|
INSERT INTO `m_permission` (`grouping`, `code`, `entity_name`, `action_name`, `can_maker_checker`) VALUES ('infrastructure', 'DELETE_ENTITYMAPPING', 'ENTITYMAPPING', 'DELETE', 0);
|
||||||
Reference in New Issue
Block a user