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.BudgetConstructionObjectSummaryReportDao; 023 import org.kuali.rice.kns.service.PersistenceService; 024 import org.kuali.rice.kns.util.Guid; 025 026 public class BudgetConstructionObjectSummaryReportDaoJdbc extends BudgetConstructionDaoJdbcBase implements BudgetConstructionObjectSummaryReportDao { 027 028 private static ArrayList<SQLForStep> objectSummarySql = new ArrayList<SQLForStep>(5); 029 030 private PersistenceService persistenceService; 031 032 public BudgetConstructionObjectSummaryReportDaoJdbc() 033 { 034 035 036 StringBuilder sqlBuilder = new StringBuilder(1500); 037 ArrayList<Integer> insertionPoints = new ArrayList<Integer>(10); 038 039 040 // build the INSERT SQL for the main table 041 sqlBuilder.append("INSERT INTO LD_BCN_OBJT_SUMM_T\n"); 042 sqlBuilder.append("(PERSON_UNVL_ID, ORG_FIN_COA_CD, ORG_CD, SUB_FUND_GRP_CD, FIN_COA_CD,\n"); 043 sqlBuilder.append("INC_EXP_CD, FIN_CONS_SORT_CD, FIN_LEV_SORT_CD, FIN_OBJECT_CD, ACLN_ANNL_BAL_AMT,\n"); 044 sqlBuilder.append("FIN_BEG_BAL_LN_AMT, FIN_CONS_OBJ_CD, FIN_OBJ_LEVEL_CD, APPT_RQCSF_FTE_QTY,\n"); 045 sqlBuilder.append("APPT_RQST_FTE_QTY, POS_CSF_FTE_QTY, POS_CSF_LV_FTE_QTY)\n"); 046 sqlBuilder.append("SELECT\n"); 047 sqlBuilder.append("?,\n"); 048 sqlBuilder.append("LD_BCN_CTRL_LIST_T.SEL_ORG_FIN_COA,\n"); 049 sqlBuilder.append("LD_BCN_CTRL_LIST_T.SEL_ORG_CD,\n"); 050 sqlBuilder.append("LD_BCN_CTRL_LIST_T.SEL_SUB_FUND_GRP,\n"); 051 sqlBuilder.append("LD_BCN_CTRL_LIST_T.FIN_COA_CD,'A',\n"); 052 sqlBuilder.append("CA_OBJ_CONSOLDTN_T.FIN_REPORT_SORT_CD,\n"); 053 sqlBuilder.append("CA_OBJ_LEVEL_T.FIN_REPORT_SORT_CD,\n"); 054 sqlBuilder.append("LD_PND_BCNSTR_GL_T.FIN_OBJECT_CD,\n"); 055 sqlBuilder.append("sum(LD_PND_BCNSTR_GL_T.ACLN_ANNL_BAL_AMT),\n"); 056 sqlBuilder.append("sum(LD_PND_BCNSTR_GL_T.FIN_BEG_BAL_LN_AMT),\n"); 057 sqlBuilder.append("CA_OBJ_LEVEL_T.FIN_CONS_OBJ_CD,\n"); 058 sqlBuilder.append("CA_OBJECT_CODE_T.FIN_OBJ_LEVEL_CD,\n"); 059 sqlBuilder.append("0,0,0,0\n"); 060 sqlBuilder.append(" FROM LD_BCN_SUBFUND_PICK_T,\n"); 061 sqlBuilder.append(" LD_BCN_CTRL_LIST_T,\n"); 062 sqlBuilder.append(" LD_PND_BCNSTR_GL_T,\n"); 063 sqlBuilder.append(" CA_OBJECT_CODE_T,\n"); 064 sqlBuilder.append(" CA_OBJ_LEVEL_T,\n"); 065 sqlBuilder.append(" CA_OBJ_CONSOLDTN_T\n"); 066 sqlBuilder.append(" WHERE (LD_BCN_SUBFUND_PICK_T.PERSON_UNVL_ID = ?)\n"); 067 sqlBuilder.append(" AND (LD_BCN_SUBFUND_PICK_T.REPORT_FLAG > 0)\n"); 068 sqlBuilder.append(" AND (LD_BCN_SUBFUND_PICK_T.SUB_FUND_GRP_CD = LD_BCN_CTRL_LIST_T.SEL_SUB_FUND_GRP)\n"); 069 sqlBuilder.append(" AND (LD_BCN_SUBFUND_PICK_T.PERSON_UNVL_ID = LD_BCN_CTRL_LIST_T.PERSON_UNVL_ID)\n"); 070 sqlBuilder.append(" AND (CA_OBJ_CONSOLDTN_T.FIN_COA_CD = CA_OBJ_LEVEL_T.FIN_COA_CD)\n"); 071 sqlBuilder.append(" AND (CA_OBJ_CONSOLDTN_T.FIN_CONS_OBJ_CD = CA_OBJ_LEVEL_T.FIN_CONS_OBJ_CD)\n"); 072 sqlBuilder.append(" AND (LD_PND_BCNSTR_GL_T.FDOC_NBR = LD_BCN_CTRL_LIST_T.FDOC_NBR)\n"); 073 sqlBuilder.append(" AND (CA_OBJECT_CODE_T.UNIV_FISCAL_YR = LD_BCN_CTRL_LIST_T.UNIV_FISCAL_YR)\n"); 074 sqlBuilder.append(" AND (CA_OBJECT_CODE_T.FIN_COA_CD = LD_BCN_CTRL_LIST_T.FIN_COA_CD)\n"); 075 sqlBuilder.append(" AND (CA_OBJECT_CODE_T.FIN_OBJECT_CD = LD_PND_BCNSTR_GL_T.FIN_OBJECT_CD)\n"); 076 sqlBuilder.append(" AND (CA_OBJ_LEVEL_T.FIN_COA_CD = CA_OBJECT_CODE_T.FIN_COA_CD)\n"); 077 sqlBuilder.append(" AND (CA_OBJ_LEVEL_T.FIN_OBJ_LEVEL_CD = CA_OBJECT_CODE_T.FIN_OBJ_LEVEL_CD)\n"); 078 sqlBuilder.append(" AND (LD_PND_BCNSTR_GL_T.FIN_OBJ_TYP_CD IN "); 079 // income object type IN list 080 insertionPoints.add(sqlBuilder.length()); 081 sqlBuilder.append(")\n"); 082 sqlBuilder.append("GROUP BY LD_BCN_CTRL_LIST_T.SEL_ORG_FIN_COA,\n"); 083 sqlBuilder.append("LD_BCN_CTRL_LIST_T.SEL_ORG_CD,\n"); 084 sqlBuilder.append("LD_BCN_CTRL_LIST_T.SEL_SUB_FUND_GRP,\n"); 085 sqlBuilder.append("LD_BCN_CTRL_LIST_T.FIN_COA_CD,\n"); 086 sqlBuilder.append("CA_OBJ_CONSOLDTN_T.FIN_REPORT_SORT_CD,\n"); 087 sqlBuilder.append("CA_OBJ_LEVEL_T.FIN_REPORT_SORT_CD,\n"); 088 sqlBuilder.append("LD_PND_BCNSTR_GL_T.FIN_OBJECT_CD,\n"); 089 sqlBuilder.append("CA_OBJ_LEVEL_T.FIN_CONS_OBJ_CD,\n"); 090 sqlBuilder.append("CA_OBJECT_CODE_T.FIN_OBJ_LEVEL_CD\n"); 091 sqlBuilder.append("UNION ALL\n"); 092 sqlBuilder.append("SELECT\n"); 093 sqlBuilder.append("?,\n"); 094 sqlBuilder.append("LD_BCN_CTRL_LIST_T.SEL_ORG_FIN_COA,\n"); 095 sqlBuilder.append("LD_BCN_CTRL_LIST_T.SEL_ORG_CD,\n"); 096 sqlBuilder.append("LD_BCN_CTRL_LIST_T.SEL_SUB_FUND_GRP,\n"); 097 sqlBuilder.append("LD_BCN_CTRL_LIST_T.FIN_COA_CD,"); 098 sqlBuilder.append("'B',\n"); 099 sqlBuilder.append("CA_OBJ_CONSOLDTN_T.FIN_REPORT_SORT_CD,\n"); 100 sqlBuilder.append("CA_OBJ_LEVEL_T.FIN_REPORT_SORT_CD,\n"); 101 sqlBuilder.append("LD_PND_BCNSTR_GL_T.FIN_OBJECT_CD,\n"); 102 sqlBuilder.append("sum(LD_PND_BCNSTR_GL_T.ACLN_ANNL_BAL_AMT),\n"); 103 sqlBuilder.append("sum(LD_PND_BCNSTR_GL_T.FIN_BEG_BAL_LN_AMT),\n"); 104 sqlBuilder.append("CA_OBJ_LEVEL_T.FIN_CONS_OBJ_CD,\n"); 105 sqlBuilder.append("CA_OBJECT_CODE_T.FIN_OBJ_LEVEL_CD,\n"); 106 sqlBuilder.append("0,0,0,0\n"); 107 sqlBuilder.append(" FROM LD_BCN_SUBFUND_PICK_T,\n"); 108 sqlBuilder.append(" LD_BCN_CTRL_LIST_T,\n"); 109 sqlBuilder.append(" LD_PND_BCNSTR_GL_T,\n"); 110 sqlBuilder.append(" CA_OBJECT_CODE_T,\n"); 111 sqlBuilder.append(" CA_OBJ_LEVEL_T,\n"); 112 sqlBuilder.append(" CA_OBJ_CONSOLDTN_T\n"); 113 sqlBuilder.append(" WHERE (LD_BCN_SUBFUND_PICK_T.PERSON_UNVL_ID = ?)\n"); 114 sqlBuilder.append(" AND (LD_BCN_SUBFUND_PICK_T.REPORT_FLAG > 0)\n"); 115 sqlBuilder.append(" AND (LD_BCN_SUBFUND_PICK_T.SUB_FUND_GRP_CD = LD_BCN_CTRL_LIST_T.SEL_SUB_FUND_GRP)\n"); 116 sqlBuilder.append(" AND (LD_BCN_SUBFUND_PICK_T.PERSON_UNVL_ID = LD_BCN_CTRL_LIST_T.PERSON_UNVL_ID)\n"); 117 sqlBuilder.append(" AND (CA_OBJ_CONSOLDTN_T.FIN_COA_CD = CA_OBJ_LEVEL_T.FIN_COA_CD)\n"); 118 sqlBuilder.append(" AND (CA_OBJ_CONSOLDTN_T.FIN_CONS_OBJ_CD = CA_OBJ_LEVEL_T.FIN_CONS_OBJ_CD)\n"); 119 sqlBuilder.append(" AND (LD_PND_BCNSTR_GL_T.FDOC_NBR = LD_BCN_CTRL_LIST_T.FDOC_NBR)\n"); 120 sqlBuilder.append(" AND (CA_OBJECT_CODE_T.UNIV_FISCAL_YR = LD_BCN_CTRL_LIST_T.UNIV_FISCAL_YR)\n"); 121 sqlBuilder.append(" AND (CA_OBJECT_CODE_T.FIN_COA_CD = LD_BCN_CTRL_LIST_T.FIN_COA_CD)\n"); 122 sqlBuilder.append(" AND (CA_OBJECT_CODE_T.FIN_OBJECT_CD = LD_PND_BCNSTR_GL_T.FIN_OBJECT_CD)\n"); 123 sqlBuilder.append(" AND (CA_OBJ_LEVEL_T.FIN_COA_CD = CA_OBJECT_CODE_T.FIN_COA_CD)\n"); 124 sqlBuilder.append(" AND (CA_OBJ_LEVEL_T.FIN_OBJ_LEVEL_CD = CA_OBJECT_CODE_T.FIN_OBJ_LEVEL_CD)\n"); 125 sqlBuilder.append(" AND (LD_PND_BCNSTR_GL_T.FIN_OBJ_TYP_CD IN "); 126 // expenditure object type IN list 127 insertionPoints.add(sqlBuilder.length()); 128 sqlBuilder.append(")\n"); 129 sqlBuilder.append("GROUP BY LD_BCN_CTRL_LIST_T.SEL_ORG_FIN_COA,\n"); 130 sqlBuilder.append("LD_BCN_CTRL_LIST_T.SEL_ORG_CD,\n"); 131 sqlBuilder.append("LD_BCN_CTRL_LIST_T.SEL_SUB_FUND_GRP,\n"); 132 sqlBuilder.append("LD_BCN_CTRL_LIST_T.FIN_COA_CD,\n"); 133 sqlBuilder.append("CA_OBJ_CONSOLDTN_T.FIN_REPORT_SORT_CD,\n"); 134 sqlBuilder.append("CA_OBJ_LEVEL_T.FIN_REPORT_SORT_CD,\n"); 135 sqlBuilder.append("LD_PND_BCNSTR_GL_T.FIN_OBJECT_CD,\n"); 136 sqlBuilder.append("CA_OBJ_LEVEL_T.FIN_CONS_OBJ_CD,\n"); 137 sqlBuilder.append("CA_OBJECT_CODE_T.FIN_OBJ_LEVEL_CD\n"); 138 139 objectSummarySql.add(new SQLForStep(sqlBuilder,insertionPoints)); 140 sqlBuilder.delete(0,sqlBuilder.length()); 141 insertionPoints.clear(); 142 143 // SQL to get the FTE amounts from appointment funding that match with the expenditure 144 sqlBuilder.append("INSERT INTO LD_BCN_BUILD_OBJTSUMM01_MT\n"); 145 sqlBuilder.append("(SESID, ORG_FIN_COA_CD, ORG_CD, SUB_FUND_GRP_CD, FIN_COA_CD,\n"); 146 sqlBuilder.append(" INC_EXP_CD, FIN_CONS_OBJ_CD, FIN_OBJ_LEVEL_CD, FIN_OBJECT_CD,\n"); 147 sqlBuilder.append(" APPT_RQCSF_FTE_QTY, APPT_RQST_FTE_QTY)\n"); 148 sqlBuilder.append("(SELECT\n"); 149 sqlBuilder.append(" ?,\n"); 150 sqlBuilder.append(" ctrl.sel_org_fin_coa,\n"); 151 sqlBuilder.append(" ctrl.sel_org_cd,\n"); 152 sqlBuilder.append(" ctrl.sel_sub_fund_grp,\n"); 153 sqlBuilder.append(" ctrl.fin_coa_cd,\n"); 154 sqlBuilder.append(" 'B',\n"); 155 sqlBuilder.append( "objl.fin_cons_obj_cd,\n"); 156 sqlBuilder.append(" objt.fin_obj_level_cd,\n"); 157 sqlBuilder.append(" bcaf.fin_object_cd,\n"); 158 sqlBuilder.append(" SUM(bcaf.appt_rqcsf_fte_qty),\n"); 159 sqlBuilder.append(" SUM(bcaf.appt_rqst_fte_qty)\n"); 160 sqlBuilder.append(" FROM LD_BCN_SUBFUND_PICK_T pick,\n"); 161 sqlBuilder.append(" LD_BCN_CTRL_LIST_T ctrl,\n"); 162 sqlBuilder.append(" LD_PNDBC_APPTFND_T bcaf,\n"); 163 sqlBuilder.append(" CA_OBJECT_CODE_T objt,\n"); 164 sqlBuilder.append(" CA_OBJ_LEVEL_T objl\n"); 165 sqlBuilder.append(" WHERE pick.person_unvl_id = ?\n"); 166 sqlBuilder.append(" AND pick.report_flag > 0\n"); 167 sqlBuilder.append(" AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp\n"); 168 sqlBuilder.append(" AND pick.person_unvl_id = ctrl.person_unvl_id\n"); 169 sqlBuilder.append(" AND bcaf.univ_fiscal_yr = ctrl.univ_fiscal_yr\n"); 170 sqlBuilder.append(" AND bcaf.fin_coa_cd = ctrl.fin_coa_cd\n"); 171 sqlBuilder.append(" AND bcaf.account_nbr = ctrl.account_nbr\n"); 172 sqlBuilder.append(" AND bcaf.sub_acct_nbr = ctrl.sub_acct_nbr\n"); 173 sqlBuilder.append(" AND objt.univ_fiscal_yr = ctrl.univ_fiscal_yr\n"); 174 sqlBuilder.append(" AND objt.fin_coa_cd = ctrl.fin_coa_cd\n"); 175 sqlBuilder.append(" AND objt.fin_object_cd = bcaf.fin_object_cd\n"); 176 sqlBuilder.append(" AND objl.fin_coa_cd = objt.fin_coa_cd\n"); 177 sqlBuilder.append(" AND objl.fin_obj_level_cd = objt.fin_obj_level_cd\n"); 178 sqlBuilder.append(" GROUP BY ctrl.sel_org_fin_coa,\n"); 179 sqlBuilder.append(" ctrl.sel_org_cd,\n"); 180 sqlBuilder.append(" ctrl.sel_sub_fund_grp,\n"); 181 sqlBuilder.append(" ctrl.fin_coa_cd,\n"); 182 sqlBuilder.append(" objl.fin_cons_obj_cd,\n"); 183 sqlBuilder.append(" objt.fin_obj_level_cd,\n"); 184 sqlBuilder.append(" bcaf.fin_object_cd)"); 185 objectSummarySql.add(new SQLForStep(sqlBuilder)); 186 sqlBuilder.delete(0,sqlBuilder.length()); 187 188 // update the original lines using the FTE generated above. (PostGreSQL supposedly does not allow the target table in an UPDATE to be aliased. Gennick, p.159.) 189 sqlBuilder.append("UPDATE LD_BCN_OBJT_SUMM_T\n"); 190 sqlBuilder.append("SET appt_rqcsf_fte_qty =\n"); 191 sqlBuilder.append(" (SELECT SUM(fq.appt_rqcsf_fte_qty)\n"); 192 sqlBuilder.append(" FROM LD_BCN_BUILD_OBJTSUMM01_MT fq\n"); 193 sqlBuilder.append(" WHERE LD_BCN_OBJT_SUMM_T.PERSON_UNVL_ID = ?\n"); 194 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.ORG_FIN_COA_CD = fq.org_fin_coa_cd\n"); 195 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.ORG_CD = fq.org_cd\n"); 196 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.SUB_FUND_GRP_CD = fq.sub_fund_grp_cd\n"); 197 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_COA_CD = fq.fin_coa_cd\n"); 198 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.INC_EXP_CD = fq.inc_exp_cd\n"); 199 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_CONS_OBJ_CD = fq.fin_cons_obj_cd\n"); 200 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_OBJ_LEVEL_CD = fq.fin_obj_level_cd\n"); 201 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_OBJECT_CD = fq.fin_object_cd\n"); 202 sqlBuilder.append(" AND fq.sesid = ?),\n"); 203 sqlBuilder.append(" appt_rqst_fte_qty =\n"); 204 sqlBuilder.append(" (SELECT SUM(fq.appt_rqst_fte_qty)\n"); 205 sqlBuilder.append(" FROM LD_BCN_BUILD_OBJTSUMM01_MT fq\n"); 206 sqlBuilder.append(" WHERE LD_BCN_OBJT_SUMM_T.PERSON_UNVL_ID = ?\n"); 207 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.ORG_FIN_COA_CD = fq.org_fin_coa_cd\n"); 208 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.ORG_CD = fq.org_cd\n"); 209 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.SUB_FUND_GRP_CD = fq.sub_fund_grp_cd\n"); 210 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_COA_CD = fq.fin_coa_cd\n"); 211 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.INC_EXP_CD = fq.inc_exp_cd\n"); 212 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_CONS_OBJ_CD = fq.fin_cons_obj_cd\n"); 213 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_OBJ_LEVEL_CD = fq.fin_obj_level_cd\n"); 214 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_OBJECT_CD = fq.fin_object_cd\n"); 215 sqlBuilder.append(" AND fq.sesid = ?)\n"); 216 sqlBuilder.append("WHERE LD_BCN_OBJT_SUMM_T.PERSON_UNVL_ID = ?\n"); 217 sqlBuilder.append(" AND EXISTS (SELECT 1\n"); 218 sqlBuilder.append(" FROM LD_BCN_BUILD_OBJTSUMM01_MT fq2\n"); 219 sqlBuilder.append(" WHERE LD_BCN_OBJT_SUMM_T.PERSON_UNVL_ID = ?\n"); 220 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.ORG_FIN_COA_CD = fq2.org_fin_coa_cd\n"); 221 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.ORG_CD = fq2.org_cd\n"); 222 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.SUB_FUND_GRP_CD = fq2.sub_fund_grp_cd\n"); 223 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_COA_CD = fq2.fin_coa_cd\n"); 224 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.INC_EXP_CD = fq2.inc_exp_cd\n"); 225 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_CONS_OBJ_CD = fq2.fin_cons_obj_cd\n"); 226 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_OBJ_LEVEL_CD = fq2.fin_obj_level_cd\n"); 227 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_OBJECT_CD = fq2.fin_object_cd\n"); 228 sqlBuilder.append(" AND fq2.sesid = ?)"); 229 230 objectSummarySql.add(new SQLForStep(sqlBuilder)); 231 sqlBuilder.delete(0,sqlBuilder.length()); 232 233 // sum the base (CSF for the current year) FTE into a holding table 234 sqlBuilder.append("INSERT INTO LD_BCN_BUILD_OBJTSUMM02_MT\n"); 235 sqlBuilder.append("(SESID, ORG_FIN_COA_CD, ORG_CD, SUB_FUND_GRP_CD, FIN_COA_CD, INC_EXP_CD,\n"); 236 sqlBuilder.append(" FIN_CONS_OBJ_CD, FIN_OBJ_LEVEL_CD, FIN_OBJECT_CD, POS_CSF_FNDSTAT_CD,\n"); 237 sqlBuilder.append(" POS_CSF_FTE_QTY, POS_CSF_LV_FTE_QTY)\n"); 238 sqlBuilder.append("SELECT\n"); 239 sqlBuilder.append(" ?,\n"); 240 sqlBuilder.append(" ctrl.sel_org_fin_coa,\n"); 241 sqlBuilder.append(" ctrl.sel_org_cd,\n"); 242 sqlBuilder.append(" ctrl.sel_sub_fund_grp,\n"); 243 sqlBuilder.append(" ctrl.fin_coa_cd,\n"); 244 sqlBuilder.append(" 'B',\n"); 245 sqlBuilder.append(" objl.fin_cons_obj_cd,\n"); 246 sqlBuilder.append(" objt.fin_obj_level_cd,\n"); 247 sqlBuilder.append(" bcsf.fin_object_cd,\n"); 248 sqlBuilder.append(" NULL,\n"); 249 sqlBuilder.append(" SUM(bcsf.pos_csf_fte_qty),\n"); 250 sqlBuilder.append(" 0\n"); 251 sqlBuilder.append("FROM LD_BCN_SUBFUND_PICK_T pick,\n"); 252 sqlBuilder.append(" LD_BCN_CTRL_LIST_T ctrl,\n"); 253 sqlBuilder.append(" LD_BCN_CSF_TRCKR_T bcsf,\n"); 254 sqlBuilder.append(" CA_OBJECT_CODE_T objt,\n"); 255 sqlBuilder.append(" CA_OBJ_LEVEL_T objl\n"); 256 sqlBuilder.append("WHERE pick.person_unvl_id = ?\n"); 257 sqlBuilder.append(" AND pick.report_flag > 0\n"); 258 sqlBuilder.append(" AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp\n"); 259 sqlBuilder.append(" AND pick.person_unvl_id = ctrl.person_unvl_id\n"); 260 sqlBuilder.append(" AND bcsf.univ_fiscal_yr = ctrl.univ_fiscal_yr\n"); 261 sqlBuilder.append(" AND bcsf.fin_coa_cd = ctrl.fin_coa_cd\n"); 262 sqlBuilder.append(" AND bcsf.account_nbr = ctrl.account_nbr\n"); 263 sqlBuilder.append(" AND bcsf.sub_acct_nbr = ctrl.sub_acct_nbr\n"); 264 sqlBuilder.append(" AND (bcsf.pos_csf_fndstat_cd <> '"); 265 // CSF LEAVE funding status 266 insertionPoints.add(sqlBuilder.length()); 267 sqlBuilder.append("' OR bcsf.pos_csf_fndstat_cd IS NULL)\n"); 268 sqlBuilder.append(" AND objt.univ_fiscal_yr = ctrl.univ_fiscal_yr\n"); 269 sqlBuilder.append(" AND objt.fin_coa_cd = ctrl.fin_coa_cd\n"); 270 sqlBuilder.append(" AND objt.fin_object_cd = bcsf.fin_object_cd\n"); 271 sqlBuilder.append(" AND objl.fin_coa_cd = objt.fin_coa_cd\n"); 272 sqlBuilder.append(" AND objl.fin_obj_level_cd = objt.fin_obj_level_cd\n"); 273 sqlBuilder.append("GROUP BY ctrl.sel_org_fin_coa,\n"); 274 sqlBuilder.append(" ctrl.sel_org_cd,\n"); 275 sqlBuilder.append(" ctrl.sel_sub_fund_grp,\n"); 276 sqlBuilder.append(" ctrl.fin_coa_cd,\n"); 277 sqlBuilder.append(" objl.fin_cons_obj_cd,\n"); 278 sqlBuilder.append(" objt.fin_obj_level_cd,\n"); 279 sqlBuilder.append(" bcsf.fin_object_cd\n"); 280 sqlBuilder.append("UNION ALL\n"); 281 sqlBuilder.append("SELECT\n"); 282 sqlBuilder.append("?,\n"); 283 sqlBuilder.append("ctrl.sel_org_fin_coa,\n"); 284 sqlBuilder.append("ctrl.sel_org_cd,\n"); 285 sqlBuilder.append("ctrl.sel_sub_fund_grp,\n"); 286 sqlBuilder.append("ctrl.fin_coa_cd,\n"); 287 sqlBuilder.append("'B',\n"); 288 sqlBuilder.append("objl.fin_cons_obj_cd,\n"); 289 sqlBuilder.append("objt.fin_obj_level_cd,\n"); 290 sqlBuilder.append("bcsf.fin_object_cd,\n"); 291 sqlBuilder.append("'"); 292 // CSF LEAVE funding status 293 insertionPoints.add(sqlBuilder.length()); 294 sqlBuilder.append("',\n"); 295 sqlBuilder.append("0,\n"); 296 sqlBuilder.append(" SUM(bcsf.pos_csf_fte_qty)\n"); 297 sqlBuilder.append("FROM LD_BCN_SUBFUND_PICK_T pick,\n"); 298 sqlBuilder.append(" LD_BCN_CTRL_LIST_T ctrl,\n"); 299 sqlBuilder.append(" LD_BCN_CSF_TRCKR_T bcsf,\n"); 300 sqlBuilder.append(" CA_OBJECT_CODE_T objt,\n"); 301 sqlBuilder.append(" CA_OBJ_LEVEL_T objl\n"); 302 sqlBuilder.append("WHERE pick.person_unvl_id = ?\n"); 303 sqlBuilder.append(" AND pick.report_flag > 0\n"); 304 sqlBuilder.append(" AND pick.sub_fund_grp_cd = ctrl.sel_sub_fund_grp\n"); 305 sqlBuilder.append(" AND pick.person_unvl_id = ctrl.person_unvl_id\n"); 306 sqlBuilder.append(" AND bcsf.univ_fiscal_yr = ctrl.univ_fiscal_yr\n"); 307 sqlBuilder.append(" AND bcsf.fin_coa_cd = ctrl.fin_coa_cd\n"); 308 sqlBuilder.append(" AND bcsf.account_nbr = ctrl.account_nbr\n"); 309 sqlBuilder.append(" AND bcsf.sub_acct_nbr = ctrl.sub_acct_nbr\n"); 310 sqlBuilder.append(" AND bcsf.pos_csf_fndstat_cd = '"); 311 // CSF LEAVE funding status 312 insertionPoints.add(sqlBuilder.length()); 313 sqlBuilder.append("'\n"); 314 sqlBuilder.append(" AND objt.univ_fiscal_yr = ctrl.univ_fiscal_yr\n"); 315 sqlBuilder.append(" AND objt.fin_coa_cd = ctrl.fin_coa_cd\n"); 316 sqlBuilder.append(" AND objt.fin_object_cd = bcsf.fin_object_cd\n"); 317 sqlBuilder.append(" AND objl.fin_coa_cd = objt.fin_coa_cd\n"); 318 sqlBuilder.append(" AND objl.fin_obj_level_cd = objt.fin_obj_level_cd\n"); 319 sqlBuilder.append("GROUP BY ctrl.sel_org_fin_coa,\n"); 320 sqlBuilder.append(" ctrl.sel_org_cd,\n"); 321 sqlBuilder.append(" ctrl.sel_sub_fund_grp,\n"); 322 sqlBuilder.append(" ctrl.fin_coa_cd,\n"); 323 sqlBuilder.append(" objl.fin_cons_obj_cd,\n"); 324 sqlBuilder.append(" objt.fin_obj_level_cd,\n"); 325 sqlBuilder.append(" bcsf.fin_object_cd\n"); 326 327 objectSummarySql.add(new SQLForStep(sqlBuilder,insertionPoints)); 328 sqlBuilder.delete(0,sqlBuilder.length()); 329 insertionPoints.clear(); 330 331 // update the base FTE in the reporting table using the holding table values. (PostGreSQL supposedly does not allow the target table in an UPDATE to be aliased. Gennick, p.159.) 332 sqlBuilder.append("UPDATE LD_BCN_OBJT_SUMM_T\n"); 333 sqlBuilder.append("SET LD_BCN_OBJT_SUMM_T.POS_CSF_FTE_QTY =\n"); 334 sqlBuilder.append(" (SELECT SUM(fq.pos_csf_fte_qty)\n"); 335 sqlBuilder.append(" FROM LD_BCN_BUILD_OBJTSUMM02_MT fq\n"); 336 sqlBuilder.append(" WHERE LD_BCN_OBJT_SUMM_T.PERSON_UNVL_ID = ?\n"); 337 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.ORG_FIN_COA_CD = fq.org_fin_coa_cd\n"); 338 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.ORG_CD = fq.org_cd\n"); 339 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.SUB_FUND_GRP_CD = fq.sub_fund_grp_cd\n"); 340 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_COA_CD = fq.fin_coa_cd\n"); 341 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.INC_EXP_CD = fq.inc_exp_cd\n"); 342 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_CONS_OBJ_CD = fq.fin_cons_obj_cd\n"); 343 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_OBJ_LEVEL_CD = fq.fin_obj_level_cd\n"); 344 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_OBJECT_CD = fq.fin_object_cd\n"); 345 sqlBuilder.append(" AND fq.sesid = ?),\n"); 346 sqlBuilder.append(" LD_BCN_OBJT_SUMM_T.POS_CSF_LV_FTE_QTY =\n"); 347 sqlBuilder.append(" (SELECT SUM(fq.pos_csf_lv_fte_qty)\n"); 348 sqlBuilder.append(" FROM LD_BCN_BUILD_OBJTSUMM02_MT fq\n"); 349 sqlBuilder.append(" WHERE LD_BCN_OBJT_SUMM_T.PERSON_UNVL_ID = ?\n"); 350 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.ORG_FIN_COA_CD = fq.org_fin_coa_cd\n"); 351 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.ORG_CD = fq.org_cd\n"); 352 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.SUB_FUND_GRP_CD = fq.sub_fund_grp_cd\n"); 353 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_COA_CD = fq.fin_coa_cd\n"); 354 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.INC_EXP_CD = fq.inc_exp_cd\n"); 355 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_CONS_OBJ_CD = fq.fin_cons_obj_cd\n"); 356 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_OBJ_LEVEL_CD = fq.fin_obj_level_cd\n"); 357 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_OBJECT_CD = fq.fin_object_cd\n"); 358 sqlBuilder.append(" AND fq.sesid = ?)\n"); 359 sqlBuilder.append(" WHERE LD_BCN_OBJT_SUMM_T.PERSON_UNVL_ID = ?\n"); 360 sqlBuilder.append(" AND EXISTS (SELECT 1\n"); 361 sqlBuilder.append(" FROM LD_BCN_BUILD_OBJTSUMM02_MT fq2\n"); 362 sqlBuilder.append(" WHERE LD_BCN_OBJT_SUMM_T.PERSON_UNVL_ID = ?\n"); 363 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.ORG_FIN_COA_CD = fq2.org_fin_coa_cd\n"); 364 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.ORG_CD = fq2.org_cd\n"); 365 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.SUB_FUND_GRP_CD = fq2.sub_fund_grp_cd\n"); 366 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_COA_CD = fq2.fin_coa_cd\n"); 367 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.INC_EXP_CD = fq2.inc_exp_cd\n"); 368 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_CONS_OBJ_CD = fq2.fin_cons_obj_cd\n"); 369 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_OBJ_LEVEL_CD = fq2.fin_obj_level_cd\n"); 370 sqlBuilder.append(" AND LD_BCN_OBJT_SUMM_T.FIN_OBJECT_CD = fq2.fin_object_cd\n"); 371 sqlBuilder.append(" AND fq2.sesid = ?)"); 372 373 objectSummarySql.add(new SQLForStep(sqlBuilder)); 374 sqlBuilder.delete(0,sqlBuilder.length()); 375 376 377 } 378 379 /** 380 * 381 * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionObjectSummaryReportDao#cleanGeneralLedgerObjectSummaryTable(java.lang.String) 382 */ 383 public void cleanGeneralLedgerObjectSummaryTable(String principalName) { 384 this.clearTempTableByUnvlId("LD_BCN_OBJT_SUMM_T","PERSON_UNVL_ID",principalName); 385 /** 386 * 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. 387 */ 388 persistenceService.clearCache(); 389 } 390 391 /** 392 * 393 * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionObjectSummaryReportDao#updateGeneralLedgerObjectSummaryTable(java.lang.String) 394 */ 395 public void updateGeneralLedgerObjectSummaryTable(String principalName) { 396 String idForSession = (new Guid()).toString(); 397 ArrayList<String> inLists = new ArrayList<String>(2); 398 inLists.add(this.getRevenueINList()); 399 inLists.add(this.getExpenditureINList()); 400 401 // get rid of anything left over from the last time this user ran this report 402 cleanGeneralLedgerObjectSummaryTable(principalName); 403 404 // insert the general ledger amounts into the report table, with 0 placeholders for the FTE 405 getSimpleJdbcTemplate().update(objectSummarySql.get(0).getSQL(inLists),principalName,principalName,principalName,principalName); 406 407 // sum up the FTE from the appointment funding and stick it in a holding table 408 getSimpleJdbcTemplate().update(objectSummarySql.get(1).getSQL(),idForSession,principalName); 409 410 // set the FTE in the report table using the appointment funding FTE from the holding table 411 getSimpleJdbcTemplate().update(objectSummarySql.get(2).getSQL(),principalName,idForSession,principalName,idForSession,principalName,principalName,idForSession); 412 413 // sum up the FTE from the CSF tracker (base funding) table and stick it in a holding table 414 ArrayList<String> csfLeaveIndicator = new ArrayList<String>(3); 415 csfLeaveIndicator.add(BCConstants.csfFundingStatusFlag.LEAVE.getFlagValue()); 416 csfLeaveIndicator.add(BCConstants.csfFundingStatusFlag.LEAVE.getFlagValue()); 417 csfLeaveIndicator.add(BCConstants.csfFundingStatusFlag.LEAVE.getFlagValue()); 418 getSimpleJdbcTemplate().update(objectSummarySql.get(3).getSQL(csfLeaveIndicator),idForSession,principalName,idForSession,principalName); 419 420 // set the CSF FTE in the report table using the FTE from the holding table 421 getSimpleJdbcTemplate().update(objectSummarySql.get(4).getSQL(),principalName,idForSession,principalName,idForSession,principalName,principalName,idForSession); 422 423 // clean out this session's rows from the holding tables used 424 this.clearTempTableBySesId("LD_BCN_BUILD_OBJTSUMM01_MT","SESID",idForSession); 425 this.clearTempTableBySesId("LD_BCN_BUILD_OBJTSUMM02_MT","SESID",idForSession); 426 /** 427 * 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. 428 */ 429 persistenceService.clearCache(); 430 431 } 432 433 public void setPersistenceService(PersistenceService persistenceService) 434 { 435 this.persistenceService = persistenceService; 436 } 437 438 } 439