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.document.validation.impl;
017
018 import java.util.List;
019
020 import org.kuali.kfs.module.bc.BCPropertyConstants;
021 import org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding;
022 import org.kuali.kfs.module.bc.document.service.BudgetConstructionRuleHelperService;
023 import org.kuali.kfs.module.bc.document.service.SalarySettingRuleHelperService;
024 import org.kuali.kfs.module.bc.document.validation.SalarySettingRule;
025 import org.kuali.kfs.sys.KFSPropertyConstants;
026 import org.kuali.kfs.sys.context.SpringContext;
027 import org.kuali.rice.kns.util.ErrorMap;
028 import org.kuali.rice.kns.util.GlobalVariables;
029 import org.kuali.rice.kns.util.MessageMap;
030
031 /**
032 * the rule implementation for the actions of salary setting component
033 */
034 public class SalarySettingRules implements SalarySettingRule {
035 private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(SalarySettingRules.class);
036
037 private BudgetConstructionRuleHelperService budgetConstructionRuleHelperService = SpringContext.getBean(BudgetConstructionRuleHelperService.class);
038 private SalarySettingRuleHelperService salarySettingRuleHelperService = SpringContext.getBean(SalarySettingRuleHelperService.class);
039 private MessageMap errorMap = GlobalVariables.getMessageMap();
040
041 /**
042 * @see org.kuali.kfs.module.bc.document.validation.SalarySettingRule#processQuickSaveAppointmentFunding(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding)
043 */
044 public boolean processQuickSaveAppointmentFunding(PendingBudgetConstructionAppointmentFunding appointmentFunding) {
045 LOG.debug("processQuickSaveAppointmentFunding() start");
046
047 boolean hasValidFormat = budgetConstructionRuleHelperService.isFieldFormatValid(appointmentFunding, errorMap);
048 if (!hasValidFormat) {
049 return hasValidFormat;
050 }
051
052 boolean hasValidAmounts = this.hasValidAmountsQuickSalarySetting(appointmentFunding, errorMap);
053 if (!hasValidAmounts) {
054 return hasValidAmounts;
055 }
056 return true;
057 }
058
059 /**
060 * @see org.kuali.kfs.module.bc.document.validation.SalarySettingRule#processSaveAppointmentFunding(java.util.List,
061 * org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding)
062 */
063 public boolean processSaveAppointmentFunding(PendingBudgetConstructionAppointmentFunding appointmentFunding) {
064 LOG.debug("processSaveAppointmentFunding() start");
065
066 boolean hasValidFormat = budgetConstructionRuleHelperService.isFieldFormatValid(appointmentFunding, errorMap);
067 if (!hasValidFormat) {
068 return hasValidFormat;
069 }
070
071 boolean hasValidReferences = this.hasValidRefences(appointmentFunding, errorMap);
072 if (!hasValidReferences) {
073 return hasValidReferences;
074 }
075
076 boolean isObjectCodeMatching = salarySettingRuleHelperService.hasObjectCodeMatchingDefaultOfPosition(appointmentFunding, errorMap);
077 if (!isObjectCodeMatching) {
078 return isObjectCodeMatching;
079 }
080
081 boolean hasActiveJob = salarySettingRuleHelperService.hasActiveJob(appointmentFunding, errorMap);
082 if (!hasActiveJob) {
083 return hasActiveJob;
084 }
085
086 // using request amount as property to light up on error
087 boolean isAssociatedWithBudgetableDocument = budgetConstructionRuleHelperService.isAssociatedWithValidDocument(appointmentFunding, errorMap, BCPropertyConstants.APPOINTMENT_REQUESTED_AMOUNT);
088 if (!isAssociatedWithBudgetableDocument) {
089 return isAssociatedWithBudgetableDocument;
090 }
091
092 boolean hasValidAmounts = this.hasValidAmounts(appointmentFunding, errorMap);
093 if (!hasValidAmounts) {
094 return hasValidAmounts;
095 }
096
097 return true;
098 }
099
100 /**
101 * @see org.kuali.kfs.module.bc.document.validation.SalarySettingRule#processAddAppointmentFunding(java.util.List,
102 * org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding)
103 */
104 public boolean processAddAppointmentFunding(List<PendingBudgetConstructionAppointmentFunding> existingAppointmentFundings, PendingBudgetConstructionAppointmentFunding appointmentFunding) {
105 LOG.debug("processAddAppointmentFunding() start");
106
107 boolean hasNoExistingLine = salarySettingRuleHelperService.hasNoExistingLine(existingAppointmentFundings, appointmentFunding, errorMap);
108 if (!hasNoExistingLine) {
109 return hasNoExistingLine;
110 }
111
112 boolean hasValidFormat = budgetConstructionRuleHelperService.isFieldFormatValid(appointmentFunding, errorMap);
113 if (!hasValidFormat) {
114 return hasValidFormat;
115 }
116
117 boolean hasValidReferences = this.hasValidRefences(appointmentFunding, errorMap);
118 if (!hasValidReferences) {
119 return hasValidReferences;
120 }
121
122 boolean isObjectCodeMatching = salarySettingRuleHelperService.hasObjectCodeMatchingDefaultOfPosition(appointmentFunding, errorMap);
123 if (!isObjectCodeMatching) {
124 return isObjectCodeMatching;
125 }
126
127 boolean hasActiveJob = salarySettingRuleHelperService.hasActiveJob(appointmentFunding, errorMap);
128 if (!hasActiveJob) {
129 return hasActiveJob;
130 }
131
132 boolean isAssociatedWithBudgetableDocument = budgetConstructionRuleHelperService.isAssociatedWithValidDocument(appointmentFunding, errorMap, KFSPropertyConstants.ACCOUNT_NUMBER);
133 if (!isAssociatedWithBudgetableDocument) {
134 return isAssociatedWithBudgetableDocument;
135 } else {
136 appointmentFunding.setBudgetable(Boolean.TRUE);
137 }
138
139 boolean hasValidAmounts = this.hasValidAmounts(appointmentFunding, errorMap);
140 if (!hasValidAmounts) {
141 return hasValidAmounts;
142 }
143
144 return true;
145 }
146
147 /**
148 * @see org.kuali.kfs.module.bc.document.validation.SalarySettingRule#processAdjustSalaraySettingLinePercent(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding)
149 */
150 public boolean processAdjustSalaraySettingLinePercent(PendingBudgetConstructionAppointmentFunding appointmentFunding) {
151 boolean canBeAdjusted = salarySettingRuleHelperService.canBeAdjusted(appointmentFunding, errorMap);
152 if (!canBeAdjusted) {
153 return false;
154 }
155
156 boolean hasValidAdjustmentAmount = salarySettingRuleHelperService.hasValidAdjustmentAmount(appointmentFunding, errorMap);
157 if (!hasValidAdjustmentAmount) {
158 return false;
159 }
160
161 return true;
162 }
163
164 /**
165 * @see org.kuali.kfs.module.bc.document.validation.SalarySettingRule#processNormalizePayrateAndAmount(org.kuali.kfs.module.bc.businessobject.PendingBudgetConstructionAppointmentFunding)
166 */
167 public boolean processNormalizePayrateAndAmount(PendingBudgetConstructionAppointmentFunding appointmentFunding) {
168 return salarySettingRuleHelperService.hasValidPayRateOrAnnualAmount(appointmentFunding, errorMap);
169 }
170
171 // test if all references of the given appointment funding are valid
172 private boolean hasValidRefences(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) {
173 boolean hasValidReference = budgetConstructionRuleHelperService.hasValidChart(appointmentFunding, errorMap);
174 hasValidReference &= budgetConstructionRuleHelperService.hasValidAccount(appointmentFunding, errorMap);
175 hasValidReference &= budgetConstructionRuleHelperService.hasValidObjectCode(appointmentFunding, errorMap);
176 hasValidReference &= budgetConstructionRuleHelperService.hasValidSubAccount(appointmentFunding, errorMap);
177 hasValidReference &= budgetConstructionRuleHelperService.hasValidSubObjectCode(appointmentFunding, errorMap);
178 hasValidReference &= budgetConstructionRuleHelperService.hasDetailPositionRequiredObjectCode(appointmentFunding, errorMap);
179 hasValidReference &= budgetConstructionRuleHelperService.hasValidPosition(appointmentFunding, errorMap);
180 hasValidReference &= budgetConstructionRuleHelperService.hasValidIncumbent(appointmentFunding, errorMap);
181
182 return hasValidReference;
183 }
184
185 // test if all amounts are legal
186 private boolean hasValidAmounts(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) {
187 boolean hasValidAmounts = salarySettingRuleHelperService.hasValidRequestedAmount(appointmentFunding, errorMap);
188 hasValidAmounts &= salarySettingRuleHelperService.hasValidRequestedFteQuantity(appointmentFunding, errorMap);
189 hasValidAmounts &= salarySettingRuleHelperService.hasValidRequestedFundingMonth(appointmentFunding, errorMap);
190 hasValidAmounts &= salarySettingRuleHelperService.hasValidRequestedTimePercent(appointmentFunding, errorMap);
191 hasValidAmounts &= salarySettingRuleHelperService.hasRequestedAmountZeroWhenFullYearLeave(appointmentFunding, errorMap);
192 hasValidAmounts &= salarySettingRuleHelperService.hasRequestedFteQuantityZeroWhenFullYearLeave(appointmentFunding, errorMap);
193 hasValidAmounts &= salarySettingRuleHelperService.hasValidRequestedCsfAmount(appointmentFunding, errorMap);
194 hasValidAmounts &= salarySettingRuleHelperService.hasValidRequestedCsfTimePercent(appointmentFunding, errorMap);
195
196 return hasValidAmounts;
197 }
198
199 // test if request amount and FTE interaction is legal
200 private boolean hasValidAmountsQuickSalarySetting(PendingBudgetConstructionAppointmentFunding appointmentFunding, MessageMap errorMap) {
201 boolean hasValidAmounts = salarySettingRuleHelperService.hasValidRequestedAmountQuickSalarySetting(appointmentFunding, errorMap);
202
203 return hasValidAmounts;
204 }
205 }