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.BudgetConstructionAccountObjectDetailReportDao;
023    import org.kuali.kfs.sys.KFSConstants;
024    import org.kuali.rice.kns.service.PersistenceService;
025    import org.kuali.rice.kns.util.Guid;
026    
027    /**
028     *  builds the report table that supports the Organization Account Object Detail report.  the report is customized by user, so the table rows are labeled with the user id
029     */
030    
031    public class BudgetConstructionAccountObjectDetailReportDaoJdbc extends BudgetConstructionDaoJdbcBase implements BudgetConstructionAccountObjectDetailReportDao {
032        private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BudgetConstructionAccountObjectDetailReportDaoJdbc.class);
033    
034        private static ArrayList<SQLForStep> updateReportsAccountObjectDetailTable  = new ArrayList<SQLForStep>(4);
035        private static ArrayList<SQLForStep> insertDetailForReport                  = new ArrayList<SQLForStep>(1);
036        private static ArrayList<SQLForStep> insertSummaryForReport                 = new ArrayList<SQLForStep>(1);
037        
038        private PersistenceService persistenceService;
039        
040        public BudgetConstructionAccountObjectDetailReportDaoJdbc() {
041            
042            //builds and updates AccountObjectDetailTable
043            StringBuilder sqlText              = new StringBuilder(5000);
044            ArrayList<Integer> insertionPoints = new ArrayList<Integer>(10);
045            //this is a bean constructor, so it is dangerous to access static constants defined in other classes here.  the other classes may not have been loaded yet.
046            //so, we use insertion points to indicate where such constants should be placed in the SQL, and we splice them in a run time.  we also use insertion points to splice in run time constants from SH_PARM_T.
047            
048            /* get the set of income and expenditure lines */
049            /* for the selected accounts */
050            sqlText.append("INSERT INTO LD_BCN_BUILD_ACCTBAL01_MT\n");
051            sqlText.append("(SESID, ORG_FIN_COA_CD, ORG_CD, SUB_FUND_GRP_CD, UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR,\n");
052            sqlText.append("  SUB_ACCT_NBR, INC_EXP_CD, FIN_CONS_SORT_CD, FIN_LEVEL_SORT_CD, FIN_OBJECT_CD, FIN_SUB_OBJ_CD,  FIN_OBJ_LEVEL_CD, APPT_RQST_FTE_QTY,\n");
053            sqlText.append("  APPT_RQCSF_FTE_QTY, POS_CSF_FTE_QTY, FIN_BEG_BAL_LN_AMT, ACLN_ANNL_BAL_AMT, POS_CSF_LV_FTE_QTY) \n");
054            sqlText.append("SELECT ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, pbgl.univ_fiscal_yr, pbgl.fin_coa_cd, pbgl.account_nbr, \n");
055            sqlText.append(" pbgl.sub_acct_nbr, 'A', c.fin_report_sort_cd, objl.fin_report_sort_cd, pbgl.fin_object_cd, pbgl.fin_sub_obj_cd, objt.fin_obj_level_cd, 0, \n");
056            sqlText.append(" 0, 0, sum(pbgl.fin_beg_bal_ln_amt), sum(pbgl.acln_annl_bal_amt), 0 \n");
057            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 c \n");
058            sqlText.append("WHERE pick.person_unvl_id = ? \n");
059            sqlText.append(" AND pick.report_flag > 0 \n");
060            sqlText.append(" AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp \n");
061            sqlText.append(" AND pick.person_unvl_id = ctrl.person_unvl_id \n");
062            sqlText.append(" AND pbgl.fdoc_nbr = ctrl.fdoc_nbr \n");
063            sqlText.append(" AND pbgl.univ_fiscal_yr = ctrl.univ_fiscal_yr \n");
064            sqlText.append(" AND pbgl.fin_coa_cd = ctrl.fin_coa_cd \n");
065            sqlText.append(" AND pbgl.account_nbr = ctrl.account_nbr \n");
066            sqlText.append(" AND pbgl.sub_acct_nbr = ctrl.sub_acct_nbr \n");
067            sqlText.append(" AND pbgl.fin_obj_typ_cd in \n");
068            // list of income object types
069            insertionPoints.add(sqlText.length());
070            sqlText.append("\n");
071            sqlText.append(" AND pbgl.univ_fiscal_yr = objt.univ_fiscal_yr \n");
072            sqlText.append(" AND pbgl.fin_coa_cd = objt.fin_coa_cd \n");
073            sqlText.append(" AND pbgl.fin_object_cd = objt.fin_object_cd \n");
074            sqlText.append(" AND objt.fin_coa_cd = objl.fin_coa_cd \n");
075            sqlText.append(" AND objt.fin_obj_level_cd = objl.fin_obj_level_cd \n");
076            sqlText.append(" AND c.fin_coa_cd = objl.fin_coa_cd \n");
077            sqlText.append(" AND c.fin_cons_obj_cd = objl.fin_cons_obj_cd \n");
078            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, pbgl.univ_fiscal_yr, pbgl.fin_coa_cd, pbgl.account_nbr, pbgl.sub_acct_nbr, \n");
079            sqlText.append(" c.fin_report_sort_cd, objl.fin_report_sort_cd, pbgl.fin_object_cd, pbgl.fin_sub_obj_cd, objt.fin_obj_level_cd \n");
080            sqlText.append("UNION ALL\n");
081            sqlText.append("SELECT ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, pbgl.univ_fiscal_yr, pbgl.fin_coa_cd, pbgl.account_nbr, \n");
082            sqlText.append(" pbgl.sub_acct_nbr, 'B', c.fin_report_sort_cd, objl.fin_report_sort_cd, pbgl.fin_object_cd, pbgl.fin_sub_obj_cd, objt.fin_obj_level_cd, 0, \n");
083            sqlText.append(" 0, 0, sum(pbgl.fin_beg_bal_ln_amt), sum(pbgl.acln_annl_bal_amt), 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 c \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.univ_fiscal_yr = ctrl.univ_fiscal_yr \n");
091            sqlText.append(" AND pbgl.fin_coa_cd = ctrl.fin_coa_cd \n");
092            sqlText.append(" AND pbgl.account_nbr = ctrl.account_nbr \n");
093            sqlText.append(" AND pbgl.sub_acct_nbr = ctrl.sub_acct_nbr \n");
094            sqlText.append(" AND pbgl.fin_obj_typ_cd in \n");
095            // list of expense object types
096            insertionPoints.add(sqlText.length());
097            sqlText.append("\n");
098            sqlText.append(" AND pbgl.univ_fiscal_yr = objt.univ_fiscal_yr \n");
099            sqlText.append(" AND pbgl.fin_coa_cd = objt.fin_coa_cd \n");
100            sqlText.append(" AND pbgl.fin_object_cd = objt.fin_object_cd \n");
101            sqlText.append(" AND objt.fin_coa_cd = objl.fin_coa_cd \n");
102            sqlText.append(" AND objt.fin_obj_level_cd = objl.fin_obj_level_cd \n");
103            sqlText.append(" AND c.fin_coa_cd = objl.fin_coa_cd \n");
104            sqlText.append(" AND c.fin_cons_obj_cd = objl.fin_cons_obj_cd \n");
105            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, pbgl.univ_fiscal_yr, pbgl.fin_coa_cd, pbgl.account_nbr, pbgl.sub_acct_nbr, \n");
106            sqlText.append(" c.fin_report_sort_cd, objl.fin_report_sort_cd, pbgl.fin_object_cd, pbgl.fin_sub_obj_cd, objt.fin_obj_level_cd \n");
107            
108            updateReportsAccountObjectDetailTable.add(new SQLForStep(sqlText,insertionPoints));
109            sqlText.delete(0, sqlText.length());
110            insertionPoints.clear();
111            
112            /*  SQL-92 does not permit us to use an alias for the target table in an UPDATE clause--neither, apparently does PostgreSQL (Gennick, p. 156) */
113    
114            /* get the appointment funding fte */
115            sqlText.append("UPDATE LD_BCN_BUILD_ACCTBAL01_MT  \n");
116            sqlText.append("SET appt_rqst_fte_qty = (SELECT SUM(af.appt_rqst_fte_qty) \n");
117            sqlText.append("FROM LD_PNDBC_APPTFND_T af \n");
118            sqlText.append("WHERE LD_BCN_BUILD_ACCTBAL01_MT.univ_fiscal_yr = af.univ_fiscal_yr \n");
119            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_coa_cd = af.fin_coa_cd \n");
120            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.account_nbr = af.account_nbr \n");
121            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.sub_acct_nbr = af.sub_acct_nbr \n");
122            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_object_cd = af.fin_object_cd \n");
123            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_sub_obj_cd = af.fin_sub_obj_cd),  \n");
124            sqlText.append(" appt_rqcsf_fte_qty = (SELECT SUM(af.appt_rqcsf_fte_qty) \n");
125            sqlText.append("FROM LD_PNDBC_APPTFND_T af \n");
126            sqlText.append("WHERE LD_BCN_BUILD_ACCTBAL01_MT.univ_fiscal_yr = af.univ_fiscal_yr \n");
127            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_coa_cd = af.fin_coa_cd \n");
128            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.account_nbr = af.account_nbr \n");
129            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.sub_acct_nbr = af.sub_acct_nbr \n");
130            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_object_cd = af.fin_object_cd \n");
131            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_sub_obj_cd = af.fin_sub_obj_cd) \n");
132            sqlText.append("WHERE sesid = ? \n");
133            sqlText.append("AND EXISTS (SELECT 1 FROM LD_PNDBC_APPTFND_T af2 \n");
134            sqlText.append("WHERE LD_BCN_BUILD_ACCTBAL01_MT.univ_fiscal_yr = af2.univ_fiscal_yr \n");
135            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_coa_cd = af2.fin_coa_cd \n");
136            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.account_nbr = af2.account_nbr \n");
137            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.sub_acct_nbr = af2.sub_acct_nbr \n");
138            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_object_cd = af2.fin_object_cd \n");
139            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_sub_obj_cd = af2.fin_sub_obj_cd) \n");
140            
141            updateReportsAccountObjectDetailTable.add(new SQLForStep(sqlText));
142            sqlText.delete(0, sqlText.length());
143    
144            /*  SQL-92 does not permit us to use an alias for the target table in an UPDATE clause--neither, apparently does PostgreSQL (Gennick, p. 156) */
145    
146            /* get the csf regular fte */
147            sqlText.append("UPDATE LD_BCN_BUILD_ACCTBAL01_MT \n");
148            sqlText.append("SET pos_csf_fte_qty = (SELECT SUM(bcsf.pos_csf_fte_qty) \n");
149            sqlText.append("FROM LD_BCN_CSF_TRCKR_T bcsf \n");
150            sqlText.append("WHERE LD_BCN_BUILD_ACCTBAL01_MT.univ_fiscal_yr = bcsf.univ_fiscal_yr \n");
151            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_coa_cd = bcsf.fin_coa_cd \n");
152            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.account_nbr = bcsf.account_nbr \n");
153            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.sub_acct_nbr = bcsf.sub_acct_nbr \n");
154            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_object_cd = bcsf.fin_object_cd \n");
155            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_sub_obj_cd = bcsf.fin_sub_obj_cd \n");
156            sqlText.append("AND bcsf.pos_csf_fndstat_cd <> '");
157            // CSF Leave indicator
158            insertionPoints.add(sqlText.length());
159            sqlText.append("')\n");
160            sqlText.append("WHERE sesid = ? \n");
161            sqlText.append("AND EXISTS (SELECT 1 FROM LD_BCN_CSF_TRCKR_T bcsf2 \n");
162            sqlText.append("WHERE LD_BCN_BUILD_ACCTBAL01_MT.univ_fiscal_yr = bcsf2.univ_fiscal_yr \n");
163            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_coa_cd = bcsf2.fin_coa_cd \n");
164            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.account_nbr = bcsf2.account_nbr \n");
165            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.sub_acct_nbr = bcsf2.sub_acct_nbr \n");
166            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_object_cd = bcsf2.fin_object_cd \n");
167            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_sub_obj_cd = bcsf2.fin_sub_obj_cd \n");
168            sqlText.append("AND bcsf2.pos_csf_fndstat_cd <> '"); 
169            // CSF leave inndicator
170            insertionPoints.add(sqlText.length());
171            sqlText.append("')\n");
172                       
173            updateReportsAccountObjectDetailTable.add(new SQLForStep(sqlText,insertionPoints));
174            sqlText.delete(0, sqlText.length());
175            insertionPoints.clear();
176                         
177            /*  SQL-92 does not permit us to use an alias for the target table in an UPDATE clause--neither, apparently does PostgreSQL (Gennick, p. 156) */
178    
179            /* get the csf leave fte */
180            
181            sqlText.append("UPDATE LD_BCN_BUILD_ACCTBAL01_MT \n");
182            sqlText.append("SET pos_csf_fte_qty = (SELECT SUM(bcsf.pos_csf_fte_qty) \n");
183            sqlText.append("FROM LD_BCN_CSF_TRCKR_T bcsf \n");
184            sqlText.append("WHERE LD_BCN_BUILD_ACCTBAL01_MT.univ_fiscal_yr = bcsf.univ_fiscal_yr \n");
185            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_coa_cd = bcsf.fin_coa_cd \n");
186            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.account_nbr = bcsf.account_nbr \n");
187            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.sub_acct_nbr = bcsf.sub_acct_nbr \n");
188            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_object_cd = bcsf.fin_object_cd \n");
189            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_sub_obj_cd = bcsf.fin_sub_obj_cd \n");
190            sqlText.append("AND bcsf.pos_csf_fndstat_cd = '");
191            //CSF leave indicator
192            insertionPoints.add(sqlText.length());
193            sqlText.append("')\n");
194            sqlText.append("WHERE sesid = ? \n");
195            sqlText.append("AND EXISTS (SELECT * FROM LD_BCN_CSF_TRCKR_T bcsf2 \n");
196            sqlText.append("WHERE LD_BCN_BUILD_ACCTBAL01_MT.univ_fiscal_yr = bcsf2.univ_fiscal_yr \n");
197            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_coa_cd = bcsf2.fin_coa_cd \n");
198            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.account_nbr = bcsf2.account_nbr \n");
199            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.sub_acct_nbr = bcsf2.sub_acct_nbr \n");
200            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_object_cd = bcsf2.fin_object_cd \n");
201            sqlText.append("AND LD_BCN_BUILD_ACCTBAL01_MT.fin_sub_obj_cd = bcsf2.fin_sub_obj_cd \n");
202            sqlText.append("AND bcsf2.pos_csf_fndstat_cd = '");
203            //CSF leave indicator
204            insertionPoints.add(sqlText.length());
205            sqlText.append("')\n");
206            
207            updateReportsAccountObjectDetailTable.add(new SQLForStep(sqlText,insertionPoints));
208            sqlText.delete(0, sqlText.length());
209            insertionPoints.clear();
210    
211            /* no rollup */
212            sqlText.append("INSERT INTO LD_BCN_ACCT_BAL_T \n");
213            sqlText.append("(PERSON_UNVL_ID, ORG_FIN_COA_CD, ORG_CD, SUB_FUND_GRP_CD, UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, \n");
214            sqlText.append(" INC_EXP_CD, FIN_LEVEL_SORT_CD, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FIN_CONS_SORT_CD, FIN_OBJ_LEVEL_CD, APPT_RQST_FTE_QTY,  \n");
215            sqlText.append(" APPT_RQCSF_FTE_QTY, POSITION_FTE_QTY, FIN_BEG_BAL_LN_AMT, ACLN_ANNL_BAL_AMT, POS_CSF_LV_FTE_QTY) \n");
216            sqlText.append(" SELECT ?, org_fin_coa_cd, org_cd, sub_fund_grp_cd, univ_fiscal_yr, fin_coa_cd, account_nbr, sub_acct_nbr, \n");
217            sqlText.append(" inc_exp_cd, fin_level_sort_cd, fin_object_cd, fin_sub_obj_cd, fin_cons_sort_cd, fin_obj_level_cd, appt_rqst_fte_qty, \n");
218            sqlText.append(" appt_rqcsf_fte_qty, pos_csf_fte_qty, fin_beg_bal_ln_amt, acln_annl_bal_amt, pos_csf_lv_fte_qty \n");
219            sqlText.append(" FROM LD_BCN_BUILD_ACCTBAL01_MT WHERE sesid = ? \n");
220            
221            insertDetailForReport.add(new SQLForStep(sqlText));
222            sqlText.delete(0, sqlText.length());                     
223    
224            /* rollup the sub-accounting and insert */
225            //should change order of select
226            sqlText.append("INSERT INTO LD_BCN_ACCT_BAL_T \n");
227            sqlText.append(" (PERSON_UNVL_ID, ORG_FIN_COA_CD, ORG_CD, SUB_FUND_GRP_CD, UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR,  \n");
228            sqlText.append(" INC_EXP_CD, FIN_LEVEL_SORT_CD, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FIN_CONS_SORT_CD, FIN_OBJ_LEVEL_CD, APPT_RQST_FTE_QTY,  \n");
229            sqlText.append(" APPT_RQCSF_FTE_QTY, POSITION_FTE_QTY, FIN_BEG_BAL_LN_AMT, ACLN_ANNL_BAL_AMT, POS_CSF_LV_FTE_QTY) \n");
230            sqlText.append(" SELECT ?, org_fin_coa_cd, org_cd, sub_fund_grp_cd, univ_fiscal_yr, fin_coa_cd, account_nbr, '");
231            // default subaccount number
232            insertionPoints.add(sqlText.length());
233            sqlText.append("', \n");
234            sqlText.append(" inc_exp_cd, fin_level_sort_cd, fin_object_cd, '");
235            // default subobject code
236            insertionPoints.add(sqlText.length());
237            sqlText.append("', fin_cons_sort_cd, fin_obj_level_cd, sum(appt_rqst_fte_qty), sum(appt_rqcsf_fte_qty), \n");
238            sqlText.append(" sum(pos_csf_fte_qty), sum(fin_beg_bal_ln_amt), sum(acln_annl_bal_amt), sum(pos_csf_lv_fte_qty) \n");
239            sqlText.append("FROM LD_BCN_BUILD_ACCTBAL01_MT \n");
240            sqlText.append("WHERE sesid = ? \n");
241            sqlText.append("GROUP BY org_fin_coa_cd, org_cd, sub_fund_grp_cd, univ_fiscal_yr, fin_coa_cd, account_nbr, inc_exp_cd, \n");
242            sqlText.append(" fin_cons_sort_cd, fin_level_sort_cd, fin_object_cd, fin_obj_level_cd \n");
243            
244            insertSummaryForReport.add(new SQLForStep(sqlText,insertionPoints));
245            sqlText.delete(0, sqlText.length());                     
246            insertionPoints.clear();
247        }
248        
249        protected void buildInitialAccountBalances(String sessionId, String principalName) 
250        {
251            // remove any rows previously processed by this user
252            cleanReportsAccountObjectDetailTable(principalName);
253            
254            // build the tables used both for detail and for consolidation
255            // insert the funding with all FTE zeroed out
256            ArrayList<String> stringsToInsert = new ArrayList<String>(2);
257            stringsToInsert.add(this.getRevenueINList());
258            stringsToInsert.add(this.getExpenditureINList());
259            getSimpleJdbcTemplate().update(updateReportsAccountObjectDetailTable.get(0).getSQL(stringsToInsert),sessionId, principalName, sessionId, principalName);
260            // fill in the FTE fields that come from appointment fundinng
261            getSimpleJdbcTemplate().update(updateReportsAccountObjectDetailTable.get(1).getSQL(),sessionId);
262            // fill in the FTE fields that come from CSF for people not on leave
263            stringsToInsert.clear();
264            stringsToInsert.add(new String(BCConstants.csfFundingStatusFlag.LEAVE.getFlagValue()));
265            stringsToInsert.add(new String(BCConstants.csfFundingStatusFlag.LEAVE.getFlagValue()));
266            getSimpleJdbcTemplate().update(updateReportsAccountObjectDetailTable.get(2).getSQL(stringsToInsert), sessionId);
267            // fill in the FTE fields that come from CSF for people who are on leave
268            getSimpleJdbcTemplate().update(updateReportsAccountObjectDetailTable.get(3).getSQL(stringsToInsert), sessionId);
269        }
270        
271        protected void cleanReportsAccountObjectDetailTable(String principalName) {
272            clearTempTableByUnvlId("LD_BCN_ACCT_BAL_T", "PERSON_UNVL_ID", principalName);
273        }
274        
275        protected void cleanReportsAccountObjectTemporaryTable(String sessionId)
276        {
277          clearTempTableBySesId("LD_BCN_BUILD_ACCTBAL01_MT","SESID",sessionId);
278        }
279        
280    
281        /**
282         * 
283         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionAccountObjectDetailReportDao#updateReportsAccountObjectDetailTable(java.lang.String)
284         */
285        public void updateReportsAccountObjectDetailTable(String principalName) {
286    
287            // get a unique ID to identify this user's session
288            String sessionId = (new Guid()).toString();
289    
290            // add the reporting rows to the common base tables
291            this.buildInitialAccountBalances(sessionId, principalName);
292    
293            // fill in the detail rows
294            getSimpleJdbcTemplate().update(insertDetailForReport.get(0).getSQL(), principalName, sessionId);
295            
296            // clean out the temporary holding table for the reporting rows
297            cleanReportsAccountObjectTemporaryTable(sessionId);    
298            /**
299             * 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.
300             */
301            persistenceService.clearCache();
302        }
303        
304        /**
305         * 
306         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionAccountObjectDetailReportDao#updateReportsAccountObjectConsolidatedTable(java.lang.String)
307         */
308        public void updateReportsAccountObjectConsolidatedTable(String principalName) {
309    
310            // get a unique ID to identify this user's session
311            String sessionId = (new Guid()).toString();
312    
313            // add the reporting rows to the common base tables
314            this.buildInitialAccountBalances(sessionId, principalName);
315            
316            // fill in the consolidated rows with  the default subaccount and the default subobject
317            ArrayList<String> stringsToInsert = new ArrayList<String>(2);
318            stringsToInsert.add(KFSConstants.getDashSubAccountNumber());
319            stringsToInsert.add(KFSConstants.getDashFinancialSubObjectCode());
320            getSimpleJdbcTemplate().update(insertSummaryForReport.get(0).getSQL(stringsToInsert), principalName, sessionId);
321            
322            // clean out the temporary holding table for the reporting rows
323            cleanReportsAccountObjectTemporaryTable(sessionId);    
324            /**
325             * 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.
326             */
327            persistenceService.clearCache();
328        }
329        
330        public void setPersistenceService(PersistenceService persistenceService)
331        {
332            this.persistenceService = persistenceService;
333        }
334        
335    }
336