/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.module.bc.dataaccess.impl; import java.math.BigDecimal; import java.sql.Date; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Calendar; import java.util.Collection; import java.util.GregorianCalendar; import java.util.LinkedHashMap; import org.kuali.kfs.gl.Constant; import org.kuali.kfs.gl.businessobject.TransientBalanceInquiryAttributes; import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition; import org.kuali.kfs.module.bc.businessobject.Position; import org.kuali.kfs.module.bc.dataaccess.HumanResourcesPayrollDao; import org.kuali.kfs.module.bc.document.dataaccess.impl.BudgetConstructionDaoJdbcBase; import org.kuali.rice.krad.bo.PersistableBusinessObjectBase; import org.springframework.jdbc.core.simple.ParameterizedRowMapper; /** * Implementation of <code>HumanResourcesPayrollDao</code> using JDBC to query PS_POSITION_DATA and then set other * <code>Position</code> fields to hard-coded IU values. This is for bootstrap only. * * @see org.kuali.kfs.module.bc.dataaccess.HumanResourcesPayrollDao */ public class HumanResourcesPayrollDaoJdbc extends BudgetConstructionDaoJdbcBase implements HumanResourcesPayrollDao { /** * Gets the <code>Position</code> data by querying PS_POSITION_DATA then setting other fields using IU business rules. This is * used in the bootstrap service implementation for an example. * * @see org.kuali.kfs.module.bc.dataaccess.HumanResourcesPayrollDao#getPosition(java.lang.Integer, java.lang.String) */ public Position getPosition(Integer universityFiscalYear, String positionNumber) { PositionData positionData = getPositionDataForFiscalYear(universityFiscalYear, positionNumber); if (positionData == null) { return null; } Position position = new BudgetConstructionPosition(); position.setUniversityFiscalYear(universityFiscalYear); position.setPositionNumber(positionNumber); populatePositionData(position, positionData); setDefaultObjectClass(position); return position; } /** * find positions with effective date before July 1 of fiscal year or on August 1 of fiscal year for academic tenure salary plan * * @param universityFiscalYear * @param positionNumber * @return */ protected PositionData getPositionDataForFiscalYear(Integer universityFiscalYear, String positionNumber) { Collection<PositionData> positionData = getPositionData(positionNumber); if (positionData == null || positionData.isEmpty()) { return null; } // find positions with effective date before July 1 of fiscal year or on August 1 of fiscal year // for academic tenure salary plan Integer baseFiscalYear = universityFiscalYear - 1; GregorianCalendar calendarJuly1 = new GregorianCalendar(baseFiscalYear, Calendar.JULY, 1); GregorianCalendar calendarAugust1 = new GregorianCalendar(universityFiscalYear, Calendar.AUGUST, 1); Date julyFirst = new Date(calendarJuly1.getTimeInMillis()); Date augustFirst = new Date(calendarAugust1.getTimeInMillis()); String academicTenureTrackSalaryPlan = new String("AC1"); PositionData positionDataMaxEffectiveDate = null; for (PositionData posData : positionData) { Date positionEffectiveDate = posData.getEffectiveDate(); if ((positionEffectiveDate.compareTo(julyFirst) <= 0) || (academicTenureTrackSalaryPlan.equals(posData.getPositionSalaryPlanDefault()) && positionEffectiveDate.equals(augustFirst))) { // get position with max effective date for year if (positionDataMaxEffectiveDate == null || positionDataMaxEffectiveDate.getEffectiveDate().compareTo(positionEffectiveDate) < 0) { positionDataMaxEffectiveDate = posData; } } } return positionDataMaxEffectiveDate; } /** * Retrieves record for position key from PS_POSITION_DATA and returns populated <code>PositionData</code> business object. */ public Collection<PositionData> getPositionData(String positionNumber) { StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append("SELECT POSITION_NBR, EFFDT, JOBCODE, POS_EFF_STATUS, DESCR, \n"); sqlBuilder.append(" DESCRSHORT, BUSINESS_UNIT, DEPTID, POSN_STATUS, STATUS_DT, \n"); sqlBuilder.append(" BUDGETED_POSN, STD_HRS_DEFAULT, STD_HRS_FREQUENCY, POS_REG_TEMP, \n"); sqlBuilder.append(" POS_FTE, POS_SAL_PLAN_DFLT, POS_GRADE_DFLT \n"); sqlBuilder.append(" FROM PS_POSITION_DATA \n"); sqlBuilder.append(" WHERE POSITION_NBR = ? \n"); String sqlString = sqlBuilder.toString(); ParameterizedRowMapper<PositionData> mapper = new ParameterizedRowMapper<PositionData>() { public PositionData mapRow(ResultSet rs, int rowNum) throws SQLException { PositionData positionData = new PositionData(); positionData.setPositionNumber(rs.getString("POSITION_NBR")); positionData.setEffectiveDate(rs.getDate("EFFDT")); positionData.setJobCode(rs.getString("JOBCODE")); positionData.setPositionEffectiveStatus(rs.getString("POS_EFF_STATUS")); positionData.setDescription(rs.getString("DESCR")); positionData.setShortDescription(rs.getString("DESCRSHORT")); positionData.setBusinessUnit(rs.getString("BUSINESS_UNIT")); positionData.setDepartmentId(rs.getString("DEPTID")); positionData.setPositionStatus(rs.getString("POSN_STATUS")); positionData.setStatusDate(rs.getDate("STATUS_DT")); positionData.setBudgetedPosition(rs.getString("BUDGETED_POSN")); positionData.setStandardHoursDefault(rs.getBigDecimal("STD_HRS_DEFAULT")); positionData.setStandardHoursFrequency(rs.getString("STD_HRS_FREQUENCY")); positionData.setPositionRegularTemporary(rs.getString("POS_REG_TEMP")); positionData.setPositionFullTimeEquivalency(rs.getBigDecimal("POS_FTE")); positionData.setPositionSalaryPlanDefault(rs.getString("POS_SAL_PLAN_DFLT")); positionData.setPositionGradeDefault(rs.getString("POS_GRADE_DFLT")); return positionData; } }; return this.getSimpleJdbcTemplate().query(sqlString, mapper, positionNumber); } /** * Sets <code>Position</code> fields with data from <code>PositionData</code> */ public void populatePositionData(Position position, PositionData positionData) { position.setPositionEffectiveDate(positionData.getEffectiveDate()); position.setJobCode(positionData.getJobCode()); position.setPositionEffectiveStatus(positionData.getPositionEffectiveStatus()); position.setPositionDescription(positionData.getDescription()); position.setSetidDepartment(positionData.getBusinessUnit()); position.setPositionDepartmentIdentifier(positionData.getDepartmentId()); position.setPositionStatus(positionData.getPositionStatus()); if ("Y".equalsIgnoreCase(positionData.getBudgetedPosition())) { position.setBudgetedPosition(true); } else { position.setBudgetedPosition(false); } position.setPositionStandardHoursDefault(positionData.getStandardHoursDefault()); position.setPositionRegularTemporary(positionData.getPositionRegularTemporary()); position.setPositionFullTimeEquivalency(positionData.getPositionFullTimeEquivalency()); position.setPositionSalaryPlanDefault(positionData.getPositionSalaryPlanDefault()); position.setPositionGradeDefault(positionData.getPositionGradeDefault()); } /** * Sets defaults based on salary plan. * * @param position <code>Position</code> to update */ public void setDefaultObjectClass(Position position) { String salaryPlan = position.getPositionSalaryPlanDefault(); if ("AC1".equals(salaryPlan)) { position.setIuNormalWorkMonths(new Integer(10)); position.setIuPayMonths(new Integer(10)); position.setIuPositionType("AC"); position.setIuDefaultObjectCode("2000"); } else if ("PAO".equals(salaryPlan) || "PAU".equals(salaryPlan)) { position.setIuNormalWorkMonths(new Integer(12)); position.setIuPayMonths(new Integer(12)); position.setIuPositionType("SM"); position.setIuDefaultObjectCode("2480"); } else if (salaryPlan.startsWith("P")) { position.setIuNormalWorkMonths(new Integer(12)); position.setIuPayMonths(new Integer(12)); position.setIuPositionType("SM"); position.setIuDefaultObjectCode("2400"); } else { position.setIuNormalWorkMonths(new Integer(12)); position.setIuPayMonths(new Integer(12)); position.setIuPositionType("SB"); position.setIuDefaultObjectCode("2500"); position.setPositionUnionCode("B1"); } } protected class PositionData extends PersistableBusinessObjectBase { private String positionNumber; private String jobCode; private Date effectiveDate; private String positionEffectiveStatus; private String description; private String shortDescription; private String businessUnit; private String departmentId; private String positionStatus; private Date statusDate; private String budgetedPosition; private BigDecimal standardHoursDefault; private String standardHoursFrequency; private String positionRegularTemporary; private BigDecimal positionFullTimeEquivalency; private String positionSalaryPlanDefault; private String positionGradeDefault; private TransientBalanceInquiryAttributes dummyBusinessObject; /** * Default constructor. */ public PositionData() { super(); this.dummyBusinessObject = new TransientBalanceInquiryAttributes(); this.dummyBusinessObject.setLinkButtonOption(Constant.LOOKUP_BUTTON_VALUE); } /** * Gets the positionNumber * * @return Returns the positionNumber */ public String getPositionNumber() { return positionNumber; } /** * Sets the positionNumber * * @param positionNumber The positionNumber to set. */ public void setPositionNumber(String positionNumber) { this.positionNumber = positionNumber; } /** * Gets the jobCode * * @return Returns the jobCode */ public String getJobCode() { return jobCode; } /** * Sets the jobCode * * @param jobCode The jobCode to set. */ public void setJobCode(String jobCode) { this.jobCode = jobCode; } /** * Gets the effectiveDate * * @return Returns the effectiveDate */ public Date getEffectiveDate() { return effectiveDate; } /** * Sets the effectiveDate * * @param effectiveDate The effectiveDate to set. */ public void setEffectiveDate(Date effectiveDate) { this.effectiveDate = effectiveDate; } /** * Gets the positionEffectiveStatus * * @return Returns the positionEffectiveStatus */ public String getPositionEffectiveStatus() { return positionEffectiveStatus; } /** * Sets the positionEffectiveStatus * * @param positionEffectiveStatus The positionEffectiveStatus to set. */ public void setPositionEffectiveStatus(String positionEffectiveStatus) { this.positionEffectiveStatus = positionEffectiveStatus; } /** * Gets the description * * @return Returns the description */ public String getDescription() { return description; } /** * Sets the description * * @param description The description to set. */ public void setDescription(String description) { this.description = description; } /** * Gets the shortDescription * * @return Returns the shortDescription */ public String getShortDescription() { return shortDescription; } /** * Sets the shortDescription * * @param shortDescription The shortDescription to set. */ public void setShortDescription(String shortDescription) { this.shortDescription = shortDescription; } /** * Gets the businessUnit * * @return Returns the businessUnit */ public String getBusinessUnit() { return businessUnit; } /** * Sets the businessUnit * * @param businessUnit The businessUnit to set. */ public void setBusinessUnit(String businessUnit) { this.businessUnit = businessUnit; } /** * Gets the departmentId * * @return Returns the departmentId */ public String getDepartmentId() { return departmentId; } /** * Sets the departmentId * * @param departmentId The departmentId to set. */ public void setDepartmentId(String departmentId) { this.departmentId = departmentId; } /** * Gets the positionStatus * * @return Returns the positionStatus */ public String getPositionStatus() { return positionStatus; } /** * Sets the positionStatus * * @param positionStatus The positionStatus to set. */ public void setPositionStatus(String positionStatus) { this.positionStatus = positionStatus; } /** * Gets the statusDate * * @return Returns the statusDate */ public Date getStatusDate() { return statusDate; } /** * Sets the statusDate * * @param statusDate The statusDate to set. */ public void setStatusDate(Date statusDate) { this.statusDate = statusDate; } /** * Gets the budgetedPosition * * @return Returns the budgetedPosition */ public String getBudgetedPosition() { return budgetedPosition; } /** * Sets the budgetedPosition * * @param budgetedPosition The budgetedPosition to set. */ public void setBudgetedPosition(String budgetedPosition) { this.budgetedPosition = budgetedPosition; } /** * Gets the standardHoursDefault * * @return Returns the standardHoursDefault */ public BigDecimal getStandardHoursDefault() { return standardHoursDefault; } /** * Sets the standardHoursDefault * * @param standardHoursDefault The standardHoursDefault to set. */ public void setStandardHoursDefault(BigDecimal standardHoursDefault) { this.standardHoursDefault = standardHoursDefault; } /** * Gets the standardHoursFrequency * * @return Returns the standardHoursFrequency */ public String getStandardHoursFrequency() { return standardHoursFrequency; } /** * Sets the standardHoursFrequency * * @param standardHoursFrequency The standardHoursFrequency to set. */ public void setStandardHoursFrequency(String standardHoursFrequency) { this.standardHoursFrequency = standardHoursFrequency; } /** * Gets the positionRegularTemporary * * @return Returns the positionRegularTemporary */ public String getPositionRegularTemporary() { return positionRegularTemporary; } /** * Sets the positionRegularTemporary * * @param positionRegularTemporary The positionRegularTemporary to set. */ public void setPositionRegularTemporary(String positionRegularTemporary) { this.positionRegularTemporary = positionRegularTemporary; } /** * Gets the positionFullTimeEquivalency * * @return Returns the positionFullTimeEquivalency */ public BigDecimal getPositionFullTimeEquivalency() { return positionFullTimeEquivalency; } /** * Sets the positionFullTimeEquivalency * * @param positionFullTimeEquivalency The positionFullTimeEquivalency to set. */ public void setPositionFullTimeEquivalency(BigDecimal positionFullTimeEquivalency) { this.positionFullTimeEquivalency = positionFullTimeEquivalency; } /** * Gets the positionSalaryPlanDefault * * @return Returns the positionSalaryPlanDefault */ public String getPositionSalaryPlanDefault() { return positionSalaryPlanDefault; } /** * Sets the positionSalaryPlanDefault * * @param positionSalaryPlanDefault The positionSalaryPlanDefault to set. */ public void setPositionSalaryPlanDefault(String positionSalaryPlanDefault) { this.positionSalaryPlanDefault = positionSalaryPlanDefault; } /** * Gets the positionGradeDefault * * @return Returns the positionGradeDefault */ public String getPositionGradeDefault() { return positionGradeDefault; } /** * Sets the positionGradeDefault * * @param positionGradeDefault The positionGradeDefault to set. */ public void setPositionGradeDefault(String positionGradeDefault) { this.positionGradeDefault = positionGradeDefault; } /** * construct the key list of the business object. * * @see org.kuali.rice.krad.bo.BusinessObjectBase#toStringMapper() */ protected LinkedHashMap toStringMapper_RICE20_REFACTORME() { LinkedHashMap m = new LinkedHashMap(); m.put("positionNumber", this.positionNumber); if (this.effectiveDate != null) { m.put("effectiveDate", this.effectiveDate.toString()); } return m; } /** * Gets the dummyBusinessObject * * @return Returns the dummyBusinessObject. */ public TransientBalanceInquiryAttributes getDummyBusinessObject() { return dummyBusinessObject; } /** * Sets the dummyBusinessObject * * @param dummyBusinessObject The dummyBusinessObject to set. */ public void setDummyBusinessObject(TransientBalanceInquiryAttributes dummyBusinessObject) { this.dummyBusinessObject = dummyBusinessObject; } } }