/** * 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.service; import java.util.Collection; import java.util.Iterator; import org.mifosplatform.infrastructure.configuration.domain.GlobalConfigurationProperty; import org.mifosplatform.infrastructure.configuration.domain.GlobalConfigurationRepositoryWrapper; import org.mifosplatform.infrastructure.codes.data.CodeValueData; import org.mifosplatform.infrastructure.codes.domain.CodeValue; import org.mifosplatform.infrastructure.codes.domain.CodeValueRepositoryWrapper; import org.mifosplatform.infrastructure.codes.service.CodeValueReadPlatformService; import org.mifosplatform.infrastructure.entityaccess.MifosEntityAccessConstants; import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityAccessType; import org.mifosplatform.infrastructure.entityaccess.domain.MifosEntityType; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.useradministration.domain.AppUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class MifosEntityAccessUtil { private final PlatformSecurityContext context; private final GlobalConfigurationRepositoryWrapper globalConfigurationRepository; private final CodeValueReadPlatformService codeValueReadPlatformService; private final CodeValueRepositoryWrapper codeValueRepository; private final MifosEntityAccessWriteService mifosEntityAccessWriteService; private final MifosEntityAccessReadService mifosEntityAccessReadService; @Autowired public MifosEntityAccessUtil ( final PlatformSecurityContext context, final GlobalConfigurationRepositoryWrapper globalConfigurationRepository, final MifosEntityAccessWriteService mifosEntityAccessWriteService, final CodeValueReadPlatformService codeValueReadPlatformService, final CodeValueRepositoryWrapper codeValueRepository, final MifosEntityAccessReadService mifosEntityAccessReadService) { this.context = context; this.globalConfigurationRepository = globalConfigurationRepository; this.mifosEntityAccessWriteService = mifosEntityAccessWriteService; this.codeValueReadPlatformService = codeValueReadPlatformService; this.codeValueRepository = codeValueRepository; this.mifosEntityAccessReadService = mifosEntityAccessReadService; } @Transactional public void checkConfigurationAndAddProductResrictionsForUserOffice ( final MifosEntityAccessType mifosEntityAccessType, final MifosEntityType mifosEntityType, final Long productOrChargeId) { AppUser thisUser = this.context.authenticatedUser(); // check if the office specific products are enabled. If yes, then save this product or charge against a specific office // i.e. this product or charge is specific for this office. final GlobalConfigurationProperty property = this.globalConfigurationRepository .findOneByNameWithNotFoundDetection( MifosEntityAccessConstants.GLOBAL_CONFIG_FOR_OFFICE_SPECIFIC_PRODUCTS); if (property.isEnabled() ) { // If this property is enabled, then Mifos need to restrict access to this loan product to only the office of the current user final GlobalConfigurationProperty restrictToUserOfficeProperty = this.globalConfigurationRepository .findOneByNameWithNotFoundDetection( MifosEntityAccessConstants.GLOBAL_CONFIG_FOR_RESTRICT_PRODUCTS_TO_USER_OFFICE); if (restrictToUserOfficeProperty.isEnabled() ) { final Long officeId = thisUser.getOffice().getId(); Collection<CodeValueData> codevalues = codeValueReadPlatformService.retrieveCodeValuesByCode( MifosEntityAccessConstants.ENTITY_ACCESS_CODENAME); if (codevalues != null) { Iterator<CodeValueData> iterator = codevalues.iterator(); while(iterator.hasNext()) { CodeValueData oneCodeValue = iterator.next(); if ( (oneCodeValue != null) && (oneCodeValue.getName().equals(mifosEntityAccessType.toStr())) ) { CodeValue cv = codeValueRepository.findOneByCodeNameAndLabelWithNotFoundDetection( MifosEntityAccessConstants.ENTITY_ACCESS_CODENAME, mifosEntityAccessType.toStr() ); if (cv != null) { mifosEntityAccessWriteService.addNewEntityAccess( MifosEntityType.OFFICE.getType(), officeId, cv, mifosEntityType.getType(), productOrChargeId); } } } } } } } public String getSQLWhereClauseForProductIDsForUserOffice_ifGlobalConfigEnabled ( MifosEntityType mifosEntityType) { String inClause = ""; final GlobalConfigurationProperty property = this.globalConfigurationRepository .findOneByNameWithNotFoundDetection( MifosEntityAccessConstants.GLOBAL_CONFIG_FOR_OFFICE_SPECIFIC_PRODUCTS); if (property.isEnabled() ) { // Get 'SQL In Clause' for fetching only products/charges that are relevant for current user's office if (mifosEntityType.equals(MifosEntityType.SAVINGS_PRODUCT)) { inClause = mifosEntityAccessReadService. getSQLQueryInClauseIDList_ForSavingsProductsForOffice ( this.context.authenticatedUser().getOffice().getId(), false); } else if (mifosEntityType.equals(MifosEntityType.LOAN_PRODUCT)) { inClause = mifosEntityAccessReadService. getSQLQueryInClauseIDList_ForLoanProductsForOffice ( this.context.authenticatedUser().getOffice().getId(), false); } else if (mifosEntityType.equals(MifosEntityType.CHARGE)) { inClause = mifosEntityAccessReadService. getSQLQueryInClauseIDList_ForChargesForOffice( this.context.authenticatedUser().getOffice().getId(), false); } } return inClause; } }