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.math.BigDecimal; 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 import java.util.Set; 025 026 import org.apache.ojb.broker.query.Criteria; 027 import org.apache.ojb.broker.query.QueryByCriteria; 028 import org.apache.ojb.broker.query.QueryFactory; 029 import org.apache.ojb.broker.query.ReportQueryByCriteria; 030 import org.kuali.kfs.gl.OJBUtility; 031 import org.kuali.kfs.gl.dataaccess.LedgerEntryBalancingDao; 032 import org.kuali.kfs.module.ld.businessobject.LedgerEntry; 033 import org.kuali.kfs.module.ld.dataaccess.LaborLedgerEntryDao; 034 import org.kuali.kfs.module.ld.util.ConsolidationUtil; 035 import org.kuali.kfs.sys.KFSConstants; 036 import org.kuali.kfs.sys.KFSPropertyConstants; 037 import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb; 038 import org.kuali.rice.kns.util.ObjectUtils; 039 import org.kuali.rice.kns.util.TransactionalServiceUtils; 040 041 /** 042 * This is the data access object for ledger entry. 043 * 044 * @see org.kuali.kfs.module.ld.businessobject.LedgerEntry 045 */ 046 public class LaborLedgerEntryDaoOjb extends PlatformAwareDaoBaseOjb implements LaborLedgerEntryDao, LedgerEntryBalancingDao { 047 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(LaborLedgerEntryDaoOjb.class); 048 049 /** 050 * @see org.kuali.kfs.module.ld.dataaccess.LaborLedgerEntryDao#getMaxSquenceNumber(org.kuali.kfs.module.ld.businessobject.LedgerEntry) 051 */ 052 public Integer getMaxSquenceNumber(LedgerEntry ledgerEntry) { 053 Criteria criteria = new Criteria(); 054 055 criteria.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, ledgerEntry.getUniversityFiscalYear()); 056 criteria.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, ledgerEntry.getChartOfAccountsCode()); 057 criteria.addEqualTo(KFSPropertyConstants.ACCOUNT_NUMBER, ledgerEntry.getAccountNumber()); 058 criteria.addEqualTo(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, ledgerEntry.getSubAccountNumber()); 059 criteria.addEqualTo(KFSPropertyConstants.FINANCIAL_OBJECT_CODE, ledgerEntry.getFinancialObjectCode()); 060 criteria.addEqualTo(KFSPropertyConstants.FINANCIAL_SUB_OBJECT_CODE, ledgerEntry.getFinancialSubObjectCode()); 061 criteria.addEqualTo(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, ledgerEntry.getFinancialBalanceTypeCode()); 062 criteria.addEqualTo(KFSPropertyConstants.FINANCIAL_OBJECT_TYPE_CODE, ledgerEntry.getFinancialObjectTypeCode()); 063 criteria.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE, ledgerEntry.getUniversityFiscalPeriodCode()); 064 criteria.addEqualTo(KFSPropertyConstants.FINANCIAL_DOCUMENT_TYPE_CODE, ledgerEntry.getFinancialDocumentTypeCode()); 065 criteria.addEqualTo(KFSPropertyConstants.FINANCIAL_SYSTEM_ORIGINATION_CODE, ledgerEntry.getFinancialSystemOriginationCode()); 066 criteria.addEqualTo(KFSPropertyConstants.DOCUMENT_NUMBER, ledgerEntry.getDocumentNumber()); 067 068 ReportQueryByCriteria query = QueryFactory.newReportQuery(this.getEntryClass(), criteria); 069 query.setAttributes(new String[] { "max(" + KFSPropertyConstants.TRANSACTION_ENTRY_SEQUENCE_NUMBER + ")" }); 070 071 Iterator iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); 072 Integer maxSequenceNumber = Integer.valueOf(0); 073 074 if (iterator.hasNext()) { 075 Object[] data = (Object[]) TransactionalServiceUtils.retrieveFirstAndExhaustIterator(iterator); 076 if (data[0] != null) { 077 maxSequenceNumber = ((BigDecimal) data[0]).intValue(); 078 } 079 } 080 return maxSequenceNumber; 081 } 082 083 /** 084 * @see org.kuali.kfs.module.ld.dataaccess.LaborLedgerEntryDao#find(java.util.Map) 085 */ 086 public Iterator<LedgerEntry> find(Map<String, String> fieldValues) { 087 Criteria criteria = OJBUtility.buildCriteriaFromMap(fieldValues, new LedgerEntry()); 088 089 QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); 090 return getPersistenceBrokerTemplate().getIteratorByQuery(query); 091 } 092 093 /** 094 * @see org.kuali.kfs.module.ld.dataaccess.LaborLedgerEntryDao#save(org.kuali.kfs.module.ld.businessobject.LedgerEntry) 095 */ 096 public void save(LedgerEntry ledgerEntry) { 097 getPersistenceBrokerTemplate().store(ledgerEntry); 098 } 099 100 /** 101 * @see org.kuali.kfs.module.ld.dataaccess.LaborLedgerEntryDao#findEmployeesWithPayType(java.util.Map, java.util.List, java.util.List) 102 */ 103 public List<String> findEmployeesWithPayType(Map<Integer, Set<String>> payPeriods, List<String> balanceTypes, Map<String, Set<String>> earnCodePayGroupMap) { 104 Criteria criteria = this.buildPayTypeCriteria(payPeriods, balanceTypes, earnCodePayGroupMap); 105 106 ReportQueryByCriteria query = QueryFactory.newReportQuery(this.getEntryClass(), criteria); 107 query.setAttributes(new String[] { KFSPropertyConstants.EMPLID }); 108 query.setDistinct(true); 109 110 Iterator<Object[]> employees = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query); 111 List<String> employeeList = new ArrayList<String>(); 112 113 while (employees != null && employees.hasNext()) { 114 Object[] emplid = employees.next(); 115 employeeList.add(emplid == null ? "" : emplid[0].toString()); 116 } 117 118 return employeeList; 119 } 120 121 /** 122 * @see org.kuali.kfs.module.ld.dataaccess.LaborLedgerEntryDao#getLedgerEntriesForEmployeeWithPayType(java.lang.String, java.util.Map, 123 * java.util.List, java.util.Map) 124 */ 125 public Collection<LedgerEntry> getLedgerEntriesForEmployeeWithPayType(String emplid, Map<Integer, Set<String>> payPeriods, List<String> balanceTypes, Map<String, Set<String>> earnCodePayGroupMap) { 126 Criteria criteria = this.buildPayTypeCriteria(payPeriods, balanceTypes, earnCodePayGroupMap); 127 criteria.addEqualTo(KFSPropertyConstants.EMPLID, emplid); 128 129 QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); 130 return getPersistenceBrokerTemplate().getCollectionByQuery(query); 131 } 132 133 /** 134 * @see org.kuali.kfs.module.ld.dataaccess.LaborLedgerEntryDao#isEmployeeWithPayType(java.lang.String, java.util.Map, java.util.List, 135 * java.util.Map) 136 */ 137 public boolean isEmployeeWithPayType(String emplid, Map<Integer, Set<String>> payPeriods, List<String> balanceTypes, Map<String, Set<String>> earnCodePayGroupMap) { 138 Criteria criteria = this.buildPayTypeCriteria(payPeriods, balanceTypes, earnCodePayGroupMap); 139 criteria.addEqualTo(KFSPropertyConstants.EMPLID, emplid); 140 141 QueryByCriteria query = QueryFactory.newQuery(this.getEntryClass(), criteria); 142 return getPersistenceBrokerTemplate().getCount(query) > 0; 143 } 144 145 /** 146 * @see org.kuali.kfs.module.ld.dataaccess.LaborLedgerEntryDao#deleteLedgerEntriesPriorToYear(java.lang.Integer, java.lang.String) 147 */ 148 public void deleteLedgerEntriesPriorToYear(Integer fiscalYear, String chartOfAccountsCode) { 149 LOG.debug("deleteLedgerEntriesPriorToYear() started"); 150 151 Criteria criteria = new Criteria(); 152 criteria.addLessThan(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, fiscalYear); 153 criteria.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, chartOfAccountsCode); 154 155 QueryByCriteria query = new QueryByCriteria(this.getEntryClass(), criteria); 156 getPersistenceBrokerTemplate().deleteByQuery(query); 157 158 } 159 160 /** 161 * @see org.kuali.kfs.gl.dataaccess.LedgerEntryBalancingDao#findEntryByGroup(java.lang.Integer, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String) 162 */ 163 public Object[] findEntryByGroup(Integer universityFiscalYear, String chartOfAccountsCode, String financialObjectCode, String financialBalanceTypeCode, String universityFiscalPeriodCode, String transactionDebitCreditCode) { 164 Criteria criteria = new Criteria(); 165 criteria.addEqualTo(KFSConstants.UNIVERSITY_FISCAL_YEAR_PROPERTY_NAME, universityFiscalYear); 166 criteria.addEqualTo(KFSConstants.CHART_OF_ACCOUNTS_CODE_PROPERTY_NAME, chartOfAccountsCode); 167 criteria.addEqualTo(KFSConstants.FINANCIAL_OBJECT_CODE_PROPERTY_NAME, financialObjectCode); 168 criteria.addEqualTo(KFSConstants.FINANCIAL_BALANCE_TYPE_CODE_PROPERTY_NAME, financialBalanceTypeCode); 169 criteria.addEqualTo(KFSConstants.UNIVERSITY_FISCAL_PERIOD_CODE_PROPERTY_NAME, universityFiscalPeriodCode); 170 criteria.addEqualTo(KFSConstants.TRANSACTION_DEBIT_CREDIT_CODE, transactionDebitCreditCode); 171 172 ReportQueryByCriteria reportQuery = QueryFactory.newReportQuery(this.getEntryClass(), criteria); 173 reportQuery.setAttributes(new String[] { "count(*)", ConsolidationUtil.sum(KFSConstants.TRANSACTION_LEDGER_ENTRY_AMOUNT)}); 174 reportQuery.addGroupBy(new String[] { KFSConstants.UNIVERSITY_FISCAL_YEAR_PROPERTY_NAME, KFSConstants.CHART_OF_ACCOUNTS_CODE_PROPERTY_NAME, KFSConstants.FINANCIAL_OBJECT_CODE_PROPERTY_NAME, KFSConstants.FINANCIAL_BALANCE_TYPE_CODE_PROPERTY_NAME, KFSConstants.UNIVERSITY_FISCAL_PERIOD_CODE_PROPERTY_NAME, KFSConstants.TRANSACTION_DEBIT_CREDIT_CODE}); 175 176 Iterator<Object[]> iterator = getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(reportQuery); 177 Object[] returnResult = TransactionalServiceUtils.retrieveFirstAndExhaustIterator(iterator); 178 179 if (ObjectUtils.isNull(returnResult)) { 180 // Do nothing, we'll return null. Data wasn't found. 181 } else if (returnResult[0] instanceof BigDecimal) { 182 returnResult[0] = ((BigDecimal) returnResult[0]).intValue(); 183 } 184 else { 185 returnResult[0] = ((Long) returnResult[0]).intValue(); 186 } 187 188 return returnResult; 189 } 190 191 // build the pay type criteria 192 protected Criteria buildPayTypeCriteria(Map<Integer, Set<String>> payPeriods, List<String> balanceTypes, Map<String, Set<String>> earnCodePayGroupMap) { 193 Criteria criteria = new Criteria(); 194 195 Criteria criteriaForPayPeriods = new Criteria(); 196 for (Integer fiscalYear : payPeriods.keySet()) { 197 Criteria criteriaForFiscalYear = new Criteria(); 198 199 criteriaForFiscalYear.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, fiscalYear); 200 criteriaForFiscalYear.addIn(KFSPropertyConstants.UNIVERSITY_FISCAL_PERIOD_CODE, payPeriods.get(fiscalYear)); 201 202 criteriaForPayPeriods.addOrCriteria(criteriaForFiscalYear); 203 } 204 205 Criteria criteriaForBalanceTypes = new Criteria(); 206 criteriaForBalanceTypes.addIn(KFSPropertyConstants.FINANCIAL_BALANCE_TYPE_CODE, balanceTypes); 207 208 Criteria criteriaForEarnCodePayGroup = new Criteria(); 209 for (String payGroup : earnCodePayGroupMap.keySet()) { 210 Criteria criteriaForEarnPay = new Criteria(); 211 212 criteriaForEarnPay.addEqualTo(KFSPropertyConstants.PAY_GROUP, payGroup); 213 criteriaForEarnPay.addIn(KFSPropertyConstants.EARN_CODE, earnCodePayGroupMap.get(payGroup)); 214 215 criteriaForEarnCodePayGroup.addOrCriteria(criteriaForEarnPay); 216 } 217 218 criteria.addAndCriteria(criteriaForPayPeriods); 219 criteria.addAndCriteria(criteriaForBalanceTypes); 220 criteria.addAndCriteria(criteriaForEarnCodePayGroup); 221 222 return criteria; 223 } 224 225 /** 226 * @see org.kuali.kfs.gl.dataaccess.LedgerEntryBalancingDao#findCountGreaterOrEqualThan(java.lang.Integer) 227 */ 228 public Integer findCountGreaterOrEqualThan(Integer year) { 229 Criteria criteria = new Criteria(); 230 criteria.addGreaterOrEqualThan(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, year); 231 232 ReportQueryByCriteria query = QueryFactory.newReportQuery(getEntryClass(), criteria); 233 234 return getPersistenceBrokerTemplate().getCount(query); 235 } 236 237 /** 238 * @return the Class type of the business object accessed and managed 239 */ 240 protected Class getEntryClass() { 241 return LedgerEntry.class; 242 } 243 }