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 }