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.service.impl;
017
018 import java.util.HashMap;
019 import java.util.List;
020 import java.util.Map;
021
022 import org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition;
023 import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding;
024 import org.kuali.kfs.module.bc.businessobject.Position;
025 import org.kuali.kfs.module.bc.document.dataaccess.BudgetConstructionDao;
026 import org.kuali.kfs.module.bc.exception.BudgetPositionAlreadyExistsException;
027 import org.kuali.kfs.module.bc.service.BudgetConstructionPositionService;
028 import org.kuali.kfs.module.bc.service.HumanResourcesPayrollService;
029 import org.kuali.kfs.sys.KFSPropertyConstants;
030 import org.kuali.kfs.sys.service.NonTransactional;
031 import org.kuali.rice.kns.service.BusinessObjectService;
032 import org.springframework.transaction.annotation.Propagation;
033 import org.springframework.transaction.annotation.Transactional;
034
035
036 /**
037 * Implementation of BudgetConstructionPositionService that uses the HumanResourcesPayrollService
038 *
039 * @see org.kuali.kfs.module.bc.service.BudgetConstructionPositionService
040 * @see org.kuali.kfs.module.bc.service.HumanResourcesPayrollService
041 */
042 public class BudgetConstructionPositionServiceImpl implements BudgetConstructionPositionService {
043 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BudgetConstructionPositionServiceImpl.class);
044
045 private HumanResourcesPayrollService humanResourcesPayrollService;
046 private BusinessObjectService businessObjectService;
047 private BudgetConstructionDao budgetConstructionDao;
048
049 /**
050 * @see org.kuali.kfs.module.bc.service.BudgetConstructionPositionService#pullNewPositionFromExternal(java.lang.Integer,
051 * java.lang.String)
052 */
053 @Transactional
054 public synchronized void pullNewPositionFromExternal(Integer universityFiscalYear, String positionNumber) throws BudgetPositionAlreadyExistsException {
055 // call humanResourcesPayrollService service to pull record
056 Position position = humanResourcesPayrollService.getPosition(universityFiscalYear, positionNumber);
057
058 // check if position already exists in budget position table, if not add position
059 BudgetConstructionPosition retrievedPosition = getByPrimaryId(universityFiscalYear.toString(), positionNumber);
060 if (retrievedPosition != null) {
061 throw new BudgetPositionAlreadyExistsException(universityFiscalYear, positionNumber);
062 }
063 else {
064 retrievedPosition = new BudgetConstructionPosition();
065 }
066
067 // populate BudgetConstructionPosition
068 BudgetConstructionPosition budgetConstructionPosition = buildBudgetPosition(position, retrievedPosition);
069
070 // insert position record
071 businessObjectService.save(budgetConstructionPosition);
072 }
073
074 /**
075 * @see org.kuali.kfs.module.bc.service.BudgetConstructionPositionService#refreshPositionFromExternal(java.lang.Integer,
076 * java.lang.String)
077 */
078 @Transactional(propagation = Propagation.REQUIRES_NEW)
079 public synchronized void refreshPositionFromExternal(Integer universityFiscalYear, String positionNumber) {
080 // call humanResourcesPayrollService service to pull record
081 Position position = humanResourcesPayrollService.getPosition(universityFiscalYear, positionNumber);
082
083 // update budget record
084 BudgetConstructionPosition retrievedPosition = getByPrimaryId(universityFiscalYear.toString(), positionNumber);
085
086 // populate BudgetConstructionPosition
087 BudgetConstructionPosition budgetConstructionPosition = buildBudgetPosition(position, retrievedPosition);
088
089 // update position record
090 businessObjectService.save(budgetConstructionPosition);
091
092 // update funding position change indicators
093 updateFundingPositionChangeIndicators(universityFiscalYear, positionNumber);
094 }
095
096 /**
097 * Retrieves all funding lines for the position that are not marked as delete and sets the position change indicator fields to
098 * true.
099 *
100 * @param universityFiscalYear budget fiscal year for the position
101 * @param positionNumber position number for the record
102 */
103 protected void updateFundingPositionChangeIndicators(Integer universityFiscalYear, String positionNumber) {
104 // retrieve funding records for the position
105 List<PendingBudgetConstructionAppointmentFunding> allPositionFunding = budgetConstructionDao.getAllFundingForPosition(universityFiscalYear, positionNumber);
106
107 // update indicators if the line is not marked for delete
108 for (PendingBudgetConstructionAppointmentFunding appointmentFunding : allPositionFunding) {
109 if (!appointmentFunding.isAppointmentFundingDeleteIndicator()) {
110 appointmentFunding.setPositionObjectChangeIndicator(true);
111 appointmentFunding.setPositionSalaryChangeIndicator(true);
112 appointmentFunding.setVersionNumber(appointmentFunding.getVersionNumber());
113
114 businessObjectService.save(appointmentFunding);
115 }
116 }
117 }
118
119 /**
120 * Populates a new <code>BudgetConstructionPosition</code> object from a <code>Position</code> object.
121 *
122 * @param position object to copy
123 * @param budgetConstructionPosition bc position to populate
124 * @return BudgetConstructionPosition populated from <code>Position</code>
125 * @see org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition
126 * @see org.kuali.kfs.module.bc.businessobject.Position
127 */
128 protected BudgetConstructionPosition buildBudgetPosition(Position position, BudgetConstructionPosition budgetConstructionPosition) {
129 budgetConstructionPosition.setBudgetedPosition(position.isBudgetedPosition());
130 budgetConstructionPosition.setConfidentialPosition(position.isConfidentialPosition());
131 budgetConstructionPosition.setIuDefaultObjectCode(position.getIuDefaultObjectCode());
132 budgetConstructionPosition.setIuNormalWorkMonths(position.getIuNormalWorkMonths());
133 budgetConstructionPosition.setIuPayMonths(position.getIuPayMonths());
134 budgetConstructionPosition.setIuPositionType(position.getIuPositionType());
135 budgetConstructionPosition.setJobCode(position.getJobCode());
136 budgetConstructionPosition.setJobCodeDescription(position.getJobCodeDescription());
137 budgetConstructionPosition.setPositionDepartmentIdentifier(position.getPositionDepartmentIdentifier());
138 budgetConstructionPosition.setPositionDescription(position.getPositionDescription());
139 budgetConstructionPosition.setPositionEffectiveDate(position.getPositionEffectiveDate());
140 budgetConstructionPosition.setPositionEffectiveStatus(position.getPositionEffectiveStatus());
141 budgetConstructionPosition.setPositionFullTimeEquivalency(position.getPositionFullTimeEquivalency());
142 budgetConstructionPosition.setPositionGradeDefault(position.getPositionGradeDefault());
143 budgetConstructionPosition.setPositionNumber(position.getPositionNumber());
144 budgetConstructionPosition.setPositionRegularTemporary(position.getPositionRegularTemporary());
145 budgetConstructionPosition.setPositionSalaryPlanDefault(position.getPositionSalaryPlanDefault());
146 budgetConstructionPosition.setPositionStandardHoursDefault(position.getPositionStandardHoursDefault());
147 budgetConstructionPosition.setPositionStatus(position.getPositionStatus());
148 budgetConstructionPosition.setPositionUnionCode(position.getPositionUnionCode());
149 budgetConstructionPosition.setResponsibilityCenterCode(position.getResponsibilityCenterCode());
150 budgetConstructionPosition.setSetidDepartment(position.getSetidDepartment());
151 budgetConstructionPosition.setSetidJobCode(position.getSetidJobCode());
152 budgetConstructionPosition.setSetidSalary(position.getSetidSalary());
153 budgetConstructionPosition.setUniversityFiscalYear(position.getUniversityFiscalYear());
154
155 return budgetConstructionPosition;
156 }
157
158 /**
159 * @see org.kuali.kfs.module.bc.service.BudgetConstructionPositionService#getByPrimaryId(java.lang.String, java.lang.String)
160 */
161 @NonTransactional
162 public BudgetConstructionPosition getByPrimaryId(String fiscalYear, String positionNumber) {
163 Map<String, Object> primaryKeys = new HashMap<String, Object>();
164 primaryKeys.put(KFSPropertyConstants.UNIVERSITY_FISCAL_YEAR, fiscalYear);
165 primaryKeys.put(KFSPropertyConstants.POSITION_NUMBER, positionNumber);
166
167 return (BudgetConstructionPosition) businessObjectService.findByPrimaryKey(BudgetConstructionPosition.class, primaryKeys);
168 }
169
170 /**
171 * @see org.kuali.kfs.module.bc.service.BudgetConstructionPositionService#isBudgetingPosition(org.kuali.kfs.module.bc.businessobject.BudgetConstructionPosition)
172 */
173 @NonTransactional
174 public boolean isBudgetablePosition(BudgetConstructionPosition budgetConstructionPosition) {
175 return budgetConstructionPosition != null && budgetConstructionPosition.isBudgetedPosition() && budgetConstructionPosition.isEffective();
176 }
177
178 /**
179 * Sets the businessObjectService attribute value.
180 *
181 * @param businessObjectService The businessObjectService to set.
182 */
183 @NonTransactional
184 public void setBusinessObjectService(BusinessObjectService businessObjectService) {
185 this.businessObjectService = businessObjectService;
186 }
187
188 /**
189 * Sets the humanResourcesPayrollService attribute value.
190 *
191 * @param humanResourcesPayrollService The humanResourcesPayrollService to set.
192 */
193 @NonTransactional
194 public void setHumanResourcesPayrollService(HumanResourcesPayrollService humanResourcesPayrollService) {
195 this.humanResourcesPayrollService = humanResourcesPayrollService;
196 }
197
198 /**
199 * Sets the budgetConstructionDao attribute value.
200 *
201 * @param budgetConstructionDao The budgetConstructionDao to set.
202 */
203 @NonTransactional
204 public void setBudgetConstructionDao(BudgetConstructionDao budgetConstructionDao) {
205 this.budgetConstructionDao = budgetConstructionDao;
206 }
207 }