1
2
3
4
5
6
7
8
9
10
11
12
13
14
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.hibernate.annotations.Fetch;
21 import org.hibernate.annotations.FetchMode;
22 import org.hibernate.annotations.GenericGenerator;
23 import org.hibernate.annotations.Parameter;
24 import org.hibernate.annotations.Type;
25 import org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange;
26 import org.kuali.rice.kim.api.KimConstants;
27 import org.kuali.rice.kim.api.identity.employment.EntityEmployment;
28 import org.kuali.rice.kim.api.role.Role;
29 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
30 import org.kuali.rice.kim.api.type.KimType;
31 import org.kuali.rice.kim.bo.ui.KimDocumentRoleMember;
32 import org.kuali.rice.kim.bo.ui.KimDocumentRoleQualifier;
33 import org.kuali.rice.kim.bo.ui.PersonDocumentAddress;
34 import org.kuali.rice.kim.bo.ui.PersonDocumentAffiliation;
35 import org.kuali.rice.kim.bo.ui.PersonDocumentCitizenship;
36 import org.kuali.rice.kim.bo.ui.PersonDocumentEmail;
37 import org.kuali.rice.kim.bo.ui.PersonDocumentEmploymentInfo;
38 import org.kuali.rice.kim.bo.ui.PersonDocumentGroup;
39 import org.kuali.rice.kim.bo.ui.PersonDocumentName;
40 import org.kuali.rice.kim.bo.ui.PersonDocumentPhone;
41 import org.kuali.rice.kim.bo.ui.PersonDocumentPrivacy;
42 import org.kuali.rice.kim.bo.ui.PersonDocumentRole;
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.type.KimTypeAttributesHelper;
46 import org.kuali.rice.kim.service.KIMServiceLocatorInternal;
47 import org.kuali.rice.kim.service.UiDocumentService;
48 import org.kuali.rice.kns.service.DocumentHelperService;
49 import org.kuali.rice.kns.service.KNSServiceLocator;
50 import org.kuali.rice.krad.service.KRADServiceLocatorWeb;
51 import org.kuali.rice.krad.service.SequenceAccessorService;
52 import org.kuali.rice.krad.util.GlobalVariables;
53
54 import javax.persistence.AssociationOverride;
55 import javax.persistence.AssociationOverrides;
56 import javax.persistence.AttributeOverride;
57 import javax.persistence.AttributeOverrides;
58 import javax.persistence.CascadeType;
59 import javax.persistence.Column;
60 import javax.persistence.Entity;
61 import javax.persistence.FetchType;
62 import javax.persistence.GeneratedValue;
63 import javax.persistence.JoinColumn;
64 import javax.persistence.OneToMany;
65 import javax.persistence.OneToOne;
66 import javax.persistence.Table;
67 import javax.persistence.Transient;
68 import java.util.ArrayList;
69 import java.util.HashMap;
70 import java.util.List;
71 import java.util.Map;
72
73
74
75
76
77
78
79
80 @Entity
81 @AttributeOverrides({
82 @AttributeOverride(name="documentNumber",column=@Column(name="FDOC_NBR"))
83 })
84 @AssociationOverrides({
85 @AssociationOverride(name="documentHeader",joinColumns=@JoinColumn(name="FDOC_NBR",referencedColumnName="DOC_HDR_ID",insertable=false,updatable=false))
86 })
87 @Table(name="KRIM_PERSON_DOCUMENT_T")
88 public class IdentityManagementPersonDocument extends IdentityManagementKimDocument {
89
90 protected static final long serialVersionUID = -534993712085516925L;
91
92
93 @GeneratedValue(generator="KRIM_PRNCPL_ID_S")
94 @GenericGenerator(name="KRIM_PRNCPL_ID_S",strategy="org.kuali.rice.core.jpa.spring.RiceNumericStringSequenceStyleGenerator",parameters={
95 @Parameter(name="sequence_name",value="KRIM_PRNCPL_ID_S"),
96 @Parameter(name="value_column",value="id")
97 })
98 @Column(name="PRNCPL_ID")
99 protected String principalId;
100 @Column(name="PRNCPL_NM")
101 protected String principalName;
102 @GeneratedValue(generator="KRIM_ENTITY_ID_S")
103 @GenericGenerator(name="KRIM_ENTITY_ID_S",strategy="org.kuali.rice.core.jpa.spring.RiceNumericStringSequenceStyleGenerator",parameters={
104 @Parameter(name="sequence_name",value="KRIM_ENTITY_ID_S"),
105 @Parameter(name="value_column",value="id")
106 })
107 @Column(name="ENTITY_ID")
108 protected String entityId;
109 @Type(type="org.kuali.rice.krad.util.HibernateKualiHashType")
110 @Column(name="PRNCPL_PSWD")
111 protected String password;
112
113 protected String univId = "";
114
115 @OneToMany(targetEntity=PersonDocumentAffiliation.class, fetch=FetchType.EAGER, cascade={CascadeType.ALL})
116 @Fetch(value = FetchMode.SELECT)
117 @JoinColumn(name="FDOC_NBR",insertable=false,updatable=false)
118 protected List<PersonDocumentAffiliation> affiliations;
119
120 @Transient
121 protected String campusCode = "";
122
123 @Transient
124 protected Map<String, String> externalIdentifiers = null;
125
126 @Column(name="ACTV_IND")
127 @Type(type="yes_no")
128 protected boolean active;
129
130
131 @Transient
132 protected List<PersonDocumentCitizenship> citizenships;
133
134 @OneToMany(targetEntity=PersonDocumentName.class, fetch=FetchType.EAGER, cascade={CascadeType.ALL})
135 @Fetch(value = FetchMode.SELECT)
136 @JoinColumn(name="FDOC_NBR",insertable=false,updatable=false)
137 protected List<PersonDocumentName> names;
138 @OneToMany(targetEntity=PersonDocumentAddress.class, fetch=FetchType.EAGER, cascade={CascadeType.ALL})
139 @Fetch(value = FetchMode.SELECT)
140 @JoinColumn(name="FDOC_NBR",insertable=false,updatable=false)
141 protected List<PersonDocumentAddress> addrs;
142 @OneToMany(targetEntity=PersonDocumentPhone.class, fetch=FetchType.EAGER, cascade={CascadeType.ALL})
143 @Fetch(value = FetchMode.SELECT)
144 @JoinColumn(name="FDOC_NBR")
145 protected List<PersonDocumentPhone> phones;
146 @OneToMany(targetEntity=PersonDocumentEmail.class, fetch=FetchType.EAGER, cascade={CascadeType.ALL})
147 @Fetch(value = FetchMode.SELECT)
148 @JoinColumn(name="FDOC_NBR",insertable=false,updatable=false)
149 protected List<PersonDocumentEmail> emails;
150 @OneToMany(targetEntity=PersonDocumentGroup.class, fetch=FetchType.EAGER, cascade={CascadeType.ALL})
151 @Fetch(value = FetchMode.SELECT)
152 @JoinColumn(name="FDOC_NBR",insertable=false,updatable=false)
153 protected List<PersonDocumentGroup> groups;
154 @OneToMany(targetEntity=PersonDocumentRole.class, fetch=FetchType.EAGER, cascade={CascadeType.ALL})
155 @Fetch(value = FetchMode.SELECT)
156 @JoinColumn(name="FDOC_NBR",insertable=false,updatable=false)
157 protected List<PersonDocumentRole> roles;
158
159 @OneToOne(targetEntity=PersonDocumentPrivacy.class, fetch=FetchType.EAGER, cascade={CascadeType.ALL})
160 @JoinColumn(name="FDOC_NBR",insertable=false,updatable=false)
161 protected PersonDocumentPrivacy privacy;
162
163 public IdentityManagementPersonDocument() {
164 affiliations = new ArrayList<PersonDocumentAffiliation>();
165 citizenships = new ArrayList<PersonDocumentCitizenship>();
166
167 names = new ArrayList<PersonDocumentName>();
168 addrs = new ArrayList<PersonDocumentAddress>();
169 phones = new ArrayList<PersonDocumentPhone>();
170 emails = new ArrayList<PersonDocumentEmail>();
171 groups = new ArrayList<PersonDocumentGroup>();
172 roles = new ArrayList<PersonDocumentRole>();
173 privacy = new PersonDocumentPrivacy();
174 this.active = true;
175
176 }
177
178 public String getPrincipalId() {
179 return this.principalId;
180 }
181
182 public void setPrincipalId(String principalId) {
183 this.principalId = principalId;
184 }
185
186 public String getPrincipalName() {
187 return this.principalName;
188 }
189
190
191
192
193
194 public void setPrincipalName(String principalName) {
195 this.principalName = principalName;
196 }
197
198 public String getEntityId() {
199 return this.entityId;
200 }
201
202 public void setEntityId(String entityId) {
203 this.entityId = entityId;
204 }
205
206 public List<PersonDocumentAffiliation> getAffiliations() {
207 return this.affiliations;
208 }
209
210 public void setAffiliations(List<PersonDocumentAffiliation> affiliations) {
211 this.affiliations = affiliations;
212 }
213
214 public String getCampusCode() {
215 return this.campusCode;
216 }
217
218 public void setCampusCode(String campusCode) {
219 this.campusCode = campusCode;
220 }
221
222 public Map<String, String> getExternalIdentifiers() {
223 return this.externalIdentifiers;
224 }
225
226 public void setExternalIdentifiers(Map<String, String> externalIdentifiers) {
227 this.externalIdentifiers = externalIdentifiers;
228 }
229
230 public String getPassword() {
231 return this.password;
232 }
233
234 public void setPassword(String password) {
235 this.password = password;
236 }
237
238 public boolean isActive() {
239 return this.active;
240 }
241
242 public void setActive(boolean active) {
243 this.active = active;
244 }
245
246 public List<PersonDocumentCitizenship> getCitizenships() {
247 return this.citizenships;
248 }
249
250 public void setCitizenships(List<PersonDocumentCitizenship> citizenships) {
251 this.citizenships = citizenships;
252 }
253
254 public List<PersonDocumentName> getNames() {
255 return this.names;
256 }
257
258 public void setNames(List<PersonDocumentName> names) {
259 this.names = names;
260 }
261
262 public List<PersonDocumentAddress> getAddrs() {
263 return this.addrs;
264 }
265
266 public void setAddrs(List<PersonDocumentAddress> addrs) {
267 this.addrs = addrs;
268 }
269
270 public List<PersonDocumentPhone> getPhones() {
271 return this.phones;
272 }
273
274 public void setPhones(List<PersonDocumentPhone> phones) {
275 this.phones = phones;
276 }
277
278 public List<PersonDocumentEmail> getEmails() {
279 return this.emails;
280 }
281
282 public void setEmails(List<PersonDocumentEmail> emails) {
283 this.emails = emails;
284 }
285
286 public void setGroups(List<PersonDocumentGroup> groups) {
287 this.groups = groups;
288 }
289
290 public List<PersonDocumentRole> getRoles() {
291 return this.roles;
292 }
293
294 public void setRoles(List<PersonDocumentRole> roles) {
295 this.roles = roles;
296 }
297
298 public List<PersonDocumentGroup> getGroups() {
299 return this.groups;
300 }
301
302 public String getUnivId() {
303 return this.univId;
304 }
305
306 public void setUnivId(String univId) {
307 this.univId = univId;
308 }
309
310 public PersonDocumentPrivacy getPrivacy() {
311 return this.privacy;
312 }
313
314 public void setPrivacy(PersonDocumentPrivacy privacy) {
315 this.privacy = privacy;
316 }
317
318 public void initializeDocumentForNewPerson() {
319 if(StringUtils.isBlank(this.principalId)){
320 this.principalId = getSequenceAccessorService().getNextAvailableSequenceNumber(KimConstants.SequenceNames.KRIM_PRNCPL_ID_S).toString();
321 }
322 if(StringUtils.isBlank(this.entityId)){
323 this.entityId = getSequenceAccessorService().getNextAvailableSequenceNumber(KimConstants.SequenceNames.KRIM_ENTITY_ID_S).toString();
324 }
325 }
326
327 @SuppressWarnings("unchecked")
328 @Override
329 public List buildListOfDeletionAwareLists() {
330 List managedLists = super.buildListOfDeletionAwareLists();
331 List<PersonDocumentEmploymentInfo> empInfos = new ArrayList<PersonDocumentEmploymentInfo>();
332 for (PersonDocumentAffiliation affiliation : getAffiliations()) {
333 empInfos.addAll(affiliation.getEmpInfos());
334 }
335
336 managedLists.add(empInfos);
337 managedLists.add(getAffiliations());
338 managedLists.add(getCitizenships());
339 managedLists.add(getPhones());
340 managedLists.add(getAddrs());
341 managedLists.add(getEmails());
342 managedLists.add(getNames());
343 managedLists.add(getGroups());
344 managedLists.add(getRoles());
345 return managedLists;
346 }
347
348
349
350
351 @Override
352 public void doRouteStatusChange(DocumentRouteStatusChange statusChangeEvent) {
353 super.doRouteStatusChange(statusChangeEvent);
354 if (getDocumentHeader().getWorkflowDocument().isProcessed()) {
355 setIfRolesEditable();
356 KIMServiceLocatorInternal.getUiDocumentService().saveEntityPerson(this);
357 }
358 }
359
360
361 @Override
362 public void prepareForSave(){
363 if (StringUtils.isBlank(getPrivacy().getDocumentNumber())) {
364 getPrivacy().setDocumentNumber(
365 getDocumentNumber());
366 }
367 setEmployeeRecordIds();
368 for (PersonDocumentRole role : getRoles()) {
369 role.setDocumentNumber(getDocumentNumber());
370
371
372
373
374
375
376
377 for (KimDocumentRoleMember rolePrncpl : role.getRolePrncpls()) {
378 rolePrncpl.setDocumentNumber(getDocumentNumber());
379 rolePrncpl.setRoleId(role.getRoleId());
380 if (StringUtils.isEmpty(rolePrncpl.getRoleMemberId())) {
381 SequenceAccessorService sas = getSequenceAccessorService();
382 Long nextSeq = sas.getNextAvailableSequenceNumber(
383 "KRIM_ROLE_MBR_ID_S", this.getClass());
384 String roleMemberId = nextSeq.toString();
385 rolePrncpl.setRoleMemberId(roleMemberId);
386 }
387 for (KimDocumentRoleQualifier qualifier : rolePrncpl.getQualifiers()) {
388 qualifier.setDocumentNumber(getDocumentNumber());
389 qualifier.setKimTypId(role.getKimTypeId());
390 }
391 }
392 }
393 if(getDelegationMembers()!=null){
394 for(RoleDocumentDelegationMember delegationMember: getDelegationMembers()){
395 delegationMember.setDocumentNumber(getDocumentNumber());
396 for (RoleDocumentDelegationMemberQualifier qualifier: delegationMember.getQualifiers()) {
397 qualifier.setDocumentNumber(getDocumentNumber());
398 qualifier.setKimTypId(delegationMember.getRoleBo().getKimTypeId());
399 }
400 addDelegationMemberToDelegation(delegationMember);
401 }
402 }
403 if (getAddrs() != null) {
404 String entityAddressId;
405 for(PersonDocumentAddress address : getAddrs()) {
406 address.setDocumentNumber(getDocumentNumber());
407 if (StringUtils.isEmpty(address.getEntityAddressId())) {
408 SequenceAccessorService sas = getSequenceAccessorService();
409 Long nextSeq = sas.getNextAvailableSequenceNumber(
410 "KRIM_ENTITY_ADDR_ID_S", this.getClass());
411 entityAddressId = nextSeq.toString();
412 address.setEntityAddressId(entityAddressId);
413 }
414 }
415 }
416 if (getAffiliations() != null) {
417 String affiliationId;
418 for(PersonDocumentAffiliation affiliation : getAffiliations()) {
419 affiliation.setDocumentNumber(getDocumentNumber());
420 if (StringUtils.isEmpty(affiliation.getEntityAffiliationId())) {
421 SequenceAccessorService sas = getSequenceAccessorService();
422 Long nextSeq = sas.getNextAvailableSequenceNumber(
423 "KRIM_ENTITY_AFLTN_ID_S", this.getClass());
424 affiliationId = nextSeq.toString();
425 affiliation.setEntityAffiliationId(affiliationId);
426 }
427 }
428 }
429 if (getEmails() != null) {
430 String entityEmailId;
431 for(PersonDocumentEmail email : getEmails()) {
432 email.setDocumentNumber(getDocumentNumber());
433 if (StringUtils.isEmpty(email.getEntityEmailId())) {
434 SequenceAccessorService sas = getSequenceAccessorService();
435 Long nextSeq = sas.getNextAvailableSequenceNumber(
436 "KRIM_ENTITY_EMAIL_ID_S", this.getClass());
437 entityEmailId = nextSeq.toString();
438 email.setEntityEmailId(entityEmailId);
439 }
440 }
441 }
442 if (getGroups() != null) {
443 String groupMemberId;
444 for(PersonDocumentGroup group : getGroups()) {
445 group.setDocumentNumber(getDocumentNumber());
446 if (StringUtils.isEmpty(group.getGroupMemberId())) {
447 SequenceAccessorService sas = getSequenceAccessorService();
448 Long nextSeq = sas.getNextAvailableSequenceNumber(
449 "KRIM_GRP_MBR_ID_S", this.getClass());
450 groupMemberId = nextSeq.toString();
451 group.setGroupMemberId(groupMemberId);
452 }
453 }
454 }
455 if (getNames() != null) {
456 String entityNameId;
457 for(PersonDocumentName name : getNames()) {
458 name.setDocumentNumber(getDocumentNumber());
459 if (StringUtils.isEmpty(name.getEntityNameId())) {
460 SequenceAccessorService sas = getSequenceAccessorService();
461 Long nextSeq = sas.getNextAvailableSequenceNumber(
462 "KRIM_ENTITY_NM_ID_S", this.getClass());
463 entityNameId = nextSeq.toString();
464 name.setEntityNameId(entityNameId);
465 }
466 }
467 }
468 if (getPhones() != null) {
469 String entityPhoneId;
470 for(PersonDocumentPhone phone : getPhones()) {
471 phone.setDocumentNumber(getDocumentNumber());
472 if (StringUtils.isEmpty(phone.getEntityPhoneId())) {
473 SequenceAccessorService sas = getSequenceAccessorService();
474 Long nextSeq = sas.getNextAvailableSequenceNumber(
475 "KRIM_ENTITY_PHONE_ID_S", this.getClass());
476 entityPhoneId = nextSeq.toString();
477 phone.setEntityPhoneId(entityPhoneId);
478 }
479 }
480 }
481
482 }
483
484 protected void setEmployeeRecordIds(){
485 List<EntityEmployment> empInfos = getUiDocumentService().getEntityEmploymentInformationInfo(getEntityId());
486 for(PersonDocumentAffiliation affiliation: getAffiliations()) {
487 int employeeRecordCounter = CollectionUtils.isEmpty(empInfos) ? 0 : empInfos.size();
488 for(PersonDocumentEmploymentInfo empInfo: affiliation.getEmpInfos()){
489 if(CollectionUtils.isNotEmpty(empInfos)){
490 for(EntityEmployment origEmpInfo: empInfos){
491 if (origEmpInfo.getEmployeeId().equals(empInfo.getEntityEmploymentId())) {
492 empInfo.setEmploymentRecordId(origEmpInfo.getEmploymentRecordId());
493 }
494 }
495 }
496 if(StringUtils.isEmpty(empInfo.getEmploymentRecordId())){
497 employeeRecordCounter++;
498 empInfo.setEmploymentRecordId(employeeRecordCounter+"");
499 }
500 }
501 }
502 }
503
504 public KimTypeAttributesHelper getKimTypeAttributesHelper(String roleId) {
505 Role role = KimApiServiceLocator.getRoleService().getRole(roleId);
506 KimType kimTypeInfo = KimApiServiceLocator.getKimTypeInfoService().getKimType(role.getKimTypeId());
507 return new KimTypeAttributesHelper(kimTypeInfo);
508
509 }
510
511 public void setIfRolesEditable(){
512 if(CollectionUtils.isNotEmpty(getRoles())){
513 for(PersonDocumentRole role: getRoles()){
514 role.setEditable(validAssignRole(role));
515 }
516 }
517 }
518
519 public boolean validAssignRole(PersonDocumentRole role){
520 boolean rulePassed = true;
521 if(StringUtils.isNotEmpty(role.getNamespaceCode())){
522 Map<String,String> additionalPermissionDetails = new HashMap<String,String>();
523 additionalPermissionDetails.put(KimConstants.AttributeConstants.NAMESPACE_CODE, role.getNamespaceCode());
524 additionalPermissionDetails.put(KimConstants.AttributeConstants.ROLE_NAME, role.getRoleName());
525 if (!getDocumentHelperService().getDocumentAuthorizer(this).isAuthorizedByTemplate(
526 this,
527 KimConstants.NAMESPACE_CODE,
528 KimConstants.PermissionTemplateNames.ASSIGN_ROLE,
529 GlobalVariables.getUserSession().getPrincipalId(),
530 additionalPermissionDetails, null)){
531 rulePassed = false;
532 }
533 }
534 return rulePassed;
535 }
536
537 @Transient
538 protected transient DocumentHelperService documentHelperService;
539 @Transient
540 protected transient UiDocumentService uiDocumentService;
541
542 protected DocumentHelperService getDocumentHelperService() {
543 if ( documentHelperService == null ) {
544 documentHelperService = KNSServiceLocator.getDocumentHelperService();
545 }
546 return this.documentHelperService;
547 }
548
549 protected UiDocumentService getUiDocumentService() {
550 if (uiDocumentService == null ) {
551 uiDocumentService = KIMServiceLocatorInternal.getUiDocumentService();
552 }
553 return this.uiDocumentService;
554 }
555
556 }