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.timecollection.rule.dao;
017
018 import java.sql.Date;
019 import java.util.ArrayList;
020 import java.util.Collection;
021 import java.util.List;
022
023 import org.apache.commons.lang.StringUtils;
024 import org.apache.ojb.broker.query.Criteria;
025 import org.apache.ojb.broker.query.Query;
026 import org.apache.ojb.broker.query.QueryFactory;
027 import org.apache.ojb.broker.query.ReportQueryByCriteria;
028 import org.kuali.hr.time.collection.rule.TimeCollectionRule;
029 import org.kuali.hr.time.util.TKUtils;
030 import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb;
031
032 public class TimeCollectionRuleDaoServiceImpl extends PlatformAwareDaoBaseOjb implements TimeCollectionRuleDaoService {
033
034 /*
035 * Returns valid TimeCollectionRule based on dept,workArea, and asOfDate
036 * dept and work area are wildcardable values
037 * @see org.kuali.hr.time.timecollection.rule.dao.TimeCollectionRuleDaoService#getTimeCollectionRule(java.lang.String dept,
038 * java.lang.Long workArea, java.sql.Date asOfDate)
039 */
040
041 @Override
042 public TimeCollectionRule getTimeCollectionRule(String dept, Long workArea, Date asOfDate) {
043
044
045 TimeCollectionRule timeCollectionRule = new TimeCollectionRule();
046
047 //First call confirm no exact match
048 timeCollectionRule = getTimeCollectionRuleWildCarded(dept, workArea, asOfDate);
049 if (timeCollectionRule != null) {
050 return timeCollectionRule;
051 }
052 //Try with dept wildcarded *
053 timeCollectionRule = getTimeCollectionRuleWildCarded("%", workArea, asOfDate);
054 if (timeCollectionRule != null) {
055 return timeCollectionRule;
056 }
057
058 //Try with work area wildcarded
059 timeCollectionRule = getTimeCollectionRuleWildCarded(dept, -1L, asOfDate);
060 if (timeCollectionRule != null) {
061 return timeCollectionRule;
062 }
063
064 //Try with everything wildcarded
065 timeCollectionRule = getTimeCollectionRuleWildCarded("%", -1L, asOfDate);
066 if (timeCollectionRule != null) {
067 return timeCollectionRule;
068 }
069
070 //Return default time collection rule
071 timeCollectionRule = new TimeCollectionRule();
072 timeCollectionRule.setActive(true);
073 timeCollectionRule.setClockUserFl(true);
074 timeCollectionRule.setDept(dept);
075 timeCollectionRule.setWorkArea(workArea);
076
077 return timeCollectionRule;
078 }
079
080 private TimeCollectionRule getTimeCollectionRuleWildCarded(String dept, Long workArea, Date asOfDate) {
081 Criteria root = new Criteria();
082 Criteria effdt = new Criteria();
083 Criteria timestamp = new Criteria();
084
085 effdt.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea");
086 effdt.addLessOrEqualThan("effectiveDate", asOfDate);
087 // effdt.addEqualTo("active", true);
088 effdt.addEqualTo("dept", dept);
089 ReportQueryByCriteria effdtSubQuery = QueryFactory.newReportQuery(TimeCollectionRule.class, effdt);
090 effdtSubQuery.setAttributes(new String[]{"max(effdt)"});
091
092 timestamp.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea");
093 timestamp.addEqualToField("effectiveDate", Criteria.PARENT_QUERY_PREFIX + "effectiveDate");
094 // timestamp.addEqualTo("active", true);
095 timestamp.addEqualTo("dept", dept);
096 ReportQueryByCriteria timestampSubQuery = QueryFactory.newReportQuery(TimeCollectionRule.class, timestamp);
097 timestampSubQuery.setAttributes(new String[]{"max(timestamp)"});
098
099 root.addEqualTo("dept", dept);
100 root.addEqualTo("workArea", workArea);
101 root.addEqualTo("effectiveDate", effdtSubQuery);
102 root.addEqualTo("timestamp", timestampSubQuery);
103 // root.addEqualTo("active", true);
104
105 Criteria activeFilter = new Criteria(); // Inner Join For Activity
106 activeFilter.addEqualTo("active", true);
107 root.addAndCriteria(activeFilter);
108
109
110 Query query = QueryFactory.newQuery(TimeCollectionRule.class, root);
111 return (TimeCollectionRule) this.getPersistenceBrokerTemplate().getObjectByQuery(query);
112
113 }
114
115 @Override
116 public TimeCollectionRule getTimeCollectionRule(String tkTimeCollectionRuleId) {
117 Criteria crit = new Criteria();
118 crit.addEqualTo("tkTimeCollectionRuleId", tkTimeCollectionRuleId);
119
120 Query query = QueryFactory.newQuery(TimeCollectionRule.class, crit);
121 return (TimeCollectionRule) this.getPersistenceBrokerTemplate().getObjectByQuery(query);
122
123 }
124
125 /* Jira 1152
126 * Returns valid TimeCollectionRule based on dept, workArea, payType, and asOfDate
127 * dept, work area, and payType can be wildcardable values
128 */
129 @Override
130 public TimeCollectionRule getTimeCollectionRule(String dept, Long workArea, String payType, Date asOfDate) {
131
132
133 TimeCollectionRule timeCollectionRule = new TimeCollectionRule();
134
135 //First call confirm no exact match
136 timeCollectionRule = getTimeCollectionRuleWildCarded(dept, workArea, payType, asOfDate);
137 if (timeCollectionRule != null) {
138 return timeCollectionRule;
139 }
140 //Try with dept wildcarded *
141 timeCollectionRule = getTimeCollectionRuleWildCarded("%", workArea, payType, asOfDate);
142 if (timeCollectionRule != null) {
143 return timeCollectionRule;
144 }
145
146 //Try with work area wildcarded
147 timeCollectionRule = getTimeCollectionRuleWildCarded(dept, -1L, payType, asOfDate);
148 if (timeCollectionRule != null) {
149 return timeCollectionRule;
150 }
151
152 //Try with payType wildcarded
153 timeCollectionRule = getTimeCollectionRuleWildCarded(dept, workArea, "%", asOfDate);
154 if (timeCollectionRule != null) {
155 return timeCollectionRule;
156 }
157
158 //Try with dept and workArea wildcarded
159 timeCollectionRule = getTimeCollectionRuleWildCarded("%", -1L, payType, asOfDate);
160 if (timeCollectionRule != null) {
161 return timeCollectionRule;
162 }
163
164 //Try with dept and payType wildcarded
165 timeCollectionRule = getTimeCollectionRuleWildCarded("%", workArea, "%", asOfDate);
166 if (timeCollectionRule != null) {
167 return timeCollectionRule;
168 }
169
170 //Try with workArea and payType wildcarded
171 timeCollectionRule = getTimeCollectionRuleWildCarded(dept, -1L, "%", asOfDate);
172 if (timeCollectionRule != null) {
173 return timeCollectionRule;
174 }
175
176 //Try with everything wildcarded
177 timeCollectionRule = getTimeCollectionRuleWildCarded("%", -1L, "%", asOfDate);
178 if (timeCollectionRule != null) {
179 return timeCollectionRule;
180 }
181
182 //Return default time collection rule
183 timeCollectionRule = new TimeCollectionRule();
184 timeCollectionRule.setActive(true);
185 timeCollectionRule.setClockUserFl(true);
186 timeCollectionRule.setDept(dept);
187 timeCollectionRule.setWorkArea(workArea);
188
189 return timeCollectionRule;
190 }
191
192 private TimeCollectionRule getTimeCollectionRuleWildCarded(String dept, Long workArea, String payType, Date asOfDate) {
193 Criteria root = new Criteria();
194 Criteria effdt = new Criteria();
195 Criteria timestamp = new Criteria();
196
197 effdt.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea");
198 effdt.addLessOrEqualThan("effectiveDate", asOfDate);
199 // effdt.addEqualTo("active", true);
200 effdt.addEqualTo("dept", dept);
201 effdt.addEqualTo("payType", payType);
202 ReportQueryByCriteria effdtSubQuery = QueryFactory.newReportQuery(TimeCollectionRule.class, effdt);
203 effdtSubQuery.setAttributes(new String[]{"max(effdt)"});
204
205 timestamp.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea");
206 timestamp.addEqualToField("effectiveDate", Criteria.PARENT_QUERY_PREFIX + "effectiveDate");
207 // timestamp.addEqualTo("active", true);
208 timestamp.addEqualTo("dept", dept);
209 timestamp.addEqualTo("payType", payType);
210 ReportQueryByCriteria timestampSubQuery = QueryFactory.newReportQuery(TimeCollectionRule.class, timestamp);
211 timestampSubQuery.setAttributes(new String[]{"max(timestamp)"});
212
213 root.addEqualTo("dept", dept);
214 root.addEqualTo("workArea", workArea);
215 root.addEqualTo("payType", payType);
216 root.addEqualTo("effectiveDate", effdtSubQuery);
217 root.addEqualTo("timestamp", timestampSubQuery);
218 // root.addEqualTo("active", true);
219
220 Criteria activeFilter = new Criteria(); // Inner Join For Activity
221 activeFilter.addEqualTo("active", true);
222 root.addAndCriteria(activeFilter);
223
224
225 Query query = QueryFactory.newQuery(TimeCollectionRule.class, root);
226 return (TimeCollectionRule) this.getPersistenceBrokerTemplate().getObjectByQuery(query);
227
228 }
229
230 @Override
231 public List<TimeCollectionRule> getTimeCollectionRules(String dept, Long workArea, String payType, String active, String showHistory) {
232
233 List<TimeCollectionRule> results = new ArrayList<TimeCollectionRule>();
234
235 Criteria root = new Criteria();
236 Criteria effdt = new Criteria();
237 Criteria timestamp = new Criteria();
238 if (workArea != null) {
239 effdt.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea");
240 } else {
241 effdt.addIsNull(Criteria.PARENT_QUERY_PREFIX + "workArea");
242 }
243 effdt.addLessOrEqualThan("effectiveDate", TKUtils.getCurrentDate());
244 if (StringUtils.isNotBlank(dept)) {
245 effdt.addEqualTo("dept", dept);
246 }
247 if (StringUtils.isNotBlank(payType)) {
248 effdt.addEqualTo("payType", payType);
249 }
250 ReportQueryByCriteria effdtSubQuery = QueryFactory.newReportQuery(TimeCollectionRule.class, effdt);
251 effdtSubQuery.setAttributes(new String[]{"max(effdt)"});
252 if (workArea != null) {
253 timestamp.addEqualToField("workArea", Criteria.PARENT_QUERY_PREFIX + "workArea");
254 } else {
255 timestamp.addIsNull(Criteria.PARENT_QUERY_PREFIX + "workArea");
256 }
257 timestamp.addEqualToField("effectiveDate", Criteria.PARENT_QUERY_PREFIX + "effectiveDate");
258 if (StringUtils.isNotBlank(dept)) {
259 timestamp.addEqualTo("dept", dept);
260 }
261 if (StringUtils.isNotBlank(payType)) {
262 timestamp.addEqualTo("payType", payType);
263 }
264 ReportQueryByCriteria timestampSubQuery = QueryFactory.newReportQuery(TimeCollectionRule.class, timestamp);
265 timestampSubQuery.setAttributes(new String[]{"max(timestamp)"});
266
267 if (StringUtils.isNotBlank(dept)) {
268 root.addLike("dept", dept);
269 }
270
271 if (workArea != null) {
272 root.addLike("workArea", workArea);
273 }
274 if (StringUtils.isNotBlank(payType)) {
275 root.addLike("payType", payType);
276 }
277 //root.addEqualTo("effectiveDate", effdtSubQuery);
278 //root.addEqualTo("timestamp", timestampSubQuery);
279
280 if (StringUtils.equals(active, "Y")) {
281 Criteria activeFilter = new Criteria(); // Inner Join For Activity
282 activeFilter.addEqualTo("active", true);
283 root.addAndCriteria(activeFilter);
284 } else if (StringUtils.equals(active, "N")) {
285 Criteria activeFilter = new Criteria(); // Inner Join For Activity
286 activeFilter.addEqualTo("active", false);
287 root.addAndCriteria(activeFilter);
288 }
289
290 Query query = QueryFactory.newQuery(TimeCollectionRule.class, root);
291 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query);
292 results.addAll(c);
293
294 return results;
295 }
296 }