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 }