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 org.kuali.kfs.module.bc.BCConstants;
019    import org.kuali.kfs.module.bc.BCConstants.OrgSelControlOption;
020    import org.kuali.kfs.module.bc.document.dataaccess.BudgetOrganizationPushPullDao;
021    import org.kuali.rice.kns.util.Guid;
022    
023    /**
024     * Implements BudgetOrganizationPushPullDao using raw SQL and populating temporary tables with the potential set of documents to
025     * push down or pull up. The temporary tables are then used to drive the entire push down or pull up process. First, an attempt is
026     * made to place budget locks on each document. Successfully locked documents are then pushed down or pulled up by setting the
027     * associated BudgetConstructionHeader (LD_BCNSTR_HDR_T) row with the appropriate level attribute values and releasing the locks.
028     */
029    public class BudgetOrganizationPushPullDaoJdbc extends BudgetConstructionDaoJdbcBase implements BudgetOrganizationPushPullDao {
030    
031        private static String[] pullupSelectedOrganizationDocumentsTemplates = new String[8];
032        private static String[] pushdownSelectedOrganizationDocumentsTemplates = new String[11];
033        private static String[] accountSelectBudgetedDocumentsPullUpTemplates = new String[2];
034        private static String[] accountSelectBudgetedDocumentsPushDownTemplates = new String[1];
035    
036        public BudgetOrganizationPushPullDaoJdbc() {
037    
038            // get accounts for selected orgs and attach the pull_flag setting
039            StringBuilder sqlText = new StringBuilder(1000);
040            sqlText.append("INSERT INTO LD_BCN_DOC_PULLUP01_MT \n");
041            sqlText.append(" (SESID, UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SORG_FIN_COA_CD, SORG_CD, PULL_FLAG) \n");
042            sqlText.append("SELECT  ?, hier.univ_fiscal_yr, hier.fin_coa_cd, hier.account_nbr, \n");
043            sqlText.append("    hier.org_fin_coa_cd, hier.org_cd, pull.pull_flag \n");
044            sqlText.append("FROM LD_BCN_PULLUP_T pull, LD_BCN_ACCT_ORG_HIER_T hier  \n");
045            sqlText.append("WHERE pull.pull_flag > 0 \n");
046            sqlText.append("  AND pull.person_unvl_id = ? \n");
047            sqlText.append("  AND hier.univ_fiscal_yr = ? \n");
048            sqlText.append("  AND hier.org_fin_coa_cd = pull.fin_coa_cd \n");
049            sqlText.append("  AND hier.org_cd = pull.org_cd \n");
050            pullupSelectedOrganizationDocumentsTemplates[0] = sqlText.toString();
051            sqlText.delete(0, sqlText.length());
052    
053            // get the point of view record for each account and attach pull_flag again
054            sqlText.append("INSERT INTO LD_BCN_DOC_PULLUP02_MT \n");
055            sqlText.append("  (SESID, UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, ORG_LEVEL_CD, \n");
056            sqlText.append("   ORG_FIN_COA_CD, ORG_CD, SORG_FIN_COA_CD, SORG_CD, PULL_FLAG) \n");
057            sqlText.append("SELECT  ?, hier.univ_fiscal_yr, hier.fin_coa_cd, hier.account_nbr, hier.org_level_cd, \n");
058            sqlText.append("        hier.org_fin_coa_cd, hier.org_cd, sel.sorg_fin_coa_cd, sel.sorg_cd, sel.pull_flag \n");
059            sqlText.append("FROM LD_BCN_ACCT_ORG_HIER_T hier, LD_BCN_DOC_PULLUP01_MT sel \n");
060            sqlText.append("WHERE sel.SESID  = ? \n");
061            sqlText.append("  AND hier.org_fin_coa_cd = ? \n");
062            sqlText.append("  AND hier.org_cd = ? \n");
063            sqlText.append("  AND hier.univ_fiscal_yr = sel.univ_fiscal_yr \n");
064            sqlText.append("  AND hier.fin_coa_cd = sel.fin_coa_cd \n");
065            sqlText.append("  AND hier.account_nbr = sel.account_nbr \n");
066            pullupSelectedOrganizationDocumentsTemplates[1] = sqlText.toString();
067            sqlText.delete(0, sqlText.length());
068    
069            // populate list of accounts to update based on pull_flag setting
070            // doc numbers and acct,subacct pairs are candidate keys
071            // build list with doc numbers since it starts the clustered index
072    
073            // get list for BOTH direct reports and org subtree pull_flag = 3
074            sqlText.append("INSERT INTO LD_BCN_DOC_PULLUP03_MT \n");
075            sqlText.append("  (SESID, FDOC_NBR, ORG_LEVEL_CD, ORG_FIN_COA_CD, ORG_CD) \n");
076            sqlText.append("SELECT  ?, head.fdoc_nbr, pv.org_level_cd, pv.org_fin_coa_cd, pv.org_cd \n");
077            sqlText.append("FROM LD_BCN_DOC_PULLUP02_MT pv, LD_BCNSTR_HDR_T head \n");
078            sqlText.append("WHERE pv.SESID = ? \n");
079            sqlText.append("  AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
080            sqlText.append("  AND head.fin_coa_cd = pv.fin_coa_cd \n");
081            sqlText.append("  AND head.account_nbr = pv.account_nbr \n");
082            sqlText.append("  AND head.org_level_cd < pv.org_level_cd \n");
083            sqlText.append("  AND pv.pull_flag = ? \n");
084            pullupSelectedOrganizationDocumentsTemplates[2] = sqlText.toString();
085            sqlText.delete(0, sqlText.length());
086    
087    
088            // add to list for direct reports only pull_flag = 1
089            sqlText.append("INSERT INTO LD_BCN_DOC_PULLUP03_MT \n");
090            sqlText.append("  (SESID, FDOC_NBR, ORG_LEVEL_CD, ORG_FIN_COA_CD, ORG_CD) \n");
091            sqlText.append("SELECT ?, head.fdoc_nbr, pv.org_level_cd, pv.org_fin_coa_cd, pv.org_cd \n");
092            sqlText.append("FROM LD_BCN_DOC_PULLUP02_MT pv, LD_BCN_ACCT_RPTS_T bar, LD_BCNSTR_HDR_T head \n");
093            sqlText.append("WHERE pv.SESID = ? \n");
094            sqlText.append("  AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
095            sqlText.append("  AND head.fin_coa_cd = pv.fin_coa_cd \n");
096            sqlText.append("  AND head.account_nbr = pv.account_nbr \n");
097            sqlText.append("  AND head.org_level_cd < pv.org_level_cd \n");
098            sqlText.append("  AND pv.pull_flag = ? \n");
099            sqlText.append("  AND bar.fin_coa_cd = pv.fin_coa_cd \n");
100            sqlText.append("  AND bar.account_nbr = pv.account_nbr \n");
101            sqlText.append("  AND bar.rpts_to_fin_coa_cd = pv.sorg_fin_coa_cd \n");
102            sqlText.append("  AND bar.rpts_to_org_cd = pv.sorg_cd \n");
103            pullupSelectedOrganizationDocumentsTemplates[3] = sqlText.toString();
104            sqlText.delete(0, sqlText.length());
105    
106    
107            // add to list for org subtree only - pull_flag = 2
108            sqlText.append("INSERT INTO LD_BCN_DOC_PULLUP03_MT \n");
109            sqlText.append("  (SESID, FDOC_NBR, ORG_LEVEL_CD, ORG_FIN_COA_CD, ORG_CD) \n");
110            sqlText.append("SELECT ?, head.fdoc_nbr, pv.org_level_cd, pv.org_fin_coa_cd, pv.org_cd \n");
111            sqlText.append("FROM LD_BCN_DOC_PULLUP02_MT pv, LD_BCN_ACCT_RPTS_T bar, LD_BCNSTR_HDR_T head \n");
112            sqlText.append("WHERE pv.SESID = ? \n");
113            sqlText.append("  AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
114            sqlText.append("  AND head.fin_coa_cd = pv.fin_coa_cd \n");
115            sqlText.append("  AND head.account_nbr = pv.account_nbr \n");
116            sqlText.append("  AND head.org_level_cd < pv.org_level_cd \n");
117            sqlText.append("  AND pv.pull_flag = ? \n");
118            sqlText.append("  AND bar.fin_coa_cd = pv.fin_coa_cd \n");
119            sqlText.append("  AND bar.account_nbr = pv.account_nbr \n");
120            sqlText.append("  AND (bar.rpts_to_org_cd <> pv.sorg_cd \n");
121            sqlText.append("       OR bar.rpts_to_fin_coa_cd <> pv.sorg_fin_coa_cd) \n");
122            pullupSelectedOrganizationDocumentsTemplates[4] = sqlText.toString();
123            sqlText.delete(0, sqlText.length());
124    
125    
126            // issue budget locks
127            sqlText.append("UPDATE LD_BCNSTR_HDR_T head \n");
128            sqlText.append("SET bdgt_lock_usr_id = ? \n");
129            sqlText.append("WHERE exists \n");
130            sqlText.append("   (SELECT * \n");
131            sqlText.append("   FROM LD_BCN_DOC_PULLUP03_MT ul \n");
132            sqlText.append("   WHERE ul.SESID = ? \n");
133            sqlText.append("     AND head.fdoc_nbr = ul.fdoc_nbr \n");
134            sqlText.append("     AND head.bdgt_lock_usr_id IS NULL) \n");
135            pullupSelectedOrganizationDocumentsTemplates[5] = sqlText.toString();
136            sqlText.delete(0, sqlText.length());
137    
138    
139            // release budget locks where funding locks found - adhere to BC lock tree protocol
140            sqlText.append("UPDATE LD_BCNSTR_HDR_T head \n");
141            sqlText.append("SET bdgt_lock_usr_id = NULL \n");
142            sqlText.append("WHERE exists \n");
143            sqlText.append("   (SELECT * \n");
144            sqlText.append("    FROM LD_BCN_DOC_PULLUP03_MT ul \n");
145            sqlText.append("    WHERE ul.SESID = ? \n");
146            sqlText.append("      AND head.fdoc_nbr = ul.fdoc_nbr \n");
147            sqlText.append("      AND head.bdgt_lock_usr_id = ?  \n");
148            sqlText.append("      AND EXISTS \n");
149            sqlText.append("          (SELECT * \n");
150            sqlText.append("           FROM LD_BCN_FND_LOCK_T fl \n");
151            sqlText.append("           WHERE fl.univ_fiscal_yr = head.univ_fiscal_yr \n");
152            sqlText.append("             AND fl.fin_coa_cd = head.fin_coa_cd  \n");
153            sqlText.append("             AND fl.account_nbr = head.account_nbr  \n");
154            sqlText.append("             AND fl.sub_acct_nbr = head.sub_acct_nbr)) \n");
155            pullupSelectedOrganizationDocumentsTemplates[6] = sqlText.toString();
156            sqlText.delete(0, sqlText.length());
157    
158            // pullup and release budget locks - SQL92 version
159            sqlText.append("UPDATE LD_BCNSTR_HDR_T head \n");
160            sqlText.append("SET org_level_cd = \n");
161            sqlText.append("        (SELECT ul.org_level_cd \n");
162            sqlText.append("         FROM LD_BCN_DOC_PULLUP03_MT ul \n");
163            sqlText.append("         WHERE ul.SESID = ? \n");
164            sqlText.append("           AND head.fdoc_nbr = ul.fdoc_nbr \n");
165            sqlText.append("           AND head.bdgt_lock_usr_id = ?), \n");
166            sqlText.append("    org_coa_of_lvl_cd = \n");
167            sqlText.append("        (SELECT ul.org_fin_coa_cd \n");
168            sqlText.append("         FROM LD_BCN_DOC_PULLUP03_MT ul \n");
169            sqlText.append("         WHERE ul.SESID = ? \n");
170            sqlText.append("           AND head.fdoc_nbr = ul.fdoc_nbr \n");
171            sqlText.append("           AND head.bdgt_lock_usr_id = ?), \n");
172            sqlText.append("    org_of_lvl_cd = \n");
173            sqlText.append("        (SELECT ul.org_cd \n");
174            sqlText.append("         FROM LD_BCN_DOC_PULLUP03_MT ul \n");
175            sqlText.append("         WHERE ul.SESID = ? \n");
176            sqlText.append("           AND head.fdoc_nbr = ul.fdoc_nbr \n");
177            sqlText.append("           AND head.bdgt_lock_usr_id = ?), \n");
178            sqlText.append("    bdgt_lock_usr_id = NULL \n");
179            sqlText.append("WHERE exists \n");
180            sqlText.append("    (SELECT * \n");
181            sqlText.append("     FROM LD_BCN_DOC_PULLUP03_MT ul \n");
182            sqlText.append("     WHERE ul.SESID = ? \n");
183            sqlText.append("       AND head.fdoc_nbr = ul.fdoc_nbr \n");
184            sqlText.append("       AND head.bdgt_lock_usr_id = ?) \n");
185            pullupSelectedOrganizationDocumentsTemplates[7] = sqlText.toString();
186            sqlText.delete(0, sqlText.length());
187    
188            // Pushdown steps start here
189    
190            // get accounts for selected orgs. and attach the pull_flag setting
191            sqlText.append("INSERT INTO LD_BCN_DOC_PUSHDOWN01_MT \n");
192            sqlText.append(" (SESID, UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, ORG_LEVEL_CD, ORG_FIN_COA_CD, ORG_CD, PULL_FLAG) \n");
193            sqlText.append("SELECT  ?, hier.univ_fiscal_yr,  hier.fin_coa_cd, hier.account_nbr, hier.org_level_cd, \n");
194            sqlText.append("        hier.org_fin_coa_cd, hier.org_cd, push.pull_flag \n");
195            sqlText.append("FROM LD_BCN_PULLUP_T push, LD_BCN_ACCT_ORG_HIER_T hier \n");
196            sqlText.append("WHERE push.pull_flag > 0 \n");
197            sqlText.append("  AND push.person_unvl_id = ? \n");
198            sqlText.append("  AND hier.univ_fiscal_yr = ? \n");
199            sqlText.append("  AND hier.org_fin_coa_cd = push.fin_coa_cd \n");
200            sqlText.append("  AND hier.org_cd = push.org_cd \n");
201            pushdownSelectedOrganizationDocumentsTemplates[0] = sqlText.toString();
202            sqlText.delete(0, sqlText.length());
203    
204            // get selection coa, orgs and levels at point of view */
205            sqlText.append("INSERT INTO LD_BCN_DOC_PUSHDOWN02_MT \n");
206            sqlText.append(" (SESID, UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, ORG_LEVEL_CD, \n");
207            sqlText.append("  SEL_ORG_LVL, SEL_ORGFIN_COA, SEL_ORG, SEL_PULLFLAG) \n");
208            sqlText.append("SELECT DISTINCT ?, hier.univ_fiscal_yr, hier.fin_coa_cd, hier.account_nbr, hier.org_level_cd, \n");
209            sqlText.append("                sel.org_level_cd, sel.org_fin_coa_cd, sel.org_cd, sel.pull_flag \n");
210            sqlText.append("FROM LD_BCN_ACCT_ORG_HIER_T hier, LD_BCN_DOC_PUSHDOWN01_MT sel \n");
211            sqlText.append("WHERE sel.SESID = ? \n");
212            sqlText.append("  AND hier.org_fin_coa_cd = ? \n");
213            sqlText.append("  AND hier.org_cd = ? \n");
214            sqlText.append("  AND hier.univ_fiscal_yr = sel.univ_fiscal_yr \n");
215            sqlText.append("  AND hier.fin_coa_cd = sel.fin_coa_cd  \n");
216            sqlText.append("  AND hier.account_nbr = sel.account_nbr \n");
217            pushdownSelectedOrganizationDocumentsTemplates[1] = sqlText.toString();
218            sqlText.delete(0, sqlText.length());
219    
220            // add the level 1 coa and org to the selection list
221            sqlText.append("INSERT INTO LD_BCN_DOC_PUSHDOWN03_MT \n");
222            sqlText.append(" (SESID,UNIV_FISCAL_YR,FIN_COA_CD,ACCOUNT_NBR,ORG_LEVEL_CD, \n");
223            sqlText.append("  SEL_ORG_LVL,SEL_ORGFIN_COA,SEL_ORG,SEL_PULLFLAG,LONE_ORGFIN_COA,LONE_ORG) \n");
224            sqlText.append("SELECT DISTINCT  ?, sel.univ_fiscal_yr, sel.fin_coa_cd, sel.account_nbr, sel.org_level_cd, \n");
225            sqlText.append("                 sel.sel_org_lvl, sel.sel_orgfin_coa, sel.sel_org, sel.sel_pullflag, hier.org_fin_coa_cd, hier.org_cd \n");
226            sqlText.append("FROM LD_BCN_ACCT_ORG_HIER_T hier, LD_BCN_DOC_PUSHDOWN02_MT sel \n");
227            sqlText.append("WHERE sel.SESID = ? \n");
228            sqlText.append("  AND hier.univ_fiscal_yr = sel.univ_fiscal_yr \n");
229            sqlText.append("  AND hier.fin_coa_cd = sel.fin_coa_cd  \n");
230            sqlText.append("  AND hier.account_nbr = sel.account_nbr  \n");
231            sqlText.append("  AND hier.org_level_cd = 1 \n");
232            pushdownSelectedOrganizationDocumentsTemplates[2] = sqlText.toString();
233            sqlText.delete(0, sqlText.length());
234    
235            // Note: (may need to/should as we scale) replace fy,coa,acct,sacct with fdoc_nbr in LD_BCN_DOC_PUSHDOWN04_MT
236            // and use it in later steps instead of the candidate key
237            // not sure why it uses the candidate key in the first place, may have been due to
238            // the use of origin code as the first field in the pkey index, a secondary index exists on coa,acct.
239            // Since origin code is no longer used fdoc_nbr may be the better choice
240            // since it now starts the pkey index in KFS
241    
242            /* get list of accounts to push for sel_pullflag in 1,3,4,5 */
243            sqlText.append("INSERT INTO LD_BCN_DOC_PUSHDOWN04_MT \n");
244            sqlText.append(" (SESID, UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, ORG_LEVEL_CD, \n");
245            sqlText.append("  SEL_ORG_LVL, SEL_ORGFIN_COA, SEL_ORG, SEL_PULLFLAG, LONE_ORGFIN_COA, LONE_ORG) \n");
246            sqlText.append("SELECT  ?, head.univ_fiscal_yr, head.fin_coa_cd, head.account_nbr, head.sub_acct_nbr, pv.org_level_cd, \n");
247            sqlText.append("        pv.sel_org_lvl, pv.sel_orgfin_coa, pv.sel_org, pv.sel_pullflag, pv.lone_orgfin_coa, pv.lone_org \n");
248            sqlText.append("FROM LD_BCN_DOC_PUSHDOWN03_MT pv, LD_BCNSTR_HDR_T head \n");
249            sqlText.append("WHERE pv.SESID = ? \n");
250            sqlText.append("  AND pv.sel_pullflag IN (?, ?, ?, ?) \n");
251            sqlText.append("  AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
252            sqlText.append("  AND head.fin_coa_cd = pv.fin_coa_cd \n");
253            sqlText.append("  AND head.account_nbr = pv.account_nbr \n");
254            sqlText.append("  AND head.org_level_cd = pv.org_level_cd \n");
255            pushdownSelectedOrganizationDocumentsTemplates[3] = sqlText.toString();
256            sqlText.delete(0, sqlText.length());
257    
258            // get list of accounts to push for sel_pullflag = 2
259            sqlText.append("INSERT INTO LD_BCN_DOC_PUSHDOWN04_MT \n");
260            sqlText.append(" (SESID, UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, ORG_LEVEL_CD, \n");
261            sqlText.append("  SEL_ORG_LVL, SEL_ORGFIN_COA, SEL_ORG, SEL_PULLFLAG, LONE_ORGFIN_COA, LONE_ORG) \n");
262            sqlText.append("SELECT ?, head.univ_fiscal_yr, head.fin_coa_cd, head.account_nbr, head.sub_acct_nbr, pv.org_level_cd, \n");
263            sqlText.append("       pv.sel_org_lvl, pv.sel_orgfin_coa, pv.sel_org, pv.sel_pullflag, pv.lone_orgfin_coa, pv.lone_org \n");
264            sqlText.append("FROM LD_BCN_DOC_PUSHDOWN03_MT pv, LD_BCNSTR_HDR_T head, LD_BCN_ACCT_RPTS_T rpts \n");
265            sqlText.append("WHERE pv.SESID = ? \n");
266            sqlText.append("  AND pv.sel_pullflag = ? \n");
267            sqlText.append("  AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
268            sqlText.append("  AND head.fin_coa_cd = pv.fin_coa_cd \n");
269            sqlText.append("  AND head.account_nbr = pv.account_nbr \n");
270            sqlText.append("  AND head.org_level_cd = pv.org_level_cd \n");
271            sqlText.append("  AND pv.fin_coa_cd = rpts.fin_coa_cd \n");
272            sqlText.append("  AND pv.account_nbr = rpts.account_nbr \n");
273            sqlText.append("  AND pv.sel_orgfin_coa = rpts.rpts_to_fin_coa_cd \n");
274            sqlText.append("  AND pv.sel_org = rpts.rpts_to_org_cd \n");
275            pushdownSelectedOrganizationDocumentsTemplates[4] = sqlText.toString();
276            sqlText.delete(0, sqlText.length());
277    
278    
279            // issue budget locks on the set to update
280            sqlText.append("UPDATE LD_BCNSTR_HDR_T head \n");
281            sqlText.append("SET bdgt_lock_usr_id = ? \n");
282            sqlText.append("WHERE exists \n");
283            sqlText.append("   (SELECT * \n");
284            sqlText.append("    FROM LD_BCN_DOC_PUSHDOWN04_MT pv \n");
285            sqlText.append("    WHERE pv.SESID = ? \n");
286            sqlText.append("      AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
287            sqlText.append("      AND head.fin_coa_cd = pv.fin_coa_cd \n");
288            sqlText.append("      AND head.account_nbr = pv.account_nbr \n");
289            sqlText.append("      AND head.sub_acct_nbr = pv.sub_acct_nbr \n");
290            sqlText.append("      AND head.bdgt_lock_usr_id IS NULL) \n");
291            pushdownSelectedOrganizationDocumentsTemplates[5] = sqlText.toString();
292            sqlText.delete(0, sqlText.length());
293    
294            /* release budget locks where funding locks are found */
295            sqlText.append("UPDATE LD_BCNSTR_HDR_T head \n");
296            sqlText.append("SET bdgt_lock_usr_id = NULL \n");
297            sqlText.append("WHERE exists \n");
298            sqlText.append("   (SELECT * \n");
299            sqlText.append("    FROM LD_BCN_DOC_PUSHDOWN04_MT pv \n");
300            sqlText.append("    WHERE pv.SESID = ? \n");
301            sqlText.append("        AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
302            sqlText.append("        AND head.fin_coa_cd = pv.fin_coa_cd \n");
303            sqlText.append("        AND head.account_nbr = pv.account_nbr \n");
304            sqlText.append("        AND head.sub_acct_nbr = pv.sub_acct_nbr \n");
305            sqlText.append("        AND head.bdgt_lock_usr_id = ? \n");
306            sqlText.append("        AND EXISTS \n");
307            sqlText.append("           (SELECT  * \n");
308            sqlText.append("            FROM LD_BCN_FND_LOCK_T fl \n");
309            sqlText.append("            WHERE fl.univ_fiscal_yr = head.univ_fiscal_yr \n");
310            sqlText.append("              AND fl.fin_coa_cd = head.fin_coa_cd \n");
311            sqlText.append("              AND fl.account_nbr = head.account_nbr \n");
312            sqlText.append("              AND fl.sub_acct_nbr = head.sub_acct_nbr)) \n");
313            pushdownSelectedOrganizationDocumentsTemplates[6] = sqlText.toString();
314            sqlText.delete(0, sqlText.length());
315    
316            // push the selected org's direct report accts to 0 and unlock as we go - sel_pullflag in 2, 3
317            sqlText.append("UPDATE LD_BCNSTR_HDR_T head \n");
318            sqlText.append("SET org_level_cd = 0, \n");
319            sqlText.append("    org_coa_of_lvl_cd = NULL, \n");
320            sqlText.append("    org_of_lvl_cd = NULL, \n");
321            sqlText.append("    bdgt_lock_usr_id = NULL \n");
322            sqlText.append("WHERE EXISTS \n");
323            sqlText.append("    (SELECT * \n");
324            sqlText.append("     FROM LD_BCN_DOC_PUSHDOWN04_MT pv, \n");
325            sqlText.append("          LD_BCN_ACCT_RPTS_T rpts \n");
326            sqlText.append("     WHERE pv.SESID = ? \n");
327            sqlText.append("       AND pv.sel_pullflag IN (?, ?) \n");
328            sqlText.append("       AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
329            sqlText.append("       AND head.fin_coa_cd = pv.fin_coa_cd \n");
330            sqlText.append("       AND head.account_nbr = pv.account_nbr \n");
331            sqlText.append("       AND head.sub_acct_nbr = pv.sub_acct_nbr \n");
332            sqlText.append("       AND head.bdgt_lock_usr_id = ? \n");
333            sqlText.append("       AND pv.fin_coa_cd = rpts.fin_coa_cd \n");
334            sqlText.append("       AND pv.account_nbr = rpts.account_nbr \n");
335            sqlText.append("       AND pv.sel_orgfin_coa = rpts.rpts_to_fin_coa_cd \n");
336            sqlText.append("       AND pv.sel_org = rpts.rpts_to_org_cd) \n");
337            pushdownSelectedOrganizationDocumentsTemplates[7] = sqlText.toString();
338            sqlText.delete(0, sqlText.length());
339    
340            // push the selected org(s) subtree accounts to its (selected org's) level - sel_pullflag IN (1, 3)
341            // unlock as we go */
342            sqlText.append("UPDATE LD_BCNSTR_HDR_T head \n");
343            sqlText.append("SET org_level_cd = \n");
344            sqlText.append("    (SELECT pv.sel_org_lvl \n");
345            sqlText.append("     FROM LD_BCN_DOC_PUSHDOWN04_MT pv \n");
346            sqlText.append("     WHERE pv.SESID = ? \n");
347            sqlText.append("       AND pv.sel_pullflag IN (?, ?) \n");
348            sqlText.append("       AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
349            sqlText.append("       AND head.fin_coa_cd = pv.fin_coa_cd \n");
350            sqlText.append("       AND head.account_nbr = pv.account_nbr \n");
351            sqlText.append("       AND head.sub_acct_nbr = pv.sub_acct_nbr \n");
352            sqlText.append("       AND head.bdgt_lock_usr_id = ?), \n");
353            sqlText.append("    org_coa_of_lvl_cd = \n");
354            sqlText.append("    (SELECT pv.sel_orgfin_coa \n");
355            sqlText.append("     FROM LD_BCN_DOC_PUSHDOWN04_MT pv \n");
356            sqlText.append("     WHERE pv.SESID = ? \n");
357            sqlText.append("       AND pv.sel_pullflag IN (?, ?) \n");
358            sqlText.append("       AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
359            sqlText.append("       AND head.fin_coa_cd = pv.fin_coa_cd \n");
360            sqlText.append("       AND head.account_nbr = pv.account_nbr \n");
361            sqlText.append("       AND head.sub_acct_nbr = pv.sub_acct_nbr \n");
362            sqlText.append("       AND head.bdgt_lock_usr_id = ?), \n");
363            sqlText.append("    org_of_lvl_cd = \n");
364            sqlText.append("    (SELECT pv.sel_org \n");
365            sqlText.append("     FROM LD_BCN_DOC_PUSHDOWN04_MT pv \n");
366            sqlText.append("     WHERE pv.SESID = ? \n");
367            sqlText.append("       AND pv.sel_pullflag IN (?, ?) \n");
368            sqlText.append("       AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
369            sqlText.append("       AND head.fin_coa_cd = pv.fin_coa_cd \n");
370            sqlText.append("       AND head.account_nbr = pv.account_nbr \n");
371            sqlText.append("       AND head.sub_acct_nbr = pv.sub_acct_nbr \n");
372            sqlText.append("       AND head.bdgt_lock_usr_id = ?), \n");
373            sqlText.append("    bdgt_lock_usr_id = NULL \n");
374            sqlText.append("WHERE EXISTS \n");
375            sqlText.append("    (SELECT * \n");
376            sqlText.append("     FROM LD_BCN_DOC_PUSHDOWN04_MT pv \n");
377            sqlText.append("     WHERE pv.SESID = ? \n");
378            sqlText.append("       AND pv.sel_pullflag IN (?, ?) \n");
379            sqlText.append("       AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
380            sqlText.append("       AND head.fin_coa_cd = pv.fin_coa_cd \n");
381            sqlText.append("       AND head.account_nbr = pv.account_nbr \n");
382            sqlText.append("       AND head.sub_acct_nbr = pv.sub_acct_nbr \n");
383            sqlText.append("       AND head.bdgt_lock_usr_id = ?) \n");
384            pushdownSelectedOrganizationDocumentsTemplates[8] = sqlText.toString();
385            sqlText.delete(0, sqlText.length());
386    
387            // push the selected org(s) subtree accts to level 1 - sel_pullflag = 4
388            // unlock as we go
389            sqlText.append("UPDATE LD_BCNSTR_HDR_T head \n");
390            sqlText.append("SET org_level_cd = 1, \n");
391            sqlText.append("    org_coa_of_lvl_cd = \n");
392            sqlText.append("    (SELECT pv.lone_orgfin_coa \n");
393            sqlText.append("     FROM LD_BCN_DOC_PUSHDOWN04_MT pv \n");
394            sqlText.append("     WHERE pv.SESID = ? \n");
395            sqlText.append("       AND pv.sel_pullflag = ? \n");
396            sqlText.append("       AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
397            sqlText.append("       AND head.fin_coa_cd = pv.fin_coa_cd \n");
398            sqlText.append("       AND head.account_nbr = pv.account_nbr \n");
399            sqlText.append("       AND head.sub_acct_nbr = pv.sub_acct_nbr \n");
400            sqlText.append("       AND head.bdgt_lock_usr_id = ?), \n");
401            sqlText.append("    org_of_lvl_cd = \n");
402            sqlText.append("    (SELECT pv.lone_org \n");
403            sqlText.append("     FROM LD_BCN_DOC_PUSHDOWN04_MT pv \n");
404            sqlText.append("     WHERE pv.SESID = ? \n");
405            sqlText.append("       AND pv.sel_pullflag = ? \n");
406            sqlText.append("       AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
407            sqlText.append("       AND head.fin_coa_cd = pv.fin_coa_cd \n");
408            sqlText.append("       AND head.account_nbr = pv.account_nbr \n");
409            sqlText.append("       AND head.sub_acct_nbr = pv.sub_acct_nbr \n");
410            sqlText.append("       AND head.bdgt_lock_usr_id = ?), \n");
411            sqlText.append("    bdgt_lock_usr_id = NULL \n");
412            sqlText.append("WHERE EXISTS \n");
413            sqlText.append("    (SELECT * \n");
414            sqlText.append("     FROM LD_BCN_DOC_PUSHDOWN04_MT pv \n");
415            sqlText.append("     WHERE pv.SESID = ? \n");
416            sqlText.append("       AND pv.sel_pullflag = ? \n");
417            sqlText.append("       AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
418            sqlText.append("       AND head.fin_coa_cd = pv.fin_coa_cd \n");
419            sqlText.append("       AND head.account_nbr = pv.account_nbr \n");
420            sqlText.append("       AND head.sub_acct_nbr = pv.sub_acct_nbr \n");
421            sqlText.append("       AND head.bdgt_lock_usr_id = ?) \n");
422            pushdownSelectedOrganizationDocumentsTemplates[9] = sqlText.toString();
423            sqlText.delete(0, sqlText.length());
424    
425    
426            // push the selected org(s) subtree accts to level 0 - sel_pullflag = 5
427            // unlock as we go */
428            sqlText.append("UPDATE LD_BCNSTR_HDR_T head \n");
429            sqlText.append("SET org_level_cd = 0, \n");
430            sqlText.append("    org_coa_of_lvl_cd = NULL, \n");
431            sqlText.append("    org_of_lvl_cd = NULL, \n");
432            sqlText.append("    bdgt_lock_usr_id = NULL \n");
433            sqlText.append("WHERE EXISTS \n");
434            sqlText.append("    (SELECT * \n");
435            sqlText.append("     FROM LD_BCN_DOC_PUSHDOWN04_MT pv \n");
436            sqlText.append("     WHERE pv.SESID = ? \n");
437            sqlText.append("       AND pv.sel_pullflag = ? \n");
438            sqlText.append("       AND head.univ_fiscal_yr = pv.univ_fiscal_yr \n");
439            sqlText.append("       AND head.fin_coa_cd = pv.fin_coa_cd \n");
440            sqlText.append("       AND head.account_nbr = pv.account_nbr \n");
441            sqlText.append("       AND head.sub_acct_nbr = pv.sub_acct_nbr \n");
442            sqlText.append("       AND head.bdgt_lock_usr_id = ?) \n");
443            pushdownSelectedOrganizationDocumentsTemplates[10] = sqlText.toString();
444            sqlText.delete(0, sqlText.length());
445    
446            // build list of budget documents for selected orgs and below user's point of view (documents that will be pulled up by org
447            // pullup)
448            sqlText.append("INSERT INTO LD_BCN_ACCTSEL_T \n");
449            sqlText.append("SELECT ?,\n");
450            sqlText.append("        head.univ_fiscal_yr,\n");
451            sqlText.append("        head.fin_coa_cd, \n");
452            sqlText.append("        head.account_nbr, \n");
453            sqlText.append("        head.sub_acct_nbr, \n");
454            sqlText.append("        head.fdoc_nbr, \n");
455            sqlText.append("        1, \n");
456            sqlText.append("        head.org_level_cd, \n");
457            sqlText.append("        head.org_coa_of_lvl_cd, \n");
458            sqlText.append("        head.org_of_lvl_cd, \n");
459            sqlText.append("        fphd.fdoc_status_cd, \n");
460            sqlText.append("        '', \n");
461            sqlText.append("        fphd.temp_doc_fnl_dt \n");
462            sqlText.append("FROM LD_BCNSTR_HDR_T head, \n");
463            sqlText.append("      FS_DOC_HEADER_T fphd, \n");
464            sqlText.append("      (SELECT head2.fdoc_nbr \n");
465            sqlText.append("      FROM LD_BCNSTR_HDR_T head2, \n");
466            sqlText.append("            LD_BCN_PULLUP_T pull, \n");
467            sqlText.append("            LD_BCN_ACCT_ORG_HIER_T hs, \n");
468            sqlText.append("            LD_BCN_ACCT_ORG_HIER_T  hp \n");
469            sqlText.append("     WHERE pull.pull_flag = ?  \n");
470            sqlText.append("       AND pull.person_unvl_id = ? \n");
471            sqlText.append("       AND hs.univ_fiscal_yr = ? \n");
472            sqlText.append("       AND hs.org_fin_coa_cd = pull.fin_coa_cd \n");
473            sqlText.append("       AND hs.org_cd = pull.org_cd \n");
474            sqlText.append("       AND hp.org_fin_coa_cd = ? \n");
475            sqlText.append("       AND hp.org_cd= ? \n");
476            sqlText.append("       AND hp.univ_fiscal_yr = hs.univ_fiscal_yr \n");
477            sqlText.append("       AND hp.fin_coa_cd = hs.fin_coa_cd \n");
478            sqlText.append("       AND hp.account_nbr = hs.account_nbr \n");
479            sqlText.append("       AND head2.univ_fiscal_yr = hp.univ_fiscal_yr \n");
480            sqlText.append("       AND head2.fin_coa_cd = hp.fin_coa_cd \n");
481            sqlText.append("       AND head2.account_nbr = hp.account_nbr \n");
482            sqlText.append("       AND head2.org_level_cd < hp.org_level_cd \n");
483            sqlText.append("     UNION \n");
484            sqlText.append("     SELECT head2.fdoc_nbr \n");
485            sqlText.append("     FROM LD_BCNSTR_HDR_T head2, \n");
486            sqlText.append("           LD_BCN_PULLUP_T pull, \n");
487            sqlText.append("           LD_BCN_ACCT_ORG_HIER_T  hs, \n");
488            sqlText.append("           LD_BCN_ACCT_ORG_HIER_T  hp, \n");
489            sqlText.append("           LD_BCN_ACCT_RPTS_T bar \n");
490            sqlText.append("    WHERE pull.pull_flag = ? \n");
491            sqlText.append("       AND pull.person_unvl_id = ? \n");
492            sqlText.append("       AND hs.univ_fiscal_yr = ? \n");
493            sqlText.append("       AND hs.org_fin_coa_cd = pull.fin_coa_cd \n");
494            sqlText.append("       AND hs.org_cd = pull.org_cd \n");
495            sqlText.append("       AND hp.org_fin_coa_cd = ? \n");
496            sqlText.append("       AND hp.org_cd= ? \n");
497            sqlText.append("       AND hp.univ_fiscal_yr = hs.univ_fiscal_yr \n");
498            sqlText.append("       AND hp.fin_coa_cd = hs.fin_coa_cd \n");
499            sqlText.append("       AND hp.account_nbr = hs.account_nbr \n");
500            sqlText.append("       AND head2.univ_fiscal_yr = hp.univ_fiscal_yr \n");
501            sqlText.append("       AND head2.fin_coa_cd = hp.fin_coa_cd \n");
502            sqlText.append("       AND head2.account_nbr = hp.account_nbr \n");
503            sqlText.append("       AND head2.org_level_cd < hp.org_level_cd \n");
504            sqlText.append("       AND bar.fin_coa_cd = hs.fin_coa_cd \n");
505            sqlText.append("       AND bar.account_nbr = hs.account_nbr \n");
506            sqlText.append("       AND bar.rpts_to_fin_coa_cd = hs.org_fin_coa_cd \n");
507            sqlText.append("       AND bar.rpts_to_org_cd = hs.org_cd \n");
508            sqlText.append("     UNION \n");
509            sqlText.append("     SELECT head2.fdoc_nbr \n");
510            sqlText.append("     FROM LD_BCNSTR_HDR_T head2, \n");
511            sqlText.append("           LD_BCN_PULLUP_T pull, \n");
512            sqlText.append("           LD_BCN_ACCT_ORG_HIER_T  hs, \n");
513            sqlText.append("           LD_BCN_ACCT_ORG_HIER_T  hp, \n");
514            sqlText.append("           LD_BCN_ACCT_RPTS_T bar \n");
515            sqlText.append("    WHERE pull.pull_flag = ? \n");
516            sqlText.append("       AND pull.person_unvl_id = ? \n");
517            sqlText.append("       AND hs.univ_fiscal_yr = ? \n");
518            sqlText.append("       AND hs.org_fin_coa_cd = pull.fin_coa_cd \n");
519            sqlText.append("       AND hs.org_cd = pull.org_cd \n");
520            sqlText.append("       AND hp.org_fin_coa_cd = ? \n");
521            sqlText.append("       AND hp.org_cd= ? \n");
522            sqlText.append("       AND hp.univ_fiscal_yr = hs.univ_fiscal_yr \n");
523            sqlText.append("       AND hp.fin_coa_cd = hs.fin_coa_cd \n");
524            sqlText.append("       AND hp.account_nbr = hs.account_nbr \n");
525            sqlText.append("       AND head2.univ_fiscal_yr = hp.univ_fiscal_yr \n");
526            sqlText.append("       AND head2.fin_coa_cd = hp.fin_coa_cd \n");
527            sqlText.append("       AND head2.account_nbr = hp.account_nbr \n");
528            sqlText.append("       AND head2.org_level_cd < hp.org_level_cd \n");
529            sqlText.append("       AND bar.fin_coa_cd = hs.fin_coa_cd \n");
530            sqlText.append("       AND bar.account_nbr = hs.account_nbr \n");
531            sqlText.append("       AND (bar.rpts_to_fin_coa_cd <> hs.org_fin_coa_cd \n");
532            sqlText.append("            OR bar.rpts_to_org_cd <> hs.org_cd) \n");
533            sqlText.append("    ) s \n");
534            sqlText.append("   WHERE head.fdoc_nbr = s.fdoc_nbr \n");
535            sqlText.append("      AND fphd.fdoc_nbr = head.fdoc_nbr \n");
536    
537            accountSelectBudgetedDocumentsPullUpTemplates[0] = sqlText.toString();
538            sqlText.delete(0, sqlText.length());
539    
540            // update org for accounts at level 0
541            sqlText.append("  UPDATE LD_BCN_ACCTSEL_T \n");
542            sqlText.append("  SET org_fin_coa_cd = \n");
543            sqlText.append("     (SELECT rpts2.rpts_to_fin_coa_cd \n");
544            sqlText.append("     FROM LD_BCN_ACCT_RPTS_T rpts2 \n");
545            sqlText.append("     WHERE LD_BCN_ACCTSEL_T.fin_coa_cd = rpts2.fin_coa_cd \n");
546            sqlText.append("       AND LD_BCN_ACCTSEL_T.account_nbr = rpts2.account_nbr), \n");
547            sqlText.append("     org_cd = \n");
548            sqlText.append("      (SELECT rpts2.rpts_to_org_cd \n");
549            sqlText.append("       FROM LD_BCN_ACCT_RPTS_T rpts2 \n");
550            sqlText.append("       WHERE LD_BCN_ACCTSEL_T.fin_coa_cd = rpts2.fin_coa_cd \n");
551            sqlText.append("          AND LD_BCN_ACCTSEL_T.account_nbr = rpts2.account_nbr) \n");
552            sqlText.append("   WHERE LD_BCN_ACCTSEL_T.person_unvl_id = ? \n");
553            sqlText.append("      AND LD_BCN_ACCTSEL_T.univ_fiscal_yr = ? \n");
554            sqlText.append("      AND LD_BCN_ACCTSEL_T.org_level_cd = 0 \n");
555            sqlText.append("      AND EXISTS (select * \n");
556            sqlText.append("                  FROM LD_BCN_ACCT_RPTS_T rpts \n");
557            sqlText.append("                  WHERE LD_BCN_ACCTSEL_T.fin_coa_cd = rpts.fin_coa_cd \n");
558            sqlText.append("                     AND LD_BCN_ACCTSEL_T.account_nbr = rpts.account_nbr) \n");
559    
560            accountSelectBudgetedDocumentsPullUpTemplates[1] = sqlText.toString();
561            sqlText.delete(0, sqlText.length());
562    
563            // build list of budget documents for selected orgs at user's point of view (documents that will be pushed down by org
564            // pushdown)
565            sqlText.append("INSERT INTO LD_BCN_ACCTSEL_T \n");
566            sqlText.append("SELECT ?, \n");
567            sqlText.append("    head.univ_fiscal_yr, \n");
568            sqlText.append("    head.fin_coa_cd, \n");
569            sqlText.append("    head.account_nbr, \n");
570            sqlText.append("    head.sub_acct_nbr, \n");
571            sqlText.append("    head.fdoc_nbr, \n");
572            sqlText.append("    1, \n");
573            sqlText.append("    head.org_level_cd, \n");
574            sqlText.append("    head.org_coa_of_lvl_cd, \n");
575            sqlText.append("    head.org_of_lvl_cd, \n");
576            sqlText.append("    fphd.fdoc_status_cd, \n");
577            sqlText.append("    '', \n");
578            sqlText.append("    fphd.temp_doc_fnl_dt   \n");
579            sqlText.append("FROM LD_BCN_PULLUP_T pull, \n");
580            sqlText.append("    LD_BCN_ACCT_ORG_HIER_T hier, \n");
581            sqlText.append("    LD_BCN_ACCT_ORG_HIER_T hier2, \n");
582            sqlText.append("    LD_BCNSTR_HDR_T head, \n");
583            sqlText.append("    FS_DOC_HEADER_T fphd \n");
584            sqlText.append("WHERE pull.pull_flag in (?,?,?,?) \n");
585            sqlText.append("  AND pull.person_unvl_id = ? \n");
586            sqlText.append("  AND hier.univ_fiscal_yr = ? \n");
587            sqlText.append("  AND hier.org_fin_coa_cd = pull.fin_coa_cd \n");
588            sqlText.append("  AND hier.org_cd = pull.org_cd  \n");
589            sqlText.append("  AND hier.univ_fiscal_yr = hier2.univ_fiscal_yr \n");
590            sqlText.append("  AND hier.fin_coa_cd = hier2.fin_coa_cd \n");
591            sqlText.append("  AND hier.account_nbr = hier2.account_nbr   \n");
592            sqlText.append("  AND hier2.org_fin_coa_cd = ? \n");
593            sqlText.append("  AND hier2.org_cd = ? \n");
594            sqlText.append("  AND head.univ_fiscal_yr = hier2.univ_fiscal_yr \n");
595            sqlText.append("  AND head.fin_coa_cd = hier2.fin_coa_cd \n");
596            sqlText.append("  AND head.account_nbr = hier2.account_nbr \n");
597            sqlText.append("  AND head.org_level_cd = hier2.org_level_cd \n");
598            sqlText.append("  AND fphd.fdoc_nbr = head.fdoc_nbr \n");
599            sqlText.append("UNION \n");
600            sqlText.append("SELECT ?, \n");
601            sqlText.append("    head.univ_fiscal_yr, \n");
602            sqlText.append("    head.fin_coa_cd, \n");
603            sqlText.append("    head.account_nbr, \n");
604            sqlText.append("    head.sub_acct_nbr, \n");
605            sqlText.append("    head.fdoc_nbr, \n");
606            sqlText.append("    1, \n");
607            sqlText.append("    head.org_level_cd, \n");
608            sqlText.append("    head.org_coa_of_lvl_cd, \n");
609            sqlText.append("    head.org_of_lvl_cd, \n");
610            sqlText.append("    fphd.fdoc_status_cd, \n");
611            sqlText.append("    '', \n");
612            sqlText.append("    fphd.temp_doc_fnl_dt     \n");
613            sqlText.append("FROM LD_BCN_PULLUP_T pull, \n");
614            sqlText.append("    LD_BCN_ACCT_ORG_HIER_T hier, \n");
615            sqlText.append("    LD_BCN_ACCT_ORG_HIER_T hier2, \n");
616            sqlText.append("    LD_BCN_ACCT_RPTS_T rpts, \n");
617            sqlText.append("    LD_BCNSTR_HDR_T head, \n");
618            sqlText.append("    FS_DOC_HEADER_T fphd \n");
619            sqlText.append("WHERE pull.pull_flag = ? \n");
620            sqlText.append("  AND pull.person_unvl_id = ? \n");
621            sqlText.append("  AND hier.univ_fiscal_yr = ? \n");
622            sqlText.append("  AND hier.org_fin_coa_cd = pull.fin_coa_cd \n");
623            sqlText.append("  AND hier.org_cd = pull.org_cd \n");
624            sqlText.append("  AND hier.fin_coa_cd = rpts.fin_coa_cd \n");
625            sqlText.append("  AND hier.account_nbr = rpts.account_nbr \n");
626            sqlText.append("  AND hier.org_fin_coa_cd = rpts.rpts_to_fin_coa_cd  \n");
627            sqlText.append("  AND hier.org_cd = rpts.rpts_to_org_cd   \n");
628            sqlText.append("  AND hier.univ_fiscal_yr = hier2.univ_fiscal_yr \n");
629            sqlText.append("  AND hier.fin_coa_cd = hier2.fin_coa_cd \n");
630            sqlText.append("  AND hier.account_nbr = hier2.account_nbr  \n");
631            sqlText.append("  AND hier2.org_fin_coa_cd = ? \n");
632            sqlText.append("  AND hier2.org_cd = ? \n");
633            sqlText.append("  AND head.univ_fiscal_yr = hier2.univ_fiscal_yr \n");
634            sqlText.append("  AND head.fin_coa_cd = hier2.fin_coa_cd \n");
635            sqlText.append("  AND head.account_nbr = hier2.account_nbr \n");
636            sqlText.append("  AND head.org_level_cd = hier2.org_level_cd \n");
637            sqlText.append("  AND fphd.fdoc_nbr = head.fdoc_nbr \n");
638    
639            accountSelectBudgetedDocumentsPushDownTemplates[0] = sqlText.toString();
640            sqlText.delete(0, sqlText.length());
641        }
642    
643        /**
644         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetOrganizationPushPullDao#pullupSelectedOrganizationDocuments(java.lang.String,
645         *      java.lang.Integer, java.lang.String, java.lang.String)
646         */
647        public void pullupSelectedOrganizationDocuments(String principalId, Integer fiscalYear, String pointOfViewCharOfAccountsCode, String pointOfViewOrganizationCode) {
648    
649            String sessionId = new Guid().toString();
650    
651            // run the steps
652            this.getSimpleJdbcTemplate().update(pullupSelectedOrganizationDocumentsTemplates[0], sessionId, principalId, fiscalYear);
653            this.getSimpleJdbcTemplate().update(pullupSelectedOrganizationDocumentsTemplates[1], sessionId, sessionId, pointOfViewCharOfAccountsCode, pointOfViewOrganizationCode);
654            this.getSimpleJdbcTemplate().update(pullupSelectedOrganizationDocumentsTemplates[2], sessionId, sessionId, BCConstants.OrgSelControlOption.BOTH.getKey());
655            this.getSimpleJdbcTemplate().update(pullupSelectedOrganizationDocumentsTemplates[3], sessionId, sessionId, BCConstants.OrgSelControlOption.ORG.getKey());
656            this.getSimpleJdbcTemplate().update(pullupSelectedOrganizationDocumentsTemplates[4], sessionId, sessionId, BCConstants.OrgSelControlOption.SUBORG.getKey());
657            this.getSimpleJdbcTemplate().update(pullupSelectedOrganizationDocumentsTemplates[5], principalId, sessionId);
658            this.getSimpleJdbcTemplate().update(pullupSelectedOrganizationDocumentsTemplates[6], sessionId, principalId);
659            this.getSimpleJdbcTemplate().update(pullupSelectedOrganizationDocumentsTemplates[7], sessionId, principalId, sessionId, principalId, sessionId, principalId, sessionId, principalId);
660    
661            // cleanup temp table space
662            this.clearTempTableBySesId("LD_BCN_DOC_PULLUP01_MT", "SESID", sessionId);
663            this.clearTempTableBySesId("LD_BCN_DOC_PULLUP02_MT", "SESID", sessionId);
664            this.clearTempTableBySesId("LD_BCN_DOC_PULLUP03_MT", "SESID", sessionId);
665    
666        }
667    
668        /**
669         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetOrganizationPushPullDao#pushdownSelectedOrganizationDocuments(java.lang.String,
670         *      java.lang.Integer, java.lang.String, java.lang.String)
671         */
672        public void pushdownSelectedOrganizationDocuments(String principalId, Integer fiscalYear, String pointOfViewCharOfAccountsCode, String pointOfViewOrganizationCode) {
673    
674            String sessionId = new Guid().toString();
675    
676            // use some local vars to improve readability
677            Integer orgLev = OrgSelControlOption.ORGLEV.getKey();
678            Integer mgrLev = OrgSelControlOption.MGRLEV.getKey();
679            Integer orgMgrLev = OrgSelControlOption.ORGMGRLEV.getKey();
680            Integer levOne = OrgSelControlOption.LEVONE.getKey();
681            Integer levZero = OrgSelControlOption.LEVZERO.getKey();
682            String puid = principalId;
683    
684            // run the steps
685            this.getSimpleJdbcTemplate().update(pushdownSelectedOrganizationDocumentsTemplates[0], sessionId, puid, fiscalYear);
686            this.getSimpleJdbcTemplate().update(pushdownSelectedOrganizationDocumentsTemplates[1], sessionId, sessionId, pointOfViewCharOfAccountsCode, pointOfViewOrganizationCode);
687            this.getSimpleJdbcTemplate().update(pushdownSelectedOrganizationDocumentsTemplates[2], sessionId, sessionId);
688            this.getSimpleJdbcTemplate().update(pushdownSelectedOrganizationDocumentsTemplates[3], sessionId, sessionId, orgLev, orgMgrLev, levOne, levZero);
689            this.getSimpleJdbcTemplate().update(pushdownSelectedOrganizationDocumentsTemplates[4], sessionId, sessionId, mgrLev);
690            this.getSimpleJdbcTemplate().update(pushdownSelectedOrganizationDocumentsTemplates[5], puid, sessionId);
691            this.getSimpleJdbcTemplate().update(pushdownSelectedOrganizationDocumentsTemplates[6], sessionId, puid);
692            this.getSimpleJdbcTemplate().update(pushdownSelectedOrganizationDocumentsTemplates[7], sessionId, mgrLev, orgMgrLev, puid);
693            this.getSimpleJdbcTemplate().update(pushdownSelectedOrganizationDocumentsTemplates[8], sessionId, orgLev, orgMgrLev, puid, sessionId, orgLev, orgMgrLev, puid, sessionId, orgLev, orgMgrLev, puid, sessionId, orgLev, orgMgrLev, puid);
694            this.getSimpleJdbcTemplate().update(pushdownSelectedOrganizationDocumentsTemplates[9], sessionId, levOne, puid, sessionId, levOne, puid, sessionId, levOne, puid);
695            this.getSimpleJdbcTemplate().update(pushdownSelectedOrganizationDocumentsTemplates[10], sessionId, levZero, puid);
696    
697            // cleanup temp table space
698            this.clearTempTableBySesId("LD_BCN_DOC_PUSHDOWN01_MT", "SESID", sessionId);
699            this.clearTempTableBySesId("LD_BCN_DOC_PUSHDOWN02_MT", "SESID", sessionId);
700            this.clearTempTableBySesId("LD_BCN_DOC_PUSHDOWN03_MT", "SESID", sessionId);
701            this.clearTempTableBySesId("LD_BCN_DOC_PUSHDOWN04_MT", "SESID", sessionId);
702        }
703    
704        /**
705         * Uses sql jdbc call to populate the account select table for the set of pull up documents.
706         * 
707         * @see org.kuali.kfs.module.bc.document.dataaccess..BudgetOrganizationPushPullDao#buildPullUpBudgetedDocuments(java.lang.String,
708         *      java.lang.Integer, java.lang.String, java.lang.String)
709         */
710        public int buildPullUpBudgetedDocuments(String principalId, Integer fiscalYear, String pointOfViewCharOfAccountsCode, String pointOfViewOrganizationCode) {
711            // clear temp records for users
712            this.clearTempTableByUnvlId("LD_BCN_ACCTSEL_T", "person_unvl_id", principalId);
713    
714            Integer org = OrgSelControlOption.ORG.getKey();
715            Integer subOrg = OrgSelControlOption.SUBORG.getKey();
716            Integer both = OrgSelControlOption.BOTH.getKey();
717    
718            // build account select
719            int rowCount = this.getSimpleJdbcTemplate().update(accountSelectBudgetedDocumentsPullUpTemplates[0], principalId, both, principalId, fiscalYear, pointOfViewCharOfAccountsCode, pointOfViewOrganizationCode, org, principalId, fiscalYear, pointOfViewCharOfAccountsCode, pointOfViewOrganizationCode, subOrg, principalId, fiscalYear, pointOfViewCharOfAccountsCode, pointOfViewOrganizationCode);
720    
721            // update org for accounts at level zero
722            this.getSimpleJdbcTemplate().update(accountSelectBudgetedDocumentsPullUpTemplates[1], principalId, fiscalYear);
723    
724            return rowCount;
725        }
726    
727        /**
728         * Uses sql jdbc call to populate the account select table for the set of push up documents.
729         * 
730         * @see org.kuali.kfs.module.bc.document.dataaccess..BudgetOrganizationPushPullDao#buildPushDownBudgetedDocuments(java.lang.String,
731         *      java.lang.Integer, java.lang.String, java.lang.String)
732         */
733        public int buildPushDownBudgetedDocuments(String principalId, Integer fiscalYear, String pointOfViewCharOfAccountsCode, String pointOfViewOrganizationCode) {
734            // clear temp records for users
735            this.clearTempTableByUnvlId("LD_BCN_ACCTSEL_T", "person_unvl_id", principalId);
736    
737            Integer orgLev = OrgSelControlOption.ORGLEV.getKey();
738            Integer mgrLev = OrgSelControlOption.MGRLEV.getKey();
739            Integer orgMgrLev = OrgSelControlOption.ORGMGRLEV.getKey();
740            Integer levOne = OrgSelControlOption.LEVONE.getKey();
741            Integer levZero = OrgSelControlOption.LEVZERO.getKey();
742    
743            // build account select
744            int rowCount = this.getSimpleJdbcTemplate().update(accountSelectBudgetedDocumentsPushDownTemplates[0], principalId, orgLev, orgMgrLev, levOne, levZero, principalId, fiscalYear, pointOfViewCharOfAccountsCode, pointOfViewOrganizationCode, principalId, mgrLev, principalId, fiscalYear, pointOfViewCharOfAccountsCode, pointOfViewOrganizationCode);
745    
746            return rowCount;
747        }
748    
749    }