/*
* The Kuali Financial System, a comprehensive financial management system for higher education.
*
* Copyright 2005-2014 The Kuali Foundation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.kuali.kfs.module.ld.dataaccess.impl;
import java.sql.Date;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.ojb.broker.query.Criteria;
import org.apache.ojb.broker.query.QueryByCriteria;
import org.apache.ojb.broker.query.QueryFactory;
import org.apache.ojb.broker.query.ReportQueryByCriteria;
import org.kuali.kfs.gl.businessobject.OriginEntryGroup;
import org.kuali.kfs.gl.businessobject.OriginEntrySource;
import org.kuali.kfs.gl.dataaccess.OriginEntryDao;
import org.kuali.kfs.gl.dataaccess.impl.OriginEntryDaoOjb;
import org.kuali.kfs.module.ld.LaborConstants;
import org.kuali.kfs.module.ld.businessobject.LaborOriginEntry;
import org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao;
import org.kuali.kfs.sys.KFSPropertyConstants;
/**
* OJB Implementation of LaborOriginEntryDao.
*/
public class LaborOriginEntryDaoOjb extends OriginEntryDaoOjb implements LaborOriginEntryDao {
private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LaborOriginEntryDaoOjb.class);
private static final String DATE = "date";
private static final String SOURCE_CODE = "sourceCode";
private static final String PROCESS = "process";
private static final String VALID = "valid";
private static final String SCRUB = "scrub";
/**
* @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#getEntriesByGroups(java.util.Collection)
*/
public Iterator<LaborOriginEntry> getEntriesByGroups(Collection<OriginEntryGroup> groups) {
LOG.debug("getEntriesByGroups() started");
// extract the group ids of the given groups
List<Integer> groupIds = new ArrayList<Integer>();
for (OriginEntryGroup group : groups) {
groupIds.add(group.getId());
}
Criteria criteria = new Criteria();
criteria.addIn(KFSPropertyConstants.ENTRY_GROUP_ID, groupIds);
QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria);
return getPersistenceBrokerTemplate().getIteratorByQuery(query);
}
/**
* @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#getCountOfEntriesInGroups(java.util.Collection)
*/
public int getCountOfEntriesInGroups(Collection<OriginEntryGroup> groups) {
LOG.debug("getCountOfEntriesInGroups() started");
if (groups.size() == 0)
return 0;
// extract the group ids of the given groups
List<Integer> groupIds = new ArrayList<Integer>();
for (OriginEntryGroup group : groups) {
groupIds.add(group.getId());
}
Criteria criteria = new Criteria();
criteria.addIn(KFSPropertyConstants.ENTRY_GROUP_ID, groupIds);
QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria);
return getPersistenceBrokerTemplate().getCount(query);
}
/**
* @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#getConsolidatedEntriesByGroup(org.kuali.kfs.gl.businessobject.OriginEntryGroup)
*/
public Iterator<Object[]> getConsolidatedEntriesByGroup(OriginEntryGroup group) {
LOG.debug("getConsolidatedEntriesByGroup() started");
Criteria criteria = new Criteria();
criteria.addEqualTo(KFSPropertyConstants.ENTRY_GROUP_ID, group.getId());
ReportQueryByCriteria query = QueryFactory.newReportQuery(this.getEntryClass(), criteria);
// set the selection attributes
List<String> attributeList = buildConsolidationAttributeList();
String[] attributes = attributeList.toArray(new String[attributeList.size()]);
query.setAttributes(attributes);
// add the group criteria into the selection statement
List<String> groupByList = buildGroupByList();
String[] groupBy = groupByList.toArray(new String[groupByList.size()]);
query.addGroupBy(groupBy);
// add the sorting criteria into the selection statement
for (String attribute : groupByList) {
query.addOrderByAscending(attribute);
}
return getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query);
}
/**
* build the returning attribute list for the calling query
*
* @return the returning attribute list
*/
protected List<String> buildConsolidationAttributeList() {
List<String> attributeList = this.buildGroupByList();
attributeList.add("sum(" + KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT + ")");
return attributeList;
}
/**
* build the grouping attribute list for the calling query
*
* @return the grouping attribute list
*/
protected List<String> buildGroupByList() {
List<String> groupByList = new ArrayList<String>(LaborConstants.consolidationAttributesOfOriginEntry());
groupByList.remove(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT);
return groupByList;
}
/**
* @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#testingLaborGetAllEntries()
*/
public Collection<LaborOriginEntry> testingLaborGetAllEntries() {
LOG.debug("testingGetAllEntries() started");
Criteria criteria = new Criteria();
QueryByCriteria qbc = QueryFactory.newQuery(getEntryClass(), criteria);
qbc.addOrderByAscending("entryGroupId");
return getPersistenceBrokerTemplate().getCollectionByQuery(qbc);
}
/**
* @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#getLaborEntriesByGroup(org.kuali.kfs.gl.businessobject.OriginEntryGroup, int)
*/
public Iterator<LaborOriginEntry> getLaborEntriesByGroup(OriginEntryGroup oeg, int sort) {
LOG.debug("getEntriesByGroup() started");
Criteria criteria = new Criteria();
criteria.addEqualTo(KFSPropertyConstants.ENTRY_GROUP_ID, oeg.getId());
QueryByCriteria qbc = QueryFactory.newQuery(getEntryClass(), criteria);
if (sort == OriginEntryDao.SORT_DOCUMENT) {
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER);
qbc.addOrderByAscending(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.ACCOUNT_NUMBER);
qbc.addOrderByAscending(KFSPropertyConstants.SUB_ACCOUNT_NUMBER);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_DOCUMENT_REVERSAL_DATE);
qbc.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR);
// The above order by fields are required by the scrubber process. Adding these
// fields makes the data in the exact same order as the COBOL scrubber.
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_OBJECT_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_OBJECT_TYPE_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER);
qbc.addOrderByAscending(KFSPropertyConstants.TRANSACTION_ENTRY_SEQUENCE_NUMBER);
qbc.addOrderByAscending(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_DESC);
qbc.addOrderByAscending(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT);
qbc.addOrderByAscending(KFSPropertyConstants.TRANSACTION_DEBIT_CREDIT_CODE);
}
else if (sort == OriginEntryDao.SORT_REPORT) {
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER);
qbc.addOrderByAscending(KFSPropertyConstants.TRANSACTION_DEBIT_CREDIT_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.ACCOUNT_NUMBER);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_OBJECT_CODE);
}
else if (sort == OriginEntryDao.SORT_LISTING_REPORT) {
qbc.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR);
qbc.addOrderByAscending(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.ACCOUNT_NUMBER);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_OBJECT_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_OBJECT_TYPE_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER);
qbc.addOrderByAscending(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_DESC);
}
else {
qbc.addOrderByAscending(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.ACCOUNT_NUMBER);
qbc.addOrderByAscending(KFSPropertyConstants.SUB_ACCOUNT_NUMBER);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_OBJECT_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_OBJECT_TYPE_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE);
qbc.addOrderByAscending(KFSPropertyConstants.DOCUMENT_NUMBER);
qbc.addOrderByAscending(KFSPropertyConstants.TRANSACTION_LEDGER_ENTRY_DESC);
}
return getPersistenceBrokerTemplate().getIteratorByQuery(qbc);
}
/**
* @see org.kuali.kfs.module.ld.dataaccess.impl.LaborOriginEntryDaoOjb#getMatchingEntriesByCollection(java.util.Map)
*/
@Override
public Collection getMatchingEntriesByCollection(Map searchCriteria) {
LOG.debug("getMatchingEntries() started");
Criteria criteria = new Criteria();
for (Iterator iter = searchCriteria.keySet().iterator(); iter.hasNext();) {
String element = (String) iter.next();
criteria.addEqualTo(element, searchCriteria.get(element));
}
QueryByCriteria qbc = QueryFactory.newQuery(this.getEntryClass(), criteria);
qbc.addOrderByAscending("entryGroupId");
return getPersistenceBrokerTemplate().getCollectionByQuery(qbc);
}
/**
* @param entry the entry to save.
*/
@Deprecated
public void saveOriginEntry(LaborOriginEntry entry) {
LOG.debug("saveOriginEntry() started");
if ((entry != null) && (entry.getTransactionLedgerEntryDescription() != null) && (entry.getTransactionLedgerEntryDescription().length() > 40)) {
entry.setTransactionLedgerEntryDescription(entry.getTransactionLedgerEntryDescription().substring(0, 40));
}
getPersistenceBrokerTemplate().store(entry);
}
/**
* @see org.kuali.kfs.module.ld.dataaccess.impl.LaborOriginEntryDaoOjb#getSummaryByGroupId(java.util.Collection)
*/
@Override
public Iterator getSummaryByGroupId(Collection groupIdList) {
LOG.debug("getSummaryByGroupId() started");
if (groupIdList == null || groupIdList.size() <= 0) {
return null;
}
Collection ids = new ArrayList();
for (Iterator iter = groupIdList.iterator(); iter.hasNext();) {
OriginEntryGroup element = (OriginEntryGroup) iter.next();
ids.add(element.getId());
}
Criteria criteria = new Criteria();
criteria.addIn(KFSPropertyConstants.ENTRY_GROUP_ID, ids);
ReportQueryByCriteria query = QueryFactory.newReportQuery(getEntryClass(), criteria);
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(*)" };
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 };
query.setAttributes(attributeList);
query.addGroupBy(groupList);
// add the sorting criteria
for (int i = 0; i < groupList.length; i++) {
query.addOrderByAscending(groupList[i]);
}
return getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query);
}
/**
* @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#getEntryCollectionByGroup(org.kuali.kfs.gl.businessobject.OriginEntryGroup)
*/
public Collection<LaborOriginEntry> getEntryCollectionByGroup(OriginEntryGroup group) {
LOG.debug("getEntriesByGroups() started");
Criteria criteria = new Criteria();
criteria.addEqualTo(KFSPropertyConstants.ENTRY_GROUP_ID, group.getId());
QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria);
return getPersistenceBrokerTemplate().getCollectionByQuery(query);
}
/**
* Get all the Labor backup groups to scrub (ie, origin entry groups with source OriginEntrySource.LABOR_BACKUP)
*
* @param groupDate this parameter isn't really used
* @return a Collection of Labor backup groups
* @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#getLaborBackupGroups(java.sql.Date)
*/
public Collection getLaborBackupGroups(Date groupDate) {
LOG.debug("getGroupsToBackup() started");
Criteria criteria = new Criteria();
criteria.addEqualTo(SOURCE_CODE, OriginEntrySource.LABOR_BACKUP);
criteria.addEqualTo(SCRUB, Boolean.TRUE);
criteria.addEqualTo(PROCESS, Boolean.TRUE);
criteria.addEqualTo(VALID, Boolean.TRUE);
QueryByCriteria qbc = QueryFactory.newQuery(OriginEntryGroup.class, criteria);
return getPersistenceBrokerTemplate().getCollectionByQuery(qbc);
}
/**
* Get all the groups to be copied into the backup group...though, notably, this method
* does nothing to differentiate labor groups from otherwise normal groups. One must assume
* that processing takes place somewhere else
*
* @param groupDate the date returned origin entry groups must have been created on or before
* @return a Collection of Labor Origin Entry Groups to backup
*
* @see org.kuali.kfs.module.ld.dataaccess.LaborOriginEntryDao#getLaborScrubberGroups(java.sql.Date)
*/
public Collection getLaborGroupsToBackup(Date groupDate) {
LOG.debug("getLaborGroupsToBackup() started");
Criteria criteria = new Criteria();
criteria.addLessOrEqualThan(DATE, groupDate);
criteria.addEqualTo(SCRUB, Boolean.TRUE);
criteria.addEqualTo(PROCESS, Boolean.TRUE);
criteria.addEqualTo(VALID, Boolean.TRUE);
QueryByCriteria qbc = QueryFactory.newQuery(OriginEntryGroup.class, criteria);
return getPersistenceBrokerTemplate().getCollectionByQuery(qbc);
}
}