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.job.dao;
017
018 import java.util.ArrayList;
019 import java.util.Collection;
020 import java.util.Date;
021 import java.util.LinkedList;
022 import java.util.List;
023
024 import com.google.common.collect.ImmutableList;
025 import org.apache.commons.lang.StringUtils;
026 import org.apache.log4j.Logger;
027 import org.apache.ojb.broker.query.Criteria;
028 import org.apache.ojb.broker.query.Query;
029 import org.apache.ojb.broker.query.QueryFactory;
030 import org.apache.ojb.broker.query.ReportQueryByCriteria;
031 import org.kuali.hr.core.util.OjbSubQueryUtil;
032 import org.kuali.hr.job.Job;
033 import org.kuali.hr.time.util.TKUtils;
034 import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb;
035
036 /**
037 * Represents an implementation of {@link JobDao}.
038 */
039 public class JobDaoSpringOjbImpl extends PlatformAwareDaoBaseOjb implements JobDao {
040 private static final ImmutableList<String> EQUAL_TO_FIELDS = new ImmutableList.Builder<String>()
041 .add("principalId")
042 .add("jobNumber")
043 .build();
044
045 @SuppressWarnings("unused")
046 private static final Logger LOG = Logger.getLogger(JobDaoSpringOjbImpl.class);
047
048 public void saveOrUpdate(Job job) {
049 this.getPersistenceBrokerTemplate().store(job);
050 }
051
052 public void saveOrUpdate(List<Job> jobList) {
053 if (jobList != null) {
054 for (Job job : jobList) {
055 this.saveOrUpdate(job);
056 }
057 }
058 }
059
060 public Job getPrimaryJob(String principalId, Date payPeriodEndDate) {
061 Criteria root = new Criteria();
062
063 java.sql.Date effDate = null;
064 if (payPeriodEndDate != null) {
065 effDate = new java.sql.Date(payPeriodEndDate.getTime());
066 }
067 root.addEqualTo("principalId", principalId);
068 root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(Job.class, effDate, EQUAL_TO_FIELDS, false));
069 root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(Job.class, EQUAL_TO_FIELDS, false));
070 root.addEqualTo("primaryIndicator", true);
071
072 Criteria activeFilter = new Criteria(); // Inner Join For Activity
073 activeFilter.addEqualTo("active", true);
074 root.addAndCriteria(activeFilter);
075
076 Query query = QueryFactory.newQuery(Job.class, root);
077
078 return (Job) this.getPersistenceBrokerTemplate().getObjectByQuery(query);
079 }
080
081 @SuppressWarnings({"unchecked", "rawtypes"})
082 @Override
083 public List<Job> getJobs(String principalId, Date payPeriodEndDate) {
084 List<Job> jobs = new LinkedList<Job>();
085 Criteria root = new Criteria();
086
087 java.sql.Date effDate = null;
088 if (payPeriodEndDate != null) {
089 effDate = new java.sql.Date(payPeriodEndDate.getTime());
090 }
091 root.addEqualTo("principalId", principalId);
092 root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(Job.class, effDate, EQUAL_TO_FIELDS, false));
093 root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(Job.class, EQUAL_TO_FIELDS, false));
094
095 Criteria activeFilter = new Criteria(); // Inner Join For Activity
096 activeFilter.addEqualTo("active", true);
097 root.addAndCriteria(activeFilter);
098
099
100 Query query = QueryFactory.newQuery(Job.class, root);
101 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
102
103 if (c != null) {
104 jobs.addAll(c);
105 }
106
107
108 return jobs;
109 }
110
111 public Job getJob(String principalId, Long jobNumber, Date asOfDate) {
112 Criteria root = new Criteria();
113
114 java.sql.Date effDate = null;
115 if (asOfDate != null) {
116 effDate = new java.sql.Date(asOfDate.getTime());
117 }
118 root.addEqualTo("principalId", principalId);
119 root.addEqualTo("jobNumber", jobNumber);
120 root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(Job.class, effDate, EQUAL_TO_FIELDS, false));
121 root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(Job.class, EQUAL_TO_FIELDS, false));
122
123 Criteria activeFilter = new Criteria(); // Inner Join For Activity
124 activeFilter.addEqualTo("active", true);
125 root.addAndCriteria(activeFilter);
126
127 Query query = QueryFactory.newQuery(Job.class, root);
128 Job job = (Job) this.getPersistenceBrokerTemplate().getObjectByQuery(query);
129 return job;
130 }
131
132 @SuppressWarnings("unchecked")
133 public List<Job> getActiveJobsForPosition(String positionNbr, Date asOfDate) {
134 Criteria root = new Criteria();
135 java.sql.Date effDate = null;
136 if (asOfDate != null) {
137 effDate = new java.sql.Date(asOfDate.getTime());
138 }
139 root.addEqualTo("positionNumber", positionNbr);
140 root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(Job.class, effDate, EQUAL_TO_FIELDS, false));
141 root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(Job.class, EQUAL_TO_FIELDS, false));
142
143 Criteria activeFilter = new Criteria(); // Inner Join For Activity
144 activeFilter.addEqualTo("active", true);
145 root.addAndCriteria(activeFilter);
146
147 Query query = QueryFactory.newQuery(Job.class, root);
148 return (List<Job>) this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
149 }
150
151 @SuppressWarnings("unchecked")
152 public List<Job> getActiveJobsForPayType(String hrPayType, Date asOfDate) {
153 Criteria root = new Criteria();
154
155 java.sql.Date effDate = asOfDate == null ? null : new java.sql.Date(asOfDate.getTime());
156 root.addEqualTo("hrPayType", hrPayType);
157 root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(Job.class, effDate, EQUAL_TO_FIELDS, false));
158 root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(Job.class, EQUAL_TO_FIELDS, false));
159
160 Criteria activeFilter = new Criteria(); // Inner Join For Activity
161 activeFilter.addEqualTo("active", true);
162 root.addAndCriteria(activeFilter);
163
164 Query query = QueryFactory.newQuery(Job.class, root);
165 return (List<Job>) this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
166 }
167
168 @Override
169 public Job getJob(String hrJobId) {
170 Criteria crit = new Criteria();
171 crit.addEqualTo("hrJobId", hrJobId);
172
173 Query query = QueryFactory.newQuery(Job.class, crit);
174 return (Job) this.getPersistenceBrokerTemplate().getObjectByQuery(query);
175 }
176
177 @Override
178 public Job getMaxJob(String principalId) {
179 Criteria root = new Criteria();
180 Criteria crit = new Criteria();
181 crit.addEqualTo("principalId", principalId);
182 ReportQueryByCriteria jobNumberSubQuery = QueryFactory.newReportQuery(Job.class, crit);
183 jobNumberSubQuery.setAttributes(new String[]{"max(jobNumber)"});
184
185 crit.addEqualTo("principalId", principalId);
186 root.addEqualTo("jobNumber", jobNumberSubQuery);
187
188 Query query = QueryFactory.newQuery(Job.class, root);
189 return (Job) this.getPersistenceBrokerTemplate().getObjectByQuery(query);
190 }
191
192 @Override
193 @SuppressWarnings("unchecked")
194 public List<Job> getJobs(String principalId, String jobNumber, String dept, String positionNumber, String hrPayType, Date fromEffdt, Date toEffdt,
195 String active, String showHistory) {
196
197 List<Job> results = new ArrayList<Job>();
198
199 Criteria root = new Criteria();
200
201 if (StringUtils.isNotBlank(principalId)) {
202 root.addLike("principalId", principalId);
203 }
204
205 if (StringUtils.isNotBlank(jobNumber)) {
206 root.addLike("jobNumber", jobNumber);
207 }
208
209 if (StringUtils.isNotBlank(dept)) {
210 root.addLike("dept", dept);
211 }
212
213 if (StringUtils.isNotBlank(positionNumber)) {
214 root.addLike("positionNumber", positionNumber);
215 }
216
217 if (StringUtils.isNotBlank(hrPayType)) {
218 root.addLike("hrPayType", hrPayType);
219 }
220
221 Criteria effectiveDateFilter = new Criteria();
222 if (fromEffdt != null) {
223 effectiveDateFilter.addGreaterOrEqualThan("effectiveDate", fromEffdt);
224 }
225 if (toEffdt != null) {
226 effectiveDateFilter.addLessOrEqualThan("effectiveDate", toEffdt);
227 }
228 if (fromEffdt == null && toEffdt == null) {
229 effectiveDateFilter.addLessOrEqualThan("effectiveDate", TKUtils.getCurrentDate());
230 }
231 root.addAndCriteria(effectiveDateFilter);
232
233 if (StringUtils.isNotBlank(active)) {
234 Criteria activeFilter = new Criteria();
235 if (StringUtils.equals(active, "Y")) {
236 activeFilter.addEqualTo("active", true);
237 } else if (StringUtils.equals(active, "N")) {
238 activeFilter.addEqualTo("active", false);
239 }
240 root.addAndCriteria(activeFilter);
241 }
242
243
244 if (StringUtils.equals(showHistory, "N")) {
245 ImmutableList<String> fields = new ImmutableList.Builder<String>()
246 .add("principalId")
247 .add("jobNumber")
248 .add("dept")
249 .add("positionNumber")
250 .add("hrPayType")
251 .build();
252 root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQueryWithFilter(Job.class, effectiveDateFilter, EQUAL_TO_FIELDS, false));
253 root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(Job.class, EQUAL_TO_FIELDS, false));
254 }
255
256 Query query = QueryFactory.newQuery(Job.class, root);
257 results.addAll(getPersistenceBrokerTemplate().getCollectionByQuery(query));
258
259 return results;
260 }
261
262 @Override
263 public int getJobCount(String principalId, Long jobNumber, String dept) {
264 Criteria crit = new Criteria();
265 crit.addEqualTo("jobNumber", jobNumber);
266 if(principalId != null) {
267 crit.addEqualTo("principalId", principalId);
268 }
269 if(dept != null) {
270 crit.addEqualTo("dept", dept);
271 }
272 Query query = QueryFactory.newQuery(Job.class, crit);
273 return this.getPersistenceBrokerTemplate().getCount(query);
274 }
275
276 @SuppressWarnings("unchecked")
277 public List<Job> getActiveLeaveJobs(String principalId, Date asOfDate) {
278 Criteria root = new Criteria();
279
280 java.sql.Date effDate = asOfDate == null ? null : new java.sql.Date(asOfDate.getTime());
281 root.addEqualTo("principalId", principalId);
282 root.addEqualTo("eligibleForLeave", true);
283 root.addEqualTo("active", true);
284 root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(Job.class, effDate, EQUAL_TO_FIELDS, false));
285 root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(Job.class, EQUAL_TO_FIELDS, false));
286
287 Query query = QueryFactory.newQuery(Job.class, root);
288 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
289 // remove jobs that has been inactive from the list
290 List<Job> jobList = new ArrayList<Job>();
291 jobList.addAll(c);
292 List<Job> aList = new ArrayList<Job>();
293 aList.addAll(jobList);
294 for(Job aJob : aList) {
295 List<Job> inactiveJobs = this.getInactiveLeaveJobs(aJob.getJobNumber(), asOfDate, aJob.getEffectiveDate());
296 if(!inactiveJobs.isEmpty()) {
297 jobList.remove(aJob);
298 }
299 }
300 return jobList;
301 }
302
303 @Override
304 @SuppressWarnings("unchecked")
305 public List<Job> getInactiveLeaveJobs(Long jobNumber, Date asOfDate, Date jobDate) {
306 Criteria root = new Criteria();
307 ImmutableList<String> fields = new ImmutableList.Builder<String>()
308 .add("jobNumber")
309 .build();
310
311 java.sql.Date effDate = asOfDate == null ? null : new java.sql.Date(asOfDate.getTime());
312 root.addEqualTo("jobNumber", jobNumber);
313 root.addEqualTo("eligibleForLeave", true);
314 root.addEqualTo("active", false);
315 root.addEqualTo("effectiveDate", OjbSubQueryUtil.getEffectiveDateSubQuery(Job.class, effDate, fields, false));
316 root.addEqualTo("timestamp", OjbSubQueryUtil.getTimestampSubQuery(Job.class, fields, false));
317
318 Query query = QueryFactory.newQuery(Job.class, root);
319 return (List<Job>) this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
320 }
321
322 @Override
323 public List<Job> getAllActiveLeaveJobs(String principalId, Date asOfDate) {
324 Criteria root = new Criteria();
325 root.addEqualTo("principalId", principalId);
326 root.addLessOrEqualThan("effectiveDate", asOfDate);
327 root.addEqualTo("active", true);
328 root.addEqualTo("eligibleForLeave", true);
329
330 Query query = QueryFactory.newQuery(Job.class, root);
331 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
332
333 List<Job> jobs = new LinkedList<Job>();
334 if (c != null) {
335 jobs.addAll(c);
336 }
337 return jobs;
338 }
339
340 public List<Job> getAllInActiveLeaveJobsInRange(String principalId, Date startDate, Date endDate) {
341 Criteria root = new Criteria();
342 root.addEqualTo("principalId", principalId);
343 root.addLessOrEqualThan("effectiveDate", endDate);
344 root.addEqualTo("active", false);
345 Query query = QueryFactory.newQuery(Job.class, root);
346 return (List<Job>) this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
347 }
348
349 @Override
350 public Job getMaxTimestampJob(String principalId) {
351 Criteria root = new Criteria();
352 Criteria crit = new Criteria();
353
354 crit.addEqualTo("principalId", principalId);
355 ReportQueryByCriteria timestampSubQuery = QueryFactory.newReportQuery(Job.class, crit);
356 timestampSubQuery.setAttributes(new String[]{"max(timestamp)"});
357
358 root.addEqualTo("principalId", principalId);
359 root.addEqualTo("timestamp", timestampSubQuery);
360
361 Query query = QueryFactory.newQuery(Job.class, root);
362 return (Job) this.getPersistenceBrokerTemplate().getObjectByQuery(query);
363 }
364
365 }