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    }