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 }