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.BudgetConstructionDocumentAccountObjectDetailReportDao;
023    import org.kuali.rice.kns.service.PersistenceService;
024    
025    
026    public class BudgetConstructionDocumentAccountObjectDetailReportDaoJdbc extends BudgetConstructionDaoJdbcBase implements BudgetConstructionDocumentAccountObjectDetailReportDao {
027    
028        private PersistenceService persistenceService;
029        
030        private SQLForStep initialInsert;     
031        private SQLForStep setNonLeaveCSFFTE;
032        private SQLForStep setLeaveCSFFTE;   
033        
034        private ArrayList<Integer> insertionPoints = new ArrayList<Integer>(4);
035        
036        public BudgetConstructionDocumentAccountObjectDetailReportDaoJdbc()
037        {
038            StringBuilder sqlText = new StringBuilder(750);
039            sqlText.append("INSERT INTO LD_BCN_BAL_BY_ACCT_T\n");
040            sqlText.append("(PERSON_UNVL_ID, UNIV_FISCAL_YR, FIN_COA_CD, ACCOUNT_NBR, SUB_ACCT_NBR, FIN_OBJECT_CD,\n");                            
041            sqlText.append(" FIN_SUB_OBJ_CD, FIN_OBJ_TYP_CD, FIN_OBJ_LEVEL_CD, TYP_FIN_REPORT_SORT_CD, FIN_CONS_SORT_CD,\n");                               
042            sqlText.append(" LEV_FIN_REPORT_SORT_CD, APPT_RQST_FTE_QTY, APPT_RQCSF_FTE_QTY, POS_CSF_FTE_QTY,\n");                                
043            sqlText.append(" ACLN_ANNL_BAL_AMT, FIN_BEG_BAL_LN_AMT, POS_CSF_LV_FTE_QTY)\n");                             
044            sqlText.append("SELECT ?,\n");
045            sqlText.append("    a.univ_fiscal_yr,\n");
046            sqlText.append("    a.fin_coa_cd,\n");
047            sqlText.append("    a.account_nbr,\n");
048            sqlText.append("    a.sub_acct_nbr,\n");
049            sqlText.append("    a.fin_object_cd,\n");
050            sqlText.append("    a.fin_sub_obj_cd,\n");
051            sqlText.append("    a.fin_obj_typ_cd,\n");
052            sqlText.append("    l.fin_obj_level_cd,\n");
053            // DB-specific substring format (first character of t.fin_report_sort_cd)
054            insertionPoints.add(sqlText.length());
055            sqlText.append(",\n");
056            sqlText.append("    c.fin_report_sort_cd,\n");
057            sqlText.append("    l.fin_report_sort_cd,\n");
058            sqlText.append("    COALESCE(SUM(p.appt_rqst_fte_qty),0),\n");
059            sqlText.append("    COALESCE(SUM(p.appt_rqcsf_fte_qty),0),\n");
060            sqlText.append("    0, a.acln_annl_bal_amt, a.fin_beg_bal_ln_amt, 0\n");
061            sqlText.append("FROM (LD_PND_BCNSTR_GL_T a LEFT OUTER JOIN LD_PNDBC_APPTFND_T p\n");
062            sqlText.append("      ON ((a.univ_fiscal_yr = p.univ_fiscal_yr) AND\n");
063            sqlText.append("          (a.fin_coa_cd = p.fin_coa_cd) AND\n");
064            sqlText.append("          (a.account_nbr = p.account_nbr) AND\n");
065            sqlText.append("          (a.sub_acct_nbr = p.sub_acct_nbr) AND\n");
066            sqlText.append("          (a.fin_object_cd = p.fin_object_cd) AND\n");
067            sqlText.append("          (a.fin_sub_obj_cd = p.fin_sub_obj_cd))),\n"); 
068            sqlText.append("    CA_OBJECT_CODE_T o,\n");
069            sqlText.append("    CA_OBJ_TYPE_T t,\n");
070            sqlText.append("    CA_OBJ_LEVEL_T l,\n");
071            sqlText.append("    CA_OBJ_CONSOLDTN_T c\n");                  
072            sqlText.append("WHERE a.fdoc_nbr = ?\n");
073            sqlText.append("  AND a.univ_fiscal_yr = ?\n");
074            sqlText.append("  AND a.fin_coa_cd = ?\n");
075            sqlText.append("  AND a.account_nbr = ?\n");
076            sqlText.append("  AND a.sub_acct_nbr = ?\n");
077            sqlText.append("  AND a.univ_fiscal_yr = o.univ_fiscal_yr\n");
078            sqlText.append("  AND a.fin_coa_cd = o.fin_coa_cd\n");
079            sqlText.append("  AND a.fin_object_cd = o.fin_object_cd\n");
080            sqlText.append("  AND o.fin_obj_typ_cd = t.fin_obj_typ_cd\n");
081            sqlText.append("  AND o.fin_coa_cd = l.fin_coa_cd\n");
082            sqlText.append("  AND o.fin_obj_level_cd = l.fin_obj_level_cd\n");
083            sqlText.append("  AND c.fin_coa_cd = l.fin_coa_cd\n");
084            sqlText.append("  AND c.fin_cons_obj_cd = l.fin_cons_obj_cd\n");
085            sqlText.append("GROUP BY a.univ_fiscal_yr,\n");
086            sqlText.append("    a.fin_coa_cd,\n");
087            sqlText.append("    a.account_nbr,\n");
088            sqlText.append("    a.sub_acct_nbr,\n");
089            sqlText.append("    a.fin_object_cd,\n");
090            sqlText.append("    a.fin_sub_obj_cd,\n");
091            sqlText.append("    a.fin_obj_typ_cd,\n");
092            sqlText.append("    l.fin_obj_level_cd,\n");
093            sqlText.append("    t.fin_report_sort_cd,\n");
094            sqlText.append("    c.fin_report_sort_cd,\n");
095            sqlText.append("    l.fin_report_sort_cd,\n");
096            sqlText.append("    a.acln_annl_bal_amt,\n");
097            sqlText.append("    a.fin_beg_bal_ln_amt");
098            // initial insertion into the table
099            initialInsert = new SQLForStep(sqlText,insertionPoints);
100            sqlText.delete(0,sqlText.length());
101            insertionPoints.clear();
102            //
103            // update non-leave CSF FTE
104            sqlText.append("UPDATE LD_BCN_BAL_BY_ACCT_T\n"); 
105            sqlText.append("SET pos_csf_fte_qty =\n"); 
106            sqlText.append("    (SELECT sum(pos_csf_fte_qty)\n");
107            sqlText.append("    FROM LD_BCN_CSF_TRCKR_T c\n");
108            sqlText.append("    WHERE person_unvl_id = ?\n");
109            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.univ_fiscal_yr = c.univ_fiscal_yr\n");
110            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.fin_coa_cd = c.fin_coa_cd\n");
111            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.account_nbr = c.account_nbr\n");
112            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.sub_acct_nbr = c.sub_acct_nbr\n");
113            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.fin_object_cd = c.fin_object_cd\n");
114            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.fin_sub_obj_cd = c.fin_sub_obj_cd\n");
115            sqlText.append("      and c.pos_csf_fndstat_cd <> '");
116            // CSF code for a leave
117            insertionPoints.add(sqlText.length());
118            sqlText.append("')\n");
119            sqlText.append("WHERE person_unvl_id = ?\n");
120            sqlText.append("  AND EXISTS (SELECT 1\n");
121            sqlText.append("    FROM LD_BCN_CSF_TRCKR_T c1\n");
122            sqlText.append("    WHERE LD_BCN_BAL_BY_ACCT_T.univ_fiscal_yr = c1.univ_fiscal_yr\n");
123            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.fin_coa_cd = c1.fin_coa_cd\n");
124            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.account_nbr = c1.account_nbr\n");
125            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.sub_acct_nbr = c1.sub_acct_nbr\n");
126            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.fin_object_cd = c1.fin_object_cd\n");
127            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.fin_sub_obj_cd = c1.fin_sub_obj_cd\n");
128            sqlText.append("      and c1.pos_csf_fndstat_cd <> '");
129            // CSF code for a leave
130            insertionPoints.add(sqlText.length());
131            sqlText.append("')");
132            // update non-leave CSF FTE
133            setNonLeaveCSFFTE = new SQLForStep(sqlText,insertionPoints);
134            sqlText.delete(0,sqlText.length());
135            insertionPoints.clear();
136            //
137            // update leave CSF FTE
138            sqlText.append("UPDATE LD_BCN_BAL_BY_ACCT_T\n");
139            sqlText.append("SET pos_csf_lv_fte_qty = \n");
140            sqlText.append("    (SELECT sum(pos_csf_fte_qty)\n");
141            sqlText.append("    FROM LD_BCN_CSF_TRCKR_T c\n");
142            sqlText.append("    WHERE person_unvl_id = ?\n");
143            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.univ_fiscal_yr = c.univ_fiscal_yr\n");
144            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.fin_coa_cd = c.fin_coa_cd\n");
145            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.account_nbr = c.account_nbr\n");
146            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.sub_acct_nbr = c.sub_acct_nbr\n");
147            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.fin_object_cd = c.fin_object_cd\n");
148            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.fin_sub_obj_cd = c.fin_sub_obj_cd\n");
149            sqlText.append("      and c.pos_csf_fndstat_cd = '");
150            // CSF code for a leave
151            insertionPoints.add(sqlText.length());
152            sqlText.append("')\n");
153            sqlText.append("WHERE person_unvl_id = ?\n");
154            sqlText.append("  AND EXISTS (SELECT 1\n");
155            sqlText.append("    FROM LD_BCN_CSF_TRCKR_T c1\n");
156            sqlText.append("    WHERE LD_BCN_BAL_BY_ACCT_T.univ_fiscal_yr = c1.univ_fiscal_yr\n");
157            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.fin_coa_cd = c1.fin_coa_cd\n");
158            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.account_nbr = c1.account_nbr\n");
159            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.sub_acct_nbr = c1.sub_acct_nbr\n");
160            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.fin_object_cd = c1.fin_object_cd\n");
161            sqlText.append("      and LD_BCN_BAL_BY_ACCT_T.fin_sub_obj_cd = c1.fin_sub_obj_cd\n");
162            sqlText.append("      and c1.pos_csf_fndstat_cd = '");
163            // CSF code for a leave
164            insertionPoints.add(sqlText.length());
165            sqlText.append("')");
166            // update leave CSF FTE
167            setLeaveCSFFTE = new SQLForStep(sqlText,insertionPoints);
168            sqlText.delete(0,sqlText.length());
169            insertionPoints.clear();
170        }
171        
172        /**
173         * 
174         * @see org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDocumentAccountObjectDetailReportDao#updateDocumentAccountObjectDetailReportTable(java.lang.String, java.lang.String, java.lang.Integer, java.lang.String, java.lang.String, java.lang.String)
175         */
176        public void updateDocumentAccountObjectDetailReportTable(String principalName, String documentNumber, Integer universityFiscalYear, String chartOfAccountsCode, String accountNumber, String subAccountNumber) {
177            // eliminate any rows already extant in the table for this user
178            this.clearTempTableByUnvlId("LD_BCN_BAL_BY_ACCT_T", "PERSON_UNVL_ID", principalName);
179            // insert the substring function into the SQL string
180            StringBuilder sqlText = this.getSqlSubStringFunction("t.fin_report_sort_cd",1,1);
181            ArrayList<String> stringsToInsert = new ArrayList<String>(1);
182            stringsToInsert.add(sqlText.toString());
183            getSimpleJdbcTemplate().update(initialInsert.getSQL(stringsToInsert),principalName, documentNumber, universityFiscalYear, chartOfAccountsCode, accountNumber, subAccountNumber); 
184            // set the non-leave CSF FTE
185            stringsToInsert.clear();
186            stringsToInsert.add(new String(BCConstants.csfFundingStatusFlag.LEAVE.getFlagValue()));
187            stringsToInsert.add(stringsToInsert.get(0));
188            getSimpleJdbcTemplate().update(setNonLeaveCSFFTE.getSQL(stringsToInsert), principalName, principalName);
189            // set the CSF FTE for people on leave
190            // (we are inserting the same set of leave flags as in the previous step)
191            getSimpleJdbcTemplate().update(setLeaveCSFFTE.getSQL(stringsToInsert), principalName, principalName);
192            // clear the cache (OJB data from the last report for this user might still be cached)
193            persistenceService.clearCache();
194        }
195        
196        public void setPersistenceService(PersistenceService persistenceService)
197        {
198            this.persistenceService = persistenceService;
199        }
200    
201    
202    }
203