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.math.BigDecimal;
019 import java.util.ArrayList;
020 import java.util.List;
021 import java.util.Map;
022
023 import org.kuali.kfs.gl.GeneralLedgerConstants;
024 import org.kuali.kfs.gl.dataaccess.AccountBalanceObjectDao;
025 import org.kuali.kfs.gl.service.AccountBalanceService;
026 import org.kuali.kfs.sys.KFSConstants;
027 import org.kuali.kfs.sys.businessobject.SystemOptions;
028 import org.kuali.kfs.sys.businessobject.UniversityDate;
029 import org.kuali.kfs.sys.context.SpringContext;
030 import org.kuali.kfs.sys.service.UniversityDateService;
031 import org.kuali.rice.kns.util.Guid;
032 import org.springframework.dao.IncorrectResultSizeDataAccessException;
033 import org.springframework.jdbc.support.rowset.SqlRowSet;
034
035 /**
036 * Calculate Balance By Object Balance Inquiry Screen
037 */
038 public class AccountBalanceObjectDaoJdbc extends AccountBalanceDaoJdbcBase implements AccountBalanceObjectDao {
039 private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AccountBalanceObjectDaoJdbc.class);
040
041 /**
042 * Returns a collection of report data for the account balance by object inquiry
043 *
044 * @param universityFiscalYear the university fiscal year of reported on account balances
045 * @param chartOfAccountsCode the chart of accounts code of reported on account balances
046 * @param accountNumber the account number of reported on account balances
047 * @param financialObjectLevelCode the object level code of reported on account balances
048 * @param financialReportingSortCode the sort code for reported results
049 * @param isCostShareExcluded whether cost share account balances should be excluded from the query or not
050 * @param isConsolidated whether the results of the query should be consolidated
051 * @param pendingEntriesCode whether this query should account for no pending entries, approved pending entries, or all pending entries
052 * @return a List of Maps with the results of the query
053 * @see org.kuali.kfs.gl.dataaccess.AccountBalanceDao#findAccountBalanceByObject(java.lang.Integer, java.lang.String,
054 * java.lang.String, java.lang.String, java.lang.String, boolean, boolean, int)
055 */
056 public List findAccountBalanceByObject(Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber, String financialObjectLevelCode, String financialReportingSortCode, boolean isCostShareExcluded, boolean isConsolidated, int pendingEntriesCode) {
057 LOG.debug("findAccountBalanceByObject() started");
058
059 SystemOptions options = optionsService.getOptions(universityFiscalYear);
060 List<Map<String, Object>> data = null;
061 String sessionId = new Guid().toString();
062 try {
063 // Delete any data for this session if it exists already
064 clearTempTable("FP_BAL_BY_OBJ_MT", "SESID", sessionId);
065 clearTempTable("FP_INTERIM1_OBJ_MT", "SESID", sessionId);
066
067 // Add in all the data we need
068 getSimpleJdbcTemplate().update("INSERT INTO FP_INTERIM1_OBJ_MT (UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR,FIN_OBJECT_CD, FIN_SUB_OBJ_CD, CURR_BDLN_BAL_AMT,"
069 + " ACLN_ACTLS_BAL_AMT, ACLN_ENCUM_BAL_AMT, TIMESTAMP,SESID) "
070 + " SELECT a.UNIV_FISCAL_YR, a.FIN_COA_CD, a.ACCOUNT_NBR, a.SUB_ACCT_NBR,"
071 + " a.FIN_OBJECT_CD, a.FIN_SUB_OBJ_CD, a.CURR_BDLN_BAL_AMT,a.ACLN_ACTLS_BAL_AMT, a.ACLN_ENCUM_BAL_AMT, a.TIMESTAMP, ?"
072 + " FROM GL_ACCT_BALANCES_T a, CA_OBJECT_CODE_T o WHERE a.univ_fiscal_yr = ? "
073 + " AND a.fin_coa_cd = ?"
074 + " AND a.account_nbr = ?"
075 + " AND a.univ_fiscal_yr = o.univ_fiscal_yr AND a.fin_coa_cd = o.fin_coa_cd AND a.fin_object_cd = o.fin_object_cd "
076 + "AND o.fin_obj_level_cd = ?", sessionId, universityFiscalYear, chartOfAccountsCode, accountNumber, financialObjectLevelCode);
077
078 // Summarize pending entries into fp_interim1_level_mt if necessary
079 if ((pendingEntriesCode == AccountBalanceService.PENDING_ALL) || (pendingEntriesCode == AccountBalanceService.PENDING_APPROVED)) {
080 if (getMatchingPendingEntriesByObject(options, universityFiscalYear, chartOfAccountsCode, accountNumber, financialObjectLevelCode, isCostShareExcluded, pendingEntriesCode, sessionId)) {
081 summarizePendingEntriesByObject(options, sessionId);
082 }
083 }
084
085 // Delete what we don't need
086 if (isCostShareExcluded) {
087 purgeCostShareEntries("FP_INTERIM1_OBJ_MT", "sesid", sessionId);
088 }
089
090 // Summarize
091 if (isConsolidated) {
092 getSimpleJdbcTemplate().update("INSERT INTO FP_BAL_BY_OBJ_MT (SUB_ACCT_NBR, FIN_OBJECT_CD, CURR_BDLN_BAL_AMT, ACLN_ACTLS_BAL_AMT, ACLN_ENCUM_BAL_AMT, FIN_REPORT_SORT_CD, "
093 + "SESID) SELECT '*ALL*',fin_object_cd, SUM(curr_bdln_bal_amt),SUM(acln_actls_bal_amt), SUM(acln_encum_bal_amt),"
094 + "'B', ? "
095 + " FROM FP_INTERIM1_OBJ_MT WHERE FP_INTERIM1_OBJ_MT.SESID = ?"
096 + " GROUP BY fin_object_cd", sessionId, sessionId);
097 }
098 else {
099 getSimpleJdbcTemplate().update("INSERT INTO FP_BAL_BY_OBJ_MT (SUB_ACCT_NBR, FIN_OBJECT_CD, CURR_BDLN_BAL_AMT, ACLN_ACTLS_BAL_AMT, ACLN_ENCUM_BAL_AMT, FIN_REPORT_SORT_CD, "
100 + "SESID) SELECT sub_acct_nbr, fin_object_cd, SUM(curr_bdln_bal_amt), SUM(acln_actls_bal_amt),SUM(acln_encum_bal_amt), "
101 + " 'B', ? "
102 + " FROM FP_INTERIM1_OBJ_MT WHERE FP_INTERIM1_OBJ_MT.SESID = ? "
103 + " GROUP BY sub_acct_nbr, fin_object_cd", sessionId, sessionId);
104 }
105
106 // Here's the data
107 data = getSimpleJdbcTemplate().queryForList("select SUB_ACCT_NBR, FIN_OBJECT_CD, CURR_BDLN_BAL_AMT, ACLN_ACTLS_BAL_AMT, ACLN_ENCUM_BAL_AMT, FIN_REPORT_SORT_CD from FP_BAL_BY_OBJ_MT "
108 + " where SESID = ? " + " order by fin_object_cd", sessionId);
109 }
110 finally {
111 // Clean up everything
112 clearTempTable("FP_BAL_BY_OBJ_MT", "SESID", sessionId);
113 clearTempTable("FP_INTERIM1_OBJ_MT", "SESID", sessionId);
114 clearTempTable("GL_PENDING_ENTRY_MT", "SESID", sessionId);
115 }
116 return data;
117 }
118
119 /**
120 * Summarizes all the pending ledger entries that would need to be reported on by this inquiry,
121 * and saves all of that data to a temporary table
122 *
123 * @param options a set of system options
124 * @param sessionId the unique web id of the currently inquiring user, used as a key for the temp table
125 */
126 protected void summarizePendingEntriesByObject(SystemOptions options, String sessionId) {
127 LOG.debug("summarizePendingEntriesByObject() started");
128
129 try {
130
131 String balanceStatementSql = "SELECT CURR_BDLN_BAL_AMT,ACLN_ACTLS_BAL_AMT,ACLN_ENCUM_BAL_AMT "
132 + "FROM FP_INTERIM1_OBJ_MT "
133 + "WHERE sesid = ? AND univ_fiscal_yr = ? AND fin_coa_cd = ? AND account_nbr = ? AND sub_acct_nbr = ?"
134 + " AND fin_object_cd = ? AND fin_sub_obj_cd = ?";
135
136 String updateBalanceStatementSql = "UPDATE FP_INTERIM1_OBJ_MT "
137 + " SET curr_bdln_bal_amt = ?,acln_actls_bal_amt = ?,acln_encum_bal_amt = ? "
138 + " WHERE sesid = ? AND univ_fiscal_yr = ? AND fin_coa_cd = ? AND account_nbr = ? AND sub_acct_nbr = ?"
139 + " AND fin_object_cd = ? AND fin_sub_obj_cd = ?";
140
141 String insertBalanceStatementSql = "INSERT INTO FP_INTERIM1_OBJ_MT (UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, FIN_OBJECT_CD, "
142 + "FIN_SUB_OBJ_CD, CURR_BDLN_BAL_AMT, ACLN_ACTLS_BAL_AMT, ACLN_ENCUM_BAL_AMT, TIMESTAMP, SESID) "
143 + "VALUES (?,?,?,?,?,?,?,?,?," + getDbPlatform().getCurTimeFunction() + ",?)";
144
145 SqlRowSet pendingEntryRowSet = getJdbcTemplate().queryForRowSet("SELECT b.FIN_OFFST_GNRTN_CD,t.FIN_OBJTYP_DBCR_CD,e.* "
146 + "FROM GL_PENDING_ENTRY_MT e,CA_OBJ_TYPE_T t,CA_BALANCE_TYPE_T b " + "WHERE e.SESID = ?"
147 + " AND e.FIN_OBJ_TYP_CD = t.FIN_OBJ_TYP_CD AND e.fin_balance_typ_cd = b.fin_balance_typ_cd "
148 + "ORDER BY e.univ_fiscal_yr,e.account_nbr,e.sub_acct_nbr,e.fin_object_cd,e.fin_sub_obj_cd,e.fin_obj_typ_cd", new Object[] { sessionId });
149
150
151 int updateCount = 0;
152 int insertCount = 0;
153 while (pendingEntryRowSet.next()) {
154
155 Map<String, Object> balance = null;
156 try {
157 balance = getSimpleJdbcTemplate().queryForMap(balanceStatementSql, sessionId, pendingEntryRowSet.getInt(GeneralLedgerConstants.ColumnNames.UNIVERSITY_FISCAL_YEAR), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.CHART_OF_ACCOUNTS_CODE), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.ACCOUNT_NUMBER), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.SUB_ACCOUNT_NUMBER), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.OBJECT_CODE), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.SUB_OBJECT_CODE));
158 }
159 catch (IncorrectResultSizeDataAccessException ex) {
160 if (ex.getActualSize() != 0) {
161 LOG.error("balance request sql returned more than one row, aborting", ex);
162 throw ex;
163 }
164 // no rows returned - that's ok
165 }
166
167 String balanceType = pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.BALANCE_TYPE_CODE);
168 String debitCreditCode = pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.DEBIT_CREDIT_CODE);
169 String objectTypeDebitCreditCode = pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.OBJECT_TYPE_DEBIT_CREDIT_CODE);
170 String offsetGenerationCode = pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.OFFSET_GENERATION_CODE);
171
172 if (balance != null) {
173 updateCount++;
174
175 BigDecimal budget = (BigDecimal) balance.get(GeneralLedgerConstants.ColumnNames.CURRENT_BDLN_BALANCE_AMOUNT);
176 BigDecimal actual = (BigDecimal) balance.get(GeneralLedgerConstants.ColumnNames.ACCOUNTING_LINE_ACTUALS_BALANCE_AMOUNT);
177 BigDecimal encumb = (BigDecimal) balance.get(GeneralLedgerConstants.ColumnNames.ACCOUNTING_LINE_ENCUMBRANCE_BALANCE_AMOUNT);
178
179 if (balanceType.equals(options.getBudgetCheckingBalanceTypeCd())) {
180 budget = budget.add(pendingEntryRowSet.getBigDecimal(GeneralLedgerConstants.ColumnNames.TRANSACTION_LEDGER_ENTRY_AMOUNT));
181 }
182 else if (balanceType.equals(options.getActualFinancialBalanceTypeCd())) {
183 if (debitCreditCode.equals(objectTypeDebitCreditCode) || (("N".equals(offsetGenerationCode) && KFSConstants.GL_BUDGET_CODE.equals(debitCreditCode)))) {
184 actual = actual.add(pendingEntryRowSet.getBigDecimal(GeneralLedgerConstants.ColumnNames.TRANSACTION_LEDGER_ENTRY_AMOUNT));
185 }
186 else {
187 actual = actual.subtract(pendingEntryRowSet.getBigDecimal(GeneralLedgerConstants.ColumnNames.TRANSACTION_LEDGER_ENTRY_AMOUNT));
188 }
189 }
190 else if (balanceType.equals(options.getExtrnlEncumFinBalanceTypCd()) || balanceType.equals(options.getIntrnlEncumFinBalanceTypCd()) || balanceType.equals(options.getPreencumbranceFinBalTypeCd()) || "CE".equals(balanceType)) {
191 if (debitCreditCode.equals(objectTypeDebitCreditCode) || (("N".equals(offsetGenerationCode) && KFSConstants.GL_BUDGET_CODE.equals(debitCreditCode)))) {
192 encumb = encumb.add(pendingEntryRowSet.getBigDecimal(GeneralLedgerConstants.ColumnNames.TRANSACTION_LEDGER_ENTRY_AMOUNT));
193 }
194 else {
195 encumb = encumb.subtract(pendingEntryRowSet.getBigDecimal(GeneralLedgerConstants.ColumnNames.TRANSACTION_LEDGER_ENTRY_AMOUNT));
196 }
197 }
198
199 // A balance exists, so we need to update it
200 getSimpleJdbcTemplate().update(updateBalanceStatementSql, budget, actual, encumb, sessionId, pendingEntryRowSet.getInt(GeneralLedgerConstants.ColumnNames.UNIVERSITY_FISCAL_YEAR), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.CHART_OF_ACCOUNTS_CODE), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.ACCOUNT_NUMBER), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.SUB_ACCOUNT_NUMBER), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.OBJECT_CODE), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.SUB_OBJECT_CODE));
201 }
202 else {
203 insertCount++;
204
205 BigDecimal budget = new BigDecimal("0");
206 BigDecimal actual = new BigDecimal("0");
207 BigDecimal encumb = new BigDecimal("0");
208
209 if (balanceType.equals(options.getBudgetCheckingBalanceTypeCd())) {
210 budget = pendingEntryRowSet.getBigDecimal(GeneralLedgerConstants.ColumnNames.TRANSACTION_LEDGER_ENTRY_AMOUNT);
211 }
212 else if (balanceType.equals(options.getActualFinancialBalanceTypeCd())) {
213 if (debitCreditCode.equals(objectTypeDebitCreditCode) || (("N".equals(offsetGenerationCode) && KFSConstants.GL_BUDGET_CODE.equals(debitCreditCode)))) {
214 actual = pendingEntryRowSet.getBigDecimal(GeneralLedgerConstants.ColumnNames.TRANSACTION_LEDGER_ENTRY_AMOUNT);
215 }
216 else {
217 actual = pendingEntryRowSet.getBigDecimal(GeneralLedgerConstants.ColumnNames.TRANSACTION_LEDGER_ENTRY_AMOUNT).negate();
218 }
219 }
220 else if (balanceType.equals(options.getExtrnlEncumFinBalanceTypCd()) || balanceType.equals(options.getIntrnlEncumFinBalanceTypCd()) || balanceType.equals(options.getPreencumbranceFinBalTypeCd()) || "CE".equals(balanceType)) {
221 if (debitCreditCode.equals(objectTypeDebitCreditCode) || (("N".equals(offsetGenerationCode) && KFSConstants.GL_BUDGET_CODE.equals(debitCreditCode)))) {
222 encumb = pendingEntryRowSet.getBigDecimal(GeneralLedgerConstants.ColumnNames.TRANSACTION_LEDGER_ENTRY_AMOUNT);
223 }
224 else {
225 encumb = pendingEntryRowSet.getBigDecimal(GeneralLedgerConstants.ColumnNames.TRANSACTION_LEDGER_ENTRY_AMOUNT).negate();
226 }
227 }
228
229 // No balance exists, so we need to insert one
230 getSimpleJdbcTemplate().update(insertBalanceStatementSql, pendingEntryRowSet.getInt(GeneralLedgerConstants.ColumnNames.UNIVERSITY_FISCAL_YEAR), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.CHART_OF_ACCOUNTS_CODE), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.ACCOUNT_NUMBER), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.SUB_ACCOUNT_NUMBER), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.OBJECT_CODE), pendingEntryRowSet.getString(GeneralLedgerConstants.ColumnNames.SUB_OBJECT_CODE), budget, actual, encumb, sessionId);
231 }
232 }
233 LOG.info("summarizePendingEntriesByObject() INSERTS: " + insertCount);
234 LOG.info("summarizePendingEntriesByObject() UPDATES: " + updateCount);
235 }
236 catch (RuntimeException ex) {
237 LOG.error("summarizePendingEntriesByObject() Exception running sql", ex);
238 throw ex;
239 }
240 }
241
242 /**
243 * Get any matching pending entries. Return true if there were some, false if not.
244 *
245 * @param universityFiscalYear the university fiscal year of pending entries to summarize
246 * @param chartOfAccountsCode the chart of accounts code of pending entries to summarize
247 * @param accountNumber the account number of pending entries to summarize
248 * @param financialObjectLevelCode the object level code of pending entries to summarize
249 * @param pendingEntriesCode whether to summarize all, approved, or no pending entries
250 * @return true if any matching pending entries were found, false otherwise
251 */
252 protected boolean getMatchingPendingEntriesByObject(SystemOptions options, Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber, String financialObjectLevelCode, boolean isCostShareExcluded, int pendingEntriesCode, String sessionId) {
253 LOG.debug("getMatchingPendingEntriesByObject() started");
254
255 // If they have specified this year, we will get all the pending entries where the year is equal or the year is null
256 // (because most eDocs don't fill in the year field).
257 // If they have specified a previous year, we will get all the pending entries where the year is equal to their selection
258 // without the nulls (because we will post eDocs
259 // with blank years tonight most probably.
260
261 UniversityDate today = SpringContext.getBean(UniversityDateService.class).getCurrentUniversityDate();
262
263 clearTempTable("GL_PENDING_ENTRY_MT", "SESID", sessionId);
264
265 List<Object> params = new ArrayList<Object>(20);
266
267 String insertSql = "insert into GL_PENDING_ENTRY_MT (SESID, FS_ORIGIN_CD, FDOC_NBR, TRN_ENTR_SEQ_NBR, "
268 + "FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FIN_BALANCE_TYP_CD,"
269 + "FIN_OBJ_TYP_CD, UNIV_FISCAL_YR, UNIV_FISCAL_PRD_CD, TRN_LDGR_ENTR_DESC, TRN_LDGR_ENTR_AMT, TRN_DEBIT_CRDT_CD,"
270 + "TRANSACTION_DT, FDOC_TYP_CD, ORG_DOC_NBR, PROJECT_CD, ORG_REFERENCE_ID, FDOC_REF_TYP_CD, FS_REF_ORIGIN_CD,FDOC_REF_NBR, "
271 + "FDOC_REVERSAL_DT, TRN_ENCUM_UPDT_CD, FDOC_APPROVED_CD, ACCT_SF_FINOBJ_CD, TRN_ENTR_OFST_CD,TRNENTR_PROCESS_TM) ";
272
273 String selectSql = "SELECT ?, p.FS_ORIGIN_CD, p.FDOC_NBR, p.TRN_ENTR_SEQ_NBR, p.FIN_COA_CD, p.ACCOUNT_NBR, "
274 + getDbPlatform().getIsNullFunction("p.SUB_ACCT_NBR", "'-----'")
275 + ", "
276 + " p.FIN_OBJECT_CD, "
277 + getDbPlatform().getIsNullFunction("p.FIN_SUB_OBJ_CD", "'---'")
278 + ", p.FIN_BALANCE_TYP_CD,p.FIN_OBJ_TYP_CD, p.UNIV_FISCAL_YR, "
279 + " p.UNIV_FISCAL_PRD_CD, p.TRN_LDGR_ENTR_DESC, p.TRN_LDGR_ENTR_AMT, p.TRN_DEBIT_CRDT_CD,"
280 + "p.TRANSACTION_DT, p.FDOC_TYP_CD, p.ORG_DOC_NBR, PROJECT_CD, p.ORG_REFERENCE_ID, p.FDOC_REF_TYP_CD, p.FS_REF_ORIGIN_CD,p.FDOC_REF_NBR, p.FDOC_REVERSAL_DT, p.TRN_ENCUM_UPDT_CD, p.FDOC_APPROVED_CD, p.ACCT_SF_FINOBJ_CD, p.TRN_ENTR_OFST_CD,p.TRNENTR_PROCESS_TM "
281 + "FROM GL_PENDING_ENTRY_T p,CA_OBJECT_CODE_T o,KRNS_DOC_HDR_T d,FS_DOC_HEADER_T fd "
282 + "WHERE o.FIN_COA_CD = p.FIN_COA_CD AND o.FIN_OBJECT_CD = p.FIN_OBJECT_CD AND o.FIN_OBJ_LEVEL_CD = ?"
283 + " AND p.fdoc_nbr = d.DOC_HDR_ID AND d.DOC_HDR_ID = fd.fdoc_nbr AND "
284 + " p.FIN_COA_CD = ?"
285 + " and p.account_nbr = ?"
286 + " and o.univ_fiscal_yr = ?";
287 params.add(sessionId);
288 params.add(financialObjectLevelCode);
289 params.add(chartOfAccountsCode);
290 params.add(accountNumber);
291 params.add(universityFiscalYear);
292
293 if (pendingEntriesCode == AccountBalanceService.PENDING_ALL) {
294 selectSql = selectSql + " AND fd.fdoc_status_cd <> '" + KFSConstants.DocumentStatusCodes.DISAPPROVED + "' ";
295 }
296 else {
297 selectSql = selectSql + " AND fd.fdoc_status_cd = '" + KFSConstants.DocumentStatusCodes.APPROVED + "' ";
298 }
299 selectSql = selectSql + " AND fd.fdoc_status_cd <> '" + KFSConstants.DocumentStatusCodes.CANCELLED + "' ";
300 selectSql = selectSql + " AND p.FDOC_APPROVED_CD <> '" + KFSConstants.DocumentStatusCodes.CANCELLED + "' ";
301
302 if (today.getUniversityFiscalYear().equals(universityFiscalYear)) {
303 selectSql = selectSql + "AND (p.univ_fiscal_yr is null OR p.univ_fiscal_yr = ? )";
304 params.add(universityFiscalYear);
305 }
306 else {
307 selectSql = selectSql + "AND p.univ_fiscal_yr = ?";
308 params.add(universityFiscalYear);
309 }
310
311 getSimpleJdbcTemplate().update(insertSql + selectSql, params.toArray());
312
313 if (isCostShareExcluded) {
314 purgeCostShareEntries("GL_PENDING_ENTRY_MT", "sesid", sessionId);
315 }
316
317 if (!hasEntriesInPendingTable(sessionId)) {
318 return false;
319 }
320
321 fixPendingEntryDisplay(options.getUniversityFiscalYear(), sessionId);
322
323 return true;
324 }
325 }