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.identity;
017
018 import java.util.ArrayList;
019 import java.util.Collection;
020 import java.util.Collections;
021 import java.util.HashMap;
022 import java.util.HashSet;
023 import java.util.Iterator;
024 import java.util.List;
025 import java.util.Map;
026 import java.util.Properties;
027 import java.util.Set;
028
029 import org.apache.commons.lang.StringUtils;
030 import org.kuali.kfs.coa.document.OrgReviewRoleMaintainableImpl;
031 import org.kuali.kfs.sys.KFSConstants;
032 import org.kuali.kfs.sys.context.SpringContext;
033 import org.kuali.kfs.sys.identity.KfsKimAttributes;
034 import org.kuali.rice.core.util.RiceUtilities;
035 import org.kuali.rice.kew.doctype.bo.DocumentType;
036 import org.kuali.rice.kew.doctype.service.DocumentTypeService;
037 import org.kuali.rice.kew.dto.DocumentTypeDTO;
038 import org.kuali.rice.kew.exception.WorkflowException;
039 import org.kuali.rice.kew.service.KEWServiceLocator;
040 import org.kuali.rice.kew.service.WorkflowInfo;
041 import org.kuali.rice.kim.bo.Group;
042 import org.kuali.rice.kim.bo.Person;
043 import org.kuali.rice.kim.bo.Role;
044 import org.kuali.rice.kim.bo.role.dto.DelegateMemberCompleteInfo;
045 import org.kuali.rice.kim.bo.role.dto.KimRoleInfo;
046 import org.kuali.rice.kim.bo.role.dto.RoleMemberCompleteInfo;
047 import org.kuali.rice.kim.bo.role.impl.KimDelegationImpl;
048 import org.kuali.rice.kim.bo.role.impl.KimDelegationMemberImpl;
049 import org.kuali.rice.kim.bo.types.dto.KimTypeInfo;
050 import org.kuali.rice.kim.service.GroupService;
051 import org.kuali.rice.kim.service.IdentityManagementService;
052 import org.kuali.rice.kim.service.KIMServiceLocator;
053 import org.kuali.rice.kim.service.KimTypeInfoService;
054 import org.kuali.rice.kim.service.RoleManagementService;
055 import org.kuali.rice.kim.util.KimCommonUtils;
056 import org.kuali.rice.kim.util.KimConstants;
057 import org.kuali.rice.kns.authorization.BusinessObjectRestrictions;
058 import org.kuali.rice.kns.bo.BusinessObject;
059 import org.kuali.rice.kns.exception.ValidationException;
060 import org.kuali.rice.kns.inquiry.KualiInquirableImpl;
061 import org.kuali.rice.kns.lookup.HtmlData;
062 import org.kuali.rice.kns.lookup.HtmlData.AnchorHtmlData;
063 import org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl;
064 import org.kuali.rice.kns.service.KNSServiceLocator;
065 import org.kuali.rice.kns.service.KualiModuleService;
066 import org.kuali.rice.kns.util.KNSConstants;
067 import org.kuali.rice.kns.util.ObjectUtils;
068 import org.kuali.rice.kns.util.UrlFactory;
069 import org.kuali.rice.kns.web.struts.form.LookupForm;
070 import org.kuali.rice.ksb.cache.RiceCacheAdministrator;
071 public class OrgReviewRoleLookupableHelperServiceImpl extends KualiLookupableHelperServiceImpl {
072
073 private GroupService groupService;
074 private RoleManagementService roleManagementService;
075 private IdentityManagementService identityManagementService;
076 private DocumentTypeService documentTypeService;
077 private KimTypeInfoService typeInfoService;
078 private RiceCacheAdministrator cacheAdministrator;
079
080 // private KualiInquirableImpl orgReviewRoleInquirable;
081
082 protected static final String WILDCARD = "*";
083 protected static final String DOCUMENT_TYPE_NAME = KfsKimAttributes.FINANCIAL_SYSTEM_DOCUMENT_TYPE_CODE;
084 protected static final String SEARCH_CRITERIA_DOCUMENT_TYPE_NAME = "documentTypeName";
085 public static final String MEMBER_ATTRIBUTE_CHART_OF_ACCOUNTS_CODE = "chartOfAccountsCode";
086 public static final String MEMBER_ATTRIBUTE_ORGANIZATION_CODE = "organizationCode";
087 protected static final String MEMBER_PRINCIPAL_NAME = "principalMemberPrincipalName";
088 protected static final String MEMBER_GROUP_NAMESPACE_CODE = "groupMemberGroupNamespaceCode";
089 protected static final String MEMBER_GROUP_NAME = "groupMemberGroupName";
090 protected static final String MEMBER_ROLE_NAMESPACE = "roleMemberRoleNamespaceCode";
091 protected static final String MEMBER_ROLE_NAME = "roleMemberRoleName";
092
093 protected static final String MEMBER_ID = "memberId";
094 protected static final String MEMBER_ATTRIBUTE_NAME_KEY = "attributes.kimAttribute.attributeName";
095 protected static final String MEMBER_ATTRIBUTE_VALUE_KEY = "attributes.attributeValue";
096
097 protected static final String DELEGATION_MEMBER_ID = "members.memberId";
098 protected static final String DELEGATION_MEMBER_ATTRIBUTE_NAME_KEY = "members.attributes.kimAttribute.attributeName";
099 protected static final String DELEGATION_MEMBER_ATTRIBUTE_VALUE_KEY = "members.attributes.attributeValue";
100
101 protected static final String DELEGATE = "delegate";
102 protected static final String ACTIVE = "active";
103 protected static final String ACTIVE_FROM_DATE = "activeFromDate";
104 protected static final String ACTIVE_TO_DATE = "activeToDate";
105 public static final String ORG_ACCT_REVIEW_ROLE_DOC_TYPE_CACHE_GROUP = "OrgAcctReviewRoleDocType";
106 public static final String ORG_ACCT_REVIEW_ROLE_DOC_TYPE_CACHE_PREFIX = ORG_ACCT_REVIEW_ROLE_DOC_TYPE_CACHE_GROUP + ":";
107
108 @Override
109 public Collection performLookup(LookupForm lookupForm, Collection resultTable, boolean bounded) {
110 lookupForm.setShowMaintenanceLinks(true);
111 lookupForm.setSuppressActions(false);
112 lookupForm.setHideReturnLink(true);
113 return super.performLookup(lookupForm, resultTable, bounded);
114 }
115
116 @Override
117 public List<HtmlData> getCustomActionUrls(BusinessObject businessObject, List pkNames){
118 OrgReviewRole orr = (OrgReviewRole)businessObject;
119 List<HtmlData> htmlDataList = super.getCustomActionUrls(businessObject, pkNames);
120 if(StringUtils.isNotBlank(getMaintenanceDocumentTypeName()) && allowsMaintenanceEditAction(businessObject) && !orr.isDelegate()) {
121 HtmlData createDelegationUrl = getUrlData(businessObject, KNSConstants.MAINTENANCE_EDIT_METHOD_TO_CALL, KFSConstants.COAConstants.ORG_REVIEW_ROLE_CREATE_DELEGATION_DISPLAY_TEXT, pkNames);
122 //createDelegationUrl.setDisplayText(KFSConstants.COAConstants.ORG_REVIEW_ROLE_CREATE_DELEGATION_DISPLAY_TEXT);
123 htmlDataList.add(createDelegationUrl);
124 }
125 return htmlDataList;
126 }
127
128 @Override
129 protected AnchorHtmlData getUrlData(BusinessObject businessObject, String methodToCall, String displayText, List pkNames){
130 if(KFSConstants.COAConstants.ORG_REVIEW_ROLE_CREATE_DELEGATION_DISPLAY_TEXT.equals(displayText)){
131 return getCreateDelegationUrl(businessObject, pkNames);
132 } else
133 return super.getUrlData(businessObject, methodToCall, displayText, pkNames);
134 }
135
136 protected AnchorHtmlData getCreateDelegationUrl(BusinessObject businessObject, List pkNames){
137 OrgReviewRole orr = (OrgReviewRole)businessObject;
138 Properties parameters = new Properties();
139 parameters.put(OrgReviewRole.ORIGINAL_DELEGATION_MEMBER_ID_TO_MODIFY, OrgReviewRole.NEW_DELEGATION_ID_KEY_VALUE);
140 parameters.put(KFSConstants.DISPATCH_REQUEST_PARAMETER, KNSConstants.MAINTENANCE_EDIT_METHOD_TO_CALL);
141 parameters.put(KNSConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, businessObject.getClass().getName());
142 parameters.put(KNSConstants.COPY_KEYS, OrgReviewRole.ORIGINAL_DELEGATION_MEMBER_ID_TO_MODIFY+","+OrgReviewRole.ORIGINAL_ROLE_MEMBER_ID_TO_MODIFY+","+KNSConstants.DISPATCH_REQUEST_PARAMETER);
143 parameters.put(OrgReviewRole.ORIGINAL_ROLE_MEMBER_ID_TO_MODIFY, orr.getRoleMemberId());
144 //parameters.putAll(getParametersFromPrimaryKey(businessObject, pkNames));
145 String href = UrlFactory.parameterizeUrl(KNSConstants.MAINTENANCE_ACTION, parameters);
146
147 return new AnchorHtmlData(href, KNSConstants.DOC_HANDLER_METHOD, KFSConstants.COAConstants.ORG_REVIEW_ROLE_CREATE_DELEGATION_DISPLAY_TEXT);
148 }
149
150 protected String getActionUrlHref(BusinessObject businessObject, String methodToCall, List pkNames){
151 OrgReviewRole orr = (OrgReviewRole)businessObject;
152 Properties parameters = new Properties();
153 parameters.put(KNSConstants.DISPATCH_REQUEST_PARAMETER, methodToCall);
154 parameters.put(KNSConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, OrgReviewRole.class.getName());
155
156 if(orr.isDelegate()){
157 parameters.put(KNSConstants.COPY_KEYS, OrgReviewRole.ORIGINAL_DELEGATION_MEMBER_ID_TO_MODIFY+","+KNSConstants.DISPATCH_REQUEST_PARAMETER);
158 parameters.put(OrgReviewRole.ORIGINAL_DELEGATION_MEMBER_ID_TO_MODIFY, orr.getDelegationMemberId());
159 } else {
160 parameters.put(KNSConstants.COPY_KEYS, OrgReviewRole.ORIGINAL_DELEGATION_MEMBER_ID_TO_MODIFY+","+OrgReviewRole.ORIGINAL_ROLE_MEMBER_ID_TO_MODIFY+","+KNSConstants.DISPATCH_REQUEST_PARAMETER);
161 parameters.put(OrgReviewRole.ORIGINAL_ROLE_MEMBER_ID_TO_MODIFY, orr.getRoleMemberId());
162 }
163 return UrlFactory.parameterizeUrl(KNSConstants.MAINTENANCE_ACTION, parameters);
164 }
165
166 protected List<String> getOverridePKNames(OrgReviewRole orr){
167 List overridePKNames = new ArrayList<String>();
168 if(orr.isDelegate())
169 overridePKNames.add(KimConstants.PrimaryKeyConstants.DELEGATION_MEMBER_ID);
170 else
171 overridePKNames.add(KimConstants.PrimaryKeyConstants.ROLE_MEMBER_ID);
172 return overridePKNames;
173 }
174
175 protected String getActionUrlTitleText(BusinessObject businessObject, String displayText, List pkNames, BusinessObjectRestrictions businessObjectRestrictions){
176 OrgReviewRole orr = (OrgReviewRole)businessObject;
177 return super.getActionUrlTitleText(businessObject, displayText, getOverridePKNames(orr), businessObjectRestrictions);
178 }
179
180 @Override
181 public List<? extends BusinessObject> getSearchResults(Map<String,String> fieldValues) {
182 return getMemberSearchResults(fieldValues);
183 }
184
185 /**
186 * @see org.kuali.rice.kns.lookup.KualiLookupableHelperServiceImpl#getSearchResultsUnbounded(java.util.Map)
187 */
188 @Override
189 public List<? extends BusinessObject> getSearchResultsUnbounded(
190 Map<String, String> fieldValues) {
191 return getMemberSearchResults(fieldValues);
192 }
193
194 protected List<? extends BusinessObject> getMemberSearchResults(Map<String, String> fieldValues){
195 String delegateStr = fieldValues.get(DELEGATE);
196 String documentTypeName = fieldValues.get(DOCUMENT_TYPE_NAME);
197 List<Class> classesToSearch = new ArrayList<Class>();
198 List<DelegateMemberCompleteInfo> searchResultsDelegationMembers = new ArrayList<DelegateMemberCompleteInfo>();
199 List<RoleMemberCompleteInfo> searchResultsRoleMembers = new ArrayList<RoleMemberCompleteInfo>();
200 Map<String, String> searchCriteriaRoleMembers;
201 Map<String, String> searchCriteriaDelegations;
202 if(StringUtils.isEmpty(delegateStr)){
203 //Search for both, role members and delegations
204 searchCriteriaRoleMembers = buildOrgReviewRoleSearchCriteria(documentTypeName, fieldValues);
205 searchCriteriaDelegations = buildOrgReviewRoleSearchCriteriaForDelegations(documentTypeName, fieldValues);
206 if(searchCriteriaRoleMembers == null && searchCriteriaDelegations==null){
207 return new ArrayList<BusinessObject>();
208 } else if(searchCriteriaRoleMembers!=null && searchCriteriaDelegations!=null){
209 searchResultsRoleMembers.addAll((Collection)searchRoleMembers(searchCriteriaRoleMembers));
210 searchResultsDelegationMembers.addAll((Collection)searchDelegations(searchCriteriaDelegations));
211 } else if(searchCriteriaRoleMembers!=null){
212 searchResultsRoleMembers.addAll((Collection)searchRoleMembers(searchCriteriaRoleMembers));
213 } else if(searchCriteriaDelegations!=null){
214 searchResultsDelegationMembers.addAll((Collection)searchDelegations(searchCriteriaDelegations));
215 }
216 } else{
217 boolean delegate = RiceUtilities.getBooleanValueForString(delegateStr, false);
218 if(delegate){
219 searchCriteriaDelegations = buildOrgReviewRoleSearchCriteriaForDelegations(documentTypeName, fieldValues);
220 searchResultsDelegationMembers.addAll((Collection)searchDelegations(searchCriteriaDelegations));
221 } else{
222 searchCriteriaRoleMembers = buildOrgReviewRoleSearchCriteria(documentTypeName, fieldValues);
223 searchResultsRoleMembers.addAll((Collection)searchRoleMembers(searchCriteriaRoleMembers));
224 }
225 }
226 List<OrgReviewRole> flattenedSearchResults = new ArrayList<OrgReviewRole>();
227 flattenedSearchResults.addAll(flattenToOrgReviewMembers(fieldValues.get(ACTIVE), documentTypeName, searchResultsRoleMembers));
228 flattenedSearchResults.addAll(flattenToOrgReviewDelegationMembers(fieldValues.get(ACTIVE), documentTypeName, searchResultsDelegationMembers));
229 filterOrgReview(fieldValues, flattenedSearchResults);
230
231 return flattenedSearchResults;
232 }
233
234 protected void filterOrgReview(Map<String, String> fieldValues, List<OrgReviewRole> searchResults){
235
236 String principalName = fieldValues.get(MEMBER_PRINCIPAL_NAME);
237 List<Person> principals = null;
238 if(StringUtils.isNotEmpty(principalName)){
239 Map<String, Object> criteria = new HashMap<String, Object>();
240 criteria.put(KimConstants.UniqueKeyConstants.PRINCIPAL_NAME, WILDCARD+principalName+WILDCARD);
241 principals = (List<Person>)getPersons(criteria);
242 }
243 String assignedToGroupNamespaceCode = fieldValues.get(MEMBER_GROUP_NAMESPACE_CODE);
244 String assignedToGroupName = fieldValues.get(MEMBER_GROUP_NAME);
245 List<Group> groups = null;
246 if(StringUtils.isNotEmpty(assignedToGroupNamespaceCode) && StringUtils.isEmpty(assignedToGroupName) ||
247 StringUtils.isEmpty(assignedToGroupNamespaceCode) && StringUtils.isNotEmpty(assignedToGroupName) ||
248 StringUtils.isNotEmpty(assignedToGroupNamespaceCode) && StringUtils.isNotEmpty(assignedToGroupName)){
249 Map<String, Object> searchCriteria = new HashMap<String, Object>();
250 searchCriteria.put(KimConstants.UniqueKeyConstants.NAMESPACE_CODE, getQueryString(assignedToGroupNamespaceCode));
251 searchCriteria.put(KimConstants.UniqueKeyConstants.GROUP_NAME, getQueryString(assignedToGroupName));
252 groups = getGroups(searchCriteria);
253 }
254
255 String assignedToRoleNamespaceCode = fieldValues.get(MEMBER_ROLE_NAMESPACE);
256 String assignedToRoleName = fieldValues.get(MEMBER_ROLE_NAME);
257
258 List<Role> roles = null;
259 if(StringUtils.isNotEmpty(assignedToRoleNamespaceCode) && StringUtils.isEmpty(assignedToRoleName) ||
260 StringUtils.isEmpty(assignedToRoleNamespaceCode) && StringUtils.isNotEmpty(assignedToRoleName) ||
261 StringUtils.isNotEmpty(assignedToRoleNamespaceCode) && StringUtils.isNotEmpty(assignedToRoleName)){
262 Map<String, Object> searchCriteria = new HashMap<String, Object>();
263 searchCriteria.put(KimConstants.UniqueKeyConstants.NAMESPACE_CODE, getQueryString(assignedToRoleNamespaceCode));
264 searchCriteria.put(KimConstants.UniqueKeyConstants.ROLE_NAME, getQueryString(assignedToRoleName));
265 roles = getRoles(searchCriteria);
266 }
267
268 String financialSystemDocumentTypeCode = fieldValues.get(DOCUMENT_TYPE_NAME);
269 String chartOfAccountsCode = fieldValues.get(MEMBER_ATTRIBUTE_CHART_OF_ACCOUNTS_CODE);
270 String organizationCode = fieldValues.get(MEMBER_ATTRIBUTE_ORGANIZATION_CODE);
271
272 //Loop through org review roles and remove rows where necessary
273 Iterator<OrgReviewRole> it = searchResults.iterator();
274 OrgReviewRole orgReviewRole = null;
275 boolean remove = false;
276
277 while(it.hasNext()){
278
279 orgReviewRole = it.next();
280 remove = false;
281
282 //check member attribute parameters
283 if(StringUtils.isNotBlank(organizationCode)){
284 //filter by chart/document type if they exist
285 if(StringUtils.isNotBlank(chartOfAccountsCode)){
286 if(!chartOfAccountsCode.equals(orgReviewRole.getChartOfAccountsCode())){
287 remove = true;
288 }
289 }
290
291 if(StringUtils.isNotBlank(financialSystemDocumentTypeCode)){
292 if(!financialSystemDocumentTypeCode.equals(orgReviewRole.getFinancialSystemDocumentTypeCode())){
293 remove = true;
294 }
295 }
296 }else if(StringUtils.isNotBlank(chartOfAccountsCode)){
297 //filter by document type if it exists
298 if(StringUtils.isNotBlank(financialSystemDocumentTypeCode)){
299 if(!financialSystemDocumentTypeCode.equals(orgReviewRole.getFinancialSystemDocumentTypeCode())){
300 remove = true;
301 }
302 }
303 }
304
305 List<String> items = new ArrayList<String>();
306
307 //check member id parameters, and only if it hasn't already been marked for removal.
308 if(remove == false){
309 if(roles!=null){
310 if(groups!=null){
311 for(Group group: groups){
312 items.add(group.getGroupId());
313 }
314 if(!items.contains(orgReviewRole.getGroupMemberGroupId())){
315 remove = true;
316 }
317 }
318 if(principals!=null){
319 for(Person principal: principals){
320 items.add(principal.getPrincipalId());
321 }
322 if(!items.contains(orgReviewRole.getPrincipalMemberPrincipalId())){
323 remove = true;
324 }
325 }
326
327 }else if(groups!=null){
328 if(principals!=null){
329 for(Person principal: principals){
330 items.add(principal.getPrincipalId());
331 }
332 if(!items.contains(orgReviewRole.getPrincipalMemberPrincipalId())){
333 remove = true;
334 }
335 }
336 }
337 }
338
339 //remove if necessary
340 if(remove){
341 it.remove();
342 }
343 }
344 }
345
346 protected Map<String, String> addRoleToConsiderSearchCriteria(String documentTypeName, Map<String, String> searchCriteria){
347 List<String> roleNamesToSearchInto = getRolesToConsider(documentTypeName);
348 if(searchCriteria==null)
349 searchCriteria = new HashMap<String, String>();
350 if(roleNamesToSearchInto!=null){
351 StringBuffer rolesQueryString = new StringBuffer();
352 for(String roleName: roleNamesToSearchInto){
353 rolesQueryString.append(
354 getRoleManagementService().getRoleIdByName(KFSConstants.SysKimConstants.ORGANIZATION_REVIEWER_ROLE_NAMESPACECODE, roleName)+
355 KimConstants.KimUIConstants.OR_OPERATOR);
356 }
357 if(rolesQueryString.toString().endsWith(KimConstants.KimUIConstants.OR_OPERATOR))
358 rolesQueryString.delete(rolesQueryString.length()-KimConstants.KimUIConstants.OR_OPERATOR.length(), rolesQueryString.length());
359 searchCriteria.put(KimConstants.PrimaryKeyConstants.ROLE_ID, rolesQueryString.toString());
360 }
361 return searchCriteria;
362 }
363
364 protected List<RoleMemberCompleteInfo> searchRoleMembers(Map<String, String> searchCriteriaRoleMembers){
365 List<RoleMemberCompleteInfo> members = new ArrayList<RoleMemberCompleteInfo>();
366 members.addAll(getRoleManagementService().findRoleMembersCompleteInfo(searchCriteriaRoleMembers));
367 return members;
368 }
369
370 protected List<DelegateMemberCompleteInfo> searchDelegations(Map<String, String> searchCriteriaDelegateMembers){
371 List<DelegateMemberCompleteInfo> members = new ArrayList<DelegateMemberCompleteInfo>();
372 members.addAll(getRoleManagementService().findDelegateMembersCompleteInfo(searchCriteriaDelegateMembers));
373 return members;
374 }
375
376 public boolean hasOrganizationHierarchy(final String documentTypeName) {
377 if(StringUtils.isEmpty(documentTypeName)) return false;
378 try {
379 return (new WorkflowInfo()).hasRouteNode(documentTypeName, KFSConstants.RouteLevelNames.ORGANIZATION_HIERARCHY);
380 } catch(WorkflowException wex){
381 throw new RuntimeException("Workflow Exception occurred: "+wex);
382 }
383 }
384
385 public boolean hasAccountingOrganizationHierarchy(final String documentTypeName) {
386 if(StringUtils.isEmpty(documentTypeName)) return false;
387 try{
388 return (new WorkflowInfo()).hasRouteNode(documentTypeName, KFSConstants.RouteLevelNames.ACCOUNTING_ORGANIZATION_HIERARCHY);
389 } catch(WorkflowException wex){
390 throw new RuntimeException("Workflow Exception occurred: "+wex);
391 }
392 }
393
394 public String getClosestOrgReviewRoleParentDocumentTypeName(final String documentTypeName){
395 if(StringUtils.isEmpty(documentTypeName)) return null;
396 Set<String> potentialParentDocumentTypeNames = new HashSet<String>();
397 potentialParentDocumentTypeNames.add(KFSConstants.FINANCIAL_SYSTEM_TRANSACTIONAL_DOCUMENT);
398 potentialParentDocumentTypeNames.add(KFSConstants.FINANCIAL_SYSTEM_COMPLEX_MAINTENANCE_DOCUMENT);
399 potentialParentDocumentTypeNames.add(KFSConstants.FINANCIAL_SYSTEM_SIMPLE_MAINTENANCE_DOCUMENT);
400 return KimCommonUtils.getClosestParentDocumentTypeName(getDocumentTypeService().findByName(documentTypeName), potentialParentDocumentTypeNames);
401 }
402
403 public List<String> getRolesToConsider(String documentTypeName) {
404 return getRolesToConsider(documentTypeName,
405 hasOrganizationHierarchy(documentTypeName),
406 hasAccountingOrganizationHierarchy(documentTypeName),
407 getClosestOrgReviewRoleParentDocumentTypeName(documentTypeName));
408 }
409
410 /**
411 * 1. Check WorkflowInfo.hasNode(documentTypeName, nodeName) to see if the document type selected has
412 * OrganizationHierarchy and/or AccountingOrganizationHierarchy - if it has either or both,
413 * set the Review Types radio group appropriately and make it read only.
414 * 2. Else, if KFS is the document type selected, set the Review Types radio group to both and leave it editable.
415 * 3. Else, if FinancialSystemTransactionalDocument is the closest parent (per KimCommonUtils.getClosestParent),
416 * set the Review Types radio group to Organization Accounting Only and leave it editable.
417 * 4. Else, if FinancialSystemComplexMaintenanceDocument is the closest parent (per KimCommonUtils.getClosestParent),
418 * set the Review Types radio group to Organization Only and make read-only.
419 * 5. Else, if FinancialSystemSimpleMaintenanceDocument is the closest parent (per KimCommonUtils.getClosestParent),
420 * this makes no sense and should generate an error.
421 * @param documentTypeName
422 * @param hasOrganizationHierarchy
423 * @param hasAccountingOrganizationHierarchy
424 * @param closestParentDocumentTypeName
425 * @return
426 */
427 public List<String> getRolesToConsider(String documentTypeName, boolean hasOrganizationHierarchy, boolean hasAccountingOrganizationHierarchy, String closestParentDocumentTypeName){
428 if(StringUtils.isEmpty(documentTypeName)){
429 List<String> roleToConsider = new ArrayList<String>();
430 roleToConsider.add(KFSConstants.SysKimConstants.ORGANIZATION_REVIEWER_ROLE_NAME);
431 roleToConsider.add(KFSConstants.SysKimConstants.ACCOUNTING_REVIEWER_ROLE_NAME);
432 return roleToConsider;
433 }
434
435 List<String> roleToConsider = new ArrayList<String>();
436 if(documentTypeName.equals(KFSConstants.FINANCIAL_SYSTEM_TRANSACTIONAL_DOCUMENT) || KFSConstants.FINANCIAL_SYSTEM_TRANSACTIONAL_DOCUMENT.equals(closestParentDocumentTypeName))
437 roleToConsider.add(KFSConstants.SysKimConstants.ACCOUNTING_REVIEWER_ROLE_NAME);
438 else if(hasOrganizationHierarchy || hasAccountingOrganizationHierarchy){
439 if(hasOrganizationHierarchy) roleToConsider.add(KFSConstants.SysKimConstants.ORGANIZATION_REVIEWER_ROLE_NAME);
440 if(hasAccountingOrganizationHierarchy) roleToConsider.add(KFSConstants.SysKimConstants.ACCOUNTING_REVIEWER_ROLE_NAME);
441 //readonly
442 } else if(KFSConstants.ROOT_DOCUMENT_TYPE.equals(documentTypeName)){
443 roleToConsider.add(KFSConstants.SysKimConstants.ORGANIZATION_REVIEWER_ROLE_NAME);
444 roleToConsider.add(KFSConstants.SysKimConstants.ACCOUNTING_REVIEWER_ROLE_NAME);
445 } else{
446 if(documentTypeName.equals(KFSConstants.FINANCIAL_SYSTEM_COMPLEX_MAINTENANCE_DOCUMENT) || KFSConstants.FINANCIAL_SYSTEM_COMPLEX_MAINTENANCE_DOCUMENT.equals(closestParentDocumentTypeName))
447 roleToConsider.add(KFSConstants.SysKimConstants.ORGANIZATION_REVIEWER_ROLE_NAME);
448 else if(currentDocTypeAndChildrenHaveZeroOrgAndAccountReviewRoles(documentTypeName)){
449 throw new ValidationException("Invalid document type chosen for Organization Review: " + documentTypeName);
450 }
451 }
452
453 return roleToConsider;
454 }
455
456 public boolean isValidDocumentTypeForOrgReview(String documentTypeName){
457
458 boolean isValid = true;
459
460 if(StringUtils.isEmpty(documentTypeName)){
461 return false;
462 }
463
464 String closestParentDocumentTypeName = getClosestOrgReviewRoleParentDocumentTypeName(documentTypeName);
465 boolean hasOrganizationHierarchy = hasOrganizationHierarchy(documentTypeName);
466 boolean hasAccountingOrganizationHierarchy = hasAccountingOrganizationHierarchy(documentTypeName);
467
468 if(documentTypeName.equals(KFSConstants.FINANCIAL_SYSTEM_TRANSACTIONAL_DOCUMENT) || KFSConstants.FINANCIAL_SYSTEM_TRANSACTIONAL_DOCUMENT.equals(closestParentDocumentTypeName)){
469 //valid
470 }else if(hasOrganizationHierarchy || hasAccountingOrganizationHierarchy){
471 //valid
472 } else if(KFSConstants.ROOT_DOCUMENT_TYPE.equals(documentTypeName)){
473 //valid
474 } else{
475 if(documentTypeName.equals(KFSConstants.FINANCIAL_SYSTEM_COMPLEX_MAINTENANCE_DOCUMENT) || KFSConstants.FINANCIAL_SYSTEM_COMPLEX_MAINTENANCE_DOCUMENT.equals(closestParentDocumentTypeName)){
476 //valid
477 }else if(currentDocTypeAndChildrenHaveZeroOrgAndAccountReviewRoles(documentTypeName)){
478 isValid = false;
479 }
480 }
481
482 return isValid;
483 }
484
485 public boolean currentDocTypeAndChildrenHaveZeroOrgAndAccountReviewRoles(String currentDocumentTypeName){
486 boolean hasZeroQualifyingNodes = true;
487 Object hasZeroNodesCache = null;
488
489 //check cache
490 hasZeroNodesCache = getCacheAdministrator().getFromCache(ORG_ACCT_REVIEW_ROLE_DOC_TYPE_CACHE_PREFIX + currentDocumentTypeName);
491 if( ObjectUtils.isNotNull(hasZeroNodesCache)){
492 return ((Boolean)hasZeroNodesCache).booleanValue();
493 }
494
495 //check current doc type for qualifying nodes
496 if(hasOrganizationHierarchy(currentDocumentTypeName) || hasAccountingOrganizationHierarchy(currentDocumentTypeName) ){
497 hasZeroQualifyingNodes = false;
498 }
499
500 //if still has no qualifying nodes, check current nodes children
501 if(hasZeroQualifyingNodes){
502 DocumentTypeDTO currentDocType = SpringContext.getBean(DocumentTypeService.class).getDocumentTypeVO(currentDocumentTypeName);
503 List<DocumentType> docTypes = SpringContext.getBean(DocumentTypeService.class).getChildDocumentTypes(currentDocType.getDocTypeId());
504
505 for(DocumentType docType : docTypes){
506 hasZeroQualifyingNodes &= currentDocTypeAndChildrenHaveZeroOrgAndAccountReviewRoles(docType.getName());
507 if(hasZeroQualifyingNodes == false) break;
508 }
509 }
510
511 //add to cache if there are qualifying nodes
512 if(hasZeroQualifyingNodes == false){
513 getCacheAdministrator().putInCache(ORG_ACCT_REVIEW_ROLE_DOC_TYPE_CACHE_PREFIX + currentDocumentTypeName, new Boolean(hasZeroQualifyingNodes), ORG_ACCT_REVIEW_ROLE_DOC_TYPE_CACHE_GROUP);
514 }
515
516 return hasZeroQualifyingNodes;
517 }
518
519 protected List<OrgReviewRole> flattenToOrgReviewMembers(String active, String documentTypeName, List<RoleMemberCompleteInfo> members){
520 List<OrgReviewRole> orgReviewRoles = new ArrayList<OrgReviewRole>();
521 if(members==null || members.size()<1) return orgReviewRoles;
522
523 OrgReviewRole orgReviewRole;
524 String memberType;
525 KimRoleInfo roleInfo;
526 KimTypeInfo kimTypeInfo;
527 Boolean activeInd = null;
528 if(StringUtils.isNotEmpty(active)){
529 activeInd = new Boolean(RiceUtilities.getBooleanValueForString(active, true));
530 }
531 for(RoleMemberCompleteInfo member: members){
532 if(activeInd==null || (activeInd.booleanValue()==true && member.isActive()) || (activeInd.booleanValue()==false && !member.isActive())){
533 orgReviewRole = new OrgReviewRole();
534 OrgReviewRoleMaintainableImpl orgReviewRoleMaintainableImpl = new OrgReviewRoleMaintainableImpl();
535 orgReviewRole.setMemberId(member.getMemberId());
536 orgReviewRole.setMemberTypeCode(member.getMemberTypeCode());
537 orgReviewRole.setActiveFromDate(member.getActiveFromDate());
538 orgReviewRole.setActiveToDate(member.getActiveToDate());
539 orgReviewRole.setActive(member.isActive());
540 orgReviewRole.setFinancialSystemDocumentTypeCode(documentTypeName);
541 orgReviewRole.setMemberName(member.getMemberName());
542 orgReviewRole.setMemberNamespaceCode(member.getMemberNamespaceCode());
543
544 roleInfo = getRoleManagementService().getRole(member.getRoleId());
545 kimTypeInfo = getTypeInfoService().getKimType(roleInfo.getKimTypeId());
546 orgReviewRole.setAttributes(orgReviewRole.getAttributeSetAsQualifierList(kimTypeInfo, member.getQualifier()));
547
548 orgReviewRole.setRoleRspActions(orgReviewRoleMaintainableImpl.getRoleRspActions(member.getRoleMemberId()));
549 orgReviewRole.setRoleMemberId(member.getRoleMemberId());
550 orgReviewRole.setRoleId(member.getRoleId());
551 orgReviewRole.setNamespaceCode(roleInfo.getNamespaceCode());
552 orgReviewRole.setRoleName(roleInfo.getRoleName());
553 orgReviewRole.setDelegate(false);
554
555 orgReviewRole.setChartOfAccountsCode(orgReviewRole.getAttributeValue(KfsKimAttributes.CHART_OF_ACCOUNTS_CODE));
556 orgReviewRole.setOrganizationCode(orgReviewRole.getAttributeValue(KfsKimAttributes.ORGANIZATION_CODE));
557 orgReviewRole.setOverrideCode(orgReviewRole.getAttributeValue(KfsKimAttributes.ACCOUNTING_LINE_OVERRIDE_CODE));
558 orgReviewRole.setFromAmount(orgReviewRole.getAttributeValue(KfsKimAttributes.FROM_AMOUNT));
559 orgReviewRole.setToAmount(orgReviewRole.getAttributeValue(KfsKimAttributes.TO_AMOUNT));
560 orgReviewRole.setFinancialSystemDocumentTypeCode(orgReviewRole.getAttributeValue(KfsKimAttributes.DOCUMENT_TYPE_NAME));
561
562 orgReviewRoles.add(orgReviewRole);
563 }
564 }
565 return orgReviewRoles;
566 }
567
568 protected List<OrgReviewRole> flattenToOrgReviewDelegationMembers(String active, String documentTypeName, List<DelegateMemberCompleteInfo> delegationMembers){
569 List<OrgReviewRole> orgReviewRoles = new ArrayList<OrgReviewRole>();
570 if(delegationMembers==null || delegationMembers.size()<1) return orgReviewRoles;
571
572 OrgReviewRole orgReviewRole;
573 String memberType;
574 KimRoleInfo roleInfo;
575 Boolean activeInd = null;
576 if(StringUtils.isNotEmpty(active)){
577 activeInd = new Boolean(RiceUtilities.getBooleanValueForString(active, true));
578 }
579 KimTypeInfo kimTypeInfo;
580 for(DelegateMemberCompleteInfo member: delegationMembers){
581 if(activeInd==null || (activeInd.booleanValue()==true && member.isActive()) || (activeInd.booleanValue()==false && !member.isActive())){
582 orgReviewRole = new OrgReviewRole();
583 OrgReviewRoleMaintainableImpl orgReviewRoleMaintainableImpl = new OrgReviewRoleMaintainableImpl();
584 orgReviewRole.setMemberId(member.getMemberId());
585 orgReviewRole.setMemberTypeCode(member.getMemberTypeCode());
586 orgReviewRole.setActiveFromDate(member.getActiveFromDate());
587 orgReviewRole.setActiveToDate(member.getActiveToDate());
588 orgReviewRole.setActive(member.isActive());
589 orgReviewRole.setFinancialSystemDocumentTypeCode(documentTypeName);
590 orgReviewRole.setMemberName(member.getMemberName());
591 orgReviewRole.setMemberNamespaceCode(member.getMemberNamespaceCode());
592
593 roleInfo = getRoleManagementService().getRole(member.getRoleId());
594 kimTypeInfo = getTypeInfoService().getKimType(roleInfo.getKimTypeId());
595 orgReviewRole.setAttributes(orgReviewRole.getAttributeSetAsQualifierList(kimTypeInfo, member.getQualifier()));
596
597 orgReviewRole.setDelegationMemberId(member.getDelegationMemberId());
598 orgReviewRole.setRoleMemberId(member.getRoleMemberId());
599 orgReviewRole.setRoleId(member.getRoleId());
600 roleInfo = getRoleManagementService().getRole(member.getRoleId());
601 orgReviewRole.setNamespaceCode(roleInfo.getNamespaceCode());
602 orgReviewRole.setRoleName(roleInfo.getRoleName());
603 orgReviewRole.setDelegationTypeCode(member.getDelegationTypeCode());
604 orgReviewRole.setDelegate(true);
605
606 orgReviewRole.setChartOfAccountsCode(orgReviewRole.getAttributeValue(KfsKimAttributes.CHART_OF_ACCOUNTS_CODE));
607 orgReviewRole.setOrganizationCode(orgReviewRole.getAttributeValue(KfsKimAttributes.ORGANIZATION_CODE));
608 orgReviewRole.setOverrideCode(orgReviewRole.getAttributeValue(KfsKimAttributes.ACCOUNTING_LINE_OVERRIDE_CODE));
609 orgReviewRole.setFromAmount(orgReviewRole.getAttributeValue(KfsKimAttributes.FROM_AMOUNT));
610 orgReviewRole.setToAmount(orgReviewRole.getAttributeValue(KfsKimAttributes.TO_AMOUNT));
611 orgReviewRole.setFinancialSystemDocumentTypeCode(orgReviewRole.getAttributeValue(KfsKimAttributes.DOCUMENT_TYPE_NAME));
612
613 orgReviewRoles.add(orgReviewRole);
614 }
615 }
616 return orgReviewRoles;
617 }
618
619 protected KimDelegationImpl getDelegation(KimDelegationMemberImpl delegationMember){
620 Map<String, String> criteria = new HashMap<String, String>();
621 KimDelegationImpl delegation;
622 criteria.put(KimConstants.PrimaryKeyConstants.DELEGATION_ID, delegationMember.getDelegationId());
623 return (KimDelegationImpl)KNSServiceLocator.getBusinessObjectService().findByPrimaryKey(KimDelegationImpl.class, criteria);
624 }
625
626 protected String getQueryString(String parameter){
627 if(StringUtils.isEmpty(parameter))
628 return WILDCARD;
629 else
630 return WILDCARD+parameter+WILDCARD;
631 }
632
633 public Person getPerson(Map<String, Object> fieldValues) {
634 return (Person) SpringContext.getBean(KualiModuleService.class).getResponsibleModuleService(
635 Person.class).getExternalizableBusinessObject(Person.class, fieldValues);
636 }
637
638 public List<Person> getPersons(Map<String, Object> fieldValues) {
639 return (List<Person>) SpringContext.getBean(KualiModuleService.class).getResponsibleModuleService(
640 Person.class).getExternalizableBusinessObjectsList(Person.class, fieldValues);
641 }
642
643 public Role getRole(Map<String, Object> fieldValues) {
644 return (Role) SpringContext.getBean(KualiModuleService.class).getResponsibleModuleService(
645 Role.class).getExternalizableBusinessObject(Role.class, fieldValues);
646 }
647
648 public List<Role> getRoles(Map<String, Object> fieldValues) {
649 return (List<Role>) SpringContext.getBean(KualiModuleService.class).getResponsibleModuleService(
650 Role.class).getExternalizableBusinessObjectsList(Role.class, fieldValues);
651 }
652
653 public Group getGroup(Map<String, Object> fieldValues) {
654 return (Group) SpringContext.getBean(KualiModuleService.class).getResponsibleModuleService(
655 Group.class).getExternalizableBusinessObject(Group.class, fieldValues);
656 }
657
658 public List<Group> getGroups(Map<String, Object> fieldValues) {
659 return (List<Group>) SpringContext.getBean(KualiModuleService.class).getResponsibleModuleService(
660 Group.class).getExternalizableBusinessObjectsList(Group.class, fieldValues);
661 }
662
663 protected Map<String, String> buildOrgReviewRoleSearchCriteria(String documentTypeName, Map<String, String> fieldValues){
664 String principalName = fieldValues.get(MEMBER_PRINCIPAL_NAME);
665 List<Person> principals = null;
666 if(StringUtils.isNotEmpty(principalName)){
667 Map<String, Object> criteria = new HashMap<String, Object>();
668 criteria.put(KimConstants.UniqueKeyConstants.PRINCIPAL_NAME, WILDCARD+principalName+WILDCARD);
669 principals = (List<Person>)getPersons(criteria);
670 if(principals==null || principals.isEmpty())
671 return null;
672 }
673 String assignedToGroupNamespaceCode = fieldValues.get(MEMBER_GROUP_NAMESPACE_CODE);
674 String assignedToGroupName = fieldValues.get(MEMBER_GROUP_NAME);
675 List<Group> groups = null;
676 if(StringUtils.isNotEmpty(assignedToGroupNamespaceCode) && StringUtils.isEmpty(assignedToGroupName) ||
677 StringUtils.isEmpty(assignedToGroupNamespaceCode) && StringUtils.isNotEmpty(assignedToGroupName) ||
678 StringUtils.isNotEmpty(assignedToGroupNamespaceCode) && StringUtils.isNotEmpty(assignedToGroupName)){
679 Map<String, Object> searchCriteria = new HashMap<String, Object>();
680 searchCriteria.put(KimConstants.UniqueKeyConstants.NAMESPACE_CODE, getQueryString(assignedToGroupNamespaceCode));
681 searchCriteria.put(KimConstants.UniqueKeyConstants.GROUP_NAME, getQueryString(assignedToGroupName));
682 groups = getGroups(searchCriteria);
683 if(groups==null || groups.size()==0)
684 return null;
685 }
686
687 String assignedToRoleNamespaceCode = fieldValues.get(MEMBER_ROLE_NAMESPACE);
688 String assignedToRoleName = fieldValues.get(MEMBER_ROLE_NAME);
689
690 List<Role> roles = null;
691 if(StringUtils.isNotEmpty(assignedToRoleNamespaceCode) && StringUtils.isEmpty(assignedToRoleName) ||
692 StringUtils.isEmpty(assignedToRoleNamespaceCode) && StringUtils.isNotEmpty(assignedToRoleName) ||
693 StringUtils.isNotEmpty(assignedToRoleNamespaceCode) && StringUtils.isNotEmpty(assignedToRoleName)){
694 Map<String, Object> searchCriteria = new HashMap<String, Object>();
695 searchCriteria.put(KimConstants.UniqueKeyConstants.NAMESPACE_CODE, getQueryString(assignedToRoleNamespaceCode));
696 searchCriteria.put(KimConstants.UniqueKeyConstants.ROLE_NAME, getQueryString(assignedToRoleName));
697 roles = getRoles(searchCriteria);
698 if(roles==null || roles.size()==0)
699 return null;
700 }
701
702 Map<String, String> searchCriteriaMain = new HashMap<String, String>();
703
704 String financialSystemDocumentTypeCode = fieldValues.get(DOCUMENT_TYPE_NAME);
705 if(StringUtils.isNotBlank(financialSystemDocumentTypeCode)){
706 searchCriteriaMain.put(MEMBER_ATTRIBUTE_NAME_KEY, SEARCH_CRITERIA_DOCUMENT_TYPE_NAME);
707 searchCriteriaMain.put(MEMBER_ATTRIBUTE_VALUE_KEY, financialSystemDocumentTypeCode);
708 }
709 String chartOfAccountsCode = fieldValues.get(MEMBER_ATTRIBUTE_CHART_OF_ACCOUNTS_CODE);
710 if(StringUtils.isNotBlank(chartOfAccountsCode)){
711 searchCriteriaMain.put(MEMBER_ATTRIBUTE_NAME_KEY, KfsKimAttributes.CHART_OF_ACCOUNTS_CODE);
712 searchCriteriaMain.put(MEMBER_ATTRIBUTE_VALUE_KEY, chartOfAccountsCode);
713 }
714 String organizationCode = fieldValues.get(MEMBER_ATTRIBUTE_ORGANIZATION_CODE);
715 if(StringUtils.isNotBlank(organizationCode)){
716 searchCriteriaMain.put(MEMBER_ATTRIBUTE_NAME_KEY, KfsKimAttributes.ORGANIZATION_CODE);
717 searchCriteriaMain.put(MEMBER_ATTRIBUTE_VALUE_KEY, organizationCode);
718 }
719 StringBuffer memberQueryString = null;
720 if(principals!=null){
721 memberQueryString = new StringBuffer();
722 for(Person principal: principals){
723 memberQueryString.append(principal.getPrincipalId()+KimConstants.KimUIConstants.OR_OPERATOR);
724 }
725 if(memberQueryString.toString().endsWith(KimConstants.KimUIConstants.OR_OPERATOR))
726 memberQueryString.delete(memberQueryString.length()-KimConstants.KimUIConstants.OR_OPERATOR.length(), memberQueryString.length());
727 searchCriteriaMain.put(MEMBER_ID, memberQueryString.toString());
728 }
729 if(groups!=null){
730 if(memberQueryString==null)
731 memberQueryString = new StringBuffer();
732 else if(StringUtils.isNotEmpty(memberQueryString.toString()))
733 memberQueryString.append(KimConstants.KimUIConstants.OR_OPERATOR);
734 for(Group group: groups){
735 memberQueryString.append(group.getGroupId()+KimConstants.KimUIConstants.OR_OPERATOR);
736 }
737 if(memberQueryString.toString().endsWith(KimConstants.KimUIConstants.OR_OPERATOR))
738 memberQueryString.delete(memberQueryString.length()-KimConstants.KimUIConstants.OR_OPERATOR.length(), memberQueryString.length());
739 searchCriteriaMain.put(MEMBER_ID, memberQueryString.toString());
740 }
741 if(roles!=null){
742 if(memberQueryString==null)
743 memberQueryString = new StringBuffer();
744 else if(StringUtils.isNotEmpty(memberQueryString.toString()))
745 memberQueryString.append(KimConstants.KimUIConstants.OR_OPERATOR);
746 for(Role role: roles){
747 memberQueryString.append(role.getRoleId()+KimConstants.KimUIConstants.OR_OPERATOR);
748 }
749 if(memberQueryString.toString().endsWith(KimConstants.KimUIConstants.OR_OPERATOR))
750 memberQueryString.delete(memberQueryString.length()-KimConstants.KimUIConstants.OR_OPERATOR.length(), memberQueryString.length());
751 searchCriteriaMain.put(MEMBER_ID, memberQueryString.toString());
752 }
753 return addRoleToConsiderSearchCriteria(documentTypeName, searchCriteriaMain);
754 }
755
756 protected Map<String, String> buildOrgReviewRoleSearchCriteriaForDelegations(String documentTypeName, Map<String, String> fieldValues){
757 String principalName = fieldValues.get(MEMBER_PRINCIPAL_NAME);
758 Map<String, Object> searchCriteriaTemp;
759 List<Person> principals = null;
760 if(StringUtils.isNotEmpty(principalName)){
761 searchCriteriaTemp = new HashMap<String, Object>();
762 searchCriteriaTemp.put(KimConstants.UniqueKeyConstants.PRINCIPAL_NAME, WILDCARD+principalName+WILDCARD);
763 principals = (List<Person>)getPersons(searchCriteriaTemp);
764 if(principals==null || principals.isEmpty())
765 return null;
766 }
767 String assignedToGroupNamespaceCode = fieldValues.get(MEMBER_GROUP_NAMESPACE_CODE);
768 String assignedToGroupName = fieldValues.get(MEMBER_GROUP_NAME);
769 List<Group> groups = null;
770 if(StringUtils.isNotEmpty(assignedToGroupNamespaceCode) && StringUtils.isEmpty(assignedToGroupName) ||
771 StringUtils.isEmpty(assignedToGroupNamespaceCode) && StringUtils.isNotEmpty(assignedToGroupName) ||
772 StringUtils.isNotEmpty(assignedToGroupNamespaceCode) && StringUtils.isNotEmpty(assignedToGroupName)){
773 Map<String, Object> searchCriteria = new HashMap<String, Object>();
774 searchCriteria.put(KimConstants.UniqueKeyConstants.NAMESPACE_CODE, getQueryString(assignedToGroupNamespaceCode));
775 searchCriteria.put(KimConstants.UniqueKeyConstants.GROUP_NAME, getQueryString(assignedToGroupName));
776 groups = getGroups(searchCriteria);
777
778 if(groups==null || groups.size()==0)
779 return null;
780 }
781
782 String assignedToRoleNamespaceCode = fieldValues.get(MEMBER_ROLE_NAMESPACE);
783 String assignedToRoleName = fieldValues.get(MEMBER_ROLE_NAME);
784
785 /*if(StringUtils.isNotEmpty(assignedToRoleNamespaceCode))
786 searchCriteria.put(MEMBER_ROLE_NAMESPACE, WILDCARD+assignedToRoleNamespaceCode+WILDCARD);
787 if(StringUtils.isNotEmpty(assignedToRoleName))
788 searchCriteria.put(MEMBER_ROLE_NAME, WILDCARD+assignedToRoleName+WILDCARD);*/
789 List<Role> roles = null;
790 if(StringUtils.isNotEmpty(assignedToRoleNamespaceCode) && StringUtils.isEmpty(assignedToRoleName) ||
791 StringUtils.isEmpty(assignedToRoleNamespaceCode) && StringUtils.isNotEmpty(assignedToRoleName) ||
792 StringUtils.isNotEmpty(assignedToRoleNamespaceCode) && StringUtils.isNotEmpty(assignedToRoleName)){
793 Map<String, Object> searchCriteria = new HashMap<String, Object>();
794 searchCriteria.put(KimConstants.UniqueKeyConstants.NAMESPACE_CODE, getQueryString(assignedToRoleNamespaceCode));
795 searchCriteria.put(KimConstants.UniqueKeyConstants.ROLE_NAME, getQueryString(assignedToRoleName));
796 roles = getRoles(searchCriteria);
797 if(roles==null || roles.size()==0)
798 return null;
799 }
800
801 final Map<String, String> searchCriteriaMain = new HashMap<String, String>();
802 String financialSystemDocumentTypeCode = fieldValues.get(DOCUMENT_TYPE_NAME);
803 if(StringUtils.isNotBlank(financialSystemDocumentTypeCode)){
804 searchCriteriaMain.put(DELEGATION_MEMBER_ATTRIBUTE_NAME_KEY, SEARCH_CRITERIA_DOCUMENT_TYPE_NAME);
805 searchCriteriaMain.put(DELEGATION_MEMBER_ATTRIBUTE_VALUE_KEY, financialSystemDocumentTypeCode);
806 }
807 String chartOfAccountsCode = fieldValues.get(MEMBER_ATTRIBUTE_CHART_OF_ACCOUNTS_CODE);
808 if(StringUtils.isNotBlank(chartOfAccountsCode)){
809 searchCriteriaMain.put(DELEGATION_MEMBER_ATTRIBUTE_NAME_KEY, KfsKimAttributes.CHART_OF_ACCOUNTS_CODE);
810 searchCriteriaMain.put(DELEGATION_MEMBER_ATTRIBUTE_VALUE_KEY, chartOfAccountsCode);
811 }
812 String organizationCode = fieldValues.get(MEMBER_ATTRIBUTE_ORGANIZATION_CODE);
813 if(StringUtils.isNotBlank(organizationCode)){
814 searchCriteriaMain.put(DELEGATION_MEMBER_ATTRIBUTE_NAME_KEY, KfsKimAttributes.ORGANIZATION_CODE);
815 searchCriteriaMain.put(DELEGATION_MEMBER_ATTRIBUTE_VALUE_KEY, organizationCode);
816 }
817 StringBuffer memberQueryString = null;
818 if(principals!=null){
819 memberQueryString = new StringBuffer();
820 for(Person principal: principals){
821 memberQueryString.append(principal.getPrincipalId()+KimConstants.KimUIConstants.OR_OPERATOR);
822 }
823 if(memberQueryString.toString().endsWith(KimConstants.KimUIConstants.OR_OPERATOR))
824 memberQueryString.delete(memberQueryString.length()-KimConstants.KimUIConstants.OR_OPERATOR.length(), memberQueryString.length());
825 searchCriteriaMain.put(DELEGATION_MEMBER_ID, memberQueryString.toString());
826 }
827 if(groups!=null){
828 if(memberQueryString==null)
829 memberQueryString = new StringBuffer();
830 else if(StringUtils.isNotEmpty(memberQueryString.toString()))
831 memberQueryString.append(KimConstants.KimUIConstants.OR_OPERATOR);
832 for(Group group: groups){
833 memberQueryString.append(group.getGroupId()+KimConstants.KimUIConstants.OR_OPERATOR);
834 }
835 if(memberQueryString.toString().endsWith(KimConstants.KimUIConstants.OR_OPERATOR))
836 memberQueryString.delete(memberQueryString.length()-KimConstants.KimUIConstants.OR_OPERATOR.length(), memberQueryString.length());
837 searchCriteriaMain.put(DELEGATION_MEMBER_ID, memberQueryString.toString());
838 }
839 if(roles!=null){
840 if(memberQueryString==null)
841 memberQueryString = new StringBuffer();
842 else if(StringUtils.isNotEmpty(memberQueryString.toString()))
843 memberQueryString.append(KimConstants.KimUIConstants.OR_OPERATOR);
844 for(Role role: roles){
845 memberQueryString.append(role.getRoleId()+KimConstants.KimUIConstants.OR_OPERATOR);
846 }
847 if(memberQueryString.toString().endsWith(KimConstants.KimUIConstants.OR_OPERATOR))
848 memberQueryString.delete(memberQueryString.length()-KimConstants.KimUIConstants.OR_OPERATOR.length(), memberQueryString.length());
849 searchCriteriaMain.put(DELEGATION_MEMBER_ID, memberQueryString.toString());
850 }
851 return addRoleToConsiderSearchCriteria(documentTypeName, searchCriteriaMain);
852 }
853
854 /**
855 * @return the roleService
856 */
857 public RoleManagementService getRoleManagementService() {
858 if(roleManagementService == null){
859 roleManagementService = KIMServiceLocator.getRoleManagementService();
860 }
861 return this.roleManagementService;
862 }
863
864 /**
865 * @param roleService the roleService to set
866 */
867 public void setRoleManagementService(RoleManagementService roleManagementService) {
868 this.roleManagementService = roleManagementService;
869 }
870
871 public DocumentTypeService getDocumentTypeService() {
872 if ( documentTypeService == null ) {
873 documentTypeService = KEWServiceLocator.getDocumentTypeService();
874 }
875 return this.documentTypeService;
876 }
877
878 public void validateDocumentType(String documentTypeName){
879 try{
880 getRolesToConsider(documentTypeName);
881 } catch(Exception ex){
882 throw new ValidationException(ex.getMessage());
883 }
884 }
885
886 @Override
887 public void validateSearchParameters(Map fieldValues) {
888 String documentTypeName = (String)fieldValues.get(DOCUMENT_TYPE_NAME);
889 /*if (StringUtils.isEmpty(documentTypeName)){
890 throw new ValidationException("Please select a document type name.");
891 }*/
892 validateDocumentType(documentTypeName);
893 super.validateSearchParameters(fieldValues);
894 }
895
896 /**
897 * Gets the groupService attribute.
898 * @return Returns the groupService.
899 */
900 public GroupService getGroupService() {
901 if(groupService==null){
902 groupService = KIMServiceLocator.getGroupService();
903 }
904 return groupService;
905 }
906
907 /**
908 * Sets the groupService attribute value.
909 * @param groupService The groupService to set.
910 */
911 public void setGroupService(GroupService groupService) {
912 this.groupService = groupService;
913 }
914
915 /**
916 * Gets the identityManagementService attribute.
917 * @return Returns the identityManagementService.
918 */
919 public IdentityManagementService getIdentityManagementService() {
920 if(identityManagementService==null){
921 identityManagementService = KIMServiceLocator.getIdentityManagementService();
922 }
923 return identityManagementService;
924 }
925
926 /**
927 * Sets the identityManagementService attribute value.
928 * @param identityManagementService The identityManagementService to set.
929 */
930 public void setIdentityManagementService(IdentityManagementService identityManagementService) {
931 this.identityManagementService = identityManagementService;
932 }
933
934 protected KimTypeInfoService getTypeInfoService(){
935 if(typeInfoService==null){
936 typeInfoService = KIMServiceLocator.getTypeInfoService();
937 }
938 return typeInfoService;
939 }
940 protected RiceCacheAdministrator getCacheAdministrator(){
941 if(cacheAdministrator==null){
942 cacheAdministrator = KEWServiceLocator.getCacheAdministrator();
943 }
944 return cacheAdministrator;
945 }
946 }