/* * 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.service.impl; import java.util.HashMap; import java.util.List; import java.util.Map; import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition; import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding; import org.kuali.kfs.module.bc.businessobject.Position; import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao; import org.kuali.kfs.module.bc.exception.BudgetPositionAlreadyExistsException; import org.kuali.kfs.module.bc.service.BudgetConstructionPositionService; import org.kuali.kfs.module.bc.service.HumanResourcesPayrollService; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.service.NonTransactional; import org.kuali.rice.krad.service.BusinessObjectService; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** * Implementation of BudgetConstructionPositionService that uses the HumanResourcesPayrollService * * @see org.kuali.kfs.module.bc.service.BudgetConstructionPositionService * @see org.kuali.kfs.module.bc.service.HumanResourcesPayrollService */ public class BudgetConstructionPositionServiceImpl implements BudgetConstructionPositionService { private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BudgetConstructionPositionServiceImpl.class); private HumanResourcesPayrollService humanResourcesPayrollService; private BusinessObjectService businessObjectService; private BudgetConstructionDao budgetConstructionDao; /** * @see org.kuali.kfs.module.bc.service.BudgetConstructionPositionService#pullNewPositionFromExternal(java.lang.Integer, * java.lang.String) */ @Transactional public synchronized void pullNewPositionFromExternal(Integer universityFiscalYear, String positionNumber) throws BudgetPositionAlreadyExistsException { // call humanResourcesPayrollService service to pull record Position position = humanResourcesPayrollService.getPosition(universityFiscalYear, positionNumber); // check if position already exists in budget position table, if not add position BudgetConstructionPosition retrievedPosition = getByPrimaryId(universityFiscalYear.toString(), positionNumber); if (retrievedPosition != null) { throw new BudgetPositionAlreadyExistsException(universityFiscalYear, positionNumber); } else { retrievedPosition = new BudgetConstructionPosition(); } // populate BudgetConstructionPosition BudgetConstructionPosition budgetConstructionPosition = buildBudgetPosition(position, retrievedPosition); // insert position record businessObjectService.save(budgetConstructionPosition); } /** * @see org.kuali.kfs.module.bc.service.BudgetConstructionPositionService#refreshPositionFromExternal(java.lang.Integer, * java.lang.String) */ @Transactional(propagation = Propagation.REQUIRES_NEW) public synchronized void refreshPositionFromExternal(Integer universityFiscalYear, String positionNumber) { // call humanResourcesPayrollService service to pull record Position position = humanResourcesPayrollService.getPosition(universityFiscalYear, positionNumber); // update budget record BudgetConstructionPosition retrievedPosition = getByPrimaryId(universityFiscalYear.toString(), positionNumber); // populate BudgetConstructionPosition BudgetConstructionPosition budgetConstructionPosition = buildBudgetPosition(position, retrievedPosition); // update position record businessObjectService.save(budgetConstructionPosition); // update funding position change indicators updateFundingPositionChangeIndicators(universityFiscalYear, positionNumber); } /** * Retrieves all funding lines for the position that are not marked as delete and sets the position change indicator fields to * true. * * @param universityFiscalYear budget fiscal year for the position * @param positionNumber position number for the record */ protected void updateFundingPositionChangeIndicators(Integer universityFiscalYear, String positionNumber) { // retrieve funding records for the position List<PendingBudgetConstructionAppointmentFunding> allPositionFunding = budgetConstructionDao.getAllFundingForPosition(universityFiscalYear, positionNumber); // update indicators if the line is not marked for delete for (PendingBudgetConstructionAppointmentFunding appointmentFunding : allPositionFunding) { if (!appointmentFunding.isAppointmentFundingDeleteIndicator()) { appointmentFunding.setPositionObjectChangeIndicator(true); appointmentFunding.setPositionSalaryChangeIndicator(true); appointmentFunding.setVersionNumber(appointmentFunding.getVersionNumber()); businessObjectService.save(appointmentFunding); } } } /** * Populates a new <code>BudgetConstructionPosition</code> object from a <code>Position</code> object. * * @param position object to copy * @param budgetConstructionPosition bc position to populate * @return BudgetConstructionPosition populated from <code>Position</code> * @see org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition * @see org.kuali.kfs.module.bc.businessobject.Position */ protected BudgetConstructionPosition buildBudgetPosition(Position position, BudgetConstructionPosition budgetConstructionPosition) { budgetConstructionPosition.setBudgetedPosition(position.isBudgetedPosition()); budgetConstructionPosition.setConfidentialPosition(position.isConfidentialPosition()); budgetConstructionPosition.setIuDefaultObjectCode(position.getIuDefaultObjectCode()); budgetConstructionPosition.setIuNormalWorkMonths(position.getIuNormalWorkMonths()); budgetConstructionPosition.setIuPayMonths(position.getIuPayMonths()); budgetConstructionPosition.setIuPositionType(position.getIuPositionType()); budgetConstructionPosition.setJobCode(position.getJobCode()); budgetConstructionPosition.setJobCodeDescription(position.getJobCodeDescription()); budgetConstructionPosition.setPositionDepartmentIdentifier(position.getPositionDepartmentIdentifier()); budgetConstructionPosition.setPositionDescription(position.getPositionDescription()); budgetConstructionPosition.setPositionEffectiveDate(position.getPositionEffectiveDate()); budgetConstructionPosition.setPositionEffectiveStatus(position.getPositionEffectiveStatus()); budgetConstructionPosition.setPositionFullTimeEquivalency(position.getPositionFullTimeEquivalency()); budgetConstructionPosition.setPositionGradeDefault(position.getPositionGradeDefault()); budgetConstructionPosition.setPositionNumber(position.getPositionNumber()); budgetConstructionPosition.setPositionRegularTemporary(position.getPositionRegularTemporary()); budgetConstructionPosition.setPositionSalaryPlanDefault(position.getPositionSalaryPlanDefault()); budgetConstructionPosition.setPositionStandardHoursDefault(position.getPositionStandardHoursDefault()); budgetConstructionPosition.setPositionStatus(position.getPositionStatus()); budgetConstructionPosition.setPositionUnionCode(position.getPositionUnionCode()); budgetConstructionPosition.setResponsibilityCenterCode(position.getResponsibilityCenterCode()); budgetConstructionPosition.setSetidDepartment(position.getSetidDepartment()); budgetConstructionPosition.setSetidJobCode(position.getSetidJobCode()); budgetConstructionPosition.setSetidSalary(position.getSetidSalary()); budgetConstructionPosition.setUniversityFiscalYear(position.getUniversityFiscalYear()); return budgetConstructionPosition; } /** * @see org.kuali.kfs.module.bc.service.BudgetConstructionPositionService#getByPrimaryId(java.lang.String, java.lang.String) */ @NonTransactional public BudgetConstructionPosition getByPrimaryId(String fiscalYear, String positionNumber) { Map<String, Object> primaryKeys = new HashMap<String, Object>(); primaryKeys.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, fiscalYear); primaryKeys.put(KFSPropertyConstants.POSITION_NUMBER, positionNumber); return (BudgetConstructionPosition) businessObjectService.findByPrimaryKey(BudgetConstructionPosition.class, primaryKeys); } /** * @see org.kuali.kfs.module.bc.service.BudgetConstructionPositionService#isBudgetingPosition(org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition) */ @NonTransactional public boolean isBudgetablePosition(BudgetConstructionPosition budgetConstructionPosition) { return budgetConstructionPosition != null && budgetConstructionPosition.isBudgetedPosition() && budgetConstructionPosition.isEffective(); } /** * Sets the businessObjectService attribute value. * * @param businessObjectService The businessObjectService to set. */ @NonTransactional public void setBusinessObjectService(BusinessObjectService businessObjectService) { this.businessObjectService = businessObjectService; } /** * Sets the humanResourcesPayrollService attribute value. * * @param humanResourcesPayrollService The humanResourcesPayrollService to set. */ @NonTransactional public void setHumanResourcesPayrollService(HumanResourcesPayrollService humanResourcesPayrollService) { this.humanResourcesPayrollService = humanResourcesPayrollService; } /** * Sets the budgetConstructionDao attribute value. * * @param budgetConstructionDao The budgetConstructionDao to set. */ @NonTransactional public void setBudgetConstructionDao(BudgetConstructionDao budgetConstructionDao) { this.budgetConstructionDao = budgetConstructionDao; } }