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.batch.dataaccess.impl.SQLForStep;
021    import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionMonthSummaryReportDao;
022    import org.kuali.kfs.sys.KFSConstants;
023    import org.kuali.rice.kns.service.PersistenceService;
024    import org.kuali.rice.kns.util.Guid;
025    
026    /**
027     * report general ledger and monthly summaries from the budget by organization, subfund group, and object code 
028     */
029    
030    public class BudgetConstructionMonthSummaryReportDaoJdbc extends BudgetConstructionDaoJdbcBase implements BudgetConstructionMonthSummaryReportDao {
031        private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BudgetConstructionMonthSummaryReportDaoJdbc.class);
032    
033        private static ArrayList<SQLForStep> updateReportsMonthSummaryTable = new ArrayList<SQLForStep>(9);
034        
035        private PersistenceService persistenceService;
036        
037        public BudgetConstructionMonthSummaryReportDaoJdbc() {
038            
039            //builds and updates MonthSummaryReports
040            StringBuilder sqlText              = new StringBuilder(2500);
041            ArrayList<Integer> insertionPoints = new ArrayList<Integer>(10);
042            
043            /* sum pending budget income records */
044            sqlText.append("INSERT INTO LD_BCN_BUILD_MNTHSUMM01_MT \n");
045            sqlText.append(" (SESID, SEL_ORG_FIN_COA, SEL_ORG_CD, SEL_SUB_FUND_GRP, UNIV_FISCAL_YR, \n");
046            sqlText.append(" FIN_COA_CD, INC_EXP_CD, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, ACLN_ANNL_BAL_AMT) \n");
047            sqlText.append("SELECT ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, \n");
048            sqlText.append(" ctrl.fin_coa_cd, 'A', pbgl.fin_object_cd, '");
049            //default sub object code
050            insertionPoints.add(sqlText.length());
051            sqlText.append("', sum(pbgl.acln_annl_bal_amt) \n");
052            sqlText.append("FROM LD_PND_BCNSTR_GL_T pbgl, LD_BCN_CTRL_LIST_T ctrl, LD_BCN_SUBFUND_PICK_T  pick \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            // list of revenue object types
060            insertionPoints.add(sqlText.length());
061            sqlText.append("\n");
062            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, \n");
063            sqlText.append(" ctrl.fin_coa_cd, pbgl.fin_object_cd \n");
064                   
065            updateReportsMonthSummaryTable.add(new SQLForStep(sqlText,insertionPoints));
066            sqlText.delete(0, sqlText.length());
067            insertionPoints.clear();
068            
069            /* sum pending budget expenditure records */
070            sqlText.append("INSERT INTO LD_BCN_BUILD_MNTHSUMM01_MT \n");
071            sqlText.append(" (SESID, SEL_ORG_FIN_COA, SEL_ORG_CD, SEL_SUB_FUND_GRP, UNIV_FISCAL_YR, \n");
072            sqlText.append(" FIN_COA_CD, INC_EXP_CD, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, ACLN_ANNL_BAL_AMT) \n");
073            sqlText.append("SELECT ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, \n");
074            sqlText.append(" ctrl.fin_coa_cd, 'B', pbgl.fin_object_cd, '");
075            // default sub object code
076            insertionPoints.add(sqlText.length());
077            sqlText.append("', sum(pbgl.acln_annl_bal_amt) \n");
078            sqlText.append("FROM LD_PND_BCNSTR_GL_T pbgl, LD_BCN_CTRL_LIST_T ctrl, LD_BCN_SUBFUND_PICK_T pick \n");
079            sqlText.append("WHERE pick.person_unvl_id = ? \n");
080            sqlText.append(" AND pick.report_flag > 0 \n");
081            sqlText.append(" AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp \n");
082            sqlText.append(" AND pick.person_unvl_id = ctrl.person_unvl_id \n");
083            sqlText.append(" AND pbgl.fdoc_nbr = ctrl.fdoc_nbr \n");
084            sqlText.append(" AND pbgl.fin_obj_typ_cd in ");
085            // list of expenditure object types
086            insertionPoints.add(sqlText.length());
087            sqlText.append("\n");
088            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, ctrl.fin_coa_cd, pbgl.fin_object_cd \n");
089            
090            updateReportsMonthSummaryTable.add(new SQLForStep(sqlText,insertionPoints));
091            sqlText.delete(0, sqlText.length());
092            insertionPoints.clear();
093            
094            /* sum monthly budget income records */
095            sqlText.append("INSERT INTO LD_BCN_BUILD_MNTHSUMM02_MT \n");
096            sqlText.append("(SESID, SEL_ORG_FIN_COA, SEL_ORG_CD, SEL_SUB_FUND_GRP, UNIV_FISCAL_YR, FIN_COA_CD, INC_EXP_CD, \n");
097            sqlText.append(" FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FDOC_LN_MO1_AMT, FDOC_LN_MO2_AMT, FDOC_LN_MO3_AMT, FDOC_LN_MO4_AMT, FDOC_LN_MO5_AMT, \n");
098            sqlText.append(" FDOC_LN_MO6_AMT, FDOC_LN_MO7_AMT, FDOC_LN_MO8_AMT, FDOC_LN_MO9_AMT, FDOC_LN_MO10_AMT, FDOC_LN_MO11_AMT, FDOC_LN_MO12_AMT) \n");
099            sqlText.append("SELECT ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, ctrl.fin_coa_cd, 'A', \n");
100            sqlText.append(" mnth.fin_object_cd, '");
101            // default sub object code
102            insertionPoints.add(sqlText.length());
103            sqlText.append("', sum(mnth.fdoc_ln_mo1_amt), sum(mnth.fdoc_ln_mo2_amt), sum(mnth.fdoc_ln_mo3_amt), \n");
104            sqlText.append(" sum(mnth.fdoc_ln_mo4_amt), sum(mnth.fdoc_ln_mo5_amt), sum(mnth.fdoc_ln_mo6_amt), sum(mnth.fdoc_ln_mo7_amt), \n");
105            sqlText.append(" sum(mnth.fdoc_ln_mo8_amt), sum(mnth.fdoc_ln_mo9_amt), sum(mnth.fdoc_ln_mo10_amt), sum(mnth.fdoc_ln_mo11_amt), sum(mnth.fdoc_ln_mo12_amt) \n");
106            sqlText.append("FROM LD_BCNSTR_MONTH_T mnth, LD_BCN_CTRL_LIST_T ctrl, LD_BCN_SUBFUND_PICK_T pick \n");
107            sqlText.append("WHERE pick.person_unvl_id = ? \n");
108            sqlText.append("AND pick.report_flag > 0 \n");
109            sqlText.append("AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp \n");
110            sqlText.append("AND pick.person_unvl_id = ctrl.person_unvl_id \n");
111            sqlText.append("AND mnth.fdoc_nbr = ctrl.fdoc_nbr \n");
112            sqlText.append("AND mnth.fin_obj_typ_cd in ");
113            // list of revenue object types
114            insertionPoints.add(sqlText.length());
115            sqlText.append("\n");
116            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, \n");
117            sqlText.append(" ctrl.univ_fiscal_yr, ctrl.fin_coa_cd, mnth.fin_object_cd \n");
118              
119            updateReportsMonthSummaryTable.add(new SQLForStep(sqlText,insertionPoints));
120            sqlText.delete(0, sqlText.length());
121            insertionPoints.clear();
122            
123            /* sum monthly budget expenditure records */
124            sqlText.append("INSERT INTO LD_BCN_BUILD_MNTHSUMM02_MT \n");
125            sqlText.append("(SESID, SEL_ORG_FIN_COA, SEL_ORG_CD, SEL_SUB_FUND_GRP, UNIV_FISCAL_YR, FIN_COA_CD, INC_EXP_CD, \n");
126            sqlText.append(" FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FDOC_LN_MO1_AMT, FDOC_LN_MO2_AMT, FDOC_LN_MO3_AMT, FDOC_LN_MO4_AMT, FDOC_LN_MO5_AMT, \n");
127            sqlText.append(" FDOC_LN_MO6_AMT, FDOC_LN_MO7_AMT, FDOC_LN_MO8_AMT, FDOC_LN_MO9_AMT, FDOC_LN_MO10_AMT, FDOC_LN_MO11_AMT, FDOC_LN_MO12_AMT) \n");
128            sqlText.append("SELECT ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, ctrl.fin_coa_cd, \n");
129            sqlText.append(" 'B', mnth.fin_object_cd, '");
130            // default sub object code
131            insertionPoints.add(sqlText.length());
132            sqlText.append("', sum(mnth.fdoc_ln_mo1_amt), sum(mnth.fdoc_ln_mo2_amt), sum(mnth.fdoc_ln_mo3_amt), \n");
133            sqlText.append(" sum(mnth.fdoc_ln_mo4_amt), sum(mnth.fdoc_ln_mo5_amt), sum(mnth.fdoc_ln_mo6_amt), sum(mnth.fdoc_ln_mo7_amt), \n");
134            sqlText.append(" sum(mnth.fdoc_ln_mo8_amt), sum(mnth.fdoc_ln_mo9_amt), sum(mnth.fdoc_ln_mo10_amt), sum(mnth.fdoc_ln_mo11_amt), sum(mnth.fdoc_ln_mo12_amt) \n");
135            sqlText.append("FROM LD_BCNSTR_MONTH_T mnth, LD_BCN_CTRL_LIST_T ctrl, LD_BCN_SUBFUND_PICK_T pick \n");
136            sqlText.append("WHERE pick.person_unvl_id = ? \n");
137            sqlText.append(" AND pick.report_flag > 0 \n");
138            sqlText.append(" AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp \n");
139            sqlText.append(" AND pick.person_unvl_id = ctrl.person_unvl_id \n");
140            sqlText.append(" AND mnth.fdoc_nbr = ctrl.fdoc_nbr \n");
141            sqlText.append(" AND mnth.fin_obj_typ_cd in ");
142            // list of expenditure object types
143            insertionPoints.add(sqlText.length());
144            sqlText.append("\n");
145            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, ctrl.fin_coa_cd, mnth.fin_object_cd \n");
146                    
147            updateReportsMonthSummaryTable.add(new SQLForStep(sqlText,insertionPoints));
148            sqlText.delete(0, sqlText.length());                  
149            insertionPoints.clear();
150    
151            /* sum to the sub-object code */
152            /* sum pending budget income records */
153            sqlText.append("INSERT INTO LD_BCN_BUILD_MNTHSUMM01_MT \n");
154            sqlText.append(" (SESID, SEL_ORG_FIN_COA, SEL_ORG_CD, SEL_SUB_FUND_GRP, UNIV_FISCAL_YR, \n");
155            sqlText.append(" FIN_COA_CD, INC_EXP_CD, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, ACLN_ANNL_BAL_AMT) \n");
156            sqlText.append("SELECT ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, \n");
157            sqlText.append(" ctrl.fin_coa_cd, 'A', pbgl.fin_object_cd, pbgl.fin_sub_obj_cd, sum(pbgl.acln_annl_bal_amt) \n");
158            sqlText.append("FROM LD_PND_BCNSTR_GL_T pbgl, LD_BCN_CTRL_LIST_T ctrl, LD_BCN_SUBFUND_PICK_T pick \n");
159            sqlText.append("WHERE pick.person_unvl_id = ? \n");
160            sqlText.append("AND pick.report_flag > 0 \n");
161            sqlText.append("AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp \n");
162            sqlText.append("AND pick.person_unvl_id = ctrl.person_unvl_id \n");
163            sqlText.append("AND pbgl.fdoc_nbr = ctrl.fdoc_nbr \n");
164            sqlText.append("AND pbgl.fin_obj_typ_cd in ");
165            // list of revenue object types
166            insertionPoints.add(sqlText.length());
167            sqlText.append("\n");
168            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, \n");
169            sqlText.append(" ctrl.fin_coa_cd, pbgl.fin_object_cd, pbgl.fin_sub_obj_cd \n");
170                      
171            updateReportsMonthSummaryTable.add(new SQLForStep(sqlText,insertionPoints));
172            sqlText.delete(0, sqlText.length());                  
173            insertionPoints.clear();
174            
175            /* sum pending budget expenditure records */
176            sqlText.append("INSERT INTO LD_BCN_BUILD_MNTHSUMM01_MT \n");
177            sqlText.append("(SESID, SEL_ORG_FIN_COA, SEL_ORG_CD, SEL_SUB_FUND_GRP, UNIV_FISCAL_YR, \n");
178            sqlText.append(" FIN_COA_CD, INC_EXP_CD, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, ACLN_ANNL_BAL_AMT) \n");
179            sqlText.append("SELECT ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, \n");
180            sqlText.append(" ctrl.fin_coa_cd, 'B', pbgl.fin_object_cd, pbgl.fin_sub_obj_cd, sum(pbgl.acln_annl_bal_amt) \n");
181            sqlText.append("FROM LD_PND_BCNSTR_GL_T pbgl, LD_BCN_CTRL_LIST_T ctrl, LD_BCN_SUBFUND_PICK_T pick \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 pbgl.fdoc_nbr = ctrl.fdoc_nbr \n");
187            sqlText.append("AND pbgl.fin_obj_typ_cd in ");
188            // list of expenditure object types
189            insertionPoints.add(sqlText.length());
190            sqlText.append("\n");
191            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, \n");
192            sqlText.append(" ctrl.fin_coa_cd, pbgl.fin_object_cd, pbgl.fin_sub_obj_cd \n");
193            
194            updateReportsMonthSummaryTable.add(new SQLForStep(sqlText,insertionPoints));
195            sqlText.delete(0, sqlText.length());
196            insertionPoints.clear();
197            
198            /* sum monthly budget income records */
199            sqlText.append("INSERT INTO LD_BCN_BUILD_MNTHSUMM02_MT \n");
200            sqlText.append("(SESID, SEL_ORG_FIN_COA, SEL_ORG_CD, SEL_SUB_FUND_GRP, UNIV_FISCAL_YR, FIN_COA_CD, INC_EXP_CD, \n");
201            sqlText.append(" FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FDOC_LN_MO1_AMT, FDOC_LN_MO2_AMT, FDOC_LN_MO3_AMT, FDOC_LN_MO4_AMT, FDOC_LN_MO5_AMT, \n");
202            sqlText.append(" FDOC_LN_MO6_AMT, FDOC_LN_MO7_AMT, FDOC_LN_MO8_AMT, FDOC_LN_MO9_AMT, FDOC_LN_MO10_AMT, FDOC_LN_MO11_AMT, FDOC_LN_MO12_AMT) \n");
203            sqlText.append("SELECT ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, ctrl.fin_coa_cd, 'A', \n");
204            sqlText.append(" mnth.fin_object_cd, mnth.fin_sub_obj_cd, sum(mnth.fdoc_ln_mo1_amt), sum(mnth.fdoc_ln_mo2_amt), sum(mnth.fdoc_ln_mo3_amt), \n");
205            sqlText.append(" sum(mnth.fdoc_ln_mo4_amt), sum(mnth.fdoc_ln_mo5_amt), sum(mnth.fdoc_ln_mo6_amt), sum(mnth.fdoc_ln_mo7_amt), sum(mnth.fdoc_ln_mo8_amt), \n");
206            sqlText.append(" sum(mnth.fdoc_ln_mo9_amt), sum(mnth.fdoc_ln_mo10_amt), sum(mnth.fdoc_ln_mo11_amt), sum(mnth.fdoc_ln_mo12_amt) \n");
207            sqlText.append("FROM LD_BCNSTR_MONTH_T mnth, LD_BCN_CTRL_LIST_T ctrl, LD_BCN_SUBFUND_PICK_T pick \n");
208            sqlText.append("WHERE pick.person_unvl_id = ? \n");
209            sqlText.append("AND pick.report_flag > 0 \n");
210            sqlText.append("AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp \n");
211            sqlText.append("AND pick.person_unvl_id = ctrl.person_unvl_id \n");
212            sqlText.append("AND mnth.fdoc_nbr = ctrl.fdoc_nbr \n");
213            sqlText.append("AND mnth.fin_obj_typ_cd in ");
214            // list of income object types
215            insertionPoints.add(sqlText.length());
216            sqlText.append("\n");
217            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, \n");
218            sqlText.append(" ctrl.fin_coa_cd, mnth.fin_object_cd, mnth.fin_sub_obj_cd \n");
219            
220            updateReportsMonthSummaryTable.add(new SQLForStep(sqlText,insertionPoints));
221            sqlText.delete(0, sqlText.length());
222            insertionPoints.clear();
223            
224            /* sum monthly budget expenditure records */
225            sqlText.append("INSERT INTO LD_BCN_BUILD_MNTHSUMM02_MT \n");
226            sqlText.append("(SESID, SEL_ORG_FIN_COA, SEL_ORG_CD, SEL_SUB_FUND_GRP, UNIV_FISCAL_YR, FIN_COA_CD, INC_EXP_CD, \n");
227            sqlText.append(" FIN_OBJECT_CD, FIN_SUB_OBJ_CD, FDOC_LN_MO1_AMT, FDOC_LN_MO2_AMT, FDOC_LN_MO3_AMT, FDOC_LN_MO4_AMT, FDOC_LN_MO5_AMT, \n");
228            sqlText.append(" FDOC_LN_MO6_AMT, FDOC_LN_MO7_AMT, FDOC_LN_MO8_AMT, FDOC_LN_MO9_AMT, FDOC_LN_MO10_AMT, FDOC_LN_MO11_AMT, FDOC_LN_MO12_AMT) \n");
229            sqlText.append("SELECT ?, ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, ctrl.fin_coa_cd, \n");
230            sqlText.append(" 'B', mnth.fin_object_cd, mnth.fin_sub_obj_cd, sum(mnth.fdoc_ln_mo1_amt), sum(mnth.fdoc_ln_mo2_amt), sum(mnth.fdoc_ln_mo3_amt), \n");
231            sqlText.append(" sum(mnth.fdoc_ln_mo4_amt), sum(mnth.fdoc_ln_mo5_amt), sum(mnth.fdoc_ln_mo6_amt), sum(mnth.fdoc_ln_mo7_amt), sum(mnth.fdoc_ln_mo8_amt), \n");
232            sqlText.append(" sum(mnth.fdoc_ln_mo9_amt), sum(mnth.fdoc_ln_mo10_amt), sum(mnth.fdoc_ln_mo11_amt), sum(mnth.fdoc_ln_mo12_amt) \n");
233            sqlText.append("FROM LD_BCNSTR_MONTH_T mnth, LD_BCN_CTRL_LIST_T ctrl, LD_BCN_SUBFUND_PICK_T pick \n");
234            sqlText.append("WHERE pick.person_unvl_id = ? \n");
235            sqlText.append("AND pick.report_flag > 0 \n");
236            sqlText.append("AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp \n");
237            sqlText.append("AND pick.person_unvl_id = ctrl.person_unvl_id \n");
238            sqlText.append("AND mnth.fdoc_nbr = ctrl.fdoc_nbr \n");
239            sqlText.append("AND mnth.fin_obj_typ_cd in ");
240            // list of expenditure object types
241            insertionPoints.add(sqlText.length());
242            sqlText.append("\n");
243            sqlText.append("GROUP BY ctrl.sel_org_fin_coa, ctrl.sel_org_cd, ctrl.sel_sub_fund_grp, ctrl.univ_fiscal_yr, ctrl.fin_coa_cd, \n");
244            sqlText.append(" mnth.fin_object_cd, mnth.fin_sub_obj_cd \n");
245              
246            updateReportsMonthSummaryTable.add(new SQLForStep(sqlText,insertionPoints));
247            sqlText.delete(0, sqlText.length());  
248            insertionPoints.clear();
249             
250            /* join the summed values and merge level and consolidation info */         
251            sqlText.append("INSERT INTO LD_BCN_MNTH_SUMM_T \n");
252            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");
253            sqlText.append(" FIN_LEV_SORT_CD, FIN_OBJECT_CD, FIN_SUB_OBJ_CD, ACLN_ANNL_BAL_AMT, FDOC_LN_MO1_AMT, FDOC_LN_MO2_AMT, \n");
254            sqlText.append(" FDOC_LN_MO3_AMT, FDOC_LN_MO4_AMT, FDOC_LN_MO5_AMT, FDOC_LN_MO6_AMT, FDOC_LN_MO7_AMT, FDOC_LN_MO8_AMT, FDOC_LN_MO9_AMT, \n");
255            sqlText.append(" FDOC_LN_MO10_AMT, FDOC_LN_MO11_AMT, FDOC_LN_MO12_AMT, FIN_CONS_OBJ_CD, FIN_OBJ_LEVEL_CD) \n");
256            sqlText.append("SELECT ?, LD_BCN_BUILD_MNTHSUMM01_MT.sel_org_fin_coa, LD_BCN_BUILD_MNTHSUMM01_MT.sel_org_cd, \n");
257            sqlText.append(" LD_BCN_BUILD_MNTHSUMM01_MT.sel_sub_fund_grp, LD_BCN_BUILD_MNTHSUMM01_MT.fin_coa_cd, \n");
258            sqlText.append(" LD_BCN_BUILD_MNTHSUMM01_MT.inc_exp_cd, objc.fin_report_sort_cd, objl.fin_report_sort_cd, LD_BCN_BUILD_MNTHSUMM01_MT.fin_object_cd, \n");
259            sqlText.append(" LD_BCN_BUILD_MNTHSUMM01_MT.fin_sub_obj_cd, LD_BCN_BUILD_MNTHSUMM01_MT.acln_annl_bal_amt, LD_BCN_BUILD_MNTHSUMM02_MT.fdoc_ln_mo1_amt, \n");
260            sqlText.append(" LD_BCN_BUILD_MNTHSUMM02_MT.fdoc_ln_mo2_amt, LD_BCN_BUILD_MNTHSUMM02_MT.fdoc_ln_mo3_amt, LD_BCN_BUILD_MNTHSUMM02_MT.fdoc_ln_mo4_amt, \n");
261            sqlText.append(" LD_BCN_BUILD_MNTHSUMM02_MT.fdoc_ln_mo5_amt, LD_BCN_BUILD_MNTHSUMM02_MT.fdoc_ln_mo6_amt, LD_BCN_BUILD_MNTHSUMM02_MT.fdoc_ln_mo7_amt, \n");
262            sqlText.append(" LD_BCN_BUILD_MNTHSUMM02_MT.fdoc_ln_mo8_amt, LD_BCN_BUILD_MNTHSUMM02_MT.fdoc_ln_mo9_amt, LD_BCN_BUILD_MNTHSUMM02_MT.fdoc_ln_mo10_amt, \n");
263            sqlText.append(" LD_BCN_BUILD_MNTHSUMM02_MT.fdoc_ln_mo11_amt, LD_BCN_BUILD_MNTHSUMM02_MT.fdoc_ln_mo12_amt, objl.fin_cons_obj_cd, objt.fin_obj_level_cd \n");
264            sqlText.append("FROM CA_OBJECT_CODE_T objt, CA_OBJ_LEVEL_T objl, CA_OBJ_CONSOLDTN_T objc, (LD_BCN_BUILD_MNTHSUMM01_MT \n");
265            sqlText.append(" LEFT OUTER JOIN LD_BCN_BUILD_MNTHSUMM02_MT ON ((LD_BCN_BUILD_MNTHSUMM01_MT.sesid = LD_BCN_BUILD_MNTHSUMM02_MT.sesid) AND \n");
266            sqlText.append(" (LD_BCN_BUILD_MNTHSUMM01_MT.sel_org_fin_coa = LD_BCN_BUILD_MNTHSUMM02_MT.sel_org_fin_coa) AND \n");
267            sqlText.append(" (LD_BCN_BUILD_MNTHSUMM01_MT.sel_org_cd = LD_BCN_BUILD_MNTHSUMM02_MT.sel_org_cd) AND  \n");
268            sqlText.append(" (LD_BCN_BUILD_MNTHSUMM01_MT.sel_sub_fund_grp = LD_BCN_BUILD_MNTHSUMM02_MT.sel_sub_fund_grp) AND \n");
269            sqlText.append(" (LD_BCN_BUILD_MNTHSUMM01_MT.univ_fiscal_yr = LD_BCN_BUILD_MNTHSUMM02_MT.univ_fiscal_yr) AND \n");
270            sqlText.append(" (LD_BCN_BUILD_MNTHSUMM01_MT.fin_coa_cd = LD_BCN_BUILD_MNTHSUMM02_MT.fin_coa_cd) AND \n");
271            sqlText.append(" (LD_BCN_BUILD_MNTHSUMM01_MT.inc_exp_cd = LD_BCN_BUILD_MNTHSUMM02_MT.inc_exp_cd) AND \n");
272            sqlText.append(" (LD_BCN_BUILD_MNTHSUMM01_MT.fin_object_cd = LD_BCN_BUILD_MNTHSUMM02_MT.fin_object_cd) AND \n");
273            sqlText.append(" (LD_BCN_BUILD_MNTHSUMM01_MT.fin_sub_obj_cd = LD_BCN_BUILD_MNTHSUMM02_MT.fin_sub_obj_cd))) \n");
274            sqlText.append("WHERE LD_BCN_BUILD_MNTHSUMM01_MT.sesid = ?\n");
275            sqlText.append("AND LD_BCN_BUILD_MNTHSUMM01_MT.univ_fiscal_yr = objt.univ_fiscal_yr \n");
276            sqlText.append("AND LD_BCN_BUILD_MNTHSUMM01_MT.fin_coa_cd = objt.fin_coa_cd \n");
277            sqlText.append("AND LD_BCN_BUILD_MNTHSUMM01_MT.fin_object_cd = objt.fin_object_cd \n");
278            sqlText.append("AND objt.fin_coa_cd = objl.fin_coa_cd \n");
279            sqlText.append("AND objt.fin_obj_level_cd = objl.fin_obj_level_cd \n");
280            sqlText.append("AND objl.fin_coa_cd = objc.fin_coa_cd \n");
281            sqlText.append("AND objl.fin_cons_obj_cd = objc.fin_cons_obj_cd \n");
282    
283            updateReportsMonthSummaryTable.add(new SQLForStep(sqlText));
284            sqlText.delete(0, sqlText.length());  
285    
286        }
287        
288        public void cleanReportsMonthSummaryTable(String principalName) {
289            clearTempTableByUnvlId("LD_BCN_MNTH_SUMM_T", "PERSON_UNVL_ID", principalName);
290            /**
291             * 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.
292             */
293            persistenceService.clearCache();
294        }
295        
296        /**
297         * 
298         * sums general ledger and montly budgets by subfund and organization to the object-code level
299         * @param principalName--the user requesting the report
300         * @param idForSession--the session id for the user
301         */
302        protected void consolidateMonthSummaryReportToObjectCodeLevel(String principalName, String idForSession) {
303    
304           // set up the things that need to be inserted into the SQL (default sub object code and an object type IN list) 
305           ArrayList<String> revenueInsertions     = new ArrayList<String>(2);
306           ArrayList<String> expenditureInsertions = new ArrayList<String>(2);
307           revenueInsertions.add(KFSConstants.getDashFinancialSubObjectCode());
308           revenueInsertions.add(this.getRevenueINList());
309           expenditureInsertions.add(KFSConstants.getDashFinancialSubObjectCode());
310           expenditureInsertions.add(this.getExpenditureINList());
311           
312           // sum revenue from the pending general ledger to the object code level
313           getSimpleJdbcTemplate().update(updateReportsMonthSummaryTable.get(0).getSQL(revenueInsertions), idForSession, principalName);
314           // sum expenditure from the pending general ledger to the object code level
315           getSimpleJdbcTemplate().update(updateReportsMonthSummaryTable.get(1).getSQL(expenditureInsertions), idForSession, principalName);
316           // sum revenue from the monthly budgets to the object code level
317           getSimpleJdbcTemplate().update(updateReportsMonthSummaryTable.get(2).getSQL(revenueInsertions), idForSession, principalName);
318           // sum expenditure from the monthly budgets to the object code level
319           getSimpleJdbcTemplate().update(updateReportsMonthSummaryTable.get(3).getSQL(expenditureInsertions), idForSession, principalName);
320        }
321        
322        /**
323         * 
324         * sums general ledger and monthly amounts by organization and subfund group to the sub-object level
325         * @param principalName--the user requesting the report
326         * @param idForSession--the ID for the user's session
327         */
328        protected void detailedMonthSummaryTableReport(String principalName, String idForSession)  {
329           
330           // set up the strings to be inserted into the SQL (revenue and expenditure object types 
331            ArrayList<String> revenueInsertions     = new ArrayList<String>(2);
332            ArrayList<String> expenditureInsertions = new ArrayList<String>(2);
333            revenueInsertions.add(this.getRevenueINList());
334            expenditureInsertions.add(this.getExpenditureINList());
335            
336            // sum revenue from the pending general ledger to the sub-object code level
337            getSimpleJdbcTemplate().update(updateReportsMonthSummaryTable.get(4).getSQL(revenueInsertions), idForSession, principalName);
338            // sum expenditure from the pending general ledger to the sub-object code level
339            getSimpleJdbcTemplate().update(updateReportsMonthSummaryTable.get(5).getSQL(expenditureInsertions), idForSession, principalName);
340            // sum revenue from the monthly budgets to the sub-object code level
341            getSimpleJdbcTemplate().update(updateReportsMonthSummaryTable.get(6).getSQL(revenueInsertions), idForSession, principalName);
342            // sum expenditure from the monthly budgets to the sub-object code level
343            getSimpleJdbcTemplate().update(updateReportsMonthSummaryTable.get(7).getSQL(expenditureInsertions), idForSession, principalName);
344        }
345    
346        /**
347         * 
348         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionMonthSummaryReportDao#updateReportsMonthSummaryTable(java.lang.String, boolean)
349         */
350        public void updateReportsMonthSummaryTable(String principalName, boolean consolidateToObjectCodeLevel) {
351    
352            Guid guid = new Guid();
353            String idForSession = guid.toString();
354            
355            // remove any previous reporting rows for this user
356            this.cleanReportsMonthSummaryTable(principalName);
357            
358            if (consolidateToObjectCodeLevel)
359            {
360                consolidateMonthSummaryReportToObjectCodeLevel(principalName, idForSession);
361            }
362            else
363            {
364                detailedMonthSummaryTableReport(principalName, idForSession);
365            }
366            // join monthly budgets and general ledger to build the final table for the report
367            getSimpleJdbcTemplate().update(updateReportsMonthSummaryTable.get(8).getSQL(), principalName, idForSession);
368            
369            // clear out the user's work table rows for this session
370            this.clearTempTableBySesId("LD_BCN_BUILD_MNTHSUMM01_MT","SESID",idForSession);
371            this.clearTempTableBySesId("LD_BCN_BUILD_MNTHSUMM02_MT","SESID",idForSession);
372            /**
373             * 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.
374             */
375            persistenceService.clearCache();
376        }
377        
378        public void setPersistenceService(PersistenceService persistenceService)
379        {
380            this.persistenceService = persistenceService;
381        }
382    
383    }
384