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    }