001 /* 002 * Copyright 2011 The Kuali Foundation. 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 package org.kuali.kfs.coa.document; 017 018 import java.util.ArrayList; 019 import java.util.Collections; 020 import java.util.HashMap; 021 import java.util.List; 022 import java.util.Map; 023 024 import org.apache.commons.lang.StringUtils; 025 import org.kuali.kfs.coa.identity.KfsKimDocumentAttributeData; 026 import org.kuali.kfs.coa.identity.OrgReviewRole; 027 import org.kuali.kfs.coa.identity.OrgReviewRoleLookupableHelperServiceImpl; 028 import org.kuali.kfs.coa.service.OrgReviewRoleService; 029 import org.kuali.kfs.sys.KFSConstants; 030 import org.kuali.kfs.sys.KFSKeyConstants; 031 import org.kuali.kfs.sys.context.SpringContext; 032 import org.kuali.kfs.sys.document.FinancialSystemMaintainable; 033 import org.kuali.kfs.sys.identity.KfsKimAttributes; 034 import org.kuali.rice.kim.bo.Role; 035 import org.kuali.rice.kim.bo.entity.KimPrincipal; 036 import org.kuali.rice.kim.bo.group.dto.GroupInfo; 037 import org.kuali.rice.kim.bo.role.dto.DelegateInfo; 038 import org.kuali.rice.kim.bo.role.dto.DelegateMemberCompleteInfo; 039 import org.kuali.rice.kim.bo.role.dto.DelegateTypeInfo; 040 import org.kuali.rice.kim.bo.role.dto.KimRoleInfo; 041 import org.kuali.rice.kim.bo.role.dto.RoleMemberCompleteInfo; 042 import org.kuali.rice.kim.bo.role.dto.RoleResponsibilityActionInfo; 043 import org.kuali.rice.kim.bo.role.dto.RoleResponsibilityInfo; 044 import org.kuali.rice.kim.bo.types.dto.AttributeDefinitionMap; 045 import org.kuali.rice.kim.bo.types.dto.AttributeSet; 046 import org.kuali.rice.kim.bo.types.dto.KimTypeInfo; 047 import org.kuali.rice.kim.service.GroupService; 048 import org.kuali.rice.kim.service.IdentityManagementService; 049 import org.kuali.rice.kim.service.KIMServiceLocator; 050 import org.kuali.rice.kim.service.KimTypeInfoService; 051 import org.kuali.rice.kim.service.RoleManagementService; 052 import org.kuali.rice.kim.service.support.KimTypeService; 053 import org.kuali.rice.kim.util.KimCommonUtils; 054 import org.kuali.rice.kim.util.KimConstants; 055 import org.kuali.rice.kns.bo.BusinessObject; 056 import org.kuali.rice.kns.datadictionary.AttributeDefinition; 057 import org.kuali.rice.kns.datadictionary.KimDataDictionaryAttributeDefinition; 058 import org.kuali.rice.kns.datadictionary.KimNonDataDictionaryAttributeDefinition; 059 import org.kuali.rice.kns.document.MaintenanceDocument; 060 import org.kuali.rice.kns.document.MaintenanceLock; 061 import org.kuali.rice.kns.exception.KualiException; 062 import org.kuali.rice.kns.maintenance.Maintainable; 063 import org.kuali.rice.kns.util.GlobalVariables; 064 import org.kuali.rice.kns.util.KNSConstants; 065 import org.kuali.rice.kns.web.ui.Field; 066 import org.kuali.rice.kns.web.ui.Row; 067 import org.kuali.rice.kns.web.ui.Section; 068 069 070 public class OrgReviewRoleMaintainableImpl extends FinancialSystemMaintainable { 071 072 private transient static RoleManagementService roleManagementService; 073 private transient static GroupService groupService; 074 private transient static IdentityManagementService identityManagementService; 075 private transient static KimTypeInfoService typeInfoService; 076 private transient static OrgReviewRoleService orgReviewRoleService; 077 078 @Override 079 public boolean isExternalBusinessObject(){ 080 return true; 081 } 082 083 @Override 084 public List<MaintenanceLock> generateMaintenanceLocks() { 085 return Collections.emptyList(); 086 } 087 088 public void prepareBusinessObject(BusinessObject businessObject){ 089 OrgReviewRole orr = (OrgReviewRole)businessObject; 090 //Assuming that this is the condition when the document is loaded on edit or copy 091 if((KNSConstants.MAINTENANCE_EDIT_METHOD_TO_CALL.equals(orr.getMethodToCall()) || 092 KNSConstants.MAINTENANCE_COPY_METHOD_TO_CALL.equals(orr.getMethodToCall())) && 093 (StringUtils.isNotEmpty(orr.getODelMId()) || StringUtils.isNotEmpty(orr.getORMId()))){ 094 Map<String, String> criteria; 095 if(StringUtils.isNotEmpty(orr.getODelMId()) && !orr.isCreateDelegation()){ 096 getOrgReviewRoleService().populateOrgReviewRoleFromDelegationMember(orr, orr.getODelMId()); 097 098 orr.setDelegate(true); 099 orr.setODelMId(""); 100 } else if(StringUtils.isNotEmpty(orr.getORMId())){ 101 getOrgReviewRoleService().populateOrgReviewRoleFromRoleMember(orr, orr.getORMId()); 102 103 if(orr.isCreateDelegation()) { 104 orr.setDelegate(true); 105 orr.setKimDocumentRoleMember(null); 106 } else { 107 orr.setDelegate(false); 108 } 109 orr.setORMId(""); 110 } 111 if(orr.isCreateDelegation()){ 112 orr.setPrincipalMemberPrincipalId(null); 113 orr.setPrincipalMemberPrincipalName(null); 114 orr.setRoleMemberRoleId(null); 115 orr.setRoleMemberRoleNamespaceCode(null); 116 orr.setRoleMemberRoleName(null); 117 orr.setGroupMemberGroupId(null); 118 orr.setGroupMemberGroupNamespaceCode(null); 119 orr.setGroupMemberGroupName(null); 120 } 121 } 122 super.setBusinessObject(orr); 123 } 124 125 public List<RoleResponsibilityActionInfo> getRoleRspActions(String roleMemberId){ 126 return getRoleManagementService().getRoleMemberResponsibilityActionInfo(roleMemberId); 127 } 128 129 @Override 130 public void processAfterEdit(MaintenanceDocument document, Map<String,String[]> parameters){ 131 super.processAfterEdit(document, parameters); 132 OrgReviewRole orr = (OrgReviewRole)document.getOldMaintainableObject().getBusinessObject(); 133 orr.setEdit(true); 134 } 135 136 @Override 137 public void processAfterCopy(MaintenanceDocument document, Map<String,String[]> parameters){ 138 OrgReviewRole orr = (OrgReviewRole)document.getOldMaintainableObject().getBusinessObject(); 139 if(orr.isDelegate() || orr.isCreateDelegation()) 140 orr.setDelegationMemberId(""); 141 else 142 orr.setRoleMemberId(""); 143 orr.setCopy(true); 144 } 145 146 /** 147 * 148 * @see org.kuali.rice.kns.maintenance.Maintainable#prepareForSave() 149 */ 150 public void prepareForSave() { 151 super.prepareForSave(); 152 } 153 154 private Boolean hasOrganizationHierarchy = null; 155 private Boolean hasAccountingOrganizationHierarchy = null; 156 private String closestOrgReviewRoleParentDocumentTypeName = null; 157 private Boolean shouldReviewTypesFieldBeReadOnly = null; 158 159 /** 160 * Override the getSections method on this maintainable so that the document type name field 161 * can be set to read-only for 162 */ 163 @Override 164 public List getSections(MaintenanceDocument document, Maintainable oldMaintainable) { 165 List<Section> sections = super.getSections(document, oldMaintainable); 166 //If oldMaintainable is null, it means we are trying to get sections for the old part 167 //If oldMaintainable is not null, it means we are trying to get sections for the new part 168 //Refer to KualiMaintenanceForm lines 288-294 169 if(oldMaintainable!=null){ 170 OrgReviewRole orr = (OrgReviewRole)document.getNewMaintainableObject().getBusinessObject(); 171 shouldReviewTypesFieldBeReadOnly(document); 172 for (Section section : sections) { 173 for (Row row : section.getRows()) { 174 for (Field field : row.getFields()) { 175 if(orr.isCreateRoleMember() || orr.isCopyRoleMember()){ 176 prepareFieldsForCreateRoleMemberMode(field); 177 } else if(orr.isCreateDelegation() || orr.isCopyDelegation()){ 178 prepareFieldsForCreateDelegationMode(field); 179 } else if(orr.isEditRoleMember()){ 180 prepareFieldsForEditRoleMember(field, orr); 181 } else if(orr.isEditDelegation()){ 182 prepareFieldsForEditDelegation(field, orr); 183 } 184 prepareFieldsCommon(field); 185 } 186 } 187 } 188 } else{ 189 for (Section section : sections) { 190 for (Row row : section.getRows()) { 191 for (Field field : row.getFields()) { 192 OrgReviewRole orr = (OrgReviewRole)document.getNewMaintainableObject().getBusinessObject(); 193 if(orr.isCreateRoleMember() || orr.isCopyRoleMember() || orr.isEditRoleMember()){ 194 //If the member being edited is not a delegate, do not show the delegation type code 195 if(OrgReviewRole.DELEGATION_TYPE_CODE.equals(field.getPropertyName())){ 196 field.setFieldType(Field.HIDDEN); 197 } 198 } 199 } 200 } 201 } 202 } 203 return sections; 204 } 205 206 private void prepareFieldsCommon(Field field){ 207 if(OrgReviewRole.REVIEW_ROLES_INDICATOR_FIELD_NAME.equals(field.getPropertyName())) { 208 if((shouldReviewTypesFieldBeReadOnly!=null && shouldReviewTypesFieldBeReadOnly)) 209 field.setReadOnly(true); 210 } else if(OrgReviewRole.FROM_AMOUNT_FIELD_NAME.equals(field.getPropertyName()) || 211 OrgReviewRole.TO_AMOUNT_FIELD_NAME.equals(field.getPropertyName()) || 212 OrgReviewRole.OVERRIDE_CODE_FIELD_NAME.equals(field.getPropertyName())) { 213 if((hasAccountingOrganizationHierarchy==null || !hasAccountingOrganizationHierarchy) && 214 (shouldReviewTypesFieldBeReadOnly!=null && shouldReviewTypesFieldBeReadOnly)){ 215 field.setReadOnly(true); 216 } 217 } 218 } 219 220 private void prepareFieldsForEditRoleMember(Field field, OrgReviewRole orr){ 221 if(OrgReviewRole.CHART_CODE_FIELD_NAME.equals(field.getPropertyName()) || 222 OrgReviewRole.ORG_CODE_FIELD_NAME.equals(field.getPropertyName()) || 223 OrgReviewRole.DOC_TYPE_NAME_FIELD_NAME.equals(field.getPropertyName()) || 224 OrgReviewRole.REVIEW_ROLES_INDICATOR_FIELD_NAME.equals(field.getPropertyName()) || 225 OrgReviewRole.PRINCIPAL_NAME_FIELD_NAME.equals(field.getPropertyName()) || 226 OrgReviewRole.ROLE_NAME_FIELD_NAME.equals(field.getPropertyName()) || 227 OrgReviewRole.ROLE_NAME_FIELD_NAMESPACE_CODE.equals(field.getPropertyName()) || 228 OrgReviewRole.GROUP_NAME_FIELD_NAME.equals(field.getPropertyName()) || 229 OrgReviewRole.GROUP_NAME_FIELD_NAMESPACE_CODE.equals(field.getPropertyName())){ 230 field.setReadOnly(true); 231 } 232 //If the member being edited is not a delegate, do not show the delegation type code 233 if(OrgReviewRole.DELEGATION_TYPE_CODE.equals(field.getPropertyName())){ 234 field.setFieldType(Field.HIDDEN); 235 } 236 } 237 238 private void prepareFieldsForEditDelegation(Field field, OrgReviewRole orr){ 239 if(OrgReviewRole.CHART_CODE_FIELD_NAME.equals(field.getPropertyName()) || 240 OrgReviewRole.ORG_CODE_FIELD_NAME.equals(field.getPropertyName()) || 241 OrgReviewRole.DOC_TYPE_NAME_FIELD_NAME.equals(field.getPropertyName()) || 242 OrgReviewRole.REVIEW_ROLES_INDICATOR_FIELD_NAME.equals(field.getPropertyName()) || 243 OrgReviewRole.PRINCIPAL_NAME_FIELD_NAME.equals(field.getPropertyName()) || 244 OrgReviewRole.ROLE_NAME_FIELD_NAME.equals(field.getPropertyName()) || 245 OrgReviewRole.ROLE_NAME_FIELD_NAMESPACE_CODE.equals(field.getPropertyName()) || 246 OrgReviewRole.GROUP_NAME_FIELD_NAME.equals(field.getPropertyName()) || 247 OrgReviewRole.GROUP_NAME_FIELD_NAMESPACE_CODE.equals(field.getPropertyName()) || 248 OrgReviewRole.ACTION_POLICY_CODE_FIELD_NAME.equals(field.getPropertyName()) || 249 OrgReviewRole.ACTION_TYPE_CODE_FIELD_NAME.equals(field.getPropertyName()) || 250 OrgReviewRole.PRIORITY_CODE_FIELD_NAME.equals(field.getPropertyName()) || 251 OrgReviewRole.FORCE_ACTION_FIELD_NAME.equals(field.getPropertyName())){ 252 field.setReadOnly(true); 253 } 254 } 255 256 private void prepareFieldsForCreateRoleMemberMode(Field field){ 257 //If a role member (i.e. not a delegate) is being created, do not show the delegation type code 258 if(OrgReviewRole.DELEGATION_TYPE_CODE.equals(field.getPropertyName())){ 259 field.setFieldType(Field.HIDDEN); 260 } 261 } 262 263 private void prepareFieldsForCreateDelegationMode(Field field){ 264 //TODO: in prepareBusinessObject, populate these fields for create delegation 265 if(OrgReviewRole.CHART_CODE_FIELD_NAME.equals(field.getPropertyName()) || 266 OrgReviewRole.ORG_CODE_FIELD_NAME.equals(field.getPropertyName()) || 267 OrgReviewRole.DOC_TYPE_NAME_FIELD_NAME.equals(field.getPropertyName()) || 268 OrgReviewRole.REVIEW_ROLES_INDICATOR_FIELD_NAME.equals(field.getPropertyName()) || 269 OrgReviewRole.ACTION_POLICY_CODE_FIELD_NAME.equals(field.getPropertyName()) || 270 OrgReviewRole.ACTION_TYPE_CODE_FIELD_NAME.equals(field.getPropertyName()) || 271 OrgReviewRole.PRIORITY_CODE_FIELD_NAME.equals(field.getPropertyName()) || 272 OrgReviewRole.FORCE_ACTION_FIELD_NAME.equals(field.getPropertyName())){ 273 field.setReadOnly(true); 274 } 275 } 276 277 private boolean shouldReviewTypesFieldBeReadOnly(MaintenanceDocument document){ 278 OrgReviewRole orr = (OrgReviewRole)document.getNewMaintainableObject().getBusinessObject(); 279 if(StringUtils.isEmpty(orr.getFinancialSystemDocumentTypeCode())) 280 return false; 281 OrgReviewRoleLookupableHelperServiceImpl orrLHSI = new OrgReviewRoleLookupableHelperServiceImpl(); 282 hasOrganizationHierarchy = orrLHSI.hasOrganizationHierarchy(orr.getFinancialSystemDocumentTypeCode()); 283 closestOrgReviewRoleParentDocumentTypeName = orrLHSI.getClosestOrgReviewRoleParentDocumentTypeName(orr.getFinancialSystemDocumentTypeCode()); 284 boolean isFSTransDoc = orr.getFinancialSystemDocumentTypeCode().equals(KFSConstants.FINANCIAL_SYSTEM_TRANSACTIONAL_DOCUMENT) || KFSConstants.FINANCIAL_SYSTEM_TRANSACTIONAL_DOCUMENT.equals(closestOrgReviewRoleParentDocumentTypeName); 285 hasAccountingOrganizationHierarchy = orrLHSI.hasAccountingOrganizationHierarchy(orr.getFinancialSystemDocumentTypeCode()) || isFSTransDoc; 286 return shouldReviewTypesFieldBeReadOnly = isFSTransDoc || hasOrganizationHierarchy || hasAccountingOrganizationHierarchy || 287 (StringUtils.isNotEmpty(closestOrgReviewRoleParentDocumentTypeName) && closestOrgReviewRoleParentDocumentTypeName.equals(KFSConstants.FINANCIAL_SYSTEM_COMPLEX_MAINTENANCE_DOCUMENT)); 288 } 289 290 /*** 291 * @see org.kuali.rice.kns.maintenance.KualiMaintainableImpl#refresh(java.lang.String, java.util.Map, org.kuali.rice.kns.document.MaintenanceDocument) 292 */ 293 @Override 294 public void refresh(String refreshCaller, Map fieldValues, MaintenanceDocument document){ 295 super.refresh(refreshCaller, fieldValues, document); 296 } 297 298 /** 299 * 300 * @see org.kuali.rice.kns.maintenance.Maintainable#saveBusinessObject() 301 */ 302 @Override 303 public void saveBusinessObject() { 304 OrgReviewRole orr = (OrgReviewRole)getBusinessObject(); 305 if(orr.isDelegate() || orr.isCreateDelegation()){ 306 // Save delegation(s) 307 List<DelegateTypeInfo> objectsToSave = getDelegations(orr); 308 if(objectsToSave!=null){ 309 for(DelegateTypeInfo delegateInfo: objectsToSave){ 310 for(DelegateMemberCompleteInfo delegateMemberInfo: delegateInfo.getMembers()){ 311 java.sql.Date fromDate = null; 312 java.sql.Date toDate = null; 313 if ( delegateMemberInfo.getActiveFromDate() != null ) { 314 fromDate = new java.sql.Date( delegateMemberInfo.getActiveFromDate().getTime() ); 315 } 316 if ( delegateMemberInfo.getActiveToDate() != null ) { 317 toDate = new java.sql.Date( delegateMemberInfo.getActiveToDate().getTime() ); 318 } 319 getRoleManagementService().saveDelegationMemberForRole(delegateMemberInfo.getDelegationMemberId(), 320 delegateMemberInfo.getRoleMemberId(), delegateMemberInfo.getMemberId(), 321 delegateMemberInfo.getMemberTypeCode(), delegateMemberInfo.getDelegationTypeCode(), 322 delegateInfo.getRoleId(), delegateMemberInfo.getQualifier(), 323 fromDate, toDate); 324 } 325 } 326 } 327 } else{ 328 // Save role member(s) 329 List<RoleMemberCompleteInfo> objectsToSave = getRoleMembers(orr); 330 RoleMemberCompleteInfo savedObject; 331 if(objectsToSave!=null){ 332 for(RoleMemberCompleteInfo roleMember: objectsToSave){ 333 java.sql.Date fromDate = null; 334 java.sql.Date toDate = null; 335 if ( roleMember.getActiveFromDate() != null ) { 336 fromDate = new java.sql.Date( roleMember.getActiveFromDate().getTime() ); 337 } 338 if ( roleMember.getActiveToDate() != null ) { 339 toDate = new java.sql.Date( roleMember.getActiveToDate().getTime() ); 340 } 341 savedObject = getRoleManagementService().saveRoleMemberForRole(roleMember.getRoleMemberId(), 342 roleMember.getMemberId(), roleMember.getMemberTypeCode(), roleMember.getRoleId(), 343 roleMember.getQualifier(), fromDate, toDate); 344 List<RoleResponsibilityActionInfo> roleRspActionsToSave = getRoleRspActions(orr, roleMember); 345 if(roleRspActionsToSave!=null){ 346 for(RoleResponsibilityActionInfo rspActionInfo: roleRspActionsToSave){ 347 getRoleManagementService().saveRoleRspActions( 348 rspActionInfo.getRoleResponsibilityActionId(), roleMember.getRoleId(), 349 rspActionInfo.getRoleResponsibilityId(), savedObject.getRoleMemberId(), 350 rspActionInfo.getActionTypeCode(), rspActionInfo.getActionPolicyCode(), 351 rspActionInfo.getPriorityNumber(), new Boolean(rspActionInfo.isForceAction())); 352 } 353 } 354 } 355 } 356 } 357 } 358 359 protected List<DelegateTypeInfo> getDelegations(OrgReviewRole orr){ 360 List<DelegateMemberCompleteInfo> delegationMembers = new ArrayList<DelegateMemberCompleteInfo>(); 361 List<String> roleNamesToSaveFor = getRolesToSaveFor(orr.getRoleNamesToConsider(), orr.getReviewRolesIndicator()); 362 List<DelegateTypeInfo> roleDelegations = new ArrayList<DelegateTypeInfo>(); 363 DelegateTypeInfo roleDelegation; 364 KimRoleInfo roleInfo; 365 if(roleNamesToSaveFor!=null){ 366 for(String roleName: roleNamesToSaveFor){ 367 roleDelegation = new DelegateTypeInfo(); 368 roleInfo = getRoleManagementService().getRoleByName( 369 KFSConstants.SysKimConstants.ORGANIZATION_REVIEWER_ROLE_NAMESPACECODE, roleName); 370 roleDelegation.setRoleId(roleInfo.getRoleId()); 371 orr.setKimTypeId(roleInfo.getKimTypeId()); 372 delegationMembers.addAll(getDelegationMembersToSave(orr)); 373 roleDelegation.setMembers(delegationMembers); 374 roleDelegations.add(roleDelegation); 375 } 376 } 377 return roleDelegations; 378 } 379 380 private List<DelegateMemberCompleteInfo> getDelegationMembersToSave(OrgReviewRole orr){ 381 List<DelegateMemberCompleteInfo> objectsToSave = new ArrayList<DelegateMemberCompleteInfo>(); 382 String memberId; 383 DelegateMemberCompleteInfo delegationMember = null; 384 Map<String, Object> criteria; 385 if(orr.isEdit() && !orr.isCreateDelegation()){ 386 delegationMember = (DelegateMemberCompleteInfo)getRoleManagementService().getDelegationMemberById(orr.getDelegationMemberId()); 387 } 388 if(StringUtils.isNotEmpty(orr.getRoleMemberRoleNamespaceCode()) && StringUtils.isNotEmpty(orr.getRoleMemberRoleName())){ 389 if(delegationMember==null){ 390 memberId = getRoleManagementService().getRoleIdByName(orr.getRoleMemberRoleNamespaceCode(), orr.getRoleMemberRoleName()); 391 delegationMember = new DelegateMemberCompleteInfo(); 392 delegationMember.setMemberId(memberId); 393 } 394 delegationMember.setDelegationTypeCode(orr.getDelegationTypeCode()); 395 delegationMember.setMemberTypeCode(KimConstants.KimUIConstants.MEMBER_TYPE_ROLE_CODE); 396 delegationMember.setQualifier(getAttributes(orr, orr.getKimTypeId())); 397 delegationMember.setActiveFromDate(orr.getActiveFromDate()); 398 delegationMember.setActiveToDate(orr.getActiveToDate()); 399 delegationMember.setRoleMemberId(orr.getRoleMemberId()); 400 objectsToSave.add(delegationMember); 401 delegationMember = null; 402 } 403 if(StringUtils.isNotEmpty(orr.getGroupMemberGroupNamespaceCode()) && StringUtils.isNotEmpty(orr.getGroupMemberGroupName())){ 404 if(delegationMember==null){ 405 GroupInfo groupInfo = getGroupService().getGroupInfoByName(orr.getGroupMemberGroupNamespaceCode(), orr.getGroupMemberGroupName()); 406 memberId = groupInfo.getGroupId(); 407 delegationMember = new DelegateMemberCompleteInfo(); 408 delegationMember.setMemberId(memberId); 409 } 410 delegationMember.setDelegationTypeCode(orr.getDelegationTypeCode()); 411 delegationMember.setMemberTypeCode(KimConstants.KimUIConstants.MEMBER_TYPE_GROUP_CODE); 412 delegationMember.setQualifier(getAttributes(orr, orr.getKimTypeId())); 413 delegationMember.setActiveFromDate(orr.getActiveFromDate()); 414 delegationMember.setActiveToDate(orr.getActiveToDate()); 415 delegationMember.setRoleMemberId(orr.getRoleMemberId()); 416 objectsToSave.add(delegationMember); 417 delegationMember = null; 418 } 419 if(StringUtils.isNotEmpty(orr.getPrincipalMemberPrincipalName())){ 420 if(delegationMember==null){ 421 KimPrincipal principal = getIdentityManagementService().getPrincipalByPrincipalName(orr.getPrincipalMemberPrincipalName()); 422 delegationMember = new DelegateMemberCompleteInfo(); 423 delegationMember.setMemberId(principal.getPrincipalId()); 424 } 425 delegationMember.setDelegationTypeCode(orr.getDelegationTypeCode()); 426 delegationMember.setMemberTypeCode(KimConstants.KimUIConstants.MEMBER_TYPE_PRINCIPAL_CODE); 427 delegationMember.setQualifier(getAttributes(orr, orr.getKimTypeId())); 428 delegationMember.setActiveFromDate(orr.getActiveFromDate()); 429 delegationMember.setActiveToDate(orr.getActiveToDate()); 430 delegationMember.setRoleMemberId(orr.getRoleMemberId()); 431 objectsToSave.add(delegationMember); 432 delegationMember = null; 433 } 434 return objectsToSave; 435 } 436 437 private List<RoleMemberCompleteInfo> getRoleMembersToSave(KimRoleInfo roleInfo, OrgReviewRole orr){ 438 List<RoleMemberCompleteInfo> objectsToSave = new ArrayList<RoleMemberCompleteInfo>(); 439 String memberId; 440 RoleMemberCompleteInfo roleMember = null; 441 if(StringUtils.isNotEmpty(orr.getRoleMemberRoleNamespaceCode()) && StringUtils.isNotEmpty(orr.getRoleMemberRoleName())){ 442 if(roleMember==null){ 443 memberId = getRoleManagementService().getRoleIdByName(orr.getRoleMemberRoleNamespaceCode(), orr.getRoleMemberRoleName()); 444 roleMember = new RoleMemberCompleteInfo(); 445 roleMember.setRoleId(roleInfo.getRoleId()); 446 roleMember.setMemberId(memberId); 447 roleMember.setMemberTypeCode(KimConstants.KimUIConstants.MEMBER_TYPE_ROLE_CODE); 448 roleMember.setMemberId(memberId); 449 } 450 if(orr.isEdit()){ 451 roleMember.setRoleMemberId(orr.getRoleMemberId()); 452 } 453 roleMember.setQualifier(getAttributes(orr, roleMember, roleInfo.getKimTypeId())); 454 roleMember.setActiveFromDate(orr.getActiveFromDate()); 455 roleMember.setActiveToDate(orr.getActiveToDate()); 456 objectsToSave.add(roleMember); 457 roleMember = null; 458 } 459 if(StringUtils.isNotEmpty(orr.getGroupMemberGroupNamespaceCode()) && StringUtils.isNotEmpty(orr.getGroupMemberGroupName())){ 460 if(roleMember==null){ 461 GroupInfo groupInfo = getGroupService().getGroupInfoByName(orr.getGroupMemberGroupNamespaceCode(), orr.getGroupMemberGroupName()); 462 memberId = groupInfo.getGroupId(); 463 roleMember = new RoleMemberCompleteInfo(); 464 roleMember.setMemberId(memberId); 465 } 466 roleMember.setMemberTypeCode(KimConstants.KimUIConstants.MEMBER_TYPE_GROUP_CODE); 467 roleMember.setRoleId(roleInfo.getRoleId()); 468 if(orr.isEdit()){ 469 roleMember.setRoleMemberId(orr.getRoleMemberId()); 470 } 471 List<RoleResponsibilityActionInfo> roleRspActionObjectsToSave = new ArrayList<RoleResponsibilityActionInfo>(); 472 roleRspActionObjectsToSave.addAll(getRoleRspActions(orr, roleMember)); 473 roleMember.setQualifier(getAttributes(orr, roleMember, roleInfo.getKimTypeId())); 474 roleMember.setActiveFromDate(orr.getActiveFromDate()); 475 roleMember.setActiveToDate(orr.getActiveToDate()); 476 objectsToSave.add(roleMember); 477 roleMember = null; 478 } 479 if(StringUtils.isNotEmpty(orr.getPrincipalMemberPrincipalName())){ 480 if(roleMember==null){ 481 KimPrincipal principal = getIdentityManagementService().getPrincipalByPrincipalName(orr.getPrincipalMemberPrincipalName()); 482 roleMember = new RoleMemberCompleteInfo(); 483 roleMember.setMemberId(principal.getPrincipalId()); 484 } 485 roleMember.setMemberTypeCode(KimConstants.KimUIConstants.MEMBER_TYPE_PRINCIPAL_CODE); 486 roleMember.setRoleId(roleInfo.getRoleId()); 487 if(orr.isEdit()){ 488 roleMember.setRoleMemberId(orr.getRoleMemberId()); 489 } 490 List<RoleResponsibilityActionInfo> roleRspActionObjectsToSave = new ArrayList<RoleResponsibilityActionInfo>(); 491 roleRspActionObjectsToSave.addAll(getRoleRspActions(orr, roleMember)); 492 roleMember.setQualifier(getAttributes(orr, roleMember, roleInfo.getKimTypeId())); 493 roleMember.setActiveFromDate(orr.getActiveFromDate()); 494 roleMember.setActiveToDate(orr.getActiveToDate()); 495 objectsToSave.add(roleMember); 496 roleMember = null; 497 } 498 return objectsToSave; 499 } 500 501 private List<String> getRolesToSaveFor(List<String> roleNamesToConsider, String reviewRolesIndicator){ 502 List<String> roleToSaveFor = new ArrayList<String>(); 503 if(roleNamesToConsider!=null){ 504 if(KFSConstants.COAConstants.ORG_REVIEW_ROLE_ORG_ACC_ONLY_CODE.equals(reviewRolesIndicator)){ 505 roleToSaveFor.add(KFSConstants.SysKimConstants.ACCOUNTING_REVIEWER_ROLE_NAME); 506 } else if(KFSConstants.COAConstants.ORG_REVIEW_ROLE_ORG_ONLY_CODE.equals(reviewRolesIndicator)){ 507 roleToSaveFor.add(KFSConstants.SysKimConstants.ORGANIZATION_REVIEWER_ROLE_NAME); 508 } else{ 509 roleToSaveFor.addAll(roleNamesToConsider); 510 } 511 } 512 return roleToSaveFor; 513 } 514 515 protected List<RoleMemberCompleteInfo> getRoleMembers(OrgReviewRole orr){ 516 List<RoleMemberCompleteInfo> objectsToSave = new ArrayList<RoleMemberCompleteInfo>(); 517 List<String> roleNamesToSaveFor = getRolesToSaveFor(orr.getRoleNamesToConsider(), orr.getReviewRolesIndicator()); 518 String roleId; 519 String memberId; 520 RoleMemberCompleteInfo roleMember = null; 521 KimRoleInfo roleInfo; 522 Map<String, Object> criteria; 523 if(roleNamesToSaveFor!=null){ 524 for(String roleName: roleNamesToSaveFor){ 525 roleId = getRoleManagementService().getRoleIdByName( 526 KFSConstants.SysKimConstants.ORGANIZATION_REVIEWER_ROLE_NAMESPACECODE, roleName); 527 roleInfo = getRoleManagementService().getRole(roleId); 528 objectsToSave.addAll(getRoleMembersToSave(roleInfo, orr)); 529 } 530 } 531 return objectsToSave; 532 } 533 534 public String getKimAttributeDefnId(AttributeDefinition definition){ 535 if (definition instanceof KimDataDictionaryAttributeDefinition) { 536 return ((KimDataDictionaryAttributeDefinition)definition).getKimAttrDefnId(); 537 } else { 538 return ((KimNonDataDictionaryAttributeDefinition)definition).getKimAttrDefnId(); 539 } 540 } 541 542 public String getKimAttributeDefnId(AttributeDefinitionMap attributeDefinitions, String attributeName){ 543 if(attributeDefinitions.values()!=null){ 544 for(AttributeDefinition definition: attributeDefinitions.values()){ 545 if(definition.getName().equals(attributeName)) 546 return getKimAttributeDefnId(definition); 547 } 548 } 549 return null; 550 } 551 552 //protected String getKimAttributeId() 553 protected AttributeSet getAttributes( 554 OrgReviewRole orr, RoleMemberCompleteInfo roleMember, String kimTypeId){ 555 KimTypeInfo kimType = getTypeInfoService().getKimType(kimTypeId); 556 KimTypeService typeService = KimCommonUtils.getKimTypeService(kimType); 557 AttributeDefinitionMap attributeDefinitions = typeService.getAttributeDefinitions(kimTypeId); 558 List<KfsKimDocumentAttributeData> attributeDataList = new ArrayList<KfsKimDocumentAttributeData>(); 559 KfsKimDocumentAttributeData attributeData = new KfsKimDocumentAttributeData(); 560 //chart code 561 String attributeDefnId = getKimAttributeDefnId(attributeDefinitions, KfsKimAttributes.CHART_OF_ACCOUNTS_CODE); 562 if(StringUtils.isNotEmpty(attributeDefnId) && orr.getFinancialSystemDocumentTypeCode()!=null){ 563 attributeData.setKimTypId(kimTypeId); 564 attributeData.setAttrVal(orr.getChartOfAccountsCode()); 565 attributeData.setKimAttrDefnId(attributeDefnId); 566 attributeData.setKimAttribute(kimType.getAttributeDefinition(attributeDefnId)); 567 attributeDataList.add(attributeData); 568 } 569 570 //org code 571 attributeDefnId = getKimAttributeDefnId(attributeDefinitions, KfsKimAttributes.ORGANIZATION_CODE); 572 if(StringUtils.isNotEmpty(attributeDefnId) && orr.getFinancialSystemDocumentTypeCode()!=null){ 573 attributeData = new KfsKimDocumentAttributeData(); 574 attributeData.setKimTypId(kimTypeId); 575 attributeData.setAttrVal(orr.getOrganizationCode()); 576 attributeData.setKimAttrDefnId(attributeDefnId); 577 attributeData.setKimAttribute(kimType.getAttributeDefinition(attributeDefnId)); 578 attributeDataList.add(attributeData); 579 } 580 581 //document type 582 attributeDefnId = getKimAttributeDefnId(attributeDefinitions, KfsKimAttributes.DOCUMENT_TYPE_NAME); 583 if(StringUtils.isNotEmpty(attributeDefnId) && orr.getFinancialSystemDocumentTypeCode()!=null){ 584 attributeData = new KfsKimDocumentAttributeData(); 585 attributeData.setKimTypId(kimTypeId); 586 attributeData.setAttrVal(orr.getFinancialSystemDocumentTypeCode()); 587 attributeData.setKimAttrDefnId(attributeDefnId); 588 attributeData.setKimAttribute(kimType.getAttributeDefinition(attributeDefnId)); 589 attributeDataList.add(attributeData); 590 } 591 592 //override code 593 attributeDefnId = getKimAttributeDefnId(attributeDefinitions, KfsKimAttributes.ACCOUNTING_LINE_OVERRIDE_CODE); 594 if(StringUtils.isNotEmpty(attributeDefnId) && orr.getOverrideCode()!=null){ 595 attributeData = new KfsKimDocumentAttributeData(); 596 attributeData.setKimTypId(kimTypeId); 597 attributeData.setAttrVal(orr.getOverrideCode()); 598 attributeData.setKimAttrDefnId(attributeDefnId); 599 attributeData.setKimAttribute(kimType.getAttributeDefinition(attributeDefnId)); 600 attributeDataList.add(attributeData); 601 } 602 603 //from amount 604 attributeDefnId = getKimAttributeDefnId(attributeDefinitions, KfsKimAttributes.FROM_AMOUNT); 605 if(StringUtils.isNotEmpty(attributeDefnId)){ 606 attributeData = new KfsKimDocumentAttributeData(); 607 attributeData.setKimTypId(kimTypeId); 608 attributeData.setAttrVal(orr.getFromAmountStr()); 609 attributeData.setKimAttrDefnId(attributeDefnId); 610 attributeData.setKimAttribute(kimType.getAttributeDefinition(attributeDefnId)); 611 attributeDataList.add(attributeData); 612 } 613 614 //to amount 615 attributeDefnId = getKimAttributeDefnId(attributeDefinitions, KfsKimAttributes.TO_AMOUNT); 616 if(StringUtils.isNotEmpty(attributeDefnId)){ 617 attributeData = new KfsKimDocumentAttributeData(); 618 attributeData.setKimTypId(kimTypeId); 619 attributeData.setAttrVal(orr.getToAmountStr()); 620 attributeData.setKimAttrDefnId(attributeDefnId); 621 attributeData.setKimAttribute(kimType.getAttributeDefinition(attributeDefnId)); 622 attributeDataList.add(attributeData); 623 } 624 625 return orr.getQualifierAsAttributeSet(attributeDataList); 626 } 627 628 protected AttributeSet getAttributes(OrgReviewRole orr, String kimTypeId){ 629 if(StringUtils.isEmpty(kimTypeId)) return null; 630 631 Map<String, String> criteria = new HashMap<String, String>(); 632 criteria.put("kimTypeId", kimTypeId); 633 KimTypeInfo kimType = getTypeInfoService().getKimType(kimTypeId); 634 KimTypeService typeService = KimCommonUtils.getKimTypeService(kimType); 635 AttributeDefinitionMap attributeDefinitions = typeService.getAttributeDefinitions(kimTypeId); 636 List<KfsKimDocumentAttributeData> attributeDataList = new ArrayList<KfsKimDocumentAttributeData>(); 637 KfsKimDocumentAttributeData attributeData = new KfsKimDocumentAttributeData(); 638 String attributeDefnId = getKimAttributeDefnId(attributeDefinitions, KfsKimAttributes.CHART_OF_ACCOUNTS_CODE); 639 if(StringUtils.isNotEmpty(attributeDefnId) && orr.getFinancialSystemDocumentTypeCode()!=null){ 640 attributeData.setKimTypId(kimTypeId); 641 attributeData.setAttrVal(orr.getChartOfAccountsCode()); 642 attributeData.setKimAttrDefnId(attributeDefnId); 643 attributeData.setKimAttribute(kimType.getAttributeDefinition(attributeDefnId)); 644 attributeDataList.add(attributeData); 645 } 646 647 //org code 648 attributeDefnId = getKimAttributeDefnId(attributeDefinitions, KfsKimAttributes.ORGANIZATION_CODE); 649 if(StringUtils.isNotEmpty(attributeDefnId) && orr.getFinancialSystemDocumentTypeCode()!=null){ 650 attributeData = new KfsKimDocumentAttributeData(); 651 attributeData.setKimTypId(kimTypeId); 652 attributeData.setAttrVal(orr.getOrganizationCode()); 653 attributeData.setKimAttrDefnId(attributeDefnId); 654 attributeData.setKimAttribute(kimType.getAttributeDefinition(attributeDefnId)); 655 attributeDataList.add(attributeData); 656 } 657 658 //document type 659 attributeDefnId = getKimAttributeDefnId(attributeDefinitions, KfsKimAttributes.DOCUMENT_TYPE_NAME); 660 if(StringUtils.isNotEmpty(attributeDefnId) && orr.getFinancialSystemDocumentTypeCode()!=null){ 661 attributeData = new KfsKimDocumentAttributeData(); 662 attributeData.setKimTypId(kimTypeId); 663 attributeData.setAttrVal(orr.getFinancialSystemDocumentTypeCode()); 664 attributeData.setKimAttrDefnId(attributeDefnId); 665 attributeData.setKimAttribute(kimType.getAttributeDefinition(attributeDefnId)); 666 attributeDataList.add(attributeData); 667 } 668 669 //override code 670 attributeDefnId = getKimAttributeDefnId(attributeDefinitions, KfsKimAttributes.ACCOUNTING_LINE_OVERRIDE_CODE); 671 if(StringUtils.isNotEmpty(attributeDefnId) && orr.getOverrideCode()!=null){ 672 attributeData = new KfsKimDocumentAttributeData(); 673 attributeData.setKimTypId(kimTypeId); 674 attributeData.setAttrVal(orr.getOverrideCode()); 675 attributeData.setKimAttrDefnId(attributeDefnId); 676 attributeData.setKimAttribute(kimType.getAttributeDefinition(attributeDefnId)); 677 attributeDataList.add(attributeData); 678 } 679 680 //from amount 681 attributeDefnId = getKimAttributeDefnId(attributeDefinitions, KfsKimAttributes.FROM_AMOUNT); 682 if(StringUtils.isNotEmpty(attributeDefnId) && orr.getFromAmount()!=null){ 683 attributeData = new KfsKimDocumentAttributeData(); 684 attributeData.setKimTypId(kimTypeId); 685 attributeData.setAttrVal(orr.getFromAmountStr()); 686 attributeData.setKimAttrDefnId(attributeDefnId); 687 attributeData.setKimAttribute(kimType.getAttributeDefinition(attributeDefnId)); 688 attributeDataList.add(attributeData); 689 } 690 691 //to amount 692 attributeDefnId = getKimAttributeDefnId(attributeDefinitions, KfsKimAttributes.TO_AMOUNT); 693 if(StringUtils.isNotEmpty(attributeDefnId) && orr.getToAmount()!=null){ 694 attributeData = new KfsKimDocumentAttributeData(); 695 attributeData.setKimTypId(kimTypeId); 696 attributeData.setAttrVal(orr.getToAmountStr()); 697 attributeData.setKimAttrDefnId(attributeDefnId); 698 attributeData.setKimAttribute(kimType.getAttributeDefinition(attributeDefnId)); 699 attributeDataList.add(attributeData); 700 } 701 702 return orr.getQualifierAsAttributeSet(attributeDataList); 703 } 704 705 protected List<RoleResponsibilityActionInfo> getRoleRspActions(OrgReviewRole orr, RoleMemberCompleteInfo roleMember){ 706 List<RoleResponsibilityActionInfo> roleRspActions = new ArrayList<RoleResponsibilityActionInfo>(); 707 RoleResponsibilityActionInfo roleRspAction; 708 //Assuming that there is only one responsibility for an org role 709 //Get it now given the role id 710 List<RoleResponsibilityInfo> roleResponsibilityInfos = ((List<RoleResponsibilityInfo>)getRoleManagementService().getRoleResponsibilities(roleMember.getRoleId())); 711 //Assuming that there is only 1 responsibility for both the org review roles 712 if(roleResponsibilityInfos!=null && roleResponsibilityInfos.size()<1) 713 throw new KualiException("The Org Review Role id:"+roleMember.getRoleId()+" does not have any responsibility associated with it"); 714 715 List<RoleResponsibilityActionInfo> origRoleRspActions = ((List<RoleResponsibilityActionInfo>)getRoleManagementService().getRoleMemberResponsibilityActionInfo(roleMember.getRoleMemberId())); 716 roleRspAction = new RoleResponsibilityActionInfo(); 717 if(origRoleRspActions!=null && origRoleRspActions.size()>0){ 718 RoleResponsibilityActionInfo origActionInfo = origRoleRspActions.get(0); 719 roleRspAction.setRoleResponsibilityActionId(origActionInfo.getRoleResponsibilityActionId()); 720 } 721 roleRspAction.setRoleMemberId(roleMember.getRoleMemberId()); 722 RoleResponsibilityInfo roleResponsibilityInfo = roleResponsibilityInfos.get(0); 723 roleRspAction.setRoleResponsibilityId(roleResponsibilityInfo.getRoleResponsibilityId()); 724 roleRspAction.setActionTypeCode(orr.getActionTypeCode()); 725 roleRspAction.setActionPolicyCode(orr.getActionPolicyCode()); 726 if(StringUtils.isNotBlank(orr.getPriorityNumber())){ 727 try{ 728 roleRspAction.setPriorityNumber(Integer.parseInt(orr.getPriorityNumber())); 729 } catch(Exception nfx){ 730 //ignore 731 } 732 } 733 roleRspAction.setForceAction(orr.isForceAction()); 734 roleRspActions.add(roleRspAction); 735 return roleRspActions; 736 } 737 738 protected OrgReviewRoleService getOrgReviewRoleService(){ 739 if(orgReviewRoleService==null){ 740 orgReviewRoleService = SpringContext.getBean( OrgReviewRoleService.class ); 741 } 742 return orgReviewRoleService; 743 } 744 745 protected RoleManagementService getRoleManagementService(){ 746 if(roleManagementService==null){ 747 roleManagementService = KIMServiceLocator.getRoleManagementService(); 748 } 749 return roleManagementService; 750 } 751 752 protected GroupService getGroupService(){ 753 if(groupService==null){ 754 groupService = KIMServiceLocator.getGroupService(); 755 } 756 return groupService; 757 } 758 759 protected IdentityManagementService getIdentityManagementService(){ 760 if(identityManagementService==null){ 761 identityManagementService = KIMServiceLocator.getIdentityManagementService(); 762 } 763 return identityManagementService; 764 } 765 766 protected KimTypeInfoService getTypeInfoService(){ 767 if(typeInfoService==null){ 768 typeInfoService = KIMServiceLocator.getTypeInfoService(); 769 } 770 return typeInfoService; 771 } 772 773 private DelegateInfo getDelegateMemberFromList(List<DelegateInfo> delegateMembers, String memberId, String memberTypeCode){ 774 if(StringUtils.isEmpty(memberId) || StringUtils.isEmpty(memberTypeCode)) 775 return null; 776 if(delegateMembers!=null){ 777 for(DelegateInfo info: delegateMembers){ 778 if(StringUtils.equals(info.getMemberId(), memberId) || 779 StringUtils.equals(info.getMemberTypeCode(), memberTypeCode)){ 780 return info; 781 } 782 } 783 } 784 return null; 785 } 786 787 @Override 788 public Map populateBusinessObject(Map<String, String> fieldValues, MaintenanceDocument maintenanceDocument, String methodToCall) { 789 String docTypeName = ""; 790 OrgReviewRoleLookupableHelperServiceImpl orrLHSI = new OrgReviewRoleLookupableHelperServiceImpl(); 791 if(fieldValues.containsKey(OrgReviewRole.DOC_TYPE_NAME_FIELD_NAME)){ 792 docTypeName = (String)fieldValues.get(OrgReviewRole.DOC_TYPE_NAME_FIELD_NAME); 793 } 794 if(KFSConstants.RETURN_METHOD_TO_CALL.equals(methodToCall) && 795 fieldValues.containsKey(OrgReviewRole.DOC_TYPE_NAME_FIELD_NAME) && 796 orrLHSI.isValidDocumentTypeForOrgReview(docTypeName) == false){ 797 798 GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + OrgReviewRole.DOC_TYPE_NAME_FIELD_NAME, KFSKeyConstants.ERROR_DOCUMENT_ORGREVIEW_INVALID_DOCUMENT_TYPE, docTypeName); 799 return new HashMap(); 800 801 }else{ 802 return super.populateBusinessObject(fieldValues, maintenanceDocument, methodToCall); 803 } 804 } 805 }