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.gl.dataaccess.impl;
017
018 import java.util.ArrayList;
019 import java.util.Arrays;
020 import java.util.Iterator;
021 import java.util.List;
022 import java.util.Map;
023
024 import org.apache.ojb.broker.query.Criteria;
025 import org.apache.ojb.broker.query.Query;
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.OJBUtility;
030 import org.kuali.kfs.gl.businessobject.Encumbrance;
031 import org.kuali.kfs.gl.businessobject.Transaction;
032 import org.kuali.kfs.gl.dataaccess.EncumbranceDao;
033 import org.kuali.kfs.sys.KFSConstants;
034 import org.kuali.kfs.sys.KFSPropertyConstants;
035 import org.kuali.rice.kns.dao.impl.PlatformAwareDaoBaseOjb;
036
037 /**
038 * An OJB implementation of the EncumbranceDao
039 */
040 public class EncumbranceDaoOjb extends PlatformAwareDaoBaseOjb implements EncumbranceDao {
041 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(EncumbranceDaoOjb.class);
042
043 /**
044 * Returns an encumbrance that would be affected by the given transaction
045 *
046 * @param t the transaction to find the affected encumbrance for
047 * @return an Encumbrance that would be affected by the posting of the transaction, or null
048 * @see org.kuali.kfs.gl.dataaccess.EncumbranceDao#getEncumbranceByTransaction(org.kuali.kfs.gl.businessobject.Transaction)
049 */
050 public Encumbrance getEncumbranceByTransaction(Transaction t) {
051 LOG.debug("getEncumbranceByTransaction() started");
052
053 Criteria crit = new Criteria();
054 crit.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, t.getUniversityFiscalYear());
055 crit.addEqualTo(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, t.getChartOfAccountsCode());
056 crit.addEqualTo(KFSPropertyConstants.ACCOUNT_NUMBER, t.getAccountNumber());
057 crit.addEqualTo(KFSPropertyConstants.SUB_ACCOUNT_NUMBER, t.getSubAccountNumber());
058 crit.addEqualTo(KFSPropertyConstants.OBJECT_CODE, t.getFinancialObjectCode());
059 crit.addEqualTo(KFSPropertyConstants.SUB_OBJECT_CODE, t.getFinancialSubObjectCode());
060 crit.addEqualTo(KFSPropertyConstants.BALANCE_TYPE_CODE, t.getFinancialBalanceTypeCode());
061 crit.addEqualTo(KFSPropertyConstants.ENCUMBRANCE_DOCUMENT_TYPE_CODE, t.getFinancialDocumentTypeCode());
062 crit.addEqualTo(KFSPropertyConstants.ORIGIN_CODE, t.getFinancialSystemOriginationCode());
063 crit.addEqualTo(KFSPropertyConstants.DOCUMENT_NUMBER, t.getDocumentNumber());
064
065 QueryByCriteria qbc = QueryFactory.newQuery(Encumbrance.class, crit);
066 return (Encumbrance) getPersistenceBrokerTemplate().getObjectByQuery(qbc);
067 }
068
069 /**
070 * Returns an Iterator of all encumbrances that need to be closed for the fiscal year
071 *
072 * @param fiscalYear a fiscal year to find encumbrances for
073 * @return an Iterator of encumbrances to close
074 * @see org.kuali.kfs.gl.dataaccess.EncumbranceDao#getEncumbrancesToClose(java.lang.Integer)
075 */
076 public Iterator getEncumbrancesToClose(Integer fiscalYear) {
077
078 Criteria criteria = new Criteria();
079 criteria.addEqualTo(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, fiscalYear);
080
081 QueryByCriteria query = new QueryByCriteria(Encumbrance.class, criteria);
082 query.addOrderByAscending(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
083 query.addOrderByAscending(KFSPropertyConstants.ACCOUNT_NUMBER);
084 query.addOrderByAscending(KFSPropertyConstants.SUB_ACCOUNT_NUMBER);
085 query.addOrderByAscending(KFSPropertyConstants.OBJECT_CODE);
086 query.addOrderByAscending(KFSPropertyConstants.SUB_OBJECT_CODE);
087 query.addOrderByAscending(KFSPropertyConstants.BALANCE_TYPE_CODE);
088
089 return getPersistenceBrokerTemplate().getIteratorByQuery(query);
090 }
091
092 /**
093 * Saves an encumbrance to the database
094 *
095 * @param e an encumbrance to save
096 * @see org.kuali.kfs.gl.dataaccess.EncumbranceDao#save(org.kuali.kfs.gl.businessobject.Encumbrance)
097 */
098 public void save(Encumbrance e) {
099 LOG.debug("save() started");
100
101 getPersistenceBrokerTemplate().store(e);
102 }
103
104 /**
105 * Purges the database of all those encumbrances with the given chart and year
106 *
107 * @param chartOfAccountsCode the chart of accounts code purged encumbrances will have
108 * @param year the university fiscal year purged encumbrances will have
109 * @see org.kuali.kfs.gl.dataaccess.EncumbranceDao#purgeYearByChart(java.lang.String, int)
110 */
111 public void purgeYearByChart(String chartOfAccountsCode, int year) {
112 LOG.debug("purgeYearByChart() started");
113
114 Criteria criteria = new Criteria();
115 criteria.addEqualTo(KFSPropertyConstants.CHART, chartOfAccountsCode);
116 criteria.addLessThan(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, new Integer(year));
117
118 getPersistenceBrokerTemplate().deleteByQuery(new QueryByCriteria(Encumbrance.class, criteria));
119
120 // This is required because if any deleted account balances are in the cache, deleteByQuery
121 // doesn't
122 // remove them from the cache so a future select will retrieve these deleted account
123 // balances from
124 // the cache and return them. Clearing the cache forces OJB to go to the database again.
125 getPersistenceBrokerTemplate().clearCache();
126 }
127
128 /**
129 * fetch all encumbrance records from GL open encumbrance table
130 *
131 * @return an Iterator with all encumbrances currently in the database
132 * @see org.kuali.kfs.gl.dataaccess.EncumbranceDao#getAllEncumbrances()
133 */
134 public Iterator getAllEncumbrances() {
135 Criteria criteria = new Criteria();
136 QueryByCriteria query = QueryFactory.newQuery(Encumbrance.class, criteria);
137 return getPersistenceBrokerTemplate().getIteratorByQuery(query);
138 }
139
140 /**
141 * group all encumbrances with/without the given document type code by fiscal year, chart, account, sub-account, object code,
142 * sub object code, and balance type code, and summarize the encumbrance amount and the encumbrance close amount.
143 *
144 * @param documentTypeCode the given document type code
145 * @param included indicate if all encumbrances with the given document type are included in the results or not
146 * @return an Iterator of arrays of java.lang.Objects holding summarization data about qualifying encumbrances
147 * @see org.kuali.kfs.gl.dataaccess.EncumbranceDao#getSummarizedEncumbrances(String, boolean)
148 */
149 public Iterator getSummarizedEncumbrances(String documentTypeCode, boolean included) {
150 Criteria criteria = new Criteria();
151
152 if (included) {
153 criteria.addEqualTo(KFSPropertyConstants.ENCUMBRANCE_DOCUMENT_TYPE_CODE, documentTypeCode);
154 }
155 else {
156 criteria.addNotEqualTo(KFSPropertyConstants.ENCUMBRANCE_DOCUMENT_TYPE_CODE, documentTypeCode);
157 }
158
159 ReportQueryByCriteria query = QueryFactory.newReportQuery(Encumbrance.class, criteria);
160
161 // set the selection attributes
162 List attributeList = buildAttributeList();
163 String[] attributes = (String[]) attributeList.toArray(new String[attributeList.size()]);
164 query.setAttributes(attributes);
165
166 // add the group criteria into the selection statement
167 List groupByList = buildGroupByList();
168 String[] groupBy = (String[]) groupByList.toArray(new String[groupByList.size()]);
169 query.addGroupBy(groupBy);
170
171 return getPersistenceBrokerTemplate().getReportQueryIteratorByQuery(query);
172 }
173
174 /**
175 * Queries the database to find all open encumbrances that qualify by the given keys
176 *
177 * @param fieldValues the input fields and values
178 * @return a collection of open encumbrances
179 * @see org.kuali.kfs.gl.dataaccess.EncumbranceDao#findOpenEncumbrance(java.util.Map)
180 */
181 public Iterator findOpenEncumbrance(Map fieldValues) {
182 LOG.debug("findOpenEncumbrance() started");
183
184 Query query = this.getOpenEncumbranceQuery(fieldValues);
185 OJBUtility.limitResultSize(query);
186 return getPersistenceBrokerTemplate().getIteratorByQuery(query);
187 }
188
189 /**
190 * Counts the number of open encumbrances that have the keys given in the map
191 *
192 * @param fieldValues the input fields and values
193 * @return the number of the open encumbrances
194 * @see org.kuali.kfs.gl.dataaccess.EncumbranceDao#getOpenEncumbranceRecordCount(java.util.Map)
195 */
196 public Integer getOpenEncumbranceRecordCount(Map fieldValues) {
197 LOG.debug("getOpenEncumbranceRecordCount() started");
198
199 Query query = this.getOpenEncumbranceQuery(fieldValues);
200 return getPersistenceBrokerTemplate().getCount(query);
201 }
202
203 /**
204 * build the query for encumbrance search
205 *
206 * @param fieldValues a Map of values to use as keys for the query
207 * @return an OJB query
208 */
209 protected Query getOpenEncumbranceQuery(Map fieldValues) {
210 Criteria criteria = OJBUtility.buildCriteriaFromMap(fieldValues, new Encumbrance());
211 criteria.addIn(KFSPropertyConstants.BALANCE_TYPE_CODE, Arrays.asList(KFSConstants.ENCUMBRANCE_BALANCE_TYPE));
212 return QueryFactory.newQuery(Encumbrance.class, criteria);
213 }
214
215 /**
216 * This method builds the atrribute list used by balance searching
217 *
218 * @return a List of encumbrance attributes that need to be summed
219 */
220 protected List buildAttributeList() {
221 List attributeList = this.buildGroupByList();
222
223 attributeList.add("sum(" + KFSPropertyConstants.ACCOUNT_LINE_ENCUMBRANCE_AMOUNT + ")");
224 attributeList.add("sum(" + KFSPropertyConstants.ACCOUNT_LINE_ENCUMBRANCE_CLOSED_AMOUNT + ")");
225
226 return attributeList;
227 }
228
229 /**
230 * This method builds group by attribute list used by balance searching
231 *
232 * @return a List of encumbrance attributes to search on
233 */
234 protected List buildGroupByList() {
235 List attributeList = new ArrayList();
236
237 attributeList.add(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR);
238 attributeList.add(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE);
239 attributeList.add(KFSPropertyConstants.ACCOUNT_NUMBER);
240 attributeList.add(KFSPropertyConstants.SUB_ACCOUNT_NUMBER);
241 attributeList.add(KFSPropertyConstants.OBJECT_CODE);
242 attributeList.add(KFSPropertyConstants.SUB_OBJECT_CODE);
243 attributeList.add(KFSPropertyConstants.BALANCE_TYPE_CODE);
244
245 return attributeList;
246 }
247
248 /**
249 * @see org.kuali.kfs.gl.dataaccess.EncumbranceDao#findCountGreaterOrEqualThan(java.lang.Integer)
250 */
251 public Integer findCountGreaterOrEqualThan(Integer year) {
252 Criteria criteria = new Criteria();
253 criteria.addGreaterOrEqualThan(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, year);
254
255 ReportQueryByCriteria query = QueryFactory.newReportQuery(Encumbrance.class, criteria);
256
257 return getPersistenceBrokerTemplate().getCount(query);
258 }
259 }