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