001 /** 002 * Copyright 2004-2012 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 java.sql.Timestamp; 019 import java.util.ArrayList; 020 import java.util.List; 021 import java.util.Map; 022 023 import org.apache.commons.lang.StringUtils; 024 import org.kuali.hr.core.cache.CacheUtils; 025 import org.kuali.hr.time.HrBusinessObject; 026 import org.kuali.hr.time.position.Position; 027 import org.kuali.hr.time.roles.TkRole; 028 import org.kuali.hr.time.service.base.TkServiceLocator; 029 import org.kuali.hr.time.task.Task; 030 import org.kuali.hr.time.util.HrBusinessObjectMaintainableImpl; 031 import org.kuali.hr.time.util.TKContext; 032 import org.kuali.hr.time.util.TKUtils; 033 import org.kuali.rice.kim.api.identity.Person; 034 import org.kuali.rice.kim.api.services.KimApiServiceLocator; 035 import org.kuali.rice.kns.document.MaintenanceDocument; 036 import org.kuali.rice.kns.maintenance.Maintainable; 037 import org.kuali.rice.kns.web.ui.Section; 038 import org.kuali.rice.krad.bo.PersistableBusinessObject; 039 import org.kuali.rice.krad.service.KRADServiceLocator; 040 import org.kuali.rice.krad.util.GlobalVariables; 041 import org.kuali.rice.krad.util.KRADConstants; 042 043 public class WorkAreaMaintainableImpl extends HrBusinessObjectMaintainableImpl { 044 045 private static final long serialVersionUID = 6264585236631982347L; 046 047 @Override 048 protected void setNewCollectionLineDefaultValues(String arg0, 049 PersistableBusinessObject arg1) { 050 WorkArea workArea = (WorkArea) this.getBusinessObject(); 051 if (arg1 instanceof TkRole) { 052 TkRole role = (TkRole) arg1; 053 role.setEffectiveDate(workArea.getEffectiveDate()); 054 } else if (arg1 instanceof Task) { 055 Task task = (Task) arg1; 056 task.setEffectiveDate(workArea.getEffectiveDate()); 057 } 058 super.setNewCollectionLineDefaultValues(arg0, arg1); 059 } 060 061 @Override 062 public PersistableBusinessObject getNewCollectionLine(String collectionName) { 063 return super.getNewCollectionLine(collectionName); //To change body of overridden methods use File | Settings | File Templates. 064 } 065 066 @Override 067 public void addNewLineToCollection(String collectionName) { 068 if (collectionName.equals("roles")) { 069 TkRole aRole = (TkRole)newCollectionLines.get(collectionName ); 070 if ( aRole != null ) { 071 if(!StringUtils.isEmpty(aRole.getPrincipalId()) && !StringUtils.isEmpty(aRole.getPositionNumber())) { 072 GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.MAINTENANCE_NEW_MAINTAINABLE +"roles", 073 "error.role.principalId.positonNumber", aRole.getPrincipalId()); 074 return; 075 } 076 if(aRole.getPrincipalId() != null && !aRole.getPrincipalId().isEmpty()) { 077 Person aPerson = KimApiServiceLocator.getPersonService().getPerson(aRole.getPrincipalId()); 078 if(aPerson == null) { 079 GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.MAINTENANCE_NEW_MAINTAINABLE +"roles", 080 "error.role.person.notexist", aRole.getPrincipalId()); 081 return; 082 } 083 } 084 if(aRole.getPositionNumber() != null && !aRole.getPositionNumber().isEmpty()) { 085 Position aPositon = TkServiceLocator.getPositionService().getPositionByPositionNumber(aRole.getPositionNumber()); 086 if(aPositon == null) { 087 GlobalVariables.getMessageMap().putErrorWithoutFullErrorPath(KRADConstants.MAINTENANCE_NEW_MAINTAINABLE +"roles", 088 "error.role.position.notexist", aRole.getPositionNumber()); 089 return; 090 } 091 } 092 } 093 } 094 super.addNewLineToCollection(collectionName); 095 } 096 097 @Override 098 public void processAfterEdit(MaintenanceDocument document, 099 Map<String, String[]> parameters) { 100 WorkArea waOld = (WorkArea) document.getOldMaintainableObject() 101 .getBusinessObject(); 102 WorkArea waNew = (WorkArea) document.getNewMaintainableObject() 103 .getBusinessObject(); 104 105 List<TkRole> positionRoles = TkServiceLocator.getTkRoleService().getPositionRolesForWorkArea(waOld.getWorkArea(), waOld.getEffectiveDate()); 106 TkServiceLocator.getWorkAreaService().populateWorkAreaRoles(waOld); 107 waOld.getRoles().addAll(positionRoles); 108 109 TkServiceLocator.getWorkAreaService().populateWorkAreaRoles(waNew); 110 waNew.getRoles().addAll(positionRoles); 111 super.processAfterEdit(document, parameters); 112 } 113 114 @SuppressWarnings("rawtypes") 115 @Override 116 public List getSections(MaintenanceDocument document, 117 Maintainable oldMaintainable) { 118 List sections = super.getSections(document, oldMaintainable); 119 for (Object obj : sections) { 120 Section sec = (Section) obj; 121 if (document.isOldBusinessObjectInDocument() 122 && sec.getSectionId().equals("inactiveRoles")) { 123 sec.setHidden(false); 124 } else if (!document.isOldBusinessObjectInDocument() 125 && sec.getSectionId().equals("inactiveRoles")) { 126 sec.setHidden(true); 127 } 128 } 129 return sections; 130 } 131 132 @Override 133 public HrBusinessObject getObjectById(String id) { 134 return TkServiceLocator.getWorkAreaService().getWorkArea(id); 135 } 136 137 @Override 138 public void customSaveLogic(HrBusinessObject hrObj) { 139 WorkArea workArea = (WorkArea) hrObj; 140 List<TkRole> roles = workArea.getRoles(); 141 List<TkRole> rolesCopy = new ArrayList<TkRole>(); 142 rolesCopy.addAll(roles); 143 if (workArea.getInactiveRoles() != null 144 && workArea.getInactiveRoles().size() > 0) { 145 for (TkRole role : workArea.getInactiveRoles()) { 146 roles.add(role); 147 } 148 } 149 List<Task> tasks = workArea.getTasks(); 150 for (Task task : tasks) { 151 task.setTkTaskId(null); 152 task.setTimestamp(new Timestamp(System.currentTimeMillis())); 153 } 154 workArea.setTasks(tasks); 155 workArea.setRoles(roles); 156 for (TkRole role : roles) { 157 role.setWorkAreaObj(workArea); 158 //Be sure department is not set for current state of role query 159 role.setDepartment(null); 160 role.setUserPrincipalId(TKContext.getPrincipalId()); 161 } 162 TkServiceLocator.getTkRoleService().saveOrUpdate(roles); 163 } 164 165 @Override 166 public void processAfterNew(MaintenanceDocument document, 167 Map<String, String[]> parameters) { 168 WorkArea workArea = (WorkArea) this.getBusinessObject(); 169 if (workArea.getWorkArea() == null) { 170 workArea.setWorkArea(TkServiceLocator.getWorkAreaService().getNextWorkAreaKey()); 171 } 172 super.processAfterNew(document, parameters); 173 } 174 175 @Override 176 public void saveBusinessObject() { 177 HrBusinessObject hrObj = (HrBusinessObject) this.getBusinessObject(); 178 customSaveLogic(hrObj); 179 if(hrObj.getId()!=null){ 180 HrBusinessObject oldHrObj = this.getObjectById(hrObj.getId()); 181 if(oldHrObj!= null){ 182 //if the effective dates are the same do not create a new row just inactivate the old one 183 if(hrObj.getEffectiveDate().equals(oldHrObj.getEffectiveDate())){ 184 oldHrObj.setActive(false); 185 oldHrObj.setTimestamp(TKUtils.subtractOneSecondFromTimestamp(new Timestamp(TKUtils.getCurrentDate().getTime()))); 186 } else{ 187 //if effective dates not the same add a new row that inactivates the old entry based on the new effective date 188 oldHrObj.setTimestamp(TKUtils.subtractOneSecondFromTimestamp(new Timestamp(TKUtils.getCurrentDate().getTime()))); 189 oldHrObj.setEffectiveDate(hrObj.getEffectiveDate()); 190 oldHrObj.setActive(false); 191 oldHrObj.setId(null); 192 } 193 KRADServiceLocator.getBusinessObjectService().save(oldHrObj); 194 } 195 } 196 hrObj.setTimestamp(new Timestamp(System.currentTimeMillis())); 197 hrObj.setId(null); 198 199 KRADServiceLocator.getBusinessObjectService().save(hrObj); 200 CacheUtils.flushCache(WorkArea.CACHE_NAME); 201 } 202 203 }