001 /* 002 * Copyright 2011 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.kfs.module.ld.dataaccess.impl; 017 018 import java.sql.Date; 019 import java.util.ArrayList; 020 import java.util.Collection; 021 import java.util.Iterator; 022 import java.util.List; 023 import java.util.Map; 024 025 import org.apache.ojb.broker.query.Criteria; 026 import org.apache.ojb.broker.query.QueryByCriteria; 027 import org.apache.ojb.broker.query.QueryFactory; 028 import org.apache.ojb.broker.query.ReportQueryByCriteria; 029 import org.kuali.kfs.gl.businessobject.OriginEntryGroup; 030 import org.kuali.kfs.gl.businessobject.OriginEntrySource; 031 import org.kuali.kfs.gl.dataaccess.OriginEntryDao; 032 import org.kuali.kfs.gl.dataaccess.impl.OriginEntryDaoOjb; 033 import org.kuali.kfs.module.ld.LaborConstants; 034 import org.kuali.kfs.module.ld.businessobject.LaborOriginEntry; 035 import org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao; 036 import org.kuali.kfs.sys.KFSPropertyConstants; 037 038 /** 039 * OJB Implementation of LaborOriginEntryDao. 040 */ 041 public class LaborOriginEntryDaoOjb extends OriginEntryDaoOjb implements LaborOriginEntryDao { 042 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LaborOriginEntryDaoOjb.class); 043 044 private static final String DATE = "date"; 045 private static final String SOURCE_CODE = "sourceCode"; 046 private static final String PROCESS = "process"; 047 private static final String VALID = "valid"; 048 private static final String SCRUB = "scrub"; 049 050 /** 051 * @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#getEntriesByGroups(java.util.Collection) 052 */ 053 public Iterator<LaborOriginEntry> getEntriesByGroups(Collection<OriginEntryGroup> groups) { 054 LOG.debug("getEntriesByGroups() started"); 055 056 // extract the group ids of the given groups 057 List<Integer> groupIds = new ArrayList<Integer>(); 058 for (OriginEntryGroup group : groups) { 059 groupIds.add(group.getId()); 060 } 061 062 Criteria criteria = new Criteria(); 063 criteria.addIn(KFSPropertyConstants.ENTRY_GROUP_ID, groupIds); 064 065 QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); 066 return getPersistenceBrokerTemplate().getIteratorByQuery(query); 067 } 068 069 /** 070 * @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#getCountOfEntriesInGroups(java.util.Collection) 071 */ 072 public int getCountOfEntriesInGroups(Collection<OriginEntryGroup> groups) { 073 LOG.debug("getCountOfEntriesInGroups() started"); 074 075 if (groups.size() == 0) 076 return 0; 077 078 // extract the group ids of the given groups 079 List<Integer> groupIds = new ArrayList<Integer>(); 080 for (OriginEntryGroup group : groups) { 081 groupIds.add(group.getId()); 082 } 083 084 Criteria criteria = new Criteria(); 085 criteria.addIn(KFSPropertyConstants.ENTRY_GROUP_ID, groupIds); 086 087 QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); 088 return getPersistenceBrokerTemplate().getCount(query); 089 } 090 091 /** 092 * @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#getConsolidatedEntriesByGroup(org.kuali.kfs.gl.businessobject.OriginEntryGroup) 093 */ 094 public Iterator<Object[]> getConsolidatedEntriesByGroup(OriginEntryGroup group) { 095 LOG.debug("getConsolidatedEntriesByGroup() started"); 096 097 Criteria criteria = new Criteria(); 098 criteria.addEqualTo(KFSPropertyConstants.ENTRY_GROUP_ID, group.getId()); 099 100 ReportQueryByCriteria query = QueryFactory.newReportQuery(this.getEntryClass(), criteria); 101 102 // set the selection attributes 103 List<String> attributeList = buildConsolidationAttributeList(); 104 String[] attributes = attributeList.toArray(new String[attributeList.size()]); 105 query.setAttributes(attributes); 106 107 // add the group criteria into the selection statement 108 List<String> groupByList = buildGroupByList(); 109 String[] groupBy = groupByList.toArray(new String[groupByList.size()]); 110 query.addGroupBy(groupBy); 111 112 // add the sorting criteria into the selection statement 113 for (String attribute : groupByList) { 114 query.addOrderByAscending(attribute); 115 } 116 return getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); 117 } 118 119 /** 120 * build the returning attribute list for the calling query 121 * 122 * @return the returning attribute list 123 */ 124 protected List<String> buildConsolidationAttributeList() { 125 List<String> attributeList = this.buildGroupByList(); 126 attributeList.add("sum(" + KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")"); 127 return attributeList; 128 } 129 130 /** 131 * build the grouping attribute list for the calling query 132 * 133 * @return the grouping attribute list 134 */ 135 protected List<String> buildGroupByList() { 136 List<String> groupByList = new ArrayList<String>(LaborConstants.consolidationAttributesOfOriginEntry()); 137 groupByList.remove(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT); 138 return groupByList; 139 } 140 141 /** 142 * @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#testingLaborGetAllEntries() 143 */ 144 public Collection<LaborOriginEntry> testingLaborGetAllEntries() { 145 LOG.debug("testingGetAllEntries() started"); 146 147 Criteria criteria = new Criteria(); 148 QueryByCriteria qbc = QueryFactory.newQuery(getEntryClass(), criteria); 149 qbc.addOrderByAscending("entryGroupId"); 150 return getPersistenceBrokerTemplate().getCollectionByQuery(qbc); 151 } 152 153 /** 154 * @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#getLaborEntriesByGroup(org.kuali.kfs.gl.businessobject.OriginEntryGroup, int) 155 */ 156 public Iterator<LaborOriginEntry> getLaborEntriesByGroup(OriginEntryGroup oeg, int sort) { 157 LOG.debug("getEntriesByGroup() started"); 158 159 Criteria criteria = new Criteria(); 160 criteria.addEqualTo(KFSPropertyConstants.ENTRY_GROUP_ID, oeg.getId()); 161 162 QueryByCriteria qbc = QueryFactory.newQuery(getEntryClass(), criteria); 163 164 if (sort == OriginEntryDao.SORT_DOCUMENT) { 165 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE); 166 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE); 167 qbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER); 168 qbc.addOrderByAscending(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE); 169 qbc.addOrderByAscending(KFSPropertyConstants.ACCOUNT_NUMBER); 170 qbc.addOrderByAscending(KFSPropertyConstants.SUB_ACCOUNT_NUMBER); 171 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE); 172 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_DOCUMENT_REVERSAL_DATE); 173 qbc.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE); 174 qbc.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR); 175 // The above order by fields are required by the scrubber process. Adding these 176 // fields makes the data in the exact same order as the COBOL scrubber. 177 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_OBJECT_CODE); 178 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE); 179 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE); 180 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_OBJECT_TYPE_CODE); 181 qbc.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE); 182 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE); 183 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE); 184 qbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER); 185 qbc.addOrderByAscending(KFSPropertyConstants.TRANSACTION_ENTRY_SEQUENCE_NUMBER); 186 qbc.addOrderByAscending(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_DESC); 187 qbc.addOrderByAscending(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT); 188 qbc.addOrderByAscending(KFSPropertyConstants.TRANSACTION_DEBIT_CREDIT_CODE); 189 } 190 else if (sort == OriginEntryDao.SORT_REPORT) { 191 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE); 192 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE); 193 qbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER); 194 qbc.addOrderByAscending(KFSPropertyConstants.TRANSACTION_DEBIT_CREDIT_CODE); 195 qbc.addOrderByAscending(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE); 196 qbc.addOrderByAscending(KFSPropertyConstants.ACCOUNT_NUMBER); 197 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_OBJECT_CODE); 198 } 199 else if (sort == OriginEntryDao.SORT_LISTING_REPORT) { 200 qbc.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR); 201 qbc.addOrderByAscending(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE); 202 qbc.addOrderByAscending(KFSPropertyConstants.ACCOUNT_NUMBER); 203 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_OBJECT_CODE); 204 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_OBJECT_TYPE_CODE); 205 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE); 206 qbc.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE); 207 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE); 208 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE); 209 qbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER); 210 qbc.addOrderByAscending(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_DESC); 211 } 212 else { 213 qbc.addOrderByAscending(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE); 214 qbc.addOrderByAscending(KFSPropertyConstants.ACCOUNT_NUMBER); 215 qbc.addOrderByAscending(KFSPropertyConstants.SUB_ACCOUNT_NUMBER); 216 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_OBJECT_CODE); 217 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_OBJECT_TYPE_CODE); 218 qbc.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE); 219 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE); 220 qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE); 221 qbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER); 222 qbc.addOrderByAscending(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_DESC); 223 } 224 225 return getPersistenceBrokerTemplate().getIteratorByQuery(qbc); 226 } 227 228 /** 229 * @see org.kuali.kfs.module.ld.dataaccess.impl.LaborOriginEntryDaoOjb#getMatchingEntriesByCollection(java.util.Map) 230 */ 231 @Override 232 public Collection getMatchingEntriesByCollection(Map searchCriteria) { 233 LOG.debug("getMatchingEntries() started"); 234 235 Criteria criteria = new Criteria(); 236 for (Iterator iter = searchCriteria.keySet().iterator(); iter.hasNext();) { 237 String element = (String) iter.next(); 238 criteria.addEqualTo(element, searchCriteria.get(element)); 239 } 240 241 QueryByCriteria qbc = QueryFactory.newQuery(this.getEntryClass(), criteria); 242 qbc.addOrderByAscending("entryGroupId"); 243 return getPersistenceBrokerTemplate().getCollectionByQuery(qbc); 244 } 245 246 /** 247 * @param entry the entry to save. 248 */ 249 @Deprecated 250 public void saveOriginEntry(LaborOriginEntry entry) { 251 LOG.debug("saveOriginEntry() started"); 252 253 if ((entry != null) && (entry.getTransactionLedgerEntryDescription() != null) && (entry.getTransactionLedgerEntryDescription().length() > 40)) { 254 entry.setTransactionLedgerEntryDescription(entry.getTransactionLedgerEntryDescription().substring(0, 40)); 255 } 256 getPersistenceBrokerTemplate().store(entry); 257 } 258 259 /** 260 * @see org.kuali.kfs.module.ld.dataaccess.impl.LaborOriginEntryDaoOjb#getSummaryByGroupId(java.util.Collection) 261 */ 262 @Override 263 public Iterator getSummaryByGroupId(Collection groupIdList) { 264 LOG.debug("getSummaryByGroupId() started"); 265 266 if (groupIdList == null || groupIdList.size() <= 0) { 267 return null; 268 } 269 270 Collection ids = new ArrayList(); 271 for (Iterator iter = groupIdList.iterator(); iter.hasNext();) { 272 OriginEntryGroup element = (OriginEntryGroup) iter.next(); 273 ids.add(element.getId()); 274 } 275 276 Criteria criteria = new Criteria(); 277 criteria.addIn(KFSPropertyConstants.ENTRY_GROUP_ID, ids); 278 279 ReportQueryByCriteria query = QueryFactory.newReportQuery(getEntryClass(), criteria); 280 281 String attributeList[] = { KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE, KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE, KFSPropertyConstants.TRANSACTION_DEBIT_CREDIT_CODE, "sum(" + KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")", "count(*)" }; 282 283 String groupList[] = { KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE, KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE, KFSPropertyConstants.TRANSACTION_DEBIT_CREDIT_CODE }; 284 285 query.setAttributes(attributeList); 286 query.addGroupBy(groupList); 287 288 // add the sorting criteria 289 for (int i = 0; i < groupList.length; i++) { 290 query.addOrderByAscending(groupList[i]); 291 } 292 293 return getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); 294 } 295 296 /** 297 * @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#getEntryCollectionByGroup(org.kuali.kfs.gl.businessobject.OriginEntryGroup) 298 */ 299 public Collection<LaborOriginEntry> getEntryCollectionByGroup(OriginEntryGroup group) { 300 LOG.debug("getEntriesByGroups() started"); 301 302 Criteria criteria = new Criteria(); 303 criteria.addEqualTo(KFSPropertyConstants.ENTRY_GROUP_ID, group.getId()); 304 305 QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); 306 return getPersistenceBrokerTemplate().getCollectionByQuery(query); 307 } 308 309 /** 310 * Get all the Labor backup groups to scrub (ie, origin entry groups with source OriginEntrySource.LABOR_BACKUP) 311 * 312 * @param groupDate this parameter isn't really used 313 * @return a Collection of Labor backup groups 314 * @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#getLaborBackupGroups(java.sql.Date) 315 */ 316 public Collection getLaborBackupGroups(Date groupDate) { 317 LOG.debug("getGroupsToBackup() started"); 318 319 Criteria criteria = new Criteria(); 320 criteria.addEqualTo(SOURCE_CODE, OriginEntrySource.LABOR_BACKUP); 321 criteria.addEqualTo(SCRUB, Boolean.TRUE); 322 criteria.addEqualTo(PROCESS, Boolean.TRUE); 323 criteria.addEqualTo(VALID, Boolean.TRUE); 324 325 QueryByCriteria qbc = QueryFactory.newQuery(OriginEntryGroup.class, criteria); 326 return getPersistenceBrokerTemplate().getCollectionByQuery(qbc); 327 } 328 329 /** 330 * Get all the groups to be copied into the backup group...though, notably, this method 331 * does nothing to differentiate labor groups from otherwise normal groups. One must assume 332 * that processing takes place somewhere else 333 * 334 * @param groupDate the date returned origin entry groups must have been created on or before 335 * @return a Collection of Labor Origin Entry Groups to backup 336 * 337 * @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#getLaborScrubberGroups(java.sql.Date) 338 */ 339 public Collection getLaborGroupsToBackup(Date groupDate) { 340 LOG.debug("getLaborGroupsToBackup() started"); 341 342 Criteria criteria = new Criteria(); 343 criteria.addLessOrEqualThan(DATE, groupDate); 344 criteria.addEqualTo(SCRUB, Boolean.TRUE); 345 criteria.addEqualTo(PROCESS, Boolean.TRUE); 346 criteria.addEqualTo(VALID, Boolean.TRUE); 347 348 QueryByCriteria qbc = QueryFactory.newQuery(OriginEntryGroup.class, criteria); 349 return getPersistenceBrokerTemplate().getCollectionByQuery(qbc); 350 } 351 }