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.lm.leaveblock.dao; 017 018 import java.sql.Timestamp; 019 import java.util.*; 020 021 import org.apache.commons.collections.CollectionUtils; 022 import org.apache.commons.lang3.StringUtils; 023 import org.apache.log4j.Logger; 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.joda.time.DateTime; 029 import org.kuali.hr.lm.LMConstants; 030 import org.kuali.hr.lm.leaveblock.LeaveBlock; 031 import org.kuali.hr.time.earncode.EarnCode; 032 import org.kuali.hr.time.service.base.TkServiceLocator; 033 import org.kuali.rice.core.framework.persistence.ojb.dao.PlatformAwareDaoBaseOjb; 034 035 public class LeaveBlockDaoSpringOjbImpl extends PlatformAwareDaoBaseOjb implements LeaveBlockDao { 036 037 private static final Logger LOG = Logger.getLogger(LeaveBlockDaoSpringOjbImpl.class); 038 039 @Override 040 public LeaveBlock getLeaveBlock(String leaveBlockId) { 041 Criteria root = new Criteria(); 042 root.addEqualTo("lmLeaveBlockId", leaveBlockId); 043 // root.addEqualTo("active", true); 044 045 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 046 047 return (LeaveBlock) this.getPersistenceBrokerTemplate().getObjectByQuery(query); 048 } 049 050 @Override 051 public List<LeaveBlock> getLeaveBlocksForDocumentId(String documentId) { 052 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 053 Criteria root = new Criteria(); 054 root.addEqualTo("documentId", documentId); 055 // root.addEqualTo("active", true); 056 057 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 058 @SuppressWarnings("rawtypes") 059 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 060 061 if (c != null) { 062 leaveBlocks.addAll(c); 063 } 064 return leaveBlocks; 065 } 066 067 @SuppressWarnings("rawtypes") 068 @Override 069 public List<LeaveBlock> getLeaveBlocks(String principalId, Date beginDate, Date endDate) { 070 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 071 Criteria root = new Criteria(); 072 root.addEqualTo("principalId", principalId); 073 root.addGreaterOrEqualThan("leaveDate", beginDate); 074 root.addLessOrEqualThan("leaveDate", endDate); 075 // root.addEqualTo("active", true); 076 077 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 078 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 079 080 if (c != null) { 081 leaveBlocks.addAll(c); 082 } 083 084 return leaveBlocks; 085 } 086 087 @SuppressWarnings("rawtypes") 088 @Override 089 public List<LeaveBlock> getLeaveBlocksWithType(String principalId, Date beginDate, Date endDate, String leaveBlockType) { 090 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 091 Criteria root = new Criteria(); 092 root.addEqualTo("principalId", principalId); 093 root.addGreaterOrEqualThan("leaveDate", beginDate); 094 root.addLessOrEqualThan("leaveDate", endDate); 095 root.addEqualTo("leaveBlockType", leaveBlockType); 096 // root.addEqualTo("active", true); 097 098 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 099 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 100 101 if (c != null) { 102 leaveBlocks.addAll(c); 103 } 104 105 return leaveBlocks; 106 } 107 108 @Override 109 public List<LeaveBlock> getLeaveBlocksWithAccrualCategory(String principalId, Date beginDate, Date endDate, String accrualCategory) { 110 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 111 Criteria root = new Criteria(); 112 root.addEqualTo("principalId", principalId); 113 root.addGreaterOrEqualThan("leaveDate", beginDate); 114 root.addLessOrEqualThan("leaveDate", endDate); 115 root.addEqualTo("accrualCategory", accrualCategory); 116 // root.addEqualTo("active", true); 117 118 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 119 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 120 121 if (c != null) { 122 leaveBlocks.addAll(c); 123 } 124 125 return leaveBlocks; 126 } 127 128 public List<LeaveBlock> getLeaveBlocksSinceCarryOver(String principalId, Map<String, LeaveBlock> carryOverDates, DateTime endDate, boolean includeAllAccrualCategories) { 129 Criteria root = new Criteria(); 130 root.addEqualTo("principalId", principalId); 131 if (endDate != null) { 132 root.addLessOrEqualThan("leaveDate", endDate.toDate()); 133 } 134 135 Criteria orCriteria = new Criteria(); 136 for (Map.Entry<String, LeaveBlock> entry : carryOverDates.entrySet()) { 137 Criteria crit = new Criteria(); 138 crit.addEqualTo("accrualCategory", entry.getKey()); 139 crit.addGreaterThan("leaveDate", entry.getValue().getLeaveDate()); 140 orCriteria.addOrCriteria(crit); 141 } 142 if (!orCriteria.isEmpty()) { 143 if (CollectionUtils.isNotEmpty(carryOverDates.keySet()) && includeAllAccrualCategories) { 144 Criteria crit = new Criteria(); 145 crit.addNotIn("accrualCategory", carryOverDates.keySet()); 146 orCriteria.addOrCriteria(crit); 147 } 148 root.addAndCriteria(orCriteria); 149 } 150 151 152 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 153 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 154 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 155 if (c != null) { 156 leaveBlocks.addAll(c); 157 } 158 159 return leaveBlocks; 160 } 161 162 public Map<String, LeaveBlock> getLastCarryOverBlocks(String principalId, String leaveBlockType, Date asOfDate) { 163 Map<String, LeaveBlock> carryOver = new HashMap<String, LeaveBlock>(); 164 Criteria root = new Criteria(); 165 root.addEqualTo("principalId", principalId); 166 root.addEqualTo("leaveBlockType", leaveBlockType); 167 168 Criteria dateSubquery = new Criteria(); 169 dateSubquery.addEqualToField("principalId", Criteria.PARENT_QUERY_PREFIX + "principalId"); 170 dateSubquery.addEqualToField("leaveBlockType", Criteria.PARENT_QUERY_PREFIX + "leaveBlockType"); 171 dateSubquery.addEqualToField("accrualCategory", Criteria.PARENT_QUERY_PREFIX + "accrualCategory"); 172 if (asOfDate != null) { 173 dateSubquery.addLessThan("leaveDate", asOfDate); 174 } 175 176 ReportQueryByCriteria subQuery = QueryFactory.newReportQuery(LeaveBlock.class, dateSubquery); 177 String[] attributes = new String[] { "max(leaveDate)" }; 178 subQuery.setAttributes(attributes); 179 180 root.addEqualTo("leaveDate", subQuery); 181 182 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 183 Collection<LeaveBlock> c = (Collection<LeaveBlock>)this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 184 //Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 185 for (LeaveBlock lb : c) { 186 carryOver.put(lb.getAccrualCategory(), lb); 187 } 188 189 return carryOver; 190 191 } 192 193 @Override 194 public List<LeaveBlock> getLeaveBlocks(String principalId, String leaveBlockType, String requestStatus, Date beginDate, Date endDate) { 195 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 196 Criteria root = new Criteria(); 197 root.addEqualTo("principalId", principalId); 198 root.addEqualTo("leaveBlockType", leaveBlockType); 199 root.addEqualTo("requestStatus", requestStatus); 200 if(beginDate != null) { 201 root.addGreaterOrEqualThan("leaveDate", beginDate); 202 } 203 if (endDate != null){ 204 root.addLessOrEqualThan("leaveDate", endDate); 205 } 206 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 207 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 208 if(c!= null) { 209 leaveBlocks.addAll(c); 210 } 211 return leaveBlocks; 212 } 213 214 @Override 215 public List<LeaveBlock> getLeaveBlocks(String principalId, String leaveBlockType, String requestStatus, Date currentDate) { 216 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 217 Criteria root = new Criteria(); 218 root.addEqualTo("principalId", principalId); 219 root.addEqualTo("leaveBlockType", leaveBlockType); 220 root.addEqualTo("requestStatus", requestStatus); 221 if(currentDate != null) { 222 root.addGreaterThan("leaveDate", currentDate); 223 } 224 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 225 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 226 if(c!= null) { 227 leaveBlocks.addAll(c); 228 } 229 return leaveBlocks; 230 } 231 232 @Override 233 public List<LeaveBlock> getLeaveBlocksForDate(String principalId, Date leaveDate) { 234 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 235 Criteria root = new Criteria(); 236 root.addEqualTo("principalId", principalId); 237 root.addEqualTo("leaveDate", leaveDate); 238 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 239 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 240 if(c!= null) { 241 leaveBlocks.addAll(c); 242 } 243 return leaveBlocks; 244 } 245 246 @Override 247 public List<LeaveBlock> getLeaveBlocks(Date leaveDate, String accrualCategory, String principalId) { 248 Criteria root = new Criteria(); 249 root.addLessOrEqualThan("timestamp", leaveDate); 250 root.addEqualTo("accrualCategory", accrualCategory); 251 root.addEqualTo("principalId", principalId); 252 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 253 List<LeaveBlock> leaveBlocks = (List<LeaveBlock>) this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 254 return leaveBlocks; 255 } 256 257 @Override 258 public List<LeaveBlock> getLeaveBlocks(String principalId, String accrualCategory, Date beginDate, Date endDate) { 259 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 260 Criteria root = new Criteria(); 261 root.addEqualTo("principalId", principalId); 262 root.addGreaterOrEqualThan("leaveDate", beginDate); 263 root.addLessOrEqualThan("leaveDate", endDate); 264 root.addEqualTo("accrualCategory", accrualCategory); 265 // root.addEqualTo("active", true); 266 267 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 268 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 269 270 if (c != null) { 271 leaveBlocks.addAll(c); 272 } 273 274 return leaveBlocks; 275 } 276 277 @Override 278 public List<LeaveBlock> getFMLALeaveBlocks(String principalId, String accrualCategory, Date beginDate, Date endDate) { 279 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 280 Criteria root = new Criteria(); 281 root.addEqualTo("principalId", principalId); 282 root.addGreaterOrEqualThan("leaveDate", beginDate); 283 root.addLessOrEqualThan("leaveDate", endDate); 284 root.addEqualTo("accrualCategory", accrualCategory); 285 286 Criteria earnCode = new Criteria(); 287 earnCode.addEqualToField("earnCode", Criteria.PARENT_QUERY_PREFIX + "earnCode"); 288 earnCode.addEqualTo("fmla", "Y"); 289 ReportQueryByCriteria earnCodeSubQuery = QueryFactory.newReportQuery(EarnCode.class, earnCode); 290 root.addEqualTo("earnCode", earnCodeSubQuery); 291 292 //root.add 293 // root.addEqualTo("active", true); 294 295 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 296 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 297 298 if (c != null) { 299 leaveBlocks.addAll(c); 300 } 301 302 return leaveBlocks; 303 } 304 305 @Override 306 public List<LeaveBlock> getNotAccrualGeneratedLeaveBlocksForDate(String principalId, Date leaveDate) { 307 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 308 Criteria root = new Criteria(); 309 root.addEqualTo("principalId", principalId); 310 root.addEqualTo("leaveDate", leaveDate); 311 root.addEqualTo("accrualGenerated", "N"); 312 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 313 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 314 if(c!= null) { 315 leaveBlocks.addAll(c); 316 } 317 return leaveBlocks; 318 } 319 320 public List<LeaveBlock> getCalendarLeaveBlocks(String principalId, Date beginDate, Date endDate) { 321 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 322 323 Criteria root = new Criteria(); 324 root.addEqualTo("principalId", principalId); 325 root.addGreaterOrEqualThan("leaveDate", beginDate); 326 root.addLessOrEqualThan("leaveDate", endDate); 327 List<String> typeValues = new ArrayList<String>(); 328 typeValues.add(LMConstants.LEAVE_BLOCK_TYPE.LEAVE_CALENDAR); 329 typeValues.add(LMConstants.LEAVE_BLOCK_TYPE.TIME_CALENDAR); 330 typeValues.add(LMConstants.LEAVE_BLOCK_TYPE.ACCRUAL_SERVICE); 331 root.addIn("leaveBlockType", typeValues); 332 333 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 334 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 335 336 if (c != null) { 337 leaveBlocks.addAll(c); 338 } 339 return leaveBlocks; 340 341 } 342 343 public void deleteLeaveBlock(String leaveBlockId) { 344 Criteria crit = new Criteria(); 345 crit.addEqualTo("lmLeaveBlockId",leaveBlockId); 346 this.getPersistenceBrokerTemplate().deleteByQuery(QueryFactory.newQuery(LeaveBlock.class, crit)); 347 } 348 349 public void deleteLeaveBlocksForDocumentId(String documentId){ 350 Criteria crit = new Criteria(); 351 crit.addEqualTo("documentId",documentId); 352 this.getPersistenceBrokerTemplate().deleteByQuery(QueryFactory.newQuery(LeaveBlock.class, crit)); 353 354 } 355 356 357 @Override 358 public List<LeaveBlock> getAccrualGeneratedLeaveBlocks(String principalId, Date beginDate, Date endDate) { 359 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 360 Criteria root = new Criteria(); 361 362 root.addEqualTo("principalId", principalId); 363 root.addGreaterOrEqualThan("leaveDate", beginDate); 364 root.addLessOrEqualThan("leaveDate", endDate); 365 root.addEqualTo("accrualGenerated", "Y"); 366 367 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 368 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 369 if (c != null) { 370 leaveBlocks.addAll(c); 371 } 372 return leaveBlocks; 373 } 374 375 @Override 376 public List<LeaveBlock> getSSTOLeaveBlocks(String principalId, String sstoId, Date accruledDate) { 377 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 378 Criteria root = new Criteria(); 379 380 root.addEqualTo("principalId", principalId); 381 root.addEqualTo("leaveDate", accruledDate); 382 root.addEqualTo("scheduleTimeOffId", sstoId); 383 384 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 385 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 386 if (c != null) { 387 leaveBlocks.addAll(c); 388 } 389 return leaveBlocks; 390 } 391 392 @Override 393 public List<LeaveBlock> getABELeaveBlocksSinceTime(String principalId, Timestamp lastRanTime) { 394 List<LeaveBlock> leaveBlocks = new ArrayList<LeaveBlock>(); 395 Criteria root = new Criteria(); 396 397 root.addEqualTo("principalId", principalId); 398 root.addGreaterThan("timestamp", lastRanTime); 399 Query query = QueryFactory.newQuery(LeaveBlock.class, root); 400 Collection c = this.getPersistenceBrokerTemplate().getCollectionByQuery(query); 401 List<LeaveBlock> tempList = new ArrayList<LeaveBlock>(); 402 if (c != null) { 403 tempList.addAll(c); 404 } 405 for(LeaveBlock lb : tempList) { 406 if(lb != null && StringUtils.isNotEmpty(lb.getEarnCode())) { 407 EarnCode ec = TkServiceLocator.getEarnCodeService().getEarnCode(lb.getEarnCode(), lb.getLeaveDate()); 408 if(ec != null && ec.getEligibleForAccrual().equals("N")) { 409 leaveBlocks.add(lb); 410 } 411 } 412 } 413 return leaveBlocks; 414 } 415 416 }