1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.kuali.kpme.core.department.web;
17
18 import java.sql.Timestamp;
19 import java.util.ArrayList;
20 import java.util.Collections;
21 import java.util.List;
22 import java.util.Map;
23
24 import org.apache.commons.lang.StringUtils;
25 import org.joda.time.DateTime;
26 import org.kuali.kpme.core.bo.HrBusinessObject;
27 import org.kuali.kpme.core.bo.HrBusinessObjectMaintainableImpl;
28 import org.kuali.kpme.core.department.Department;
29 import org.kuali.kpme.core.role.KPMERoleMemberAttribute;
30 import org.kuali.kpme.core.role.department.DepartmentPrincipalRoleMemberBo;
31 import org.kuali.kpme.core.service.HrServiceLocator;
32 import org.kuali.rice.kim.api.identity.principal.Principal;
33 import org.kuali.rice.kim.api.role.RoleMember;
34 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
35 import org.kuali.rice.kim.impl.role.RoleMemberBo;
36 import org.kuali.rice.kns.document.MaintenanceDocument;
37 import org.kuali.rice.kns.maintenance.Maintainable;
38 import org.kuali.rice.kns.web.ui.Section;
39 import org.kuali.rice.krad.bo.PersistableBusinessObject;
40 import org.kuali.rice.krad.util.GlobalVariables;
41 import org.kuali.rice.krad.util.KRADConstants;
42
43 @SuppressWarnings("deprecation")
44 public class DepartmentMaintainableImpl extends HrBusinessObjectMaintainableImpl {
45
46 private static final long serialVersionUID = -330523155799598560L;
47
48 @Override
49 public HrBusinessObject getObjectById(String id) {
50 return HrServiceLocator.getDepartmentService().getDepartment(id);
51 }
52
53 @Override
54 @SuppressWarnings("rawtypes")
55 public List getSections(MaintenanceDocument document, Maintainable oldMaintainable) {
56 List sections = super.getSections(document, oldMaintainable);
57
58 for (Object obj : sections) {
59 Section sec = (Section) obj;
60 if (sec.getSectionId().equals("inactiveRoleMembers")) {
61 sec.setHidden(!document.isOldBusinessObjectInDocument());
62 }
63 }
64
65 return sections;
66 }
67
68 @Override
69 public void processAfterEdit(MaintenanceDocument document, Map<String, String[]> parameters) {
70 Department oldMaintainableObject = (Department) document.getOldMaintainableObject().getBusinessObject();
71 Department newMaintainableObject = (Department) document.getNewMaintainableObject().getBusinessObject();
72
73 Department oldDepartment = oldMaintainableObject;
74 if(StringUtils.isNotBlank(oldMaintainableObject.getHrDeptId())) {
75 oldDepartment = HrServiceLocator.getDepartmentService().getDepartment(oldMaintainableObject.getHrDeptId());
76 } else {
77 oldDepartment = HrServiceLocator.getDepartmentService().getDepartment(oldMaintainableObject.getDept(), oldMaintainableObject.getEffectiveLocalDate());
78 }
79
80 oldMaintainableObject.setRoleMembers(oldDepartment.getRoleMembers());
81 oldMaintainableObject.setInactiveRoleMembers(oldDepartment.getInactiveRoleMembers());
82
83 Department newDepartment = newMaintainableObject;
84 if(StringUtils.isNotBlank(newMaintainableObject.getHrDeptId())) {
85 newDepartment = HrServiceLocator.getDepartmentService().getDepartment(newMaintainableObject.getHrDeptId());
86 } else {
87 newDepartment = HrServiceLocator.getDepartmentService().getDepartment(newMaintainableObject.getDept(), newMaintainableObject.getEffectiveLocalDate());
88 }
89
90 newMaintainableObject.setRoleMembers(newDepartment.getRoleMembers());
91 newMaintainableObject.setInactiveRoleMembers(newDepartment.getInactiveRoleMembers());
92
93 super.processAfterEdit(document, parameters);
94 }
95
96 @Override
97 protected void setNewCollectionLineDefaultValues(String collectionName, PersistableBusinessObject addLine) {
98 Department department = (Department) this.getBusinessObject();
99
100 if (department.getEffectiveDate() != null) {
101 if (addLine instanceof RoleMemberBo) {
102 RoleMemberBo roleMember = (RoleMemberBo) addLine;
103 roleMember.setActiveFromDateValue(new Timestamp(department.getEffectiveDate().getTime()));
104 }
105 }
106
107 super.setNewCollectionLineDefaultValues(collectionName, addLine);
108 }
109
110 @Override
111 public void addNewLineToCollection(String collectionName) {
112 if (collectionName.equals("roleMembers")) {
113 RoleMemberBo roleMember = (RoleMemberBo) newCollectionLines.get(collectionName);
114 if (roleMember != null) {
115 if(!StringUtils.isEmpty(roleMember.getMemberId())) {
116 Principal person = KimApiServiceLocator.getIdentityService().getPrincipal(roleMember.getMemberId());
117 if (person == null) {
118 GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.MAINTENANCE_NEW_MAINTAINABLE +"roleMembers",
119 "dept.role.person.notExist",roleMember.getMemberId());
120 return;
121 }
122 }
123 }
124 }
125
126 super.addNewLineToCollection(collectionName);
127 }
128
129 @Override
130 public void customSaveLogic(HrBusinessObject hrObj) {
131 Department department = (Department) hrObj;
132
133 List<DepartmentPrincipalRoleMemberBo> newInactiveRoleMembers = createInactiveRoleMembers(department.getRoleMembers());
134 List<DepartmentPrincipalRoleMemberBo> roleList = new ArrayList<DepartmentPrincipalRoleMemberBo> ();
135 roleList.addAll(department.getRoleMembers());
136
137 for (DepartmentPrincipalRoleMemberBo newInactiveRoleMember : newInactiveRoleMembers) {
138 department.addInactiveRoleMember(newInactiveRoleMember);
139 List<DepartmentPrincipalRoleMemberBo> tempRoleList = department.getRoleMembers();
140 for(DepartmentPrincipalRoleMemberBo role : tempRoleList) {
141 if(StringUtils.isNotEmpty(role.getId())
142 && StringUtils.isNotEmpty(newInactiveRoleMember.getId())
143 && StringUtils.equals(role.getId(), newInactiveRoleMember.getId())) {
144 roleList.remove(role);
145 }
146 }
147 }
148
149 for (DepartmentPrincipalRoleMemberBo roleMember : roleList) {
150 RoleMember.Builder builder = RoleMember.Builder.create(roleMember);
151 builder.setAttributes(Collections.singletonMap(KPMERoleMemberAttribute.DEPARTMENT.getRoleMemberAttributeName(), department.getDept()));
152
153 if (StringUtils.isBlank(roleMember.getId())) {
154 KimApiServiceLocator.getRoleService().createRoleMember(builder.build());
155 } else {
156 KimApiServiceLocator.getRoleService().updateRoleMember(builder.build());
157 }
158 }
159 for (DepartmentPrincipalRoleMemberBo inactiveRoleMember : department.getInactiveRoleMembers()) {
160 RoleMember.Builder builder = RoleMember.Builder.create(inactiveRoleMember);
161 builder.setAttributes(Collections.singletonMap(KPMERoleMemberAttribute.DEPARTMENT.getRoleMemberAttributeName(), department.getDept()));
162
163 if (StringUtils.isBlank(inactiveRoleMember.getId())) {
164 KimApiServiceLocator.getRoleService().createRoleMember(builder.build());
165 } else {
166 KimApiServiceLocator.getRoleService().updateRoleMember(builder.build());
167 }
168 }
169 }
170
171 private List<DepartmentPrincipalRoleMemberBo> createInactiveRoleMembers(List<DepartmentPrincipalRoleMemberBo> roleMembers) {
172 List<DepartmentPrincipalRoleMemberBo> inactiveRoleMembers = new ArrayList<DepartmentPrincipalRoleMemberBo>();
173
174 List<RoleMemberBo> oldRoleMembers = new ArrayList<RoleMemberBo>();
175 List<RoleMemberBo> newRoleMembers = new ArrayList<RoleMemberBo>();
176 for (RoleMemberBo roleMember : roleMembers) {
177 if (!StringUtils.isEmpty(roleMember.getId())) {
178 oldRoleMembers.add(roleMember);
179 } else {
180 newRoleMembers.add(roleMember);
181 }
182 }
183
184 for (RoleMemberBo newRoleMember : newRoleMembers) {
185 for (RoleMemberBo oldRoleMember : oldRoleMembers) {
186 if (StringUtils.equals(newRoleMember.getRoleId(), oldRoleMember.getRoleId())
187 && StringUtils.equals(newRoleMember.getMemberId(), oldRoleMember.getMemberId()) ) {
188 DepartmentPrincipalRoleMemberBo.Builder builder = DepartmentPrincipalRoleMemberBo.Builder.create(oldRoleMember);
189 builder.setActiveToDate(DateTime.now());
190
191 inactiveRoleMembers.add(builder.build());
192 }
193 }
194 }
195
196 return inactiveRoleMembers;
197 }
198
199 @Override
200 public Map<String, String> populateNewCollectionLines(Map<String, String> fieldValues,
201 MaintenanceDocument maintenanceDocument, String methodToCall) {
202 if(fieldValues.containsKey("roleMembers.roleName") && StringUtils.isEmpty(fieldValues.get("roleMembers.roleName"))) {
203 fieldValues.put("roleMembers.roleName", null);
204 }
205 return super.populateNewCollectionLines(fieldValues, maintenanceDocument, methodToCall);
206 }
207 }