From 618e2e91082bb0f7ca7272e9c9e86ff35be81c6c Mon Sep 17 00:00:00 2001 From: rojlarge Date: Wed, 13 Apr 2016 15:18:23 -0400 Subject: [PATCH] [#RESSUP-1593] Created KC Fiscal Officer Derived Role to grant KFS Fiscal Officers access to KC permissions --- .../rice/bootstrap/V1604_001__RESSUP-1593.sql | 4 + ...cationModuleRoleQualifierValuesFinder.java | 1 + ...scalOfficerDerivedRoleTypeServiceImpl.java | 117 ++++++++++++++++++ .../org/kuali/kra/award/AwardSpringBeans.xml | 12 ++ 4 files changed, 134 insertions(+) create mode 100644 coeus-db/coeus-db-sql/src/main/resources/co/kuali/coeus/data/migration/sql/oracle/rice/bootstrap/V1604_001__RESSUP-1593.sql create mode 100644 coeus-impl/src/main/java/org/kuali/kra/kfs/coa/identity/FiscalOfficerDerivedRoleTypeServiceImpl.java diff --git a/coeus-db/coeus-db-sql/src/main/resources/co/kuali/coeus/data/migration/sql/oracle/rice/bootstrap/V1604_001__RESSUP-1593.sql b/coeus-db/coeus-db-sql/src/main/resources/co/kuali/coeus/data/migration/sql/oracle/rice/bootstrap/V1604_001__RESSUP-1593.sql new file mode 100644 index 00000000000..9da1eda44fa --- /dev/null +++ b/coeus-db/coeus-db-sql/src/main/resources/co/kuali/coeus/data/migration/sql/oracle/rice/bootstrap/V1604_001__RESSUP-1593.sql @@ -0,0 +1,4 @@ +INSERT INTO KRIM_TYP_T (KIM_TYP_ID, OBJ_ID, VER_NBR, NM, SRVC_NM, ACTV_IND, NMSPC_CD) +VALUES( KRIM_TYP_ID_S.NEXTVAL, SYS_GUID(), 1, 'Derived Role: Fiscal Officer', '{http://kc.kuali.org/core/v5_0}fiscalOfficerDerivedRoleTypeService', 'Y', 'KC-AWARD'); +INSERT INTO KRIM_ROLE_T (ROLE_ID, OBJ_ID, VER_NBR, ROLE_NM, NMSPC_CD, DESC_TXT, KIM_TYP_ID, ACTV_IND, LAST_UPDT_DT) +VALUES (KRIM_ROLE_PERM_ID_S.NEXTVAL, SYS_GUID(), 1, 'KC Fiscal Officer', 'KC-AWARD', 'Role for granting Fiscal Officers KC permissions', (SELECT KIM_TYP_ID FROM KRIM_TYP_T WHERE NM = 'Derived Role: Fiscal Officer'), 'Y', SYSDATE); \ No newline at end of file diff --git a/coeus-impl/src/main/java/org/kuali/coeus/common/notification/impl/lookup/keyvalue/NotificationModuleRoleQualifierValuesFinder.java b/coeus-impl/src/main/java/org/kuali/coeus/common/notification/impl/lookup/keyvalue/NotificationModuleRoleQualifierValuesFinder.java index 322fa71301c..b9cf8f68344 100644 --- a/coeus-impl/src/main/java/org/kuali/coeus/common/notification/impl/lookup/keyvalue/NotificationModuleRoleQualifierValuesFinder.java +++ b/coeus-impl/src/main/java/org/kuali/coeus/common/notification/impl/lookup/keyvalue/NotificationModuleRoleQualifierValuesFinder.java @@ -45,6 +45,7 @@ public List getKeyValues() { documentList.add(new ConcreteKeyValue("negotiation", "Negotiation Id")); documentList.add(new ConcreteKeyValue("coiDisclosureId", "Disclosure Id")); documentList.add(new ConcreteKeyValue(KcKimAttributes.PROPOSAL, "Proposal")); + documentList.add(new ConcreteKeyValue(KcKimAttributes.AWARD, "Award")); documentList.add(new ConcreteKeyValue(KimConstants.AttributeConstants.DOCUMENT_NUMBER, "Document Number")); return documentList; diff --git a/coeus-impl/src/main/java/org/kuali/kra/kfs/coa/identity/FiscalOfficerDerivedRoleTypeServiceImpl.java b/coeus-impl/src/main/java/org/kuali/kra/kfs/coa/identity/FiscalOfficerDerivedRoleTypeServiceImpl.java new file mode 100644 index 00000000000..997a5c7307a --- /dev/null +++ b/coeus-impl/src/main/java/org/kuali/kra/kfs/coa/identity/FiscalOfficerDerivedRoleTypeServiceImpl.java @@ -0,0 +1,117 @@ +package org.kuali.kra.kfs.coa.identity; + +import org.apache.commons.lang.StringUtils; +import org.kuali.kra.award.home.Award; +import org.kuali.kra.award.home.AwardService; +import org.kuali.kra.kim.bo.KcKimAttributes; +import org.kuali.rice.kim.api.role.Role; +import org.kuali.rice.kim.api.role.RoleMembership; +import org.kuali.rice.kim.api.role.RoleService; +import org.kuali.rice.kns.kim.role.DerivedRoleTypeServiceBase; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class FiscalOfficerDerivedRoleTypeServiceImpl extends DerivedRoleTypeServiceBase { + + protected static final String FISCAL_OFFICER_ROLE_NAMESPACE = "KFS-SYS"; + protected static final String FISCAL_OFFICER_ROLE_NAME = "Fiscal Officer"; + + protected static final String ACCOUNT_NUMBER_QUALIFIER = "accountNumber"; + protected static final String FIN_COA_CODE_QUALIFIER = "chartOfAccountsCode"; + + protected RoleService roleService; + protected AwardService awardService; + + protected List requiredAttributes = new ArrayList(); + { + requiredAttributes.add(KcKimAttributes.AWARD); + } + + @Override + public boolean hasDerivedRole(String principalId, List groupIds, String namespaceCode, + String roleName, Map qualification) { + Map kfsQualification = translateAwardToAccountQualification(qualification); + List fiscalOfficerRoleId = getFiscalOfficerRoleIdAsList(); + + if (!fiscalOfficerRoleId.isEmpty()) { + return roleService.principalHasRole(principalId, fiscalOfficerRoleId, kfsQualification); + } + + return false; + } + + public List getRoleMembersFromDerivedRole(String namespaceCode, String roleName, Map qualification) { + validateRequiredAttributesAgainstReceived(qualification); + Map kfsQualification = translateAwardToAccountQualification(qualification); + List fiscalOfficerRoleId = getFiscalOfficerRoleIdAsList(); + + if (!fiscalOfficerRoleId.isEmpty()) { + return roleService.getRoleMembers(fiscalOfficerRoleId, kfsQualification); + } + + return new ArrayList(); + } + + protected Map translateAwardToAccountQualification(Map qualification) { + if (qualification == null) { + return new HashMap(); + } + Map translatedQualifications = new HashMap(qualification); + Award award = null; + String awardIdStr = translatedQualifications.get(KcKimAttributes.AWARD); + if (StringUtils.isNotBlank(awardIdStr) && awardIdStr.matches("\\d+")) { + Long awardId = Long.valueOf(awardIdStr); + award = getAwardService().getAward(awardId); + } + if (award != null && StringUtils.isNotBlank(award.getAccountNumber()) && StringUtils.isNotBlank(award.getFinancialChartOfAccountsCode())) { + translatedQualifications.remove(KcKimAttributes.AWARD); + translatedQualifications.put(ACCOUNT_NUMBER_QUALIFIER, award.getAccountNumber()); + translatedQualifications.put(FIN_COA_CODE_QUALIFIER, award.getFinancialChartOfAccountsCode()); + } + return translatedQualifications; + } + + protected String getFiscalOfficerRoleId() { + Role fiscalOfficerRole = getRoleService().getRoleByNamespaceCodeAndName(FISCAL_OFFICER_ROLE_NAMESPACE, FISCAL_OFFICER_ROLE_NAME); + if (fiscalOfficerRole != null && StringUtils.isNotBlank(fiscalOfficerRole.getId())) { + return fiscalOfficerRole.getId(); + } + return null; + } + + protected List getFiscalOfficerRoleIdAsList() { + List roleIdList = new ArrayList(); + String fiscalOfficerRoleId = getFiscalOfficerRoleId(); + + if (StringUtils.isNotBlank(fiscalOfficerRoleId)) { + roleIdList.add(fiscalOfficerRoleId); + } + return roleIdList; + } + + @Override + public boolean dynamicRoleMembership(String namespaceCode, String roleName) { + super.dynamicRoleMembership(namespaceCode, roleName); + return true; + } + + protected AwardService getAwardService() { + return awardService; + } + + public void setAwardService(AwardService awardService) { + this.awardService = awardService; + } + + protected RoleService getRoleService() { + return roleService; + } + + public void setRoleService(RoleService roleService) { + this.roleService = roleService; + } + +} diff --git a/coeus-impl/src/main/resources/org/kuali/kra/award/AwardSpringBeans.xml b/coeus-impl/src/main/resources/org/kuali/kra/award/AwardSpringBeans.xml index 6031dd274a3..ef96ebf4c9b 100644 --- a/coeus-impl/src/main/resources/org/kuali/kra/award/AwardSpringBeans.xml +++ b/coeus-impl/src/main/resources/org/kuali/kra/award/AwardSpringBeans.xml @@ -1182,6 +1182,18 @@ + + + + + + + + +