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.bc.document.dataaccess.impl;
017    
018    import java.util.ArrayList;
019    
020    import org.kuali.kfs.module.bc.BCConstants;
021    import org.kuali.kfs.module.bc.batch.dataaccess.impl.SQLForStep;
022    import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionLevelSummaryReportDao;
023    import org.kuali.rice.kns.service.PersistenceService;
024    import org.kuali.rice.kns.util.Guid;
025    
026    /**
027     * report general ledger amounts and FTE from the pending budget by object level
028     */
029    
030    public class BudgetConstructionLevelSummaryReportDaoJdbc extends BudgetConstructionDaoJdbcBase implements BudgetConstructionLevelSummaryReportDao {
031        private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BudgetConstructionLevelSummaryReportDaoJdbc.class);
032    
033        private static ArrayList<SQLForStep> updateReportsLevelSummaryTable = new ArrayList<SQLForStep>(7);
034        ArrayList<Integer> insertionPoints = new ArrayList<Integer>(10);
035        
036        private PersistenceService persistenceService;
037    
038    
039        public BudgetConstructionLevelSummaryReportDaoJdbc() {
040    
041            // builds and updates LevelSummaryReports
042            StringBuilder sqlText = new StringBuilder(1500);
043    
044            /* insert the income records */
045            sqlText.append("INSERT INTO LD_BCN_LEVL_SUMM_T \n");
046            sqlText.append("(PERSON_UNVL_ID, ORG_FIN_COA_CD, ORG_CD, SUB_FUND_GRP_CD, FIN_COA_CD, INC_EXP_CD, FIN_CONS_SORT_CD, \n");
047            sqlText.append(" FIN_LEV_SORT_CD, ACLN_ANNL_BAL_AMT, FIN_BEG_BAL_LN_AMT, FIN_CONS_OBJ_CD, FIN_OBJ_LEVEL_CD, APPT_RQCSF_FTE_QTY, \n");
048            sqlText.append(" APPT_RQST_FTE_QTY, POS_CSF_FTE_QTY, POS_CSF_LV_FTE_QTY) \n");
049            sqlText.append("SELECT ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.fin_coa_cd, 'A', objc.fin_report_sort_cd, \n");
050            sqlText.append(" objl.fin_report_sort_cd, sum(pbgl.acln_annl_bal_amt), sum(pbgl.fin_beg_bal_ln_amt), objl.fin_cons_obj_cd, objt.fin_obj_level_cd, \n");
051            sqlText.append(" 0, 0, 0, 0 \n");
052            sqlText.append("FROM LD_BCN_SUBFUND_PICK_T pick, LD_BCN_CTRL_LIST_T ctrl, LD_PND_BCNSTR_GL_T pbgl, CA_OBJECT_CODE_T objt, CA_OBJ_LEVEL_T objl, CA_OBJ_CONSOLDTN_T objc \n");
053            sqlText.append("WHERE pick.person_unvl_id = ? \n");
054            sqlText.append(" AND pick.report_flag > 0 \n");
055            sqlText.append(" AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp \n");
056            sqlText.append(" AND pick.person_unvl_id = ctrl.person_unvl_id \n");
057            sqlText.append(" AND pbgl.fdoc_nbr = ctrl.fdoc_nbr \n");
058            sqlText.append(" AND pbgl.fin_obj_typ_cd in ");
059            // IN list of revenue object types
060            insertionPoints.add(sqlText.length());
061            sqlText.append("\n");
062            sqlText.append(" AND objt.univ_fiscal_yr = ctrl.univ_fiscal_yr \n");
063            sqlText.append(" AND objt.fin_coa_cd = ctrl.fin_coa_cd \n");
064            sqlText.append(" AND objt.fin_object_cd = pbgl.fin_object_cd \n");
065            sqlText.append(" AND objl.fin_coa_cd = objt.fin_coa_cd \n");
066            sqlText.append(" AND objl.fin_obj_level_cd = objt.fin_obj_level_cd \n");
067            sqlText.append(" AND objc.fin_coa_cd = objl.fin_coa_cd \n");
068            sqlText.append(" AND objc.fin_cons_obj_cd = objl.fin_cons_obj_cd \n");
069            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.fin_coa_cd, objc.fin_report_sort_cd, \n");
070            sqlText.append(" objl.fin_report_sort_cd, objl.fin_cons_obj_cd, objt.fin_obj_level_cd \n");
071    
072            updateReportsLevelSummaryTable.add(new SQLForStep(sqlText,insertionPoints));
073            sqlText.delete(0, sqlText.length());
074            insertionPoints.clear();
075    
076            /* insert expenditure records with FTE place holders */
077            sqlText.append("INSERT INTO LD_BCN_LEVL_SUMM_T \n");
078            sqlText.append("(PERSON_UNVL_ID, ORG_FIN_COA_CD, ORG_CD, SUB_FUND_GRP_CD, FIN_COA_CD, INC_EXP_CD, FIN_CONS_SORT_CD, \n");
079            sqlText.append(" FIN_LEV_SORT_CD, ACLN_ANNL_BAL_AMT, FIN_BEG_BAL_LN_AMT, FIN_CONS_OBJ_CD, FIN_OBJ_LEVEL_CD, APPT_RQCSF_FTE_QTY, \n");
080            sqlText.append(" APPT_RQST_FTE_QTY, POS_CSF_FTE_QTY, POS_CSF_LV_FTE_QTY) \n");
081            sqlText.append("SELECT ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.fin_coa_cd, 'B', objc.fin_report_sort_cd, \n");
082            sqlText.append("  objl.fin_report_sort_cd, sum(pbgl.acln_annl_bal_amt), sum(pbgl.fin_beg_bal_ln_amt), objl.fin_cons_obj_cd, objt.fin_obj_level_cd, 0, \n");
083            sqlText.append(" 0, 0, 0 \n");
084            sqlText.append("FROM LD_BCN_SUBFUND_PICK_T pick, LD_BCN_CTRL_LIST_T ctrl, LD_PND_BCNSTR_GL_T pbgl, CA_OBJECT_CODE_T objt, CA_OBJ_LEVEL_T objl, CA_OBJ_CONSOLDTN_T objc \n");
085            sqlText.append("WHERE pick.person_unvl_id = ? \n");
086            sqlText.append(" AND pick.report_flag > 0 \n");
087            sqlText.append(" AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp \n");
088            sqlText.append(" AND pick.person_unvl_id = ctrl.person_unvl_id \n");
089            sqlText.append(" AND pbgl.fdoc_nbr = ctrl.fdoc_nbr \n");
090            sqlText.append(" AND pbgl.fin_obj_typ_cd in ");
091            // IN list of expenditure object types
092            insertionPoints.add(sqlText.length());
093            sqlText.append("\n");
094            sqlText.append(" AND objt.univ_fiscal_yr = ctrl.univ_fiscal_yr \n");
095            sqlText.append(" AND objt.fin_coa_cd = ctrl.fin_coa_cd \n");
096            sqlText.append(" AND objt.fin_object_cd = pbgl.fin_object_cd \n");
097            sqlText.append(" AND objl.fin_coa_cd = objt.fin_coa_cd \n");
098            sqlText.append(" AND objl.fin_obj_level_cd = objt.fin_obj_level_cd \n");
099            sqlText.append(" AND objc.fin_coa_cd = objl.fin_coa_cd \n");
100            sqlText.append(" AND objc.fin_cons_obj_cd = objl.fin_cons_obj_cd \n");
101            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.fin_coa_cd, objc.fin_report_sort_cd, objl.fin_report_sort_cd, objl.fin_cons_obj_cd, objt.fin_obj_level_cd \n");
102    
103            updateReportsLevelSummaryTable.add(new SQLForStep(sqlText,insertionPoints));
104            sqlText.delete(0, sqlText.length());
105            insertionPoints.clear();
106    
107            /* get the BCAF FTE values */
108            sqlText.append("INSERT INTO LD_BCN_BUILD_LEVLSUMM03_MT \n");
109            sqlText.append("(SESID, ORG_FIN_COA_CD, ORG_CD, SUB_FUND_GRP_CD, FIN_COA_CD, INC_EXP_CD, FIN_CONS_OBJ_CD, \n");
110            sqlText.append(" FIN_OBJ_LEVEL_CD, APPT_RQCSF_FTE_QTY, APPT_RQST_FTE_QTY) \n");
111            sqlText.append("SELECT  ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.fin_coa_cd, 'B', objl.fin_cons_obj_cd, \n");
112            sqlText.append(" objt.fin_obj_level_cd, SUM(bcaf.APPT_RQCSF_FTE_QTY), SUM(bcaf.APPT_RQST_FTE_QTY) \n");
113            sqlText.append("FROM LD_BCN_SUBFUND_PICK_T pick, LD_BCN_CTRL_LIST_T ctrl, LD_PNDBC_APPTFND_T bcaf, CA_OBJECT_CODE_T objt, CA_OBJ_LEVEL_T objl \n");
114            sqlText.append("WHERE pick.person_unvl_id = ? \n");
115            sqlText.append(" AND pick.report_flag > 0 \n");
116            sqlText.append(" AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp \n");
117            sqlText.append(" AND pick.person_unvl_id = ctrl.person_unvl_id \n");
118            sqlText.append(" AND bcaf.univ_fiscal_yr = ctrl.univ_fiscal_yr \n");
119            sqlText.append(" AND bcaf.fin_coa_cd = ctrl.fin_coa_cd \n");
120            sqlText.append(" AND bcaf.account_nbr = ctrl.account_nbr \n");
121            sqlText.append(" AND bcaf.sub_acct_nbr = ctrl.sub_acct_nbr \n");
122            sqlText.append(" AND objt.univ_fiscal_yr = ctrl.univ_fiscal_yr \n");
123            sqlText.append(" AND objt.fin_coa_cd = ctrl.fin_coa_cd \n");
124            sqlText.append(" AND objt.fin_object_cd = bcaf.fin_object_cd \n");
125            sqlText.append(" AND objl.fin_coa_cd = objt.fin_coa_cd \n");
126            sqlText.append(" AND objl.fin_obj_level_cd = objt.fin_obj_level_cd \n");
127            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.fin_coa_cd, objl.fin_cons_obj_cd, objt.fin_obj_level_cd \n");
128    
129            updateReportsLevelSummaryTable.add(new SQLForStep(sqlText));
130            sqlText.delete(0, sqlText.length());
131            
132            /* SQL-92 does not allow the target table of an UPDATE to be aliased.  Supposedly, PostgreSQL enforces this (Gennick, p.156) */  
133    
134            /* copy the fte values to the report tables */
135            sqlText.append("UPDATE LD_BCN_LEVL_SUMM_T \n");
136            sqlText.append("SET appt_rqcsf_fte_qty =\n");
137            sqlText.append("(SELECT SUM(fq.appt_rqcsf_fte_qty) \n");
138            sqlText.append("FROM LD_BCN_BUILD_LEVLSUMM03_MT fq \n");
139            sqlText.append("WHERE LD_BCN_LEVL_SUMM_T.person_unvl_id = ? \n");
140            sqlText.append(" AND LD_BCN_LEVL_SUMM_T.org_fin_coa_cd = fq.org_fin_coa_cd \n");
141            sqlText.append(" AND LD_BCN_LEVL_SUMM_T.org_cd = fq.org_cd \n");
142            sqlText.append(" AND LD_BCN_LEVL_SUMM_T.sub_fund_grp_cd = fq.sub_fund_grp_cd \n");
143            sqlText.append(" AND LD_BCN_LEVL_SUMM_T.fin_coa_cd = fq.fin_coa_cd \n");
144            sqlText.append(" AND LD_BCN_LEVL_SUMM_T.inc_exp_cd = fq.inc_exp_cd \n");
145            sqlText.append(" AND LD_BCN_LEVL_SUMM_T.fin_cons_obj_cd = fq.fin_cons_obj_cd \n");
146            sqlText.append(" AND LD_BCN_LEVL_SUMM_T.fin_obj_level_cd = fq.fin_obj_level_cd \n");
147            sqlText.append(" AND fq.sesid = ?), \n");
148            sqlText.append("    appt_rqst_fte_qty = \n");
149            sqlText.append("(SELECT SUM(fq.appt_rqst_fte_qty) \n");
150            sqlText.append("FROM LD_BCN_BUILD_LEVLSUMM03_MT fq \n");
151            sqlText.append("WHERE LD_BCN_LEVL_SUMM_T.person_unvl_id = ? \n");
152            sqlText.append(" AND LD_BCN_LEVL_SUMM_T.org_fin_coa_cd = fq.org_fin_coa_cd \n");
153            sqlText.append(" AND LD_BCN_LEVL_SUMM_T.org_cd = fq.org_cd \n");
154            sqlText.append(" AND LD_BCN_LEVL_SUMM_T.sub_fund_grp_cd = fq.sub_fund_grp_cd \n");
155            sqlText.append(" AND LD_BCN_LEVL_SUMM_T.fin_coa_cd = fq.fin_coa_cd \n");
156            sqlText.append(" AND LD_BCN_LEVL_SUMM_T.inc_exp_cd = fq.inc_exp_cd \n");
157            sqlText.append(" AND LD_BCN_LEVL_SUMM_T.fin_cons_obj_cd = fq.fin_cons_obj_cd \n");
158            sqlText.append(" AND LD_BCN_LEVL_SUMM_T.fin_obj_level_cd = fq.fin_obj_level_cd \n");
159            sqlText.append(" AND fq.sesid = ?) \n");
160            sqlText.append("WHERE LD_BCN_LEVL_SUMM_T.person_unvl_id = ? \n");
161            sqlText.append(" AND EXISTS (SELECT * FROM LD_BCN_BUILD_LEVLSUMM03_MT fq2 \n");
162            sqlText.append(" WHERE LD_BCN_LEVL_SUMM_T.person_unvl_id = ? \n");
163            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.org_fin_coa_cd = fq2.org_fin_coa_cd \n");
164            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.org_cd = fq2.org_cd \n");
165            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.sub_fund_grp_cd = fq2.sub_fund_grp_cd \n");
166            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.fin_coa_cd = fq2.fin_coa_cd \n");
167            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.inc_exp_cd = fq2.inc_exp_cd \n");
168            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.fin_cons_obj_cd = fq2.fin_cons_obj_cd \n");
169            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.fin_obj_level_cd = fq2.fin_obj_level_cd \n");
170            sqlText.append("  AND fq2.sesid = ? ) \n");
171    
172            updateReportsLevelSummaryTable.add(new SQLForStep(sqlText));
173            sqlText.delete(0, sqlText.length());
174    
175            /* get the CSF regular FTE */
176            sqlText.append("INSERT INTO LD_BCN_BUILD_LEVLSUMM02_MT \n");
177            sqlText.append("(SESID, ORG_FIN_COA_CD, ORG_CD, SUB_FUND_GRP_CD, FIN_COA_CD, INC_EXP_CD, FIN_CONS_OBJ_CD, \n");
178            sqlText.append(" FIN_OBJ_LEVEL_CD, POS_CSF_FNDSTAT_CD, POS_CSF_FTE_QTY, POS_CSF_LV_FTE_QTY) \n");
179            sqlText.append("SELECT ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.fin_coa_cd, 'B', objl.fin_cons_obj_cd, \n");
180            sqlText.append(" objt.fin_obj_level_cd, NULL, SUM(pos_csf_fte_qty), 0 \n");
181            sqlText.append("FROM LD_BCN_SUBFUND_PICK_T pick, LD_BCN_CTRL_LIST_T ctrl, LD_BCN_CSF_TRCKR_T bcsf, CA_OBJECT_CODE_T objt, CA_OBJ_LEVEL_T objl \n");
182            sqlText.append("WHERE pick.person_unvl_id = ? \n");
183            sqlText.append(" AND pick.report_flag > 0 \n");
184            sqlText.append(" AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp \n");
185            sqlText.append(" AND pick.person_unvl_id = ctrl.person_unvl_id \n");
186            sqlText.append(" AND bcsf.univ_fiscal_yr = ctrl.univ_fiscal_yr \n");
187            sqlText.append(" AND bcsf.fin_coa_cd = ctrl.fin_coa_cd \n");
188            sqlText.append(" AND bcsf.account_nbr = ctrl.account_nbr \n");
189            sqlText.append(" AND bcsf.sub_acct_nbr = ctrl.sub_acct_nbr \n");
190            sqlText.append(" AND (bcsf.pos_csf_fndstat_cd <> '");
191            // CSF funding status code for leave
192            insertionPoints.add(sqlText.length());
193            sqlText.append("' OR bcsf.pos_csf_fndstat_cd IS NULL) \n");
194            sqlText.append(" AND objt.univ_fiscal_yr = ctrl.univ_fiscal_yr \n");
195            sqlText.append(" AND objt.fin_coa_cd = ctrl.fin_coa_cd \n");
196            sqlText.append(" AND objt.fin_object_cd = bcsf.fin_object_cd \n");
197            sqlText.append(" AND objl.fin_coa_cd = objt.fin_coa_cd \n");
198            sqlText.append(" AND objl.fin_obj_level_cd = objt.fin_obj_level_cd \n");
199            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.fin_coa_cd, objl.fin_cons_obj_cd, objt.fin_obj_level_cd \n");
200    
201            updateReportsLevelSummaryTable.add(new SQLForStep(sqlText,insertionPoints));
202            sqlText.delete(0, sqlText.length());
203            insertionPoints.clear();
204    
205            /* get the CSF leave FTE */
206            sqlText.append("INSERT INTO LD_BCN_BUILD_LEVLSUMM02_MT \n");
207            sqlText.append("(SESID, ORG_FIN_COA_CD, ORG_CD, SUB_FUND_GRP_CD, FIN_COA_CD, INC_EXP_CD, FIN_CONS_OBJ_CD, \n");
208            sqlText.append(" FIN_OBJ_LEVEL_CD, POS_CSF_FNDSTAT_CD, POS_CSF_FTE_QTY, POS_CSF_LV_FTE_QTY) \n");
209            sqlText.append("SELECT ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.fin_coa_cd, 'B', objl.fin_cons_obj_cd, \n");
210            sqlText.append(" objt.fin_obj_level_cd, '");
211            // CSF funding status code for leave
212            insertionPoints.add(sqlText.length());
213            sqlText.append("', 0, SUM(pos_csf_fte_qty) \n");
214            sqlText.append("FROM LD_BCN_SUBFUND_PICK_T pick, LD_BCN_CTRL_LIST_T ctrl, LD_BCN_CSF_TRCKR_T bcsf, CA_OBJECT_CODE_T objt, CA_OBJ_LEVEL_T objl \n");
215            sqlText.append("WHERE pick.person_unvl_id = ? \n");
216            sqlText.append(" AND pick.report_flag > 0 \n");
217            sqlText.append(" AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp \n");
218            sqlText.append(" AND pick.person_unvl_id = ctrl.person_unvl_id \n");
219            sqlText.append(" AND bcsf.univ_fiscal_yr = ctrl.univ_fiscal_yr \n");
220            sqlText.append(" AND bcsf.fin_coa_cd = ctrl.fin_coa_cd \n");
221            sqlText.append(" AND bcsf.account_nbr = ctrl.account_nbr \n");
222            sqlText.append(" AND bcsf.sub_acct_nbr = ctrl.sub_acct_nbr \n");
223            sqlText.append(" AND bcsf.pos_csf_fndstat_cd = '");
224            // CSF funding status code for leave
225            insertionPoints.add(sqlText.length());
226            sqlText.append("' \n");
227            sqlText.append(" AND objt.univ_fiscal_yr = ctrl.univ_fiscal_yr \n");
228            sqlText.append(" AND objt.fin_coa_cd = ctrl.fin_coa_cd \n");
229            sqlText.append(" AND objt.fin_object_cd = bcsf.fin_object_cd \n");
230            sqlText.append(" AND objl.fin_coa_cd = objt.fin_coa_cd \n");
231            sqlText.append(" AND objl.fin_obj_level_cd = objt.fin_obj_level_cd \n");
232            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.fin_coa_cd, objl.fin_cons_obj_cd, objt.fin_obj_level_cd \n");
233    
234            updateReportsLevelSummaryTable.add(new SQLForStep(sqlText,insertionPoints));
235            sqlText.delete(0, sqlText.length());
236            insertionPoints.clear();
237    
238            /* copy the fte values to the report table */
239            sqlText.append("UPDATE LD_BCN_LEVL_SUMM_T \n");
240            sqlText.append("SET pos_csf_fte_qty = ");
241            sqlText.append("(SELECT SUM(pos_csf_fte_qty) \n");
242            sqlText.append(" FROM LD_BCN_BUILD_LEVLSUMM02_MT fq \n");
243            sqlText.append(" WHERE LD_BCN_LEVL_SUMM_T.person_unvl_id = ? \n");
244            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.org_fin_coa_cd = fq.org_fin_coa_cd \n");
245            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.org_cd = fq.org_cd \n");
246            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.sub_fund_grp_cd = fq.sub_fund_grp_cd \n");
247            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.fin_coa_cd = fq.fin_coa_cd \n");
248            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.inc_exp_cd = fq.inc_exp_cd \n");
249            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.fin_cons_obj_cd = fq.fin_cons_obj_cd \n");
250            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.fin_obj_level_cd = fq.fin_obj_level_cd \n");
251            sqlText.append("  AND fq.sesid = ?), \n");
252            sqlText.append("  pos_csf_lv_fte_qty =\n");
253            sqlText.append("(SELECT  SUM(pos_csf_lv_fte_qty)\n");
254            sqlText.append(" FROM LD_BCN_BUILD_LEVLSUMM02_MT fq \n");
255            sqlText.append(" WHERE LD_BCN_LEVL_SUMM_T.person_unvl_id = ? \n");
256            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.org_fin_coa_cd = fq.org_fin_coa_cd \n");
257            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.org_cd = fq.org_cd \n");
258            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.sub_fund_grp_cd = fq.sub_fund_grp_cd \n");
259            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.fin_coa_cd = fq.fin_coa_cd \n");
260            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.inc_exp_cd = fq.inc_exp_cd \n");
261            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.fin_cons_obj_cd = fq.fin_cons_obj_cd \n");
262            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.fin_obj_level_cd = fq.fin_obj_level_cd \n");
263            sqlText.append("  AND fq.sesid = ?) \n");
264            sqlText.append("WHERE LD_BCN_LEVL_SUMM_T.person_unvl_id = ? \n");
265            sqlText.append(" AND EXISTS (SELECT 1 FROM LD_BCN_BUILD_LEVLSUMM02_MT fq2 \n");
266            sqlText.append(" WHERE LD_BCN_LEVL_SUMM_T.person_unvl_id = ? \n");
267            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.org_fin_coa_cd = fq2.org_fin_coa_cd \n");
268            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.org_cd = fq2.org_cd \n");
269            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.sub_fund_grp_cd = fq2.sub_fund_grp_cd \n");
270            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.fin_coa_cd = fq2.fin_coa_cd \n");
271            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.inc_exp_cd = fq2.inc_exp_cd \n");
272            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.fin_cons_obj_cd = fq2.fin_cons_obj_cd \n");
273            sqlText.append("  AND LD_BCN_LEVL_SUMM_T.fin_obj_level_cd = fq2.fin_obj_level_cd \n");
274            sqlText.append("  AND fq2.sesid = ?) \n");
275    
276            updateReportsLevelSummaryTable.add(new SQLForStep(sqlText));
277            sqlText.delete(0, sqlText.length());
278        }
279    
280        public void cleanReportsLevelSummaryTable(String principalName) {
281            clearTempTableByUnvlId("LD_BCN_LEVL_SUMM_T", "PERSON_UNVL_ID", principalName);
282            /**
283             * this is necessary to clear any rows for the tables we have just updated from the OJB cache.  otherwise, subsequent calls to OJB will fetch the old, unupdated cached rows.
284             */
285            persistenceService.clearCache();
286        }
287    
288        public void updateReportsLevelSummaryTable(String principalName) {
289            
290            Guid guid = new Guid();
291            String idForSession = guid.toString();
292    
293            ArrayList<String> stringsToInsert = new ArrayList<String>(10);
294            
295            cleanReportsLevelSummaryTable(principalName);
296            
297            // insert revenue by object level from pending budget construction general ledger into the report-by-level table
298            stringsToInsert.add(this.getRevenueINList());
299            getSimpleJdbcTemplate().update(updateReportsLevelSummaryTable.get(0).getSQL(stringsToInsert), principalName, principalName);
300            // insert expenditure by object level from pending budget construction general ledger into the report-by-level table
301            stringsToInsert.clear();
302            stringsToInsert.add(this.getExpenditureINList());
303            getSimpleJdbcTemplate().update(updateReportsLevelSummaryTable.get(1).getSQL(stringsToInsert), principalName, principalName);
304            // sum the FTE from appointment funding
305            getSimpleJdbcTemplate().update(updateReportsLevelSummaryTable.get(2).getSQL(), idForSession, principalName);
306            // update the appointment FTE in the report-by-level table
307            getSimpleJdbcTemplate().update(updateReportsLevelSummaryTable.get(3).getSQL(), principalName, idForSession, principalName, idForSession, principalName, principalName, idForSession);
308            // sum the non-leave FTE from the CSF
309            stringsToInsert.clear();
310            stringsToInsert.add(BCConstants.csfFundingStatusFlag.LEAVE.getFlagValue());
311            getSimpleJdbcTemplate().update(updateReportsLevelSummaryTable.get(4).getSQL(stringsToInsert), idForSession, principalName);
312            // sum the FTE for leaves from the CSF (the leave flag is used twice in this SQL, so just add it again to stringsToInsert)
313            stringsToInsert.add(BCConstants.csfFundingStatusFlag.LEAVE.getFlagValue());
314            getSimpleJdbcTemplate().update(updateReportsLevelSummaryTable.get(5).getSQL(stringsToInsert), idForSession, principalName);
315            // update all the CSF FTE fields in the report-by-level table
316            getSimpleJdbcTemplate().update(updateReportsLevelSummaryTable.get(6).getSQL(), principalName, idForSession, principalName, idForSession, principalName, principalName, idForSession);
317            clearTempTableBySesId("LD_BCN_BUILD_LEVLSUMM02_MT", "SESID", idForSession);
318            clearTempTableBySesId("LD_BCN_BUILD_LEVLSUMM03_MT", "SESID", idForSession);
319            /**
320             * this is necessary to clear any rows for the tables we have just updated from the OJB cache.  otherwise, subsequent calls to OJB will fetch the old, unupdated cached rows.
321             */
322            persistenceService.clearCache();
323    
324        }
325        
326        public void setPersistenceService(PersistenceService persistenceService)
327        {
328            this.persistenceService = persistenceService;
329        }
330    
331    }
332