001 /**
002 * Copyright 2004-2013 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.hr.time.workarea;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.hr.time.HrBusinessObject;
020 import org.kuali.hr.time.position.Position;
021 import org.kuali.hr.time.roles.TkRole;
022 import org.kuali.hr.time.service.base.TkServiceLocator;
023 import org.kuali.hr.time.task.Task;
024 import org.kuali.hr.time.util.HrBusinessObjectMaintainableImpl;
025 import org.kuali.hr.time.util.TKContext;
026 import org.kuali.rice.kim.api.identity.principal.Principal;
027 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
028 import org.kuali.rice.kns.document.MaintenanceDocument;
029 import org.kuali.rice.kns.maintenance.Maintainable;
030 import org.kuali.rice.kns.web.ui.Section;
031 import org.kuali.rice.krad.bo.PersistableBusinessObject;
032 import org.kuali.rice.krad.util.GlobalVariables;
033 import org.kuali.rice.krad.util.KRADConstants;
034
035 import java.sql.Timestamp;
036 import java.util.ArrayList;
037 import java.util.List;
038 import java.util.Map;
039
040 public class WorkAreaMaintainableImpl extends HrBusinessObjectMaintainableImpl {
041
042 private static final long serialVersionUID = 6264585236631982347L;
043
044 @Override
045 protected void setNewCollectionLineDefaultValues(String arg0,
046 PersistableBusinessObject arg1) {
047 WorkArea workArea = (WorkArea) this.getBusinessObject();
048 if (arg1 instanceof TkRole) {
049 TkRole role = (TkRole) arg1;
050 role.setEffectiveDate(workArea.getEffectiveDate());
051 } else if (arg1 instanceof Task) {
052 Task task = (Task) arg1;
053 task.setEffectiveDate(workArea.getEffectiveDate());
054 }
055 super.setNewCollectionLineDefaultValues(arg0, arg1);
056 }
057
058 @Override
059 public PersistableBusinessObject getNewCollectionLine(String collectionName) {
060 return super.getNewCollectionLine(collectionName); //To change body of overridden methods use File | Settings | File Templates.
061 }
062
063 @Override
064 public void addNewLineToCollection(String collectionName) {
065 if (collectionName.equals("roles")) {
066 TkRole aRole = (TkRole)newCollectionLines.get(collectionName );
067 if ( aRole != null ) {
068 if(!StringUtils.isEmpty(aRole.getPrincipalId()) && !StringUtils.isEmpty(aRole.getPositionNumber())) {
069 GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.MAINTENANCE_NEW_MAINTAINABLE +"roles",
070 "error.role.principalId.positonNumber", aRole.getPrincipalId());
071 return;
072 }
073 if(aRole.getPrincipalId() != null && !aRole.getPrincipalId().isEmpty()) {
074 Principal aPerson = KimApiServiceLocator.getIdentityService().getPrincipal(aRole.getPrincipalId());
075 if(aPerson == null) {
076 GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.MAINTENANCE_NEW_MAINTAINABLE +"roles",
077 "error.role.person.notexist", aRole.getPrincipalId());
078 return;
079 }
080 }
081 if(aRole.getPositionNumber() != null && !aRole.getPositionNumber().isEmpty()) {
082 Position aPositon = TkServiceLocator.getPositionService().getPosition(aRole.getPositionNumber(), aRole.getEffectiveDate());
083 if(aPositon == null) {
084 GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.MAINTENANCE_NEW_MAINTAINABLE +"roles",
085 "error.role.position.notexist", aRole.getPositionNumber());
086 return;
087 }
088 }
089 }
090 }
091 super.addNewLineToCollection(collectionName);
092 }
093
094 @Override
095 public void processAfterEdit(MaintenanceDocument document,
096 Map<String, String[]> parameters) {
097 WorkArea waOld = (WorkArea) document.getOldMaintainableObject()
098 .getBusinessObject();
099 WorkArea waNew = (WorkArea) document.getNewMaintainableObject()
100 .getBusinessObject();
101
102 List<TkRole> positionRoles = TkServiceLocator.getTkRoleService().getPositionRolesForWorkArea(waOld.getWorkArea(), waOld.getEffectiveDate());
103 TkServiceLocator.getWorkAreaService().populateWorkAreaTasks(waOld);
104 TkServiceLocator.getWorkAreaService().populateWorkAreaRoles(waOld);
105 waOld.getRoles().addAll(positionRoles);
106
107 TkServiceLocator.getWorkAreaService().populateWorkAreaTasks(waNew);
108 TkServiceLocator.getWorkAreaService().populateWorkAreaRoles(waNew);
109 waNew.getRoles().addAll(positionRoles);
110 super.processAfterEdit(document, parameters);
111 }
112
113 @SuppressWarnings("rawtypes")
114 @Override
115 public List getSections(MaintenanceDocument document,
116 Maintainable oldMaintainable) {
117 List sections = super.getSections(document, oldMaintainable);
118 for (Object obj : sections) {
119 Section sec = (Section) obj;
120 if (document.isOldBusinessObjectInDocument()
121 && sec.getSectionId().equals("inactiveRoles")) {
122 sec.setHidden(false);
123 } else if (!document.isOldBusinessObjectInDocument()
124 && sec.getSectionId().equals("inactiveRoles")) {
125 sec.setHidden(true);
126 }
127 }
128 return sections;
129 }
130
131 @Override
132 public HrBusinessObject getObjectById(String id) {
133 return TkServiceLocator.getWorkAreaService().getWorkArea(id);
134 }
135
136 @Override
137 public void customSaveLogic(HrBusinessObject hrObj) {
138 WorkArea workArea = (WorkArea) hrObj;
139
140 List<TkRole> roles = new ArrayList<TkRole>();
141 roles.addAll(workArea.getRoles());
142 roles.addAll(workArea.getInactiveRoles());
143 roles.addAll(createInactiveRoles(workArea.getRoles()));
144
145 for (TkRole role : roles) {
146 role.setWorkAreaObj(workArea);
147 role.setUserPrincipalId(TKContext.getPrincipalId());
148 }
149 workArea.setRoles(roles);
150
151 TkServiceLocator.getTkRoleService().saveOrUpdate(roles);
152
153 List<Task> tasks = workArea.getTasks();
154 for (Task task : tasks) {
155 task.setTkTaskId(null);
156 task.setTimestamp(new Timestamp(System.currentTimeMillis()));
157 }
158 workArea.setTasks(tasks);
159
160 TkServiceLocator.getTaskService().saveTasks(tasks);
161 }
162
163 private List<TkRole> createInactiveRoles(List<TkRole> activeRoles) {
164 List<TkRole> inactiveRoles = new ArrayList<TkRole>();
165
166 List<TkRole> oldRoles = new ArrayList<TkRole>();
167 List<TkRole> newRoles = new ArrayList<TkRole>();
168 for (TkRole activeRole : activeRoles) {
169 if (!StringUtils.isEmpty(activeRole.getHrRolesId())) {
170 oldRoles.add(activeRole);
171 } else {
172 newRoles.add(activeRole);
173 }
174 }
175
176 for (TkRole newRole : newRoles) {
177 for (TkRole oldRole : oldRoles) {
178 if (StringUtils.equals(newRole.getRoleName(), oldRole.getRoleName())
179 && StringUtils.equals(newRole.getPrincipalId(), oldRole.getPrincipalId())
180 && StringUtils.equals(newRole.getPositionNumber(), oldRole.getPositionNumber())) {
181
182 TkRole newInactiveRole = new TkRole();
183 newInactiveRole.setPrincipalId(oldRole.getPrincipalId());
184 newInactiveRole.setRoleName(oldRole.getRoleName());
185 newInactiveRole.setWorkArea(oldRole.getWorkArea());
186 newInactiveRole.setDepartment(oldRole.getDepartment());
187 newInactiveRole.setChart(oldRole.getChart());
188 newInactiveRole.setHrDeptId(oldRole.getHrDeptId());
189 newInactiveRole.setPositionNumber(oldRole.getPositionNumber());
190 newInactiveRole.setExpirationDate(oldRole.getExpirationDate());
191 newInactiveRole.setEffectiveDate(newRole.getEffectiveDate());
192 newInactiveRole.setTimestamp(new Timestamp(System.currentTimeMillis()));
193 newInactiveRole.setUserPrincipalId(TKContext.getPrincipalId());
194 newInactiveRole.setActive(false);
195
196 inactiveRoles.add(newInactiveRole);
197 }
198 }
199 }
200
201 return inactiveRoles;
202 }
203
204 @Override
205 public void processAfterNew(MaintenanceDocument document,
206 Map<String, String[]> parameters) {
207 WorkArea workArea = (WorkArea) this.getBusinessObject();
208 if (workArea.getWorkArea() == null) {
209 workArea.setWorkArea(TkServiceLocator.getWorkAreaService().getNextWorkAreaKey());
210 }
211 super.processAfterNew(document, parameters);
212 }
213
214 }