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.batch.dataaccess.impl;
017    
018    import java.sql.Date;
019    import java.sql.Types;
020    import java.util.Calendar;
021    import java.util.GregorianCalendar;
022    
023    import org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao;
024    import org.kuali.kfs.module.bc.document.dataaccess.impl.BudgetConstructionDaoJdbcBase;
025    import org.kuali.kfs.sys.KFSConstants;
026    import org.kuali.kfs.module.bc.BCConstants;
027    
028    
029    
030    public class BudgetConstructionHumanResourcesPayrollInterfaceDaoJdbc extends BudgetConstructionDaoJdbcBase implements BudgetConstructionHumanResourcesPayrollInterfaceDao {
031        /**
032         * 
033         * @see org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao#buildBudgetConstructionAdministrativePosts(java.lang.Integer)
034         */
035        public void buildBudgetConstructionAdministrativePosts() {
036          /**
037           * this unrealistic implementation will simply clean out what is already there
038           */
039           String sqlString = new String("DELETE FROM LD_BCN_ADM_POST_T\n");
040           getSimpleJdbcTemplate().update(sqlString);
041        }
042    
043        /**
044         * 
045         * @see org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao#buildBudgetConstructionAppointmentFundingReasons(java.lang.Integer)
046         */
047        public void buildBudgetConstructionAppointmentFundingReasons(Integer requestFiscalYear) {
048            /**
049             * this unrealistic implementation will simply clean out what is already there
050             */
051             String sqlString = new String("DELETE FROM LD_BCN_AF_REASON_T WHERE (UNIV_FISCAL_YR = ?)\n");
052             getSimpleJdbcTemplate().update(sqlString,requestFiscalYear);
053        }
054    
055        /**
056         * 
057         * @see org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao#buildBudgetConstructionIntendedIncumbent(java.lang.Integer)
058         */
059        public void buildBudgetConstructionIntendedIncumbent(Integer requestFiscalYear) {
060            /**
061             * this unrealistic implementation will refresh all incumbents who presently exist in the CSF tracker, but
062             * leave any who no longer do in place.
063             */
064            Integer baseFiscalYear = requestFiscalYear - 1;
065             StringBuilder sqlBuilder = new StringBuilder(1500);
066             sqlBuilder.append("DELETE FROM LD_BCN_INTINCBNT_T\n");
067             sqlBuilder.append("WHERE (EXISTS (SELECT 1\n");
068             sqlBuilder.append("               FROM LD_CSF_TRACKER_T\n");
069             sqlBuilder.append("               WHERE (LD_CSF_TRACKER_T.UNIV_FISCAL_YR = ?)\n");
070             sqlBuilder.append("                 AND (LD_CSF_TRACKER_T.EMPLID = LD_BCN_INTINCBNT_T.EMPLID)\n");
071             sqlBuilder.append("                 AND (LD_CSF_TRACKER_T.POS_CSF_DELETE_CD = ?)))\n");
072             String sqlString = sqlBuilder.toString();
073             getSimpleJdbcTemplate().update(sqlString,baseFiscalYear,BCConstants.ACTIVE_CSF_DELETE_CODE);
074    
075             sqlBuilder.delete(0, sqlBuilder.length());
076             /**
077              *  constants for intended incumbent
078              *  the "classification ID" is an IU-specific field that refers to faculty titles.  we default it below.
079              *  positions allowed in budget construction are those that are active in the current fiscal year, those that start
080              *  July 1 of the coming fiscal year, or, if the person is a 10-month appointee, those that start on August 1 of the
081              *  coming fiscal year.
082              */
083             String defaultClassificationId = new String("TL");
084             GregorianCalendar calendarJuly1 = new GregorianCalendar(baseFiscalYear, Calendar.JULY, 1);
085             GregorianCalendar calendarAugust1 = new GregorianCalendar(baseFiscalYear, Calendar.AUGUST, 1);
086             Date julyFirst = new Date(calendarJuly1.getTimeInMillis());
087             Date augustFirst = new Date(calendarAugust1.getTimeInMillis());
088             /**
089              *  this SQL is unrealistic, but tries to provide decent test data that will cover most cases.
090              *  the "in-line view" is required because of the OBJ_ID, which frustrates using a DISTINCT directly.
091              *  intended incumbent has only one row per person in real life.  the position is the "principal job" in
092              *  PeopleSoft, where people can have secondary appointments in other positions.  the fields to implement
093              *  this are not included in Kuali--hence our need to arbitrarily choose the highest position in sort order.
094              *  the DISTINCT is necessary, because CSF can have more than one accounting line per person with the same
095              *  position.  that, unlike secondary jobs, is a common occurrence. 
096              *  in addition, the check for an "August 1" fiscal year is only done at IU for academic-year (10-pay) appointments 
097              *  the alias "makeUnique" for the in-line view is required by MySQL (but not by Oracle).
098              */
099             sqlBuilder.append("INSERT INTO LD_BCN_INTINCBNT_T\n");
100             sqlBuilder.append("(EMPLID, PERSON_NM, SETID_SALARY, SAL_ADMIN_PLAN, GRADE, IU_CLASSIF_LEVEL, ACTV_IND)\n");
101             sqlBuilder.append("(SELECT EMPLID, PERSON_NM, BUSINESS_UNIT, POS_SAL_PLAN_DFLT, POS_GRADE_DFLT, ?, 'Y'\n"); 
102             sqlBuilder.append("FROM\n");
103             sqlBuilder.append("(SELECT DISTINCT csf.EMPLID,\n");
104             sqlBuilder.append("        CONCAT(CONCAT(csf.EMPLID,' LastNm HR'),CONCAT(', ',CONCAT(csf.EMPLID,' 1stNm HR'))) AS PERSON_NM,\n");
105             sqlBuilder.append("        pos.BUSINESS_UNIT,\n");
106             sqlBuilder.append("        pos.POS_SAL_PLAN_DFLT,\n");
107             sqlBuilder.append("        pos.POS_GRADE_DFLT\n");
108             sqlBuilder.append(" FROM LD_CSF_TRACKER_T csf,\n");
109             sqlBuilder.append(" PS_POSITION_DATA pos\n");
110             sqlBuilder.append(" WHERE (csf.UNIV_FISCAL_YR = ?)\n");
111             sqlBuilder.append("   AND (csf.POS_CSF_DELETE_CD = ?)\n");
112             sqlBuilder.append("   AND (csf.POSITION_NBR = pos.POSITION_NBR)\n");
113             sqlBuilder.append("   AND  ((pos.EFFDT <= ?) OR (pos.EFFDT = ?))\n");
114             sqlBuilder.append("   AND (NOT EXISTS (SELECT 1\n");
115             sqlBuilder.append("                    FROM PS_POSITION_DATA pox\n");
116             sqlBuilder.append("                    WHERE (pos.POSITION_NBR = pox.POSITION_NBR)\n");
117             sqlBuilder.append("                      AND (pos.EFFDT < pox.EFFDT)\n");
118             sqlBuilder.append("                      AND ((pox.EFFDT <= ?) OR (pox.EFFDT = ?))))\n");
119             sqlBuilder.append("   AND (NOT EXISTS (SELECT 1\n");
120             sqlBuilder.append("                    FROM LD_CSF_TRACKER_T cfx\n");
121             sqlBuilder.append("                    WHERE (csf.UNIV_FISCAL_YR = cfx.UNIV_FISCAL_YR)\n");
122             sqlBuilder.append("                      AND (csf.EMPLID = cfx.EMPLID)\n");
123             sqlBuilder.append("                      AND (cfx.POS_CSF_DELETE_CD = ?)\n");
124             sqlBuilder.append("                      AND (csf.POSITION_NBR < cfx.POSITION_NBR)))) makeUnique)\n");
125             
126             sqlString = sqlBuilder.toString();
127             Object[] sqlArgumentList = {defaultClassificationId,baseFiscalYear,BCConstants.ACTIVE_CSF_DELETE_CODE,julyFirst,augustFirst,julyFirst,augustFirst,BCConstants.ACTIVE_CSF_DELETE_CODE};
128             int[] sqlArgumentTypes = {Types.VARCHAR,Types.INTEGER,Types.VARCHAR,Types.DATE,Types.DATE,Types.DATE,Types.DATE,Types.VARCHAR};
129             getSimpleJdbcTemplate().update(sqlString,sqlArgumentList);
130    //         getSimpleJdbcTemplate().getJdbcOperations().update(sqlString,sqlArgumentList,sqlArgumentTypes);
131        }
132    /**
133     * 
134     * @see org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao#buildBudgetConstructionIntendedIncumbentWithFacultyAttributes(java.lang.Integer)
135     */    
136        public void buildBudgetConstructionIntendedIncumbentWithFacultyAttributes (Integer requestFiscalYear)
137        {
138             // this method is the same as buildBudgetConstructionIntendedIncumbent in the default interface.
139             // to update faculty ranks, one would modify buildBudgetConstructionIntendedIncumbent so the defaultClassifictaionId for faculty incumbents corresponded to the appropriate faculty level.
140             this.buildBudgetConstructionIntendedIncumbent(requestFiscalYear);
141        }
142    
143        /**
144         * 
145         * @see org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao#buildBudgetConstructionPositionBaseYear(java.lang.Integer)
146         */
147        public void buildBudgetConstructionPositionBaseYear(Integer baseFiscalYear) {
148            StringBuilder sqlBuilder = new StringBuilder(2000);
149            String defaultRCCd = new String("--");
150            /**
151             *  we have to do this because imbedding a constant string in SQL assumes a string delimiter--that can vary with the DBMS 
152             */
153            String orgSeparator = new String("-");
154            GregorianCalendar calendarJuly1 = new GregorianCalendar(baseFiscalYear, Calendar.JULY, 1);
155            Date julyFirst = new Date(calendarJuly1.getTimeInMillis());
156            /**
157             * first, delete everything for the base year--we will refresh it in case the position has changed
158             */
159            sqlBuilder.append("DELETE FROM LD_BCN_POS_T\n");
160            sqlBuilder.append("WHERE (UNIV_FISCAL_YR = ?)\n");
161            sqlBuilder.append("  AND (EXISTS (SELECT 1\n"); 
162            sqlBuilder.append("               FROM LD_CSF_TRACKER_T\n"); 
163            sqlBuilder.append("               WHERE (LD_CSF_TRACKER_T.UNIV_FISCAL_YR = ?)\n");
164            sqlBuilder.append("                 AND (LD_CSF_TRACKER_T.POSITION_NBR = LD_BCN_POS_T.POSITION_NBR)\n");
165            sqlBuilder.append("                 AND (LD_CSF_TRACKER_T.POS_CSF_DELETE_CD = ?)))\n");
166            String sqlString = sqlBuilder.toString();
167            getSimpleJdbcTemplate().update(sqlString,baseFiscalYear,baseFiscalYear,BCConstants.ACTIVE_CSF_DELETE_CODE);
168            sqlBuilder.delete(0, sqlBuilder.length());
169            /**
170             * re-create the base year position data
171             * we take the latest position that is active BEFORE the coming fiscal year
172             */
173            sqlBuilder.append("INSERT INTO LD_BCN_POS_T\n");
174            sqlBuilder.append("(POSITION_NBR, UNIV_FISCAL_YR, POS_EFFDT, POS_EFF_STATUS, POSN_STATUS,\n");
175            sqlBuilder.append(" BUDGETED_POSN, CONFIDENTIAL_POSN, POS_STD_HRS_DFLT, POS_REG_TEMP, POS_FTE, POS_DESCR, SETID_DEPT, POS_DEPTID,\n"); 
176            sqlBuilder.append(" RC_CD, POS_SAL_PLAN_DFLT, POS_GRADE_DFLT, SETID_JOBCODE, JOBCODE, SETID_SALARY,\n");
177            sqlBuilder.append(" POS_LOCK_USR_ID)\n");
178            sqlBuilder.append("(SELECT px.POSITION_NBR,\n");
179            sqlBuilder.append("        ?, px.EFFDT, px.POS_EFF_STATUS,\n");
180            sqlBuilder.append("        px.POSN_STATUS, px.BUDGETED_POSN, 'N',\n");
181            sqlBuilder.append("        px.STD_HRS_DEFAULT, px.POS_REG_TEMP, px.POS_FTE, px.DESCR, px.BUSINESS_UNIT,\n");
182            sqlBuilder.append("        px.DEPTID, COALESCE(org.RC_CD,?),\n");
183            sqlBuilder.append("        px.POS_SAL_PLAN_DFLT, px.POS_GRADE_DFLT, px.BUSINESS_UNIT, px.JOBCODE,\n");
184            sqlBuilder.append("        px.BUSINESS_UNIT, ?\n");
185            sqlBuilder.append(" FROM PS_POSITION_DATA px LEFT OUTER JOIN LD_BCN_ORG_RPTS_T org\n"); 
186            sqlBuilder.append("      ON (CONCAT(CONCAT(org.FIN_COA_CD,?),org.ORG_CD) = px.DEPTID)\n");
187            sqlBuilder.append(" WHERE (px.EFFDT < ?)\n");
188            sqlBuilder.append("   AND (NOT EXISTS (SELECT 1\n");
189            sqlBuilder.append("                    FROM LD_BCN_POS_T\n");
190            sqlBuilder.append("                    WHERE (LD_BCN_POS_T.UNIV_FISCAL_YR = ?)\n");
191            sqlBuilder.append("                      AND (px.POSITION_NBR = LD_BCN_POS_T.POSITION_NBR)))\n");
192            sqlBuilder.append("   AND (NOT EXISTS (SELECT 1\n");
193            sqlBuilder.append("                    FROM PS_POSITION_DATA py\n");
194            sqlBuilder.append("                    WHERE (px.POSITION_NBR = py.POSITION_NBR)\n");
195            sqlBuilder.append("                      AND (py.EFFDT < ?)\n");
196            sqlBuilder.append("                      AND (px.EFFDT < py.EFFDT)))\n");
197            sqlBuilder.append("   AND (EXISTS (SELECT 1\n");
198            sqlBuilder.append("                FROM LD_CSF_TRACKER_T csf\n");
199            sqlBuilder.append("                WHERE (csf.UNIV_FISCAL_YR = ?)\n");
200            sqlBuilder.append("                  AND (csf.POS_CSF_DELETE_CD = ?)\n");
201            sqlBuilder.append("                  AND (csf.POSITION_NBR = px.POSITION_NBR))))\n");
202            sqlString = sqlBuilder.toString();
203            getSimpleJdbcTemplate().update(sqlString,baseFiscalYear,defaultRCCd,BCConstants.DEFAULT_BUDGET_HEADER_LOCK_IDS,orgSeparator,julyFirst,baseFiscalYear,julyFirst,baseFiscalYear,BCConstants.ACTIVE_CSF_DELETE_CODE);
204            // set the things that we'll need for testing but which we don't have enough information to set from the Kuali DB
205            // this code is obviously somewhat arbitrary--it should be replaced with institution-specific algorithms
206            setAcademicDefaultObjectClass(baseFiscalYear);
207            setMonthlyStaffOvertimeEligibleDefaultObjectClass(baseFiscalYear);
208            setMonthlyStaffOvertimeExemptDefaultObjectClass(baseFiscalYear);
209            setBiweeklyStaffDefaultObjectClass(baseFiscalYear);
210        }
211    
212        /**
213         * 
214         * @see org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao#buildBudgetConstructionPositonRequestYear(java.lang.Integer)
215         */
216        public void buildBudgetConstructionPositonRequestYear(Integer requestFiscalYear) {
217            StringBuilder sqlBuilder = new StringBuilder(2500);
218            // we build constants for DB independence.  we let the library decide how they should be represented in what is passed to the DB server
219            String defaultRCCd = new String("--");
220            String orgSeparator = new String("-");
221            Integer baseFiscalYear = requestFiscalYear-1;
222            GregorianCalendar calendarJuly1 = new GregorianCalendar(baseFiscalYear, Calendar.JULY, 1);
223            GregorianCalendar calendarAugust1 = new GregorianCalendar(baseFiscalYear, Calendar.AUGUST, 1);
224            Date julyFirst = new Date(calendarJuly1.getTimeInMillis());
225            Date augustFirst = new Date(calendarAugust1.getTimeInMillis());
226            String academicPositionType = new String("AC");
227            String academicTenureTrackSalaryPlan = new String("AC1");   
228            
229            sqlBuilder.append("INSERT INTO LD_BCN_POS_T\n");
230            sqlBuilder.append("(POSITION_NBR, UNIV_FISCAL_YR, POS_EFFDT, POS_EFF_STATUS, POSN_STATUS,\n");
231            sqlBuilder.append(" BUDGETED_POSN, CONFIDENTIAL_POSN, POS_STD_HRS_DFLT, POS_REG_TEMP, POS_FTE, POS_DESCR, SETID_DEPT, POS_DEPTID,\n"); 
232            sqlBuilder.append(" RC_CD, POS_SAL_PLAN_DFLT, POS_GRADE_DFLT, SETID_JOBCODE, JOBCODE, SETID_SALARY,\n");
233            sqlBuilder.append(" POS_LOCK_USR_ID)\n");
234            sqlBuilder.append("(SELECT px.POSITION_NBR,\n");
235            sqlBuilder.append("        ?, px.EFFDT, px.POS_EFF_STATUS,\n");
236            sqlBuilder.append("        px.POSN_STATUS, px.BUDGETED_POSN, 'N',\n");
237            sqlBuilder.append("        px.STD_HRS_DEFAULT, px.POS_REG_TEMP, px.POS_FTE, px.DESCR, px.BUSINESS_UNIT,\n");
238            sqlBuilder.append("        px.DEPTID, COALESCE(org.RC_CD,?),\n");
239            sqlBuilder.append("        px.POS_SAL_PLAN_DFLT, px.POS_GRADE_DFLT, px.BUSINESS_UNIT, px.JOBCODE,\n");
240            sqlBuilder.append("        px.BUSINESS_UNIT, ?\n");
241            sqlBuilder.append(" FROM PS_POSITION_DATA px LEFT OUTER JOIN LD_BCN_ORG_RPTS_T org\n"); 
242            sqlBuilder.append("      ON (CONCAT(CONCAT(org.FIN_COA_CD,?),org.ORG_CD) = px.DEPTID)\n");
243            sqlBuilder.append(" WHERE ((px.EFFDT <= ?) OR ((px.EFFDT = ?) AND (px.POS_SAL_PLAN_DFLT = ?)))\n");
244            sqlBuilder.append("   AND (NOT EXISTS (SELECT 1\n");
245            sqlBuilder.append("                    FROM LD_BCN_POS_T\n");
246            sqlBuilder.append("                    WHERE (LD_BCN_POS_T.UNIV_FISCAL_YR = ?)\n");
247            sqlBuilder.append("                      AND (px.POSITION_NBR = LD_BCN_POS_T.POSITION_NBR)))\n");
248            sqlBuilder.append("   AND (NOT EXISTS (SELECT 1\n");
249            sqlBuilder.append("                    FROM PS_POSITION_DATA py\n");
250            sqlBuilder.append("                    WHERE (px.POSITION_NBR = py.POSITION_NBR)\n");
251            sqlBuilder.append("                      AND ((py.EFFDT <= ?) OR ((py.EFFDT = ?) AND (px.POS_SAL_PLAN_DFLT = ?)))\n");
252            sqlBuilder.append("                      AND (px.EFFDT < py.EFFDT)))\n");
253            sqlBuilder.append("   AND (EXISTS (SELECT 1\n");
254            sqlBuilder.append("                FROM LD_CSF_TRACKER_T csf\n");
255            sqlBuilder.append("                WHERE (csf.UNIV_FISCAL_YR = ?)\n");
256            sqlBuilder.append("                  AND (csf.POS_CSF_DELETE_CD = ?)\n");
257            sqlBuilder.append("                  AND (csf.POSITION_NBR = px.POSITION_NBR))))\n");
258            String sqlString = sqlBuilder.toString();
259            getSimpleJdbcTemplate().update(sqlString,requestFiscalYear,defaultRCCd,BCConstants.DEFAULT_BUDGET_HEADER_LOCK_IDS,orgSeparator,julyFirst,augustFirst,academicTenureTrackSalaryPlan,requestFiscalYear,julyFirst,augustFirst,academicTenureTrackSalaryPlan,baseFiscalYear,BCConstants.ACTIVE_CSF_DELETE_CODE);
260            // set the things that we'll need for testing but which we don't have enough information to set from the Kuali DB
261            // this code is obviously somewhat arbitrary--it should be replaced with institution-specific algorithms
262            setAcademicDefaultObjectClass(requestFiscalYear);
263            setMonthlyStaffOvertimeEligibleDefaultObjectClass(requestFiscalYear);
264            setMonthlyStaffOvertimeExemptDefaultObjectClass(requestFiscalYear);
265            setBiweeklyStaffDefaultObjectClass(requestFiscalYear);
266        }
267        
268        /**
269         *   At IU, there is a concept of normal work months and pay months.  For example, one can theoretically be in a 12-month position
270         *   but only work during a 10-month academic year for some reason.  This situation would make the "full time equivalent" for that
271         *   person (assuming she works a 40-hour week during the 10 months) 10/12 or .893333....
272         *   Each position is supposed to have an object class.  No one should be able to budget a given position in a different object
273         *   class, because that would break the "object level" reporting in accounting that gives totals for "academic salaries", etc.
274         *   In this placeholder code, we set these based on the salary plan and the position type.  At IU, there is a table containing salary plan and 
275         *   grade that is shared by payroll and the budget to mandate the object class used for salary funding.
276         */
277        protected void setAcademicDefaultObjectClass(Integer fiscalYear)
278        {
279            // build constants for DB independence
280            Integer monthConstant = new Integer(10);
281            String positionType  = new String("AC");
282            String defaultObject = new String("2000");
283            String salaryPlan    = new String("AC1");
284            StringBuilder sqlBuilder = new StringBuilder(500);
285            sqlBuilder.append("UPDATE LD_BCN_POS_T\n");
286            sqlBuilder.append("SET IU_NORM_WORK_MONTHS = ?,\n");
287            sqlBuilder.append("    IU_PAY_MONTHS = ?,\n");
288            sqlBuilder.append("    IU_POSITION_TYPE = ?,\n");
289            sqlBuilder.append("    IU_DFLT_OBJ_CD = ?\n");
290            sqlBuilder.append("WHERE (UNIV_FISCAL_YR = ?)\n");
291            sqlBuilder.append("  AND (POS_SAL_PLAN_DFLT = ?)");
292            String sqlString = sqlBuilder.toString();
293            getSimpleJdbcTemplate().update(sqlString,monthConstant,monthConstant,positionType,defaultObject,fiscalYear,salaryPlan);
294        }
295        protected void setMonthlyStaffOvertimeEligibleDefaultObjectClass(Integer fiscalYear)
296        {
297            // build constants for DB independence
298            Integer monthConstant = new Integer(12);
299            String positionType  = new String("SM");
300            String defaultObject = new String("2480");
301            String[] salaryPlan = {new String("PAO"), new String("PAU")};
302            StringBuilder sqlBuilder = new StringBuilder(500);
303            sqlBuilder.append("UPDATE LD_BCN_POS_T\n");
304            sqlBuilder.append("SET IU_NORM_WORK_MONTHS = ?,\n");
305            sqlBuilder.append("    IU_PAY_MONTHS = ?,\n");
306            sqlBuilder.append("    IU_POSITION_TYPE = ?,\n");
307            sqlBuilder.append("    IU_DFLT_OBJ_CD = ?\n");
308            sqlBuilder.append("WHERE (UNIV_FISCAL_YR = ?)\n");
309            sqlBuilder.append("  AND (POS_SAL_PLAN_DFLT IN (?,?))\n");
310            String sqlString = sqlBuilder.toString();
311            getSimpleJdbcTemplate().update(sqlString,monthConstant,monthConstant,positionType,defaultObject,fiscalYear,salaryPlan[0],salaryPlan[1]);
312        }
313    
314        protected void setMonthlyStaffOvertimeExemptDefaultObjectClass(Integer fiscalYear)
315        {
316            // build constants for DB independence
317            // (note that this uses a pattern, and therefore assumes that any specific position types beginning with 'P' that go to
318            //  a different default object class have already been assigned)
319            Integer monthConstant = new Integer(12);
320            String  positionType  = new String("SM");
321            String  defaultObject = new String("2400");
322            String  salaryPlan    = new String("P%");
323            StringBuilder sqlBuilder = new StringBuilder(500);
324            sqlBuilder.append("UPDATE LD_BCN_POS_T\n");
325            sqlBuilder.append("SET IU_NORM_WORK_MONTHS = ?,\n");
326            sqlBuilder.append("    IU_PAY_MONTHS = ?,\n");
327            sqlBuilder.append("    IU_POSITION_TYPE = ?,\n");
328            sqlBuilder.append("    IU_DFLT_OBJ_CD = ?\n");
329            sqlBuilder.append("WHERE (UNIV_FISCAL_YR = ?)\n");
330            sqlBuilder.append("  AND (POS_SAL_PLAN_DFLT LIKE ?)\n");
331            sqlBuilder.append("  AND (IU_DFLT_OBJ_CD IS NULL)\n");
332            String sqlString = sqlBuilder.toString();
333            getSimpleJdbcTemplate().update(sqlString,monthConstant,monthConstant,positionType,defaultObject,fiscalYear,salaryPlan);
334        }
335        
336        protected void setBiweeklyStaffDefaultObjectClass(Integer fiscalYear)
337        {
338            // build constants for DB independence
339            // (note that we are only assigning default object codes to positions not yet assigned a default.  so, this method must
340            //  be called last.  In particular, there is no check on salary plan.)
341            Integer monthConstant    = new Integer(12);
342            String  positionType     = new String("SB");
343            String  defaultObject    = new String("2500");
344            String  defaultUnionCode = new String("B1");
345            StringBuilder sqlBuilder = new StringBuilder(500);
346            sqlBuilder.append("UPDATE LD_BCN_POS_T\n");
347            sqlBuilder.append("SET IU_NORM_WORK_MONTHS = ?,\n");
348            sqlBuilder.append("    IU_PAY_MONTHS = ?,\n");
349            sqlBuilder.append("    IU_POSITION_TYPE = ?,\n");
350            sqlBuilder.append("    POS_UNION_CD = ?,\n");
351            sqlBuilder.append("    IU_DFLT_OBJ_CD = ?\n");
352            sqlBuilder.append("WHERE (UNIV_FISCAL_YR = ?)\n");
353            sqlBuilder.append("  AND (IU_DFLT_OBJ_CD IS NULL)\n");
354            String sqlString = sqlBuilder.toString();
355            getSimpleJdbcTemplate().update(sqlString,monthConstant,monthConstant,positionType,defaultUnionCode,defaultObject,fiscalYear);
356        }
357        
358        /**
359         * 
360         * @see org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao#updateNamesInBudgetConstructionIntendedIncumbent()
361         */
362        public void updateNamesInBudgetConstructionIntendedIncumbent()
363        {
364            // do nothing in the default: the names are added in the build routines
365        }
366    }