View Javadoc
1   /**
2    * Copyright 2005-2016 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.rice.kim.document;
17  
18  import org.apache.commons.collections.CollectionUtils;
19  import org.apache.commons.lang.StringUtils;
20  import org.eclipse.persistence.annotations.JoinFetch;
21  import org.eclipse.persistence.annotations.JoinFetchType;
22  import org.kuali.rice.core.api.membership.MemberType;
23  import org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange;
24  import org.kuali.rice.kim.api.KimConstants;
25  import org.kuali.rice.kim.api.identity.employment.EntityEmployment;
26  import org.kuali.rice.kim.api.role.Role;
27  import org.kuali.rice.kim.api.services.KimApiServiceLocator;
28  import org.kuali.rice.kim.api.type.KimType;
29  import org.kuali.rice.kim.bo.ui.KimDocumentRoleMember;
30  import org.kuali.rice.kim.bo.ui.KimDocumentRoleQualifier;
31  import org.kuali.rice.kim.bo.ui.KimDocumentRoleResponsibilityAction;
32  import org.kuali.rice.kim.bo.ui.PersonDocumentAddress;
33  import org.kuali.rice.kim.bo.ui.PersonDocumentAffiliation;
34  import org.kuali.rice.kim.bo.ui.PersonDocumentCitizenship;
35  import org.kuali.rice.kim.bo.ui.PersonDocumentEmail;
36  import org.kuali.rice.kim.bo.ui.PersonDocumentEmploymentInfo;
37  import org.kuali.rice.kim.bo.ui.PersonDocumentGroup;
38  import org.kuali.rice.kim.bo.ui.PersonDocumentName;
39  import org.kuali.rice.kim.bo.ui.PersonDocumentPhone;
40  import org.kuali.rice.kim.bo.ui.PersonDocumentPrivacy;
41  import org.kuali.rice.kim.bo.ui.PersonDocumentRole;
42  import org.kuali.rice.kim.bo.ui.RoleDocumentDelegation;
43  import org.kuali.rice.kim.bo.ui.RoleDocumentDelegationMember;
44  import org.kuali.rice.kim.bo.ui.RoleDocumentDelegationMemberQualifier;
45  import org.kuali.rice.kim.impl.role.RoleBo;
46  import org.kuali.rice.kim.impl.role.RoleMemberBo;
47  import org.kuali.rice.kim.impl.services.KimImplServiceLocator;
48  import org.kuali.rice.kim.impl.type.KimTypeAttributesHelper;
49  import org.kuali.rice.kim.service.KIMServiceLocatorInternal;
50  import org.kuali.rice.kim.service.UiDocumentService;
51  import org.kuali.rice.kns.service.DocumentHelperService;
52  import org.kuali.rice.kns.service.KNSServiceLocator;
53  import org.kuali.rice.krad.data.jpa.converters.BooleanYNConverter;
54  import org.kuali.rice.krad.data.jpa.converters.HashConverter;
55  import org.kuali.rice.krad.data.platform.MaxValueIncrementerFactory;
56  import org.kuali.rice.krad.rules.rule.event.DocumentEvent;
57  import org.kuali.rice.krad.util.GlobalVariables;
58  import org.springframework.jdbc.support.incrementer.DataFieldMaxValueIncrementer;
59  
60  import javax.persistence.AttributeOverride;
61  import javax.persistence.AttributeOverrides;
62  import javax.persistence.CascadeType;
63  import javax.persistence.Column;
64  import javax.persistence.Convert;
65  import javax.persistence.Entity;
66  import javax.persistence.JoinColumn;
67  import javax.persistence.OneToMany;
68  import javax.persistence.OneToOne;
69  import javax.persistence.PrimaryKeyJoinColumn;
70  import javax.persistence.Table;
71  import javax.persistence.Transient;
72  import java.util.ArrayList;
73  import java.util.HashMap;
74  import java.util.List;
75  import java.util.Map;
76  
77  /**
78   * This is a description of what this class does - shyu don't forget to fill
79   * this in.
80   *
81   * @author Kuali Rice Team (rice.collab@kuali.org)
82   *
83   */
84  @AttributeOverrides({ @AttributeOverride(name = "documentNumber", column = @Column(name = "FDOC_NBR")) })
85  @Entity
86  @Table(name = "KRIM_PERSON_DOCUMENT_T")
87  public class IdentityManagementPersonDocument extends IdentityManagementKimDocument {
88  
89      protected static final long serialVersionUID = -534993712085516925L;
90  
91      // principal data                       
92      @Column(name = "PRNCPL_ID")
93      protected String principalId;
94  
95      @Column(name = "PRNCPL_NM")
96      protected String principalName;
97  
98      @Column(name = "ENTITY_ID")
99      protected String entityId;
100 
101     //@Type(type="org.kuali.rice.krad.util.HibernateKualiHashType")                       
102     @Column(name = "PRNCPL_PSWD")
103     @Convert(converter = HashConverter.class)
104     protected String password;
105 
106     @Column(name = "UNIV_ID")
107     protected String univId = "";
108 
109     // affiliation data                       
110     @JoinFetch(value= JoinFetchType.OUTER)
111     @OneToMany(targetEntity = PersonDocumentAffiliation.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
112     @JoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR", insertable = false, updatable = false)
113     protected List<PersonDocumentAffiliation> affiliations;
114 
115     @Transient
116     protected String campusCode = "";
117 
118     // external identifier data                       
119     @Transient
120     protected Map<String, String> externalIdentifiers = null;
121 
122     @Column(name = "ACTV_IND")
123     @Convert(converter = BooleanYNConverter.class)
124     protected boolean active;
125 
126     // citizenship                       
127     @Transient
128     protected List<PersonDocumentCitizenship> citizenships;
129 
130     // protected List<DocEmploymentInfo> employmentInformations;                       
131     @JoinFetch(value= JoinFetchType.OUTER)
132     @OneToMany(targetEntity = PersonDocumentName.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
133     @JoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR", insertable = false, updatable = false)
134     protected List<PersonDocumentName> names;
135 
136     @JoinFetch(value= JoinFetchType.OUTER)
137     @OneToMany(targetEntity = PersonDocumentAddress.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
138     @JoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR", insertable = false, updatable = false)
139     protected List<PersonDocumentAddress> addrs;
140 
141     @JoinFetch(value= JoinFetchType.OUTER)
142     @OneToMany(targetEntity = PersonDocumentPhone.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
143     @JoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR", insertable = false, updatable = false)
144     protected List<PersonDocumentPhone> phones;
145 
146     @JoinFetch(value= JoinFetchType.OUTER)
147     @OneToMany(targetEntity = PersonDocumentEmail.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
148     @JoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR", insertable = false, updatable = false)
149     protected List<PersonDocumentEmail> emails;
150 
151     @JoinFetch(value= JoinFetchType.OUTER)
152     @OneToMany(targetEntity = PersonDocumentGroup.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
153     @JoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR", insertable = false, updatable = false)
154     protected List<PersonDocumentGroup> groups;
155 
156     @JoinFetch(value= JoinFetchType.OUTER)
157     @OneToMany(targetEntity = PersonDocumentRole.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
158     @JoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR", insertable = false, updatable = false)
159     protected List<PersonDocumentRole> roles;
160 
161     @JoinFetch(value= JoinFetchType.OUTER)
162     @OneToOne(targetEntity = PersonDocumentPrivacy.class, orphanRemoval = true, cascade = { CascadeType.REFRESH, CascadeType.REMOVE, CascadeType.PERSIST })
163     @PrimaryKeyJoinColumn(name = "FDOC_NBR", referencedColumnName = "FDOC_NBR")
164     protected PersonDocumentPrivacy privacy;
165 
166     public IdentityManagementPersonDocument() {
167         affiliations = new ArrayList<PersonDocumentAffiliation>();
168         citizenships = new ArrayList<PersonDocumentCitizenship>();
169         // employmentInformations = new ArrayList<DocEmploymentInfo>();                       
170         names = new ArrayList<PersonDocumentName>();
171         addrs = new ArrayList<PersonDocumentAddress>();
172         phones = new ArrayList<PersonDocumentPhone>();
173         emails = new ArrayList<PersonDocumentEmail>();
174         groups = new ArrayList<PersonDocumentGroup>();
175         roles = new ArrayList<PersonDocumentRole>();
176         privacy = new PersonDocumentPrivacy();
177         this.active = true;
178     }
179 
180     public String getPrincipalId() {
181         return this.principalId;
182     }
183 
184     public void setPrincipalId(String principalId) {
185         this.principalId = principalId;
186     }
187 
188     public String getPrincipalName() {
189         return this.principalName;
190     }
191 
192     /*
193      * sets the principal name.  
194      * Principal names are converted to lower case.
195      */
196     public void setPrincipalName(String principalName) {
197         this.principalName = principalName;
198     }
199 
200     public String getEntityId() {
201         return this.entityId;
202     }
203 
204     public void setEntityId(String entityId) {
205         this.entityId = entityId;
206     }
207 
208     public List<PersonDocumentAffiliation> getAffiliations() {
209         return this.affiliations;
210     }
211 
212     public void setAffiliations(List<PersonDocumentAffiliation> affiliations) {
213         this.affiliations = affiliations;
214     }
215 
216     public String getCampusCode() {
217         return this.campusCode;
218     }
219 
220     public void setCampusCode(String campusCode) {
221         this.campusCode = campusCode;
222     }
223 
224     public Map<String, String> getExternalIdentifiers() {
225         return this.externalIdentifiers;
226     }
227 
228     public void setExternalIdentifiers(Map<String, String> externalIdentifiers) {
229         this.externalIdentifiers = externalIdentifiers;
230     }
231 
232     public String getPassword() {
233         return this.password;
234     }
235 
236     public void setPassword(String password) {
237         this.password = password;
238     }
239 
240     public boolean isActive() {
241         return this.active;
242     }
243 
244     public void setActive(boolean active) {
245         this.active = active;
246     }
247 
248     public List<PersonDocumentCitizenship> getCitizenships() {
249         return this.citizenships;
250     }
251 
252     public void setCitizenships(List<PersonDocumentCitizenship> citizenships) {
253         this.citizenships = citizenships;
254     }
255 
256     public List<PersonDocumentName> getNames() {
257         return this.names;
258     }
259 
260     public void setNames(List<PersonDocumentName> names) {
261         this.names = names;
262     }
263 
264     public List<PersonDocumentAddress> getAddrs() {
265         return this.addrs;
266     }
267 
268     public void setAddrs(List<PersonDocumentAddress> addrs) {
269         this.addrs = addrs;
270     }
271 
272     public List<PersonDocumentPhone> getPhones() {
273         return this.phones;
274     }
275 
276     public void setPhones(List<PersonDocumentPhone> phones) {
277         this.phones = phones;
278     }
279 
280     public List<PersonDocumentEmail> getEmails() {
281         return this.emails;
282     }
283 
284     public void setEmails(List<PersonDocumentEmail> emails) {
285         this.emails = emails;
286     }
287 
288     public void setGroups(List<PersonDocumentGroup> groups) {
289         this.groups = groups;
290     }
291 
292     public List<PersonDocumentRole> getRoles() {
293         return this.roles;
294     }
295 
296     public void setRoles(List<PersonDocumentRole> roles) {
297         this.roles = roles;
298     }
299 
300     public List<PersonDocumentGroup> getGroups() {
301         return this.groups;
302     }
303 
304     public String getUnivId() {
305         return this.univId;
306     }
307 
308     public void setUnivId(String univId) {
309         this.univId = univId;
310     }
311 
312     public PersonDocumentPrivacy getPrivacy() {
313         return this.privacy;
314     }
315 
316     public void setPrivacy(PersonDocumentPrivacy privacy) {
317         this.privacy = privacy;
318     }
319 
320     public void initializeDocumentForNewPerson() {
321         if (StringUtils.isBlank(this.principalId)) {
322             DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), KimConstants.SequenceNames.KRIM_PRNCPL_ID_S);
323             this.principalId = incrementer.nextStringValue();
324         }
325         if (StringUtils.isBlank(this.entityId)) {
326             DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), KimConstants.SequenceNames.KRIM_ENTITY_ID_S);
327             this.entityId = incrementer.nextStringValue();
328         }
329     }
330 
331     @SuppressWarnings({"unchecked", "rawtypes", "deprecation"})
332     @Override
333     public List buildListOfDeletionAwareLists() {
334         List managedLists = super.buildListOfDeletionAwareLists();
335         List<PersonDocumentEmploymentInfo> empInfos = new ArrayList<PersonDocumentEmploymentInfo>();
336         for (PersonDocumentAffiliation affiliation : getAffiliations()) {
337             empInfos.addAll(affiliation.getEmpInfos());
338         }
339         managedLists.add(empInfos);
340         managedLists.add(getAffiliations());
341         managedLists.add(getCitizenships());
342         managedLists.add(getPhones());
343         managedLists.add(getAddrs());
344         managedLists.add(getEmails());
345         managedLists.add(getNames());
346         managedLists.add(getGroups());
347         managedLists.add(getRoles());
348         return managedLists;
349     }
350 
351     /**
352      * @see org.kuali.rice.krad.document.DocumentBase#doRouteStatusChange(org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange)
353      */
354     @Override
355     public void doRouteStatusChange(DocumentRouteStatusChange statusChangeEvent) {
356         super.doRouteStatusChange(statusChangeEvent);
357         if (getDocumentHeader().getWorkflowDocument().isProcessed()) {
358             setIfRolesEditable();
359             KIMServiceLocatorInternal.getUiDocumentService().saveEntityPerson(this);
360         }
361     }
362 
363     @Override
364     public void prepareForSave() {
365         if (StringUtils.isBlank(getPrivacy().getDocumentNumber())) {
366             getPrivacy().setDocumentNumber(getDocumentNumber());
367         }
368         setEmployeeRecordIds();
369         for (PersonDocumentRole role : getRoles()) {
370             role.setDocumentNumber(getDocumentNumber());
371             for (KimDocumentRoleMember rolePrncpl : role.getRolePrncpls()) {
372                 rolePrncpl.setDocumentNumber(getDocumentNumber());
373                 rolePrncpl.setRoleId(role.getRoleId());
374                 if (StringUtils.isEmpty(rolePrncpl.getRoleMemberId())) {
375                     DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), "KRIM_ROLE_MBR_ID_S");
376                     rolePrncpl.setRoleMemberId(incrementer.nextStringValue());
377                 }
378                 for (KimDocumentRoleQualifier qualifier : rolePrncpl.getQualifiers()) {
379                     qualifier.setDocumentNumber(getDocumentNumber());
380                     qualifier.setRoleMemberId(rolePrncpl.getRoleMemberId());
381                     qualifier.setKimTypId(role.getKimTypeId());
382                 }
383                 for (KimDocumentRoleResponsibilityAction responsibilityAction : rolePrncpl.getRoleRspActions()) {
384                     responsibilityAction.setDocumentNumber(getDocumentNumber());
385                     responsibilityAction.setRoleMemberId(rolePrncpl.getRoleMemberId());
386                     responsibilityAction.setRoleResponsibilityId("*");
387                 }
388             }
389         }
390         if (getDelegationMembers() != null) {
391             for (RoleDocumentDelegationMember delegationMember : getDelegationMembers()) {
392                 delegationMember.setDocumentNumber(getDocumentNumber());
393                 for (RoleDocumentDelegationMemberQualifier qualifier : delegationMember.getQualifiers()) {
394                     qualifier.setDocumentNumber(getDocumentNumber());
395                     qualifier.setKimTypId(delegationMember.getRoleBo().getKimTypeId());
396                 }
397                 addDelegationMemberToDelegation(delegationMember);
398             }
399         }
400         // important to do this after getDelegationMembers since the addDelegationMemberToDelegation method will create
401         // primary and/or secondary delegations for us in a "just-in-time" fashion
402         if (getDelegations() != null) {
403             List<RoleDocumentDelegation> emptyDelegations = new ArrayList<>();
404             for (RoleDocumentDelegation delegation : getDelegations()) {
405                 delegation.setDocumentNumber(getDocumentNumber());
406                 if (delegation.getMembers().isEmpty()) {
407                     emptyDelegations.add(delegation);
408                 }
409             }
410             // remove any empty delegations because we just don't need them
411             getDelegations().removeAll(emptyDelegations);
412         }
413         if (getAddrs() != null) {
414             for (PersonDocumentAddress address : getAddrs()) {
415                 address.setDocumentNumber(getDocumentNumber());
416                 if (StringUtils.isEmpty(address.getEntityAddressId())) {
417                     DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), "KRIM_ENTITY_ADDR_ID_S");
418                     address.setEntityAddressId(incrementer.nextStringValue());
419                 }
420             }
421         }
422         if (getAffiliations() != null) {
423             String nextValue = null;
424 
425             for (PersonDocumentAffiliation affiliation : getAffiliations()) {
426                 affiliation.setDocumentNumber(getDocumentNumber());
427                 if (StringUtils.isEmpty(affiliation.getEntityAffiliationId())) {
428                     DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), "KRIM_ENTITY_AFLTN_ID_S");
429                     nextValue = incrementer.nextStringValue();
430                     affiliation.setEntityAffiliationId(nextValue);
431                 }
432                 for (PersonDocumentEmploymentInfo empInfo : affiliation.getEmpInfos()) {
433                     empInfo.setDocumentNumber(getDocumentNumber());
434                     if (StringUtils.isEmpty(empInfo.getEntityAffiliationId())) {
435                         empInfo.setEntityAffiliationId(nextValue);
436                     }
437                 }
438             }
439         }
440         if (getEmails() != null) {
441             for (PersonDocumentEmail email : getEmails()) {
442                 email.setDocumentNumber(getDocumentNumber());
443                 if (StringUtils.isEmpty(email.getEntityEmailId())) {
444                     DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), "KRIM_ENTITY_EMAIL_ID_S");
445                     email.setEntityEmailId(incrementer.nextStringValue());
446                 }
447             }
448         }
449         if (getGroups() != null) {
450             for (PersonDocumentGroup group : getGroups()) {
451                 group.setDocumentNumber(getDocumentNumber());
452                 if (StringUtils.isEmpty(group.getGroupMemberId())) {
453                     DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), "KRIM_GRP_MBR_ID_S");
454                     group.setGroupMemberId(incrementer.nextStringValue());
455                 }
456             }
457         }
458         if (getNames() != null) {
459             for (PersonDocumentName name : getNames()) {
460                 name.setDocumentNumber(getDocumentNumber());
461                 if (StringUtils.isEmpty(name.getEntityNameId())) {
462                     DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), "KRIM_ENTITY_NM_ID_S");
463                     name.setEntityNameId(incrementer.nextStringValue());
464                 }
465             }
466         }
467         if (getPhones() != null) {
468             for (PersonDocumentPhone phone : getPhones()) {
469                 phone.setDocumentNumber(getDocumentNumber());
470                 if (StringUtils.isEmpty(phone.getEntityPhoneId())) {
471                     DataFieldMaxValueIncrementer incrementer = MaxValueIncrementerFactory.getIncrementer(KimImplServiceLocator.getDataSource(), "KRIM_ENTITY_PHONE_ID_S");
472                     phone.setEntityPhoneId(incrementer.nextStringValue());
473                 }
474             }
475         }
476     }
477 
478     @Override
479     public void postProcessSave(DocumentEvent event) {
480         super.postProcessSave(event);
481         // after the save has completed, we want to restore any potentially @Transient state that JPA might have
482         // discarded, specifically the delegation members have a lot of this
483         resyncTransientState();
484     }
485 
486     public void resyncTransientState() {
487         getDelegationMembers().clear();
488         for (RoleDocumentDelegation delegation : getDelegations()) {
489             for (RoleDocumentDelegationMember delegationMember : delegation.getMembers()) {
490 
491                 // RoleDocumentDelegationMember has a number of transient fields that are derived from the role member,
492                 // we must populate them in order for the person document to work properly when loading an existing
493                 // person document
494 
495                 RoleMemberBo roleMember = getUiDocumentService().getRoleMember(delegationMember.getRoleMemberId());
496                 delegationMember.setRoleMemberMemberId(roleMember.getMemberId());
497                 delegationMember.setRoleMemberMemberTypeCode(roleMember.getType().getCode());
498                 delegationMember.setRoleMemberName(getUiDocumentService().getMemberName(MemberType.fromCode(delegationMember.getRoleMemberMemberTypeCode()), delegationMember.getRoleMemberMemberId()));
499                 delegationMember.setRoleMemberNamespaceCode(getUiDocumentService().getMemberNamespaceCode(MemberType.fromCode(delegationMember.getRoleMemberMemberTypeCode()), delegationMember.getRoleMemberMemberId()));
500                 delegationMember.setDelegationTypeCode(delegation.getDelegationTypeCode());
501                 Role role = KimApiServiceLocator.getRoleService().getRole(roleMember.getRoleId());
502                 delegationMember.setRoleBo(RoleBo.from(role));
503 
504                 // don't want to be able to "delete" existing delegation members from the person document, so we
505                 // indicate that we are editing the delegation member, which we are
506                 delegationMember.setEdit(true);
507 
508                 getDelegationMembers().add(delegationMember);
509             }
510         }
511     }
512 
513 
514 
515     protected void setEmployeeRecordIds() {
516         List<EntityEmployment> empInfos = getUiDocumentService().getEntityEmploymentInformationInfo(getEntityId());
517         for (PersonDocumentAffiliation affiliation : getAffiliations()) {
518             int employeeRecordCounter = CollectionUtils.isEmpty(empInfos) ? 0 : empInfos.size();
519             for (PersonDocumentEmploymentInfo empInfo : affiliation.getEmpInfos()) {
520                 if (CollectionUtils.isNotEmpty(empInfos)) {
521                     for (EntityEmployment origEmpInfo : empInfos) {
522                         if (origEmpInfo.getId().equals(empInfo.getEntityEmploymentId())) {
523                             empInfo.setEmploymentRecordId(origEmpInfo.getEmploymentRecordId());
524                         }
525                     }
526                 }
527                 if (StringUtils.isEmpty(empInfo.getEmploymentRecordId())) {
528                     employeeRecordCounter++;
529                     empInfo.setEmploymentRecordId(employeeRecordCounter + "");
530                 }
531             }
532         }
533     }
534 
535     public KimTypeAttributesHelper getKimTypeAttributesHelper(String roleId) {
536         Role role = KimApiServiceLocator.getRoleService().getRole(roleId);
537         KimType kimTypeInfo = KimApiServiceLocator.getKimTypeInfoService().getKimType(role.getKimTypeId());
538         return new KimTypeAttributesHelper(kimTypeInfo);
539     }
540 
541     public void setIfRolesEditable() {
542         if (CollectionUtils.isNotEmpty(getRoles())) {
543             for (PersonDocumentRole role : getRoles()) {
544                 role.setEditable(validAssignRole(role));
545             }
546         }
547     }
548 
549     public boolean validAssignRole(PersonDocumentRole role) {
550         boolean rulePassed = true;
551         if (StringUtils.isNotEmpty(role.getNamespaceCode())) {
552             Map<String, String> additionalPermissionDetails = new HashMap<String, String>();
553             additionalPermissionDetails.put(KimConstants.AttributeConstants.NAMESPACE_CODE, role.getNamespaceCode());
554             additionalPermissionDetails.put(KimConstants.AttributeConstants.ROLE_NAME, role.getRoleName());
555             if (!getDocumentHelperService().getDocumentAuthorizer(this).isAuthorizedByTemplate(this, KimConstants.NAMESPACE_CODE, KimConstants.PermissionTemplateNames.ASSIGN_ROLE, GlobalVariables.getUserSession().getPrincipalId(), additionalPermissionDetails, null)) {
556                 rulePassed = false;
557             }
558         }
559         return rulePassed;
560     }
561 
562     @Transient
563     protected transient DocumentHelperService documentHelperService;
564 
565     @Transient
566     protected transient UiDocumentService uiDocumentService;
567 
568     protected DocumentHelperService getDocumentHelperService() {
569         if (documentHelperService == null) {
570             documentHelperService = KNSServiceLocator.getDocumentHelperService();
571         }
572         return this.documentHelperService;
573     }
574 
575     protected UiDocumentService getUiDocumentService() {
576         if (uiDocumentService == null) {
577             uiDocumentService = KIMServiceLocatorInternal.getUiDocumentService();
578         }
579         return this.uiDocumentService;
580     }
581 }