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    }