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.earncode.service; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.kuali.hr.earncodesec.EarnCodeSecurity; 020 import org.kuali.hr.earncodesec.EarnCodeType; 021 import org.kuali.hr.job.Job; 022 import org.kuali.hr.time.assignment.Assignment; 023 import org.kuali.hr.time.earncode.EarnCode; 024 import org.kuali.hr.time.earncode.dao.EarnCodeDao; 025 import org.kuali.hr.time.roles.TkUserRoles; 026 import org.kuali.hr.time.service.base.TkServiceLocator; 027 import org.kuali.hr.time.util.TKContext; 028 import org.kuali.hr.time.util.TKUser; 029 import org.kuali.hr.time.workarea.WorkArea; 030 import org.kuali.rice.krad.util.GlobalVariables; 031 032 import java.sql.Date; 033 import java.util.*; 034 035 public class EarnCodeServiceImpl implements EarnCodeService { 036 037 private EarnCodeDao earnCodeDao; 038 039 public void setEarnCodeDao(EarnCodeDao earnCodeDao) { 040 this.earnCodeDao = earnCodeDao; 041 } 042 043 044 @Override 045 public List<EarnCode> getEarnCodes(Assignment a, Date asOfDate) { 046 return getEarnCodesForTime(a, asOfDate); 047 } 048 049 @Override 050 public List<EarnCode> getEarnCodes(Assignment a, Date asOfDate, String earnTypeCode) { 051 List<EarnCode> earnCodes = new LinkedList<EarnCode>(); 052 053 // Note: https://jira.kuali.org/browse/KPME-689 054 // We are grabbing a TkUser from the current thread local context here. 055 // really, this should probably be passed in.. 056 057 TKUser user = TKContext.getUser(); 058 if (user == null) { 059 // TODO: Determine how to fail if there is no TkUser 060 throw new RuntimeException("No User on context."); 061 } 062 063 if (a == null) 064 throw new RuntimeException("Can not get earn codes for null assignment"); 065 Job job = a.getJob(); 066 if (job == null || job.getPayTypeObj() == null) 067 throw new RuntimeException("Null job/job paytype on assignment!"); 068 069 EarnCode regularEc = getEarnCode(job.getPayTypeObj().getRegEarnCode(), asOfDate); 070 if (regularEc == null) 071 throw new RuntimeException("No regular earn code defined."); 072 earnCodes.add(regularEc); 073 List<EarnCodeSecurity> decs = TkServiceLocator.getEarnCodeSecurityService().getEarnCodeSecurities(job.getDept(), job.getHrSalGroup(), job.getLocation(), asOfDate); 074 for (EarnCodeSecurity dec : decs) { 075 if (StringUtils.isBlank(earnTypeCode) 076 || earnTypeCode.equals(dec.getEarnCodeType()) 077 ) { 078 079 boolean addEarnCode = false; 080 // Check employee flag 081 if (dec.isEmployee() && 082 (StringUtils.equals(TKUser.getCurrentTargetPerson().getEmployeeId(), GlobalVariables.getUserSession().getPerson().getEmployeeId()))) { 083 addEarnCode = true; 084 } 085 // Check approver flag 086 if (!addEarnCode && dec.isApprover()) { 087 Set<Long> workAreas = TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).getApproverWorkAreas(); 088 for (Long wa : workAreas) { 089 WorkArea workArea = TkServiceLocator.getWorkAreaService().getWorkArea(wa, asOfDate); 090 if (workArea!= null && a.getWorkArea().compareTo(workArea.getWorkArea())==0) { 091 addEarnCode = true; 092 break; 093 } 094 } 095 } 096 if (addEarnCode) { 097 EarnCode ec = getEarnCode(dec.getEarnCode(), asOfDate); 098 if(ec!=null){ 099 earnCodes.add(ec); 100 } 101 } 102 } 103 } 104 105 return earnCodes; 106 } 107 108 public EarnCode getEarnCode(String earnCode, Date asOfDate) { 109 EarnCode ec = null; 110 111 ec = earnCodeDao.getEarnCode(earnCode, asOfDate); 112 113 return ec; 114 } 115 116 @Override 117 public String getEarnCodeType(String earnCode, Date asOfDate) { 118 EarnCode earnCodeObj = getEarnCode(earnCode, asOfDate); 119 return earnCodeObj.getEarnCodeType(); 120 } 121 122 @Override 123 public EarnCode getEarnCodeById(String earnCodeId) { 124 return earnCodeDao.getEarnCodeById(earnCodeId); 125 } 126 127 public List<EarnCode> getOvertimeEarnCodes(Date asOfDate){ 128 return earnCodeDao.getOvertimeEarnCodes(asOfDate); 129 } 130 131 public List<String> getOvertimeEarnCodesStrs(Date asOfDate){ 132 List<String> ovtEarnCodeStrs = new ArrayList<String>(); 133 List<EarnCode> ovtEarnCodes = getOvertimeEarnCodes(asOfDate); 134 if(ovtEarnCodes != null){ 135 for(EarnCode ovtEc : ovtEarnCodes){ 136 ovtEarnCodeStrs.add(ovtEc.getEarnCode()); 137 } 138 } 139 return ovtEarnCodeStrs; 140 } 141 142 @Override 143 public int getEarnCodeCount(String earnCode) { 144 return earnCodeDao.getEarnCodeCount(earnCode); 145 } 146 147 @Override 148 public int getNewerEarnCodeCount(String earnCode, Date effdt) { 149 return earnCodeDao.getNewerEarnCodeCount(earnCode, effdt); 150 } 151 152 @Override 153 public List<EarnCode> getEarnCodes(String earnCode, String ovtEarnCode, String descr, Date fromEffdt, Date toEffdt, String active, String showHist) { 154 return earnCodeDao.getEarnCodes(earnCode, ovtEarnCode, descr, fromEffdt, toEffdt, active, showHist); 155 } 156 157 158 public List<EarnCode> getEarnCodesForTime(Assignment a, Date asOfDate) { 159 // code moved over from earncodeservice in kpme 1.5 160 if (a == null) throw new RuntimeException("No assignment parameter."); 161 Job job = a.getJob(); 162 if (job == null || job.getPayTypeObj() == null) throw new RuntimeException("Null job or null job pay type on assignment."); 163 164 List<EarnCode> earnCodes = new LinkedList<EarnCode>(); 165 String earnTypeCode = EarnCodeType.TIME.getCode(); 166 167 boolean isClockUser = a.getTimeCollectionRule().isClockUserFl(); 168 boolean isUsersTimesheet = StringUtils.equals(TKContext.getPrincipalId(),a.getPrincipalId()); 169 170 // Reg earn codes will typically not be defined in the earn code security table 171 EarnCode regularEarnCode = getEarnCode(job.getPayTypeObj().getRegEarnCode(), asOfDate); 172 if (regularEarnCode == null) { 173 throw new RuntimeException("No regular earn code defined for job pay type."); 174 } else { 175 // if you are a clock user and this is your timesheet and you are processing the reg earn code, do not add this earn code. Use the clock in/out mechanism. 176 if (isClockUser && isUsersTimesheet) { 177 // do not add reg earn code. use clock. 178 } else { 179 earnCodes.add(regularEarnCode); 180 } 181 } 182 List<EarnCodeSecurity> decs = TkServiceLocator.getEarnCodeSecurityService().getEarnCodeSecurities(job.getDept(), job.getHrSalGroup(), job.getLocation(), asOfDate); 183 for (EarnCodeSecurity dec : decs) { 184 if (earnTypeCode.equals(dec.getEarnCodeType()) 185 || EarnCodeType.BOTH.getCode().equals(dec.getEarnCodeType())) { 186 187 boolean addEarnCode = addEarnCodeBasedOnEmployeeApproverSettings(dec, a, asOfDate); 188 // this earn code could possibly be for reg earnings. reg was processed before the earn code security table of earn codes, so it should be skipped here. 189 if ( StringUtils.equals(job.getPayTypeObj().getRegEarnCode(),dec.getEarnCode()) ){ 190 addEarnCode = false; 191 } 192 if (!dec.isEmployee()){ 193 addEarnCode = false; 194 } 195 if (addEarnCode) { 196 EarnCode ec = getEarnCode(dec.getEarnCode(), asOfDate); 197 if(ec!=null){ 198 earnCodes.add(ec); 199 } 200 } 201 } 202 } 203 204 return earnCodes; 205 // if (a == null) throw new RuntimeException("No assignment parameter."); 206 // Job job = a.getJob(); 207 // if (job == null || job.getPayTypeObj() == null) throw new RuntimeException("Null job or null job pay type on assignment."); 208 // 209 // List<EarnCode> earnCodes = new LinkedList<EarnCode>(); 210 // 211 // EarnCode regularEarnCode = getEarnCode(job.getPayTypeObj().getRegEarnCode(), asOfDate); 212 // if (regularEarnCode == null) { 213 // throw new RuntimeException("No regular earn code defined for job pay type."); 214 // } else { 215 // earnCodes.add(regularEarnCode); 216 // } 217 // List<EarnCodeSecurity> decs = TkServiceLocator.getEarnCodeSecurityService().getEarnCodeSecurities(job.getDept(), job.getHrSalGroup(), job.getLocation(), asOfDate); 218 // for (EarnCodeSecurity dec : decs) { 219 // boolean addEarnCode = false; 220 // // Check employee flag 221 // if (dec.isEmployee() && 222 // (StringUtils.equals(TKUser.getCurrentTargetPerson().getEmployeeId(), GlobalVariables.getUserSession().getPerson().getEmployeeId()))) { 223 // addEarnCode = true; 224 // } 225 // // Check approver flag 226 // if (!addEarnCode && dec.isApprover()) { 227 // Set<Long> workAreas = TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).getApproverWorkAreas(); 228 // for (Long wa : workAreas) { 229 // WorkArea workArea = TkServiceLocator.getWorkAreaService().getWorkArea(wa, asOfDate); 230 // if (workArea!= null && a.getWorkArea().compareTo(workArea.getWorkArea())==0) { 231 // addEarnCode = true; 232 // break; 233 // } 234 // } 235 // } 236 // if (addEarnCode) { 237 // EarnCode ec = getEarnCode(dec.getEarnCode(), asOfDate); 238 // if(ec!=null){ 239 // earnCodes.add(ec); 240 // } 241 // } 242 // } 243 // return earnCodes; 244 } 245 246 private boolean addEarnCodeBasedOnEmployeeApproverSettings(EarnCodeSecurity security, Assignment a, Date asOfDate) { 247 boolean addEarnCode = false; 248 if (security.isEmployee() && 249 (StringUtils.equals(TKUser.getCurrentTargetPerson().getEmployeeId(), GlobalVariables.getUserSession().getPerson().getEmployeeId()))) { 250 addEarnCode = true; 251 } 252 // Check approver flag 253 if (!addEarnCode && security.isApprover()) { 254 Set<Long> workAreas = TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).getApproverWorkAreas(); 255 for (Long wa : workAreas) { 256 WorkArea workArea = TkServiceLocator.getWorkAreaService().getWorkArea(wa, asOfDate); 257 if (workArea!= null && a.getWorkArea().compareTo(workArea.getWorkArea())==0) { 258 addEarnCode = true; 259 break; 260 } 261 } 262 } 263 return addEarnCode; 264 } 265 266 /* not using yet, may not be needed 267 @Override 268 public Map<String, String> getEarnCod e s ForDisplayWithAssignment(Assignment assignment, Date asOfDate) { 269 List<EarnCode> earnCodes = this.getEarnCod e s ( assignment, asOfDate); 270 271 Date currentDate = TKUtils.getCurrentDate(); 272 boolean futureDate = asOfDate.after(currentDate); 273 List<EarnCode> copyList = new ArrayList<EarnCode>(); 274 copyList.addAll(earnCodes); 275 for (EarnCode earnCode : copyList) { 276 if ( futureDate 277 && !earnCode.getAllowScheduledLeave().equalsIgnoreCase("Y")) { 278 earnCodes.remove(earnCode); 279 } 280 } 281 Comparator<EarnCode> earnCodeComparator = new Comparator<EarnCode>() { 282 @Override 283 public int compare(EarnCode ec1, EarnCode ec2) { 284 return ec1.getEarnCode().compareToIgnoreCase(ec2.getEarnCode()); 285 } 286 }; 287 // Order by leaveCode ascending 288 Ordering<EarnCode> ordering = Ordering.from(earnCodeComparator); 289 290 Map<String, String> earnCodesForDisplay = new LinkedHashMap<String, String>(); 291 for (EarnCode earnCode : ordering.sortedCopy(earnCodes)) { 292 earnCodesForDisplay.put(earnCode.getEarnCodeKeyForDisplay(), earnCode.getEarnCodeValueForDisplay()); 293 } 294 return earnCodesForDisplay; 295 } 296 297 */ 298 }