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 }