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.earncode.service;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.hr.earncodesec.EarnCodeSecurity;
020 import org.kuali.hr.job.Job;
021 import org.kuali.hr.time.assignment.Assignment;
022 import org.kuali.hr.time.earncode.EarnCode;
023 import org.kuali.hr.time.earncode.dao.EarnCodeDao;
024 import org.kuali.hr.time.roles.TkUserRoles;
025 import org.kuali.hr.time.service.base.TkServiceLocator;
026 import org.kuali.hr.time.util.TKContext;
027 import org.kuali.hr.time.util.TKUser;
028 import org.kuali.hr.time.workarea.WorkArea;
029 import org.kuali.rice.krad.util.GlobalVariables;
030
031 import java.sql.Date;
032 import java.util.*;
033
034 public class EarnCodeServiceImpl implements EarnCodeService {
035
036 private EarnCodeDao earnCodeDao;
037
038 public void setEarnCodeDao(EarnCodeDao earnCodeDao) {
039 this.earnCodeDao = earnCodeDao;
040 }
041
042
043 @Override
044 public List<EarnCode> getEarnCodes(Assignment a, Date asOfDate) {
045 return getEarnCodes(a, asOfDate, null);
046 }
047
048 @Override
049 public List<EarnCode> getEarnCodes(Assignment a, Date asOfDate, String earnTypeCode) {
050 List<EarnCode> earnCodes = new LinkedList<EarnCode>();
051
052 // Note: https://jira.kuali.org/browse/KPME-689
053 // We are grabbing a TkUser from the current thread local context here.
054 // really, this should probably be passed in..
055
056 TKUser user = TKContext.getUser();
057 if (user == null) {
058 // TODO: Determine how to fail if there is no TkUser
059 throw new RuntimeException("No User on context.");
060 }
061
062 if (a == null)
063 throw new RuntimeException("Can not get earn codes for null assignment");
064 Job job = a.getJob();
065 if (job == null || job.getPayTypeObj() == null)
066 throw new RuntimeException("Null job/job paytype on assignment!");
067
068 EarnCode regularEc = getEarnCode(job.getPayTypeObj().getRegEarnCode(), asOfDate);
069 if (regularEc == null)
070 throw new RuntimeException("No regular earn code defined.");
071 earnCodes.add(regularEc);
072 List<EarnCodeSecurity> decs = TkServiceLocator.getEarnCodeSecurityService().getEarnCodeSecurities(job.getDept(), job.getHrSalGroup(), job.getLocation(), asOfDate);
073 for (EarnCodeSecurity dec : decs) {
074 if (StringUtils.isBlank(earnTypeCode)
075 || earnTypeCode.equals(dec.getEarnCodeType())
076 ) {
077
078 boolean addEarnCode = false;
079 // Check employee flag
080 if (dec.isEmployee() &&
081 (StringUtils.equals(TKUser.getCurrentTargetPerson().getEmployeeId(), GlobalVariables.getUserSession().getPerson().getEmployeeId()))) {
082 addEarnCode = true;
083 }
084 // Check approver flag
085 if (!addEarnCode && dec.isApprover()) {
086 Set<Long> workAreas = TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).getApproverWorkAreas();
087 for (Long wa : workAreas) {
088 WorkArea workArea = TkServiceLocator.getWorkAreaService().getWorkArea(wa, asOfDate);
089 if (workArea!= null && a.getWorkArea().compareTo(workArea.getWorkArea())==0) {
090 addEarnCode = true;
091 break;
092 }
093 }
094 }
095 if (addEarnCode) {
096 EarnCode ec = getEarnCode(dec.getEarnCode(), asOfDate);
097 if(ec!=null){
098 earnCodes.add(ec);
099 }
100 }
101 }
102 }
103
104 return earnCodes;
105 }
106
107 public EarnCode getEarnCode(String earnCode, Date asOfDate) {
108 EarnCode ec = null;
109
110 ec = earnCodeDao.getEarnCode(earnCode, asOfDate);
111
112 return ec;
113 }
114
115 @Override
116 public String getEarnCodeType(String earnCode, Date asOfDate) {
117 EarnCode earnCodeObj = getEarnCode(earnCode, asOfDate);
118 return earnCodeObj.getEarnCodeType();
119 }
120
121 @Override
122 public EarnCode getEarnCodeById(String earnCodeId) {
123 return earnCodeDao.getEarnCodeById(earnCodeId);
124 }
125
126 public List<EarnCode> getOvertimeEarnCodes(Date asOfDate){
127 return earnCodeDao.getOvertimeEarnCodes(asOfDate);
128 }
129
130 public List<String> getOvertimeEarnCodesStrs(Date asOfDate){
131 List<String> ovtEarnCodeStrs = new ArrayList<String>();
132 List<EarnCode> ovtEarnCodes = getOvertimeEarnCodes(asOfDate);
133 if(ovtEarnCodes != null){
134 for(EarnCode ovtEc : ovtEarnCodes){
135 ovtEarnCodeStrs.add(ovtEc.getEarnCode());
136 }
137 }
138 return ovtEarnCodeStrs;
139 }
140
141 @Override
142 public int getEarnCodeCount(String earnCode) {
143 return earnCodeDao.getEarnCodeCount(earnCode);
144 }
145
146 @Override
147 public int getNewerEarnCodeCount(String earnCode, Date effdt) {
148 return earnCodeDao.getNewerEarnCodeCount(earnCode, effdt);
149 }
150
151
152 public List<EarnCode> getEarnCodesForTime(Assignment a, Date asOfDate) {
153 if (a == null) throw new RuntimeException("No assignment parameter.");
154 Job job = a.getJob();
155 if (job == null || job.getPayTypeObj() == null) throw new RuntimeException("Null job or null job pay type on assignment.");
156
157 List<EarnCode> earnCodes = new LinkedList<EarnCode>();
158
159 EarnCode regularEarnCode = getEarnCode(job.getPayTypeObj().getRegEarnCode(), asOfDate);
160 if (regularEarnCode == null) {
161 throw new RuntimeException("No regular earn code defined for job pay type.");
162 } else {
163 earnCodes.add(regularEarnCode);
164 }
165 List<EarnCodeSecurity> decs = TkServiceLocator.getEarnCodeSecurityService().getEarnCodeSecurities(job.getDept(), job.getHrSalGroup(), job.getLocation(), asOfDate);
166 for (EarnCodeSecurity dec : decs) {
167 boolean addEarnCode = false;
168 // Check employee flag
169 if (dec.isEmployee() &&
170 (StringUtils.equals(TKUser.getCurrentTargetPerson().getEmployeeId(), GlobalVariables.getUserSession().getPerson().getEmployeeId()))) {
171 addEarnCode = true;
172 }
173 // Check approver flag
174 if (!addEarnCode && dec.isApprover()) {
175 Set<Long> workAreas = TkUserRoles.getUserRoles(GlobalVariables.getUserSession().getPrincipalId()).getApproverWorkAreas();
176 for (Long wa : workAreas) {
177 WorkArea workArea = TkServiceLocator.getWorkAreaService().getWorkArea(wa, asOfDate);
178 if (workArea!= null && a.getWorkArea().compareTo(workArea.getWorkArea())==0) {
179 addEarnCode = true;
180 break;
181 }
182 }
183 }
184 if (addEarnCode) {
185 EarnCode ec = getEarnCode(dec.getEarnCode(), asOfDate);
186 if(ec!=null){
187 earnCodes.add(ec);
188 }
189 }
190 }
191
192
193 return earnCodes;
194 }
195
196
197 /* not using yet, may not be needed
198 @Override
199 public Map<String, String> getEarnCod e s ForDisplayWithAssignment(Assignment assignment, Date asOfDate) {
200 List<EarnCode> earnCodes = this.getEarnCod e s ( assignment, asOfDate);
201
202 Date currentDate = TKUtils.getCurrentDate();
203 boolean futureDate = asOfDate.after(currentDate);
204 List<EarnCode> copyList = new ArrayList<EarnCode>();
205 copyList.addAll(earnCodes);
206 for (EarnCode earnCode : copyList) {
207 if ( futureDate
208 && !earnCode.getAllowScheduledLeave().equalsIgnoreCase("Y")) {
209 earnCodes.remove(earnCode);
210 }
211 }
212 Comparator<EarnCode> earnCodeComparator = new Comparator<EarnCode>() {
213 @Override
214 public int compare(EarnCode ec1, EarnCode ec2) {
215 return ec1.getEarnCode().compareToIgnoreCase(ec2.getEarnCode());
216 }
217 };
218 // Order by leaveCode ascending
219 Ordering<EarnCode> ordering = Ordering.from(earnCodeComparator);
220
221 Map<String, String> earnCodesForDisplay = new LinkedHashMap<String, String>();
222 for (EarnCode earnCode : ordering.sortedCopy(earnCodes)) {
223 earnCodesForDisplay.put(earnCode.getEarnCodeKeyForDisplay(), earnCode.getEarnCodeValueForDisplay());
224 }
225 return earnCodesForDisplay;
226 }
227
228 */
229 }