View Javadoc

1   /**
2    * Copyright 2004-2013 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.hr.time.workarea;
17  
18  import java.sql.Timestamp;
19  import java.util.ArrayList;
20  import java.util.List;
21  import java.util.Map;
22  
23  import org.apache.commons.lang.StringUtils;
24  import org.kuali.hr.time.HrBusinessObject;
25  import org.kuali.hr.time.position.Position;
26  import org.kuali.hr.time.roles.TkRole;
27  import org.kuali.hr.time.service.base.TkServiceLocator;
28  import org.kuali.hr.time.task.Task;
29  import org.kuali.hr.time.util.HrBusinessObjectMaintainableImpl;
30  import org.kuali.hr.time.util.TKContext;
31  import org.kuali.rice.kim.api.identity.Person;
32  import org.kuali.rice.kim.api.services.KimApiServiceLocator;
33  import org.kuali.rice.kns.document.MaintenanceDocument;
34  import org.kuali.rice.kns.maintenance.Maintainable;
35  import org.kuali.rice.kns.web.ui.Section;
36  import org.kuali.rice.krad.bo.PersistableBusinessObject;
37  import org.kuali.rice.krad.util.GlobalVariables;
38  import org.kuali.rice.krad.util.KRADConstants;
39  
40  public class WorkAreaMaintainableImpl extends HrBusinessObjectMaintainableImpl {
41  
42      private static final long serialVersionUID = 6264585236631982347L;
43  
44      @Override
45      protected void setNewCollectionLineDefaultValues(String arg0,
46                                                       PersistableBusinessObject arg1) {
47          WorkArea workArea = (WorkArea) this.getBusinessObject();
48          if (arg1 instanceof TkRole) {
49              TkRole role = (TkRole) arg1;
50              role.setEffectiveDate(workArea.getEffectiveDate());
51          } else if (arg1 instanceof Task) {
52              Task task = (Task) arg1;
53              task.setEffectiveDate(workArea.getEffectiveDate());
54          }
55          super.setNewCollectionLineDefaultValues(arg0, arg1);
56      }
57  
58      @Override
59      public PersistableBusinessObject getNewCollectionLine(String collectionName) {
60          return super.getNewCollectionLine(collectionName);    //To change body of overridden methods use File | Settings | File Templates.
61      }
62  
63      @Override
64      public void addNewLineToCollection(String collectionName) {
65          if (collectionName.equals("roles")) {
66              TkRole aRole = (TkRole)newCollectionLines.get(collectionName );
67              if ( aRole != null ) {
68                  if(!StringUtils.isEmpty(aRole.getPrincipalId()) && !StringUtils.isEmpty(aRole.getPositionNumber())) {
69                      GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.MAINTENANCE_NEW_MAINTAINABLE +"roles",
70              				"error.role.principalId.positonNumber", aRole.getPrincipalId());
71                      return;
72                  }
73                  if(aRole.getPrincipalId() != null && !aRole.getPrincipalId().isEmpty()) {
74                      Person aPerson = KimApiServiceLocator.getPersonService().getPerson(aRole.getPrincipalId());
75                      if(aPerson == null) {
76                          GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.MAINTENANCE_NEW_MAINTAINABLE +"roles",
77                                  "error.role.person.notexist", aRole.getPrincipalId());
78                          return;
79                      }
80                  }
81                  if(aRole.getPositionNumber() != null && !aRole.getPositionNumber().isEmpty()) {
82                      Position aPositon = TkServiceLocator.getPositionService().getPositionByPositionNumber(aRole.getPositionNumber());
83                      if(aPositon == null) {
84                          GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.MAINTENANCE_NEW_MAINTAINABLE +"roles",
85                                  "error.role.position.notexist", aRole.getPositionNumber());
86                          return;
87                      }
88                  }
89              }
90          }
91          super.addNewLineToCollection(collectionName);
92      }
93  
94      @Override
95      public void processAfterEdit(MaintenanceDocument document,
96                                   Map<String, String[]> parameters) {
97          WorkArea waOld = (WorkArea) document.getOldMaintainableObject()
98                  .getBusinessObject();
99          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 }