View Javadoc
1   /*
2    * The Kuali Financial System, a comprehensive financial management system for higher education.
3    * 
4    * Copyright 2005-2014 The Kuali Foundation
5    * 
6    * This program is free software: you can redistribute it and/or modify
7    * it under the terms of the GNU Affero General Public License as
8    * published by the Free Software Foundation, either version 3 of the
9    * License, or (at your option) any later version.
10   * 
11   * This program is distributed in the hope that it will be useful,
12   * but WITHOUT ANY WARRANTY; without even the implied warranty of
13   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14   * GNU Affero General Public License for more details.
15   * 
16   * You should have received a copy of the GNU Affero General Public License
17   * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18   */
19  package org.kuali.kfs.module.bc.batch.dataaccess.impl;
20  
21  import java.sql.Date;
22  import java.sql.Types;
23  import java.util.Calendar;
24  import java.util.GregorianCalendar;
25  
26  import org.kuali.kfs.module.bc.BCConstants;
27  import org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao;
28  import org.kuali.kfs.module.bc.document.dataaccess.impl.BudgetConstructionDaoJdbcBase;
29  
30  
31  
32  public class BudgetConstructionHumanResourcesPayrollInterfaceDaoJdbc extends BudgetConstructionDaoJdbcBase implements BudgetConstructionHumanResourcesPayrollInterfaceDao {
33      /**
34       * 
35       * @see org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao#buildBudgetConstructionAdministrativePosts(java.lang.Integer)
36       */
37      public void buildBudgetConstructionAdministrativePosts() {
38        /**
39         * this unrealistic implementation will simply clean out what is already there
40         */
41         String sqlString = new String("DELETE FROM LD_BCN_ADM_POST_T\n");
42         getSimpleJdbcTemplate().update(sqlString);
43      }
44  
45      /**
46       * 
47       * @see org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao#buildBudgetConstructionAppointmentFundingReasons(java.lang.Integer)
48       */
49      public void buildBudgetConstructionAppointmentFundingReasons(Integer requestFiscalYear) {
50          /**
51           * this unrealistic implementation will simply clean out what is already there
52           */
53           String sqlString = new String("DELETE FROM LD_BCN_AF_REASON_T WHERE (UNIV_FISCAL_YR = ?)\n");
54           getSimpleJdbcTemplate().update(sqlString,requestFiscalYear);
55      }
56  
57      /**
58       * 
59       * @see org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao#buildBudgetConstructionIntendedIncumbent(java.lang.Integer)
60       */
61      public void buildBudgetConstructionIntendedIncumbent(Integer requestFiscalYear) {
62          /**
63           * this unrealistic implementation will refresh all incumbents who presently exist in the CSF tracker, but
64           * leave any who no longer do in place.
65           */
66          Integer baseFiscalYear = requestFiscalYear - 1;
67           StringBuilder sqlBuilder = new StringBuilder(1500);
68           sqlBuilder.append("DELETE FROM LD_BCN_INTINCBNT_T\n");
69           sqlBuilder.append("WHERE (EXISTS (SELECT 1\n");
70           sqlBuilder.append("               FROM LD_CSF_TRACKER_T\n");
71           sqlBuilder.append("               WHERE (LD_CSF_TRACKER_T.UNIV_FISCAL_YR = ?)\n");
72           sqlBuilder.append("                 AND (LD_CSF_TRACKER_T.EMPLID = LD_BCN_INTINCBNT_T.EMPLID)\n");
73           sqlBuilder.append("                 AND (LD_CSF_TRACKER_T.POS_CSF_DELETE_CD = ?)))\n");
74           String sqlString = sqlBuilder.toString();
75           getSimpleJdbcTemplate().update(sqlString,baseFiscalYear,BCConstants.ACTIVE_CSF_DELETE_CODE);
76  
77           sqlBuilder.delete(0, sqlBuilder.length());
78           /**
79            *  constants for intended incumbent
80            *  the "classification ID" is an IU-specific field that refers to faculty titles.  we default it below.
81            *  positions allowed in budget construction are those that are active in the current fiscal year, those that start
82            *  July 1 of the coming fiscal year, or, if the person is a 10-month appointee, those that start on August 1 of the
83            *  coming fiscal year.
84            */
85           String defaultClassificationId = new String("TL");
86           GregorianCalendar calendarJuly1 = new GregorianCalendar(baseFiscalYear, Calendar.JULY, 1);
87           GregorianCalendar calendarAugust1 = new GregorianCalendar(baseFiscalYear, Calendar.AUGUST, 1);
88           Date julyFirst = new Date(calendarJuly1.getTimeInMillis());
89           Date augustFirst = new Date(calendarAugust1.getTimeInMillis());
90           /**
91            *  this SQL is unrealistic, but tries to provide decent test data that will cover most cases.
92            *  the "in-line view" is required because of the OBJ_ID, which frustrates using a DISTINCT directly.
93            *  intended incumbent has only one row per person in real life.  the position is the "principal job" in
94            *  PeopleSoft, where people can have secondary appointments in other positions.  the fields to implement
95            *  this are not included in Kuali--hence our need to arbitrarily choose the highest position in sort order.
96            *  the DISTINCT is necessary, because CSF can have more than one accounting line per person with the same
97            *  position.  that, unlike secondary jobs, is a common occurrence. 
98            *  in addition, the check for an "August 1" fiscal year is only done at IU for academic-year (10-pay) appointments 
99            *  the alias "makeUnique" for the in-line view is required by MySQL (but not by Oracle).
100           */
101          sqlBuilder.append("INSERT INTO LD_BCN_INTINCBNT_T\n");
102          sqlBuilder.append("(EMPLID, PERSON_NM, SETID_SALARY, SAL_ADMIN_PLAN, GRADE, IU_CLASSIF_LEVEL, ACTV_IND)\n");
103          sqlBuilder.append("(SELECT EMPLID, PERSON_NM, BUSINESS_UNIT, POS_SAL_PLAN_DFLT, POS_GRADE_DFLT, ?, 'Y'\n"); 
104          sqlBuilder.append("FROM\n");
105          sqlBuilder.append("(SELECT DISTINCT csf.EMPLID,\n");
106          sqlBuilder.append("        CONCAT(CONCAT(csf.EMPLID,' LastNm HR'),CONCAT(', ',CONCAT(csf.EMPLID,' 1stNm HR'))) AS PERSON_NM,\n");
107          sqlBuilder.append("        pos.BUSINESS_UNIT,\n");
108          sqlBuilder.append("        pos.POS_SAL_PLAN_DFLT,\n");
109          sqlBuilder.append("        pos.POS_GRADE_DFLT\n");
110          sqlBuilder.append(" FROM LD_CSF_TRACKER_T csf,\n");
111          sqlBuilder.append(" PS_POSITION_DATA pos\n");
112          sqlBuilder.append(" WHERE (csf.UNIV_FISCAL_YR = ?)\n");
113          sqlBuilder.append("   AND (csf.POS_CSF_DELETE_CD = ?)\n");
114          sqlBuilder.append("   AND (csf.POSITION_NBR = pos.POSITION_NBR)\n");
115          sqlBuilder.append("   AND  ((pos.EFFDT <= ?) OR (pos.EFFDT = ?))\n");
116          sqlBuilder.append("   AND (NOT EXISTS (SELECT 1\n");
117          sqlBuilder.append("                    FROM PS_POSITION_DATA pox\n");
118          sqlBuilder.append("                    WHERE (pos.POSITION_NBR = pox.POSITION_NBR)\n");
119          sqlBuilder.append("                      AND (pos.EFFDT < pox.EFFDT)\n");
120          sqlBuilder.append("                      AND ((pox.EFFDT <= ?) OR (pox.EFFDT = ?))))\n");
121          sqlBuilder.append("   AND (NOT EXISTS (SELECT 1\n");
122          sqlBuilder.append("                    FROM LD_CSF_TRACKER_T cfx\n");
123          sqlBuilder.append("                    WHERE (csf.UNIV_FISCAL_YR = cfx.UNIV_FISCAL_YR)\n");
124          sqlBuilder.append("                      AND (csf.EMPLID = cfx.EMPLID)\n");
125          sqlBuilder.append("                      AND (cfx.POS_CSF_DELETE_CD = ?)\n");
126          sqlBuilder.append("                      AND (csf.POSITION_NBR < cfx.POSITION_NBR)))) makeUnique)\n");
127          
128          sqlString = sqlBuilder.toString();
129          Object[] sqlArgumentList = {defaultClassificationId,baseFiscalYear,BCConstants.ACTIVE_CSF_DELETE_CODE,julyFirst,augustFirst,julyFirst,augustFirst,BCConstants.ACTIVE_CSF_DELETE_CODE};
130          int[] sqlArgumentTypes = {Types.VARCHAR,Types.INTEGER,Types.VARCHAR,Types.DATE,Types.DATE,Types.DATE,Types.DATE,Types.VARCHAR};
131          getSimpleJdbcTemplate().update(sqlString,sqlArgumentList);
132 //         getSimpleJdbcTemplate().getJdbcOperations().update(sqlString,sqlArgumentList,sqlArgumentTypes);
133     }
134 /**
135  * 
136  * @see org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao#buildBudgetConstructionIntendedIncumbentWithFacultyAttributes(java.lang.Integer)
137  */    
138     public void buildBudgetConstructionIntendedIncumbentWithFacultyAttributes (Integer requestFiscalYear)
139     {
140          // this method is the same as buildBudgetConstructionIntendedIncumbent in the default interface.
141          // to update faculty ranks, one would modify buildBudgetConstructionIntendedIncumbent so the defaultClassifictaionId for faculty incumbents corresponded to the appropriate faculty level.
142          this.buildBudgetConstructionIntendedIncumbent(requestFiscalYear);
143     }
144 
145     /**
146      * 
147      * @see org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao#buildBudgetConstructionPositionBaseYear(java.lang.Integer)
148      */
149     public void buildBudgetConstructionPositionBaseYear(Integer baseFiscalYear) {
150         StringBuilder sqlBuilder = new StringBuilder(2000);
151         String defaultRCCd = new String("--");
152         /**
153          *  we have to do this because imbedding a constant string in SQL assumes a string delimiter--that can vary with the DBMS 
154          */
155         String orgSeparator = new String("-");
156         GregorianCalendar calendarJuly1 = new GregorianCalendar(baseFiscalYear, Calendar.JULY, 1);
157         Date julyFirst = new Date(calendarJuly1.getTimeInMillis());
158         /**
159          * first, delete everything for the base year--we will refresh it in case the position has changed
160          */
161         sqlBuilder.append("DELETE FROM LD_BCN_POS_T\n");
162         sqlBuilder.append("WHERE (UNIV_FISCAL_YR = ?)\n");
163         sqlBuilder.append("  AND (EXISTS (SELECT 1\n"); 
164         sqlBuilder.append("               FROM LD_CSF_TRACKER_T\n"); 
165         sqlBuilder.append("               WHERE (LD_CSF_TRACKER_T.UNIV_FISCAL_YR = ?)\n");
166         sqlBuilder.append("                 AND (LD_CSF_TRACKER_T.POSITION_NBR = LD_BCN_POS_T.POSITION_NBR)\n");
167         sqlBuilder.append("                 AND (LD_CSF_TRACKER_T.POS_CSF_DELETE_CD = ?)))\n");
168         String sqlString = sqlBuilder.toString();
169         getSimpleJdbcTemplate().update(sqlString,baseFiscalYear,baseFiscalYear,BCConstants.ACTIVE_CSF_DELETE_CODE);
170         sqlBuilder.delete(0, sqlBuilder.length());
171         /**
172          * re-create the base year position data
173          * we take the latest position that is active BEFORE the coming fiscal year
174          */
175         sqlBuilder.append("INSERT INTO LD_BCN_POS_T\n");
176         sqlBuilder.append("(POSITION_NBR, UNIV_FISCAL_YR, POS_EFFDT, POS_EFF_STATUS, POSN_STATUS,\n");
177         sqlBuilder.append(" BUDGETED_POSN, CONFIDENTIAL_POSN, POS_STD_HRS_DFLT, POS_REG_TEMP, POS_FTE, POS_DESCR, SETID_DEPT, POS_DEPTID,\n"); 
178         sqlBuilder.append(" RC_CD, POS_SAL_PLAN_DFLT, POS_GRADE_DFLT, SETID_JOBCODE, JOBCODE, SETID_SALARY,\n");
179         sqlBuilder.append(" POS_LOCK_USR_ID)\n");
180         sqlBuilder.append("(SELECT px.POSITION_NBR,\n");
181         sqlBuilder.append("        ?, px.EFFDT, px.POS_EFF_STATUS,\n");
182         sqlBuilder.append("        px.POSN_STATUS, px.BUDGETED_POSN, 'N',\n");
183         sqlBuilder.append("        px.STD_HRS_DEFAULT, px.POS_REG_TEMP, px.POS_FTE, px.DESCR, px.BUSINESS_UNIT,\n");
184         sqlBuilder.append("        px.DEPTID, COALESCE(org.RC_CD,?),\n");
185         sqlBuilder.append("        px.POS_SAL_PLAN_DFLT, px.POS_GRADE_DFLT, px.BUSINESS_UNIT, px.JOBCODE,\n");
186         sqlBuilder.append("        px.BUSINESS_UNIT, ?\n");
187         sqlBuilder.append(" FROM PS_POSITION_DATA px LEFT OUTER JOIN LD_BCN_ORG_RPTS_T org\n"); 
188         sqlBuilder.append("      ON (CONCAT(CONCAT(org.FIN_COA_CD,?),org.ORG_CD) = px.DEPTID)\n");
189         sqlBuilder.append(" WHERE (px.EFFDT < ?)\n");
190         sqlBuilder.append("   AND (NOT EXISTS (SELECT 1\n");
191         sqlBuilder.append("                    FROM LD_BCN_POS_T\n");
192         sqlBuilder.append("                    WHERE (LD_BCN_POS_T.UNIV_FISCAL_YR = ?)\n");
193         sqlBuilder.append("                      AND (px.POSITION_NBR = LD_BCN_POS_T.POSITION_NBR)))\n");
194         sqlBuilder.append("   AND (NOT EXISTS (SELECT 1\n");
195         sqlBuilder.append("                    FROM PS_POSITION_DATA py\n");
196         sqlBuilder.append("                    WHERE (px.POSITION_NBR = py.POSITION_NBR)\n");
197         sqlBuilder.append("                      AND (py.EFFDT < ?)\n");
198         sqlBuilder.append("                      AND (px.EFFDT < py.EFFDT)))\n");
199         sqlBuilder.append("   AND (EXISTS (SELECT 1\n");
200         sqlBuilder.append("                FROM LD_CSF_TRACKER_T csf\n");
201         sqlBuilder.append("                WHERE (csf.UNIV_FISCAL_YR = ?)\n");
202         sqlBuilder.append("                  AND (csf.POS_CSF_DELETE_CD = ?)\n");
203         sqlBuilder.append("                  AND (csf.POSITION_NBR = px.POSITION_NBR))))\n");
204         sqlString = sqlBuilder.toString();
205         getSimpleJdbcTemplate().update(sqlString,baseFiscalYear,defaultRCCd,BCConstants.DEFAULT_BUDGET_HEADER_LOCK_IDS,orgSeparator,julyFirst,baseFiscalYear,julyFirst,baseFiscalYear,BCConstants.ACTIVE_CSF_DELETE_CODE);
206         // set the things that we'll need for testing but which we don't have enough information to set from the Kuali DB
207         // this code is obviously somewhat arbitrary--it should be replaced with institution-specific algorithms
208         setAcademicDefaultObjectClass(baseFiscalYear);
209         setMonthlyStaffOvertimeEligibleDefaultObjectClass(baseFiscalYear);
210         setMonthlyStaffOvertimeExemptDefaultObjectClass(baseFiscalYear);
211         setBiweeklyStaffDefaultObjectClass(baseFiscalYear);
212     }
213 
214     /**
215      * 
216      * @see org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao#buildBudgetConstructionPositonRequestYear(java.lang.Integer)
217      */
218     public void buildBudgetConstructionPositonRequestYear(Integer requestFiscalYear) {
219         StringBuilder sqlBuilder = new StringBuilder(2500);
220         // we build constants for DB independence.  we let the library decide how they should be represented in what is passed to the DB server
221         String defaultRCCd = new String("--");
222         String orgSeparator = new String("-");
223         Integer baseFiscalYear = requestFiscalYear-1;
224         GregorianCalendar calendarJuly1 = new GregorianCalendar(baseFiscalYear, Calendar.JULY, 1);
225         GregorianCalendar calendarAugust1 = new GregorianCalendar(baseFiscalYear, Calendar.AUGUST, 1);
226         Date julyFirst = new Date(calendarJuly1.getTimeInMillis());
227         Date augustFirst = new Date(calendarAugust1.getTimeInMillis());
228         String academicPositionType = new String("AC");
229         String academicTenureTrackSalaryPlan = new String("AC1");   
230         
231         sqlBuilder.append("INSERT INTO LD_BCN_POS_T\n");
232         sqlBuilder.append("(POSITION_NBR, UNIV_FISCAL_YR, POS_EFFDT, POS_EFF_STATUS, POSN_STATUS,\n");
233         sqlBuilder.append(" BUDGETED_POSN, CONFIDENTIAL_POSN, POS_STD_HRS_DFLT, POS_REG_TEMP, POS_FTE, POS_DESCR, SETID_DEPT, POS_DEPTID,\n"); 
234         sqlBuilder.append(" RC_CD, POS_SAL_PLAN_DFLT, POS_GRADE_DFLT, SETID_JOBCODE, JOBCODE, SETID_SALARY,\n");
235         sqlBuilder.append(" POS_LOCK_USR_ID)\n");
236         sqlBuilder.append("(SELECT px.POSITION_NBR,\n");
237         sqlBuilder.append("        ?, px.EFFDT, px.POS_EFF_STATUS,\n");
238         sqlBuilder.append("        px.POSN_STATUS, px.BUDGETED_POSN, 'N',\n");
239         sqlBuilder.append("        px.STD_HRS_DEFAULT, px.POS_REG_TEMP, px.POS_FTE, px.DESCR, px.BUSINESS_UNIT,\n");
240         sqlBuilder.append("        px.DEPTID, COALESCE(org.RC_CD,?),\n");
241         sqlBuilder.append("        px.POS_SAL_PLAN_DFLT, px.POS_GRADE_DFLT, px.BUSINESS_UNIT, px.JOBCODE,\n");
242         sqlBuilder.append("        px.BUSINESS_UNIT, ?\n");
243         sqlBuilder.append(" FROM PS_POSITION_DATA px LEFT OUTER JOIN LD_BCN_ORG_RPTS_T org\n"); 
244         sqlBuilder.append("      ON (CONCAT(CONCAT(org.FIN_COA_CD,?),org.ORG_CD) = px.DEPTID)\n");
245         sqlBuilder.append(" WHERE ((px.EFFDT <= ?) OR ((px.EFFDT = ?) AND (px.POS_SAL_PLAN_DFLT = ?)))\n");
246         sqlBuilder.append("   AND (NOT EXISTS (SELECT 1\n");
247         sqlBuilder.append("                    FROM LD_BCN_POS_T\n");
248         sqlBuilder.append("                    WHERE (LD_BCN_POS_T.UNIV_FISCAL_YR = ?)\n");
249         sqlBuilder.append("                      AND (px.POSITION_NBR = LD_BCN_POS_T.POSITION_NBR)))\n");
250         sqlBuilder.append("   AND (NOT EXISTS (SELECT 1\n");
251         sqlBuilder.append("                    FROM PS_POSITION_DATA py\n");
252         sqlBuilder.append("                    WHERE (px.POSITION_NBR = py.POSITION_NBR)\n");
253         sqlBuilder.append("                      AND ((py.EFFDT <= ?) OR ((py.EFFDT = ?) AND (px.POS_SAL_PLAN_DFLT = ?)))\n");
254         sqlBuilder.append("                      AND (px.EFFDT < py.EFFDT)))\n");
255         sqlBuilder.append("   AND (EXISTS (SELECT 1\n");
256         sqlBuilder.append("                FROM LD_CSF_TRACKER_T csf\n");
257         sqlBuilder.append("                WHERE (csf.UNIV_FISCAL_YR = ?)\n");
258         sqlBuilder.append("                  AND (csf.POS_CSF_DELETE_CD = ?)\n");
259         sqlBuilder.append("                  AND (csf.POSITION_NBR = px.POSITION_NBR))))\n");
260         String sqlString = sqlBuilder.toString();
261         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);
262         // set the things that we'll need for testing but which we don't have enough information to set from the Kuali DB
263         // this code is obviously somewhat arbitrary--it should be replaced with institution-specific algorithms
264         setAcademicDefaultObjectClass(requestFiscalYear);
265         setMonthlyStaffOvertimeEligibleDefaultObjectClass(requestFiscalYear);
266         setMonthlyStaffOvertimeExemptDefaultObjectClass(requestFiscalYear);
267         setBiweeklyStaffDefaultObjectClass(requestFiscalYear);
268     }
269     
270     /**
271      *   At IU, there is a concept of normal work months and pay months.  For example, one can theoretically be in a 12-month position
272      *   but only work during a 10-month academic year for some reason.  This situation would make the "full time equivalent" for that
273      *   person (assuming she works a 40-hour week during the 10 months) 10/12 or .893333....
274      *   Each position is supposed to have an object class.  No one should be able to budget a given position in a different object
275      *   class, because that would break the "object level" reporting in accounting that gives totals for "academic salaries", etc.
276      *   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 
277      *   grade that is shared by payroll and the budget to mandate the object class used for salary funding.
278      */
279     protected void setAcademicDefaultObjectClass(Integer fiscalYear)
280     {
281         // build constants for DB independence
282         Integer monthConstant = new Integer(10);
283         String positionType  = new String("AC");
284         String defaultObject = new String("2000");
285         String salaryPlan    = new String("AC1");
286         StringBuilder sqlBuilder = new StringBuilder(500);
287         sqlBuilder.append("UPDATE LD_BCN_POS_T\n");
288         sqlBuilder.append("SET IU_NORM_WORK_MONTHS = ?,\n");
289         sqlBuilder.append("    IU_PAY_MONTHS = ?,\n");
290         sqlBuilder.append("    IU_POSITION_TYPE = ?,\n");
291         sqlBuilder.append("    IU_DFLT_OBJ_CD = ?\n");
292         sqlBuilder.append("WHERE (UNIV_FISCAL_YR = ?)\n");
293         sqlBuilder.append("  AND (POS_SAL_PLAN_DFLT = ?)");
294         String sqlString = sqlBuilder.toString();
295         getSimpleJdbcTemplate().update(sqlString,monthConstant,monthConstant,positionType,defaultObject,fiscalYear,salaryPlan);
296     }
297     protected void setMonthlyStaffOvertimeEligibleDefaultObjectClass(Integer fiscalYear)
298     {
299         // build constants for DB independence
300         Integer monthConstant = new Integer(12);
301         String positionType  = new String("SM");
302         String defaultObject = new String("2480");
303         String[] salaryPlan = {new String("PAO"), new String("PAU")};
304         StringBuilder sqlBuilder = new StringBuilder(500);
305         sqlBuilder.append("UPDATE LD_BCN_POS_T\n");
306         sqlBuilder.append("SET IU_NORM_WORK_MONTHS = ?,\n");
307         sqlBuilder.append("    IU_PAY_MONTHS = ?,\n");
308         sqlBuilder.append("    IU_POSITION_TYPE = ?,\n");
309         sqlBuilder.append("    IU_DFLT_OBJ_CD = ?\n");
310         sqlBuilder.append("WHERE (UNIV_FISCAL_YR = ?)\n");
311         sqlBuilder.append("  AND (POS_SAL_PLAN_DFLT IN (?,?))\n");
312         String sqlString = sqlBuilder.toString();
313         getSimpleJdbcTemplate().update(sqlString,monthConstant,monthConstant,positionType,defaultObject,fiscalYear,salaryPlan[0],salaryPlan[1]);
314     }
315 
316     protected void setMonthlyStaffOvertimeExemptDefaultObjectClass(Integer fiscalYear)
317     {
318         // build constants for DB independence
319         // (note that this uses a pattern, and therefore assumes that any specific position types beginning with 'P' that go to
320         //  a different default object class have already been assigned)
321         Integer monthConstant = new Integer(12);
322         String  positionType  = new String("SM");
323         String  defaultObject = new String("2400");
324         String  salaryPlan    = new String("P%");
325         StringBuilder sqlBuilder = new StringBuilder(500);
326         sqlBuilder.append("UPDATE LD_BCN_POS_T\n");
327         sqlBuilder.append("SET IU_NORM_WORK_MONTHS = ?,\n");
328         sqlBuilder.append("    IU_PAY_MONTHS = ?,\n");
329         sqlBuilder.append("    IU_POSITION_TYPE = ?,\n");
330         sqlBuilder.append("    IU_DFLT_OBJ_CD = ?\n");
331         sqlBuilder.append("WHERE (UNIV_FISCAL_YR = ?)\n");
332         sqlBuilder.append("  AND (POS_SAL_PLAN_DFLT LIKE ?)\n");
333         sqlBuilder.append("  AND (IU_DFLT_OBJ_CD IS NULL)\n");
334         String sqlString = sqlBuilder.toString();
335         getSimpleJdbcTemplate().update(sqlString,monthConstant,monthConstant,positionType,defaultObject,fiscalYear,salaryPlan);
336     }
337     
338     protected void setBiweeklyStaffDefaultObjectClass(Integer fiscalYear)
339     {
340         // build constants for DB independence
341         // (note that we are only assigning default object codes to positions not yet assigned a default.  so, this method must
342         //  be called last.  In particular, there is no check on salary plan.)
343         Integer monthConstant    = new Integer(12);
344         String  positionType     = new String("SB");
345         String  defaultObject    = new String("2500");
346         String  defaultUnionCode = new String("B1");
347         StringBuilder sqlBuilder = new StringBuilder(500);
348         sqlBuilder.append("UPDATE LD_BCN_POS_T\n");
349         sqlBuilder.append("SET IU_NORM_WORK_MONTHS = ?,\n");
350         sqlBuilder.append("    IU_PAY_MONTHS = ?,\n");
351         sqlBuilder.append("    IU_POSITION_TYPE = ?,\n");
352         sqlBuilder.append("    POS_UNION_CD = ?,\n");
353         sqlBuilder.append("    IU_DFLT_OBJ_CD = ?\n");
354         sqlBuilder.append("WHERE (UNIV_FISCAL_YR = ?)\n");
355         sqlBuilder.append("  AND (IU_DFLT_OBJ_CD IS NULL)\n");
356         String sqlString = sqlBuilder.toString();
357         getSimpleJdbcTemplate().update(sqlString,monthConstant,monthConstant,positionType,defaultUnionCode,defaultObject,fiscalYear);
358     }
359     
360     /**
361      * 
362      * @see org.kuali.kfs.module.bc.batch.dataaccess.BudgetConstructionHumanResourcesPayrollInterfaceDao#updateNamesInBudgetConstructionIntendedIncumbent()
363      */
364     public void updateNamesInBudgetConstructionIntendedIncumbent()
365     {
366         // do nothing in the default: the names are added in the build routines
367     }
368 }