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.document.BudgetConstructionDocument;
020    import org.kuali.kfs.module.bc.document.dataaccess.OrganizationBCDocumentSearchDao;
021    import org.kuali.kfs.sys.KFSConstants;
022    import org.kuali.rice.kns.service.DataDictionaryService;
023    
024    /**
025     * This class...
026     */
027    public class OrganizationBCDocumentSearchDaoJdbc extends BudgetConstructionDaoJdbcBase implements OrganizationBCDocumentSearchDao {
028        private static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(OrganizationBCDocumentSearchDaoJdbc.class);
029    
030        private static String[] buildAccountSelectPullListTemplates = new String[1];
031        private static String[] buildBudgetedAccountsAbovePointsOfView = new String[1];
032        private static String[] buildAccountManagerDelegateListTemplates = new String[3];
033    
034        private DataDictionaryService dataDictionaryService;
035    
036        public OrganizationBCDocumentSearchDaoJdbc() {
037    
038            StringBuilder sqlText = new StringBuilder(500);
039    
040            sqlText.append("INSERT INTO LD_BCN_ACCTSEL_T \n");
041            sqlText.append(" (PERSON_UNVL_ID,UNIV_FISCAL_YR,FIN_COA_CD,ACCOUNT_NBR,SUB_ACCT_NBR,FDOC_NBR, \n");
042            sqlText.append("  ORG_LEVEL_CD,ORG_FIN_COA_CD,ORG_CD,FDOC_STATUS_CD,FDOC_CREATE_DT) \n");
043            sqlText.append("SELECT pull.person_unvl_id, head.univ_fiscal_yr, head.fin_coa_cd, head.account_nbr, head.sub_acct_nbr,head.fdoc_nbr, \n");
044            sqlText.append(" head.org_level_cd, hier2.org_fin_coa_cd, hier2.org_cd, fshd.fdoc_status_cd, fshd.temp_doc_fnl_dt \n");
045            sqlText.append("FROM LD_BCN_PULLUP_T pull, LD_BCN_ACCT_ORG_HIER_T hier,  LD_BCN_ACCT_ORG_HIER_T hier2, \n");
046            sqlText.append("     LD_BCNSTR_HDR_T head, FS_DOC_HEADER_T fshd \n");
047            sqlText.append("WHERE pull.pull_flag > 0 \n");
048            sqlText.append("  AND pull.person_unvl_id = ? \n");
049            sqlText.append("  AND hier.univ_fiscal_yr = ? \n");
050            sqlText.append("  AND hier.org_fin_coa_cd = pull.fin_coa_cd \n");
051            sqlText.append("  AND hier.org_cd = pull.org_cd \n");
052            sqlText.append("  AND hier2.univ_fiscal_yr = hier.univ_fiscal_yr \n");
053            sqlText.append("  AND hier2.fin_coa_cd = hier.fin_coa_cd \n");
054            sqlText.append("  AND hier2.account_nbr = hier.account_nbr \n");
055            sqlText.append("  AND head.univ_fiscal_yr = hier2.univ_fiscal_yr \n");
056            sqlText.append("  AND head.fin_coa_cd = hier2.fin_coa_cd \n");
057            sqlText.append("  AND head.account_nbr = hier2.account_nbr \n");
058            sqlText.append("  AND head.org_level_cd = hier2.org_level_cd \n");
059            sqlText.append("  AND fshd.fdoc_nbr = head.fdoc_nbr \n");
060            sqlText.append("UNION \n");
061            sqlText.append("SELECT pull.person_unvl_id, head.univ_fiscal_yr, head.fin_coa_cd, head.account_nbr, head.sub_acct_nbr, head.fdoc_nbr, \n");
062            sqlText.append(" head.org_level_cd, hier2.org_fin_coa_cd, hier2.org_cd, fshd.fdoc_status_cd, fshd.temp_doc_fnl_dt \n");
063            sqlText.append("FROM LD_BCN_PULLUP_T pull, LD_BCN_ACCT_ORG_HIER_T hier, LD_BCN_ACCT_ORG_HIER_T hier2, \n");
064            sqlText.append("     LD_BCNSTR_HDR_T head, FS_DOC_HEADER_T fshd \n");
065            sqlText.append("WHERE pull.pull_flag > 0 \n");
066            sqlText.append("  AND pull.person_unvl_id = ? \n");
067            sqlText.append("  AND hier.univ_fiscal_yr = ? \n");
068            sqlText.append("  AND hier.org_fin_coa_cd = pull.fin_coa_cd \n");
069            sqlText.append("  AND hier.org_cd = pull.org_cd \n");
070            sqlText.append("  AND hier2.univ_fiscal_yr = hier.univ_fiscal_yr \n");
071            sqlText.append("  AND hier2.fin_coa_cd = hier.fin_coa_cd \n");
072            sqlText.append("  AND hier2.account_nbr = hier.account_nbr \n");
073            sqlText.append("  AND hier2.org_level_cd = 1 \n");
074            sqlText.append("  AND head.univ_fiscal_yr = hier2.univ_fiscal_yr \n");
075            sqlText.append("  AND head.fin_coa_cd = hier2.fin_coa_cd \n");
076            sqlText.append("  AND head.account_nbr = hier2.account_nbr \n");
077            sqlText.append("  AND head.org_level_cd = 0 \n");
078            sqlText.append("  AND fshd.fdoc_nbr = head.fdoc_nbr\n");
079            buildAccountSelectPullListTemplates[0] = sqlText.toString();
080            sqlText.delete(0, sqlText.length());
081    
082            sqlText.append("INSERT INTO LD_BCN_ACCTSEL_T \n");
083            sqlText.append(" (PERSON_UNVL_ID, UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, FDOC_NBR, \n");
084            sqlText.append(" ORG_LEVEL_CD, ORG_FIN_COA_CD, ORG_CD, FDOC_STATUS_CD, FDOC_CREATE_DT) \n");
085            sqlText.append("SELECT  ?, \n");
086            sqlText.append(" head.univ_fiscal_yr, \n");
087            sqlText.append(" head.fin_coa_cd, \n");
088            sqlText.append(" head.account_nbr, \n");
089            sqlText.append(" head.sub_acct_nbr, \n");
090            sqlText.append(" head.fdoc_nbr, \n");
091            sqlText.append(" head.org_level_cd, \n");
092            sqlText.append(" ah.org_fin_coa_cd, \n");
093            sqlText.append(" ah.org_cd, \n");
094            sqlText.append(" fshd.fdoc_status_cd, \n");
095            sqlText.append(" fshd.TEMP_DOC_FNL_DT \n");
096            sqlText.append("FROM LD_BCN_PULLUP_T pull, \n");
097            sqlText.append(" LD_BCNSTR_HDR_T head, \n");
098            sqlText.append(" FS_DOC_HEADER_T fshd, \n");
099            sqlText.append(" LD_BCN_ACCT_ORG_HIER_T sh, \n");
100            sqlText.append(" LD_BCN_ACCT_ORG_HIER_T ph, \n");
101            sqlText.append(" LD_BCN_ACCT_ORG_HIER_T ah \n");
102            sqlText.append("WHERE pull.pull_flag > 0 \n");
103            sqlText.append(" AND pull.person_unvl_id = ? \n");
104            sqlText.append(" AND sh.org_fin_coa_cd = pull.fin_coa_cd  \n");
105            sqlText.append(" AND sh.org_cd = pull.org_cd \n");
106            sqlText.append(" AND sh.univ_fiscal_yr = ?  \n");
107            sqlText.append(" AND ph.univ_fiscal_yr = sh.univ_fiscal_yr  \n");
108            sqlText.append(" AND ph.fin_coa_cd = sh.fin_coa_cd  \n");
109            sqlText.append(" AND ph.account_nbr = sh.account_nbr \n");
110            sqlText.append(" AND ph.org_fin_coa_cd = ? \n");
111            sqlText.append(" AND ph.org_cd = ? \n");
112            sqlText.append(" AND head.univ_fiscal_yr = ph.univ_fiscal_yr \n");
113            sqlText.append(" AND head.fin_coa_cd = ph.fin_coa_cd \n");
114            sqlText.append(" AND head.account_nbr = ph.account_nbr \n");
115            sqlText.append(" AND head.org_level_cd > ph.org_level_cd \n");
116            sqlText.append(" AND fshd.fdoc_nbr = head.fdoc_nbr \n");
117            sqlText.append(" AND ah.univ_fiscal_yr = head.univ_fiscal_yr \n");
118            sqlText.append(" AND ah.fin_coa_cd = head.fin_coa_cd \n");
119            sqlText.append(" AND ah.account_nbr = head.account_nbr \n");
120            sqlText.append(" AND ah.org_level_cd = head.org_level_cd \n");
121            buildBudgetedAccountsAbovePointsOfView[0] = sqlText.toString();
122            sqlText.delete(0, sqlText.length());
123    
124            // build list of accounts where user is fiscal officer or delegate
125            sqlText.append("INSERT INTO LD_BCN_ACCTSEL_T \n");
126            sqlText.append("SELECT ?, \n");
127            sqlText.append("    head.univ_fiscal_yr, \n");
128            sqlText.append("    head.fin_coa_cd, \n");
129            sqlText.append("    head.account_nbr, \n");
130            sqlText.append("    head.sub_acct_nbr, \n");
131            sqlText.append("    head.fdoc_nbr, \n");
132            sqlText.append("    1, \n");
133            sqlText.append("    head.org_level_cd, \n");
134            sqlText.append("    NULL, \n");
135            sqlText.append("    NULL, \n");
136            sqlText.append("    fshd.fdoc_status_cd, \n");
137            sqlText.append("    '', \n");
138            sqlText.append("    fshd.temp_doc_fnl_dt \n");
139            sqlText.append("FROM LD_BCNSTR_HDR_T head, \n");
140            sqlText.append("    CA_ACCT_DELEGATE_T adel, \n");
141            sqlText.append("    FS_DOC_HEADER_T fshd \n");
142            sqlText.append("WHERE head.univ_fiscal_yr = ? \n");
143            sqlText.append("  AND adel.acct_dlgt_unvl_id = ? \n");
144            sqlText.append("  AND adel.acct_dlgt_actv_cd = 'Y' \n");
145            sqlText.append("  AND adel.fdoc_typ_cd in (?, ?)  \n");
146            sqlText.append("  AND head.fin_coa_cd = adel.fin_coa_cd \n");
147            sqlText.append("  AND head.account_nbr = adel.account_nbr \n");
148            sqlText.append("  AND fshd.fdoc_nbr = head.fdoc_nbr \n");
149            sqlText.append("UNION \n");
150            sqlText.append("SELECT ?, \n");
151            sqlText.append("    head.univ_fiscal_yr, \n");
152            sqlText.append("    head.fin_coa_cd, \n");
153            sqlText.append("    head.account_nbr, \n");
154            sqlText.append("    head.sub_acct_nbr, \n");
155            sqlText.append("    head.fdoc_nbr, \n");
156            sqlText.append("    1, \n");
157            sqlText.append("    head.org_level_cd, \n");
158            sqlText.append("    NULL, \n");
159            sqlText.append("    NULL, \n");
160            sqlText.append("    fshd.fdoc_status_cd, \n");
161            sqlText.append("    '', \n");
162            sqlText.append("    fshd.temp_doc_fnl_dt \n");
163            sqlText.append("FROM LD_BCNSTR_HDR_T head, \n");
164            sqlText.append("    CA_ACCOUNT_T acct, \n");
165            sqlText.append("    FS_DOC_HEADER_T fshd \n");
166            sqlText.append("WHERE head.univ_fiscal_yr = ? \n");
167            sqlText.append("  AND acct.acct_fsc_ofc_uid = ? \n");
168            sqlText.append("  AND head.fin_coa_cd = acct.fin_coa_cd \n");
169            sqlText.append("  AND head.account_nbr = acct.account_nbr \n");
170            sqlText.append("  AND fshd.fdoc_nbr = head.fdoc_nbr \n");
171    
172            buildAccountManagerDelegateListTemplates[0] = sqlText.toString();
173            sqlText.delete(0, sqlText.length());
174    
175            // assign org for the account's current level
176            sqlText.append("UPDATE LD_BCN_ACCTSEL_T asel \n");
177            sqlText.append("SET org_fin_coa_cd =  \n");
178            sqlText.append("    (SELECT h1.org_fin_coa_cd \n");
179            sqlText.append("    FROM LD_BCN_ACCT_ORG_HIER_T h1 \n");
180            sqlText.append("    WHERE asel.univ_fiscal_yr = h1.univ_fiscal_yr \n");
181            sqlText.append("      AND asel.fin_coa_cd = h1.fin_coa_cd \n");
182            sqlText.append("      AND asel.account_nbr = h1.account_nbr \n");
183            sqlText.append("      AND asel.org_level_cd = h1.org_level_cd), \n");
184            sqlText.append("    org_cd =  \n");
185            sqlText.append("    (SELECT h1.org_cd \n");
186            sqlText.append("    FROM LD_BCN_ACCT_ORG_HIER_T h1 \n");
187            sqlText.append("    WHERE asel.univ_fiscal_yr = h1.univ_fiscal_yr \n");
188            sqlText.append("      AND asel.fin_coa_cd = h1.fin_coa_cd \n");
189            sqlText.append("      AND asel.account_nbr = h1.account_nbr \n");
190            sqlText.append("      AND asel.org_level_cd = h1.org_level_cd) \n");       
191            sqlText.append("WHERE asel.person_unvl_id = ? \n");
192            sqlText.append("AND EXISTS (SELECT * \n");
193            sqlText.append("    FROM LD_BCN_ACCT_ORG_HIER_T h2 \n");
194            sqlText.append("    WHERE asel.univ_fiscal_yr = h2.univ_fiscal_yr \n");
195            sqlText.append("      AND asel.fin_coa_cd = h2.fin_coa_cd \n");
196            sqlText.append("      AND asel.account_nbr = h2.account_nbr \n");
197            sqlText.append("      AND asel.org_level_cd = h2.org_level_cd) \n");
198      
199            buildAccountManagerDelegateListTemplates[1] = sqlText.toString();
200            sqlText.delete(0, sqlText.length());
201    
202            // assign org for accounts at level 0
203            sqlText.append("UPDATE LD_BCN_ACCTSEL_T asel \n");
204            sqlText.append("SET org_fin_coa_cd =  \n");
205            sqlText.append("    (SELECT r1.rpts_to_fin_coa_cd \n");
206            sqlText.append("    FROM LD_BCN_ACCT_RPTS_T r1 \n");
207            sqlText.append("    WHERE asel.fin_coa_cd = r1.fin_coa_cd \n");
208            sqlText.append("      AND asel.account_nbr = r1.account_nbr), \n");
209            sqlText.append("    org_cd =  \n");
210            sqlText.append("    (SELECT r1.rpts_to_org_cd \n");
211            sqlText.append("    FROM LD_BCN_ACCT_RPTS_T r1 \n");
212            sqlText.append("    WHERE asel.fin_coa_cd = r1.fin_coa_cd \n");
213            sqlText.append("      AND asel.account_nbr = r1.account_nbr) \n");
214            sqlText.append("WHERE asel.person_unvl_id = ? \n");
215            sqlText.append("  AND asel.org_level_cd = 0 \n");
216            sqlText.append("  AND EXISTS (select * \n");
217            sqlText.append("    FROM LD_BCN_ACCT_RPTS_T r2 \n");
218            sqlText.append("    WHERE asel.fin_coa_cd = r2.fin_coa_cd \n");
219            sqlText.append("      AND asel.account_nbr = r2.account_nbr)  \n");
220            
221            buildAccountManagerDelegateListTemplates[2] = sqlText.toString();
222            sqlText.delete(0, sqlText.length());
223        }
224    
225        /**
226         * @see org.kuali.kfs.module.bc.document.dataaccess.OrganizationBCDocumentSearchDao#buildAccountSelectPullList(java.lang.String,
227         *      java.lang.Integer)
228         */
229        public int buildAccountSelectPullList(String principalName, Integer universityFiscalYear) {
230            LOG.debug("buildAccountSelectPullList() started");
231    
232            int rowsAffected = getSimpleJdbcTemplate().update(buildAccountSelectPullListTemplates[0], principalName, universityFiscalYear, principalName, universityFiscalYear);
233            return rowsAffected;
234        }
235    
236        /**
237         * @see org.kuali.kfs.module.bc.document.dataaccess.OrganizationBCDocumentSearchDao#buildBudgetedAccountsAbovePointsOfView(java.lang.String,
238         *      java.lang.Integer, java.lang.String, java.lang.String)
239         */
240        public int buildBudgetedAccountsAbovePointsOfView(String principalName, Integer universityFiscalYear, String chartOfAccountsCode, String organizationCode) {
241            LOG.debug("buildBudgetedAccountsAbovePointsOfView() started");
242    
243            int rowsAffected = getSimpleJdbcTemplate().update(buildBudgetedAccountsAbovePointsOfView[0], principalName, principalName, universityFiscalYear, chartOfAccountsCode, organizationCode);
244            return rowsAffected;
245        }
246    
247        /**
248         * @see org.kuali.kfs.module.bc.document.dataaccess.OrganizationBCDocumentSearchDao#buildAccountManagerDelegateList(java.lang.String,
249         *      java.lang.Integer)
250         */
251        public int buildAccountManagerDelegateList(String principalName, Integer universityFiscalYear) {
252            int rowsAffected = getSimpleJdbcTemplate().update(buildAccountManagerDelegateListTemplates[0], principalName, universityFiscalYear, principalName, KFSConstants.FinancialDocumentTypeCodes.BUDGET_CONSTRUCTION, BCConstants.DOCUMENT_TYPE_CODE_ALL, principalName, universityFiscalYear, principalName);
253          
254            // update level chart and org
255            getSimpleJdbcTemplate().update(buildAccountManagerDelegateListTemplates[1], principalName);
256            getSimpleJdbcTemplate().update(buildAccountManagerDelegateListTemplates[2], principalName);
257    
258            return rowsAffected;
259        }
260    
261        /**
262         * @see org.kuali.kfs.module.bc.document.dataaccess.OrganizationBCDocumentSearchDao#cleanAccountSelectPullList(java.lang.String)
263         */
264        public void cleanAccountSelectPullList(String principalName) {
265            clearTempTableByUnvlId("LD_BCN_ACCTSEL_T", "PERSON_UNVL_ID", principalName);
266        }
267    
268        /**
269         * Gets the dataDictionaryService attribute. 
270         * @return Returns the dataDictionaryService.
271         */
272        public DataDictionaryService getDataDictionaryService() {
273            return dataDictionaryService;
274        }
275    
276        /**
277         * Sets the dataDictionaryService attribute value.
278         * @param dataDictionaryService The dataDictionaryService to set.
279         */
280        public void setDataDictionaryService(DataDictionaryService dataDictionaryService) {
281            this.dataDictionaryService = dataDictionaryService;
282        }
283    
284    }
285