001    /**
002     * Copyright 2004-2013 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.hr.lm.leaveplan.validation;
017    
018    import java.sql.Date;
019    import java.text.ParseException;
020    import java.text.SimpleDateFormat;
021    import java.util.List;
022    
023    import org.apache.commons.lang.StringUtils;
024    import org.kuali.hr.lm.leaveplan.LeavePlan;
025    import org.kuali.hr.time.principal.PrincipalHRAttributes;
026    import org.kuali.hr.time.service.base.TkServiceLocator;
027    import org.kuali.hr.time.util.ValidationUtils;
028    import org.kuali.rice.kns.document.MaintenanceDocument;
029    import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase;
030    import org.kuali.rice.krad.bo.PersistableBusinessObject;
031    
032    public class LeavePlanValidation extends MaintenanceDocumentRuleBase {
033    
034            // KPME-1250 Kagata
035            // This method determines if the leave plan can be inactivated
036            boolean validateInactivation(LeavePlan leavePlan) {
037                    boolean valid = true;
038                    // Get a list of active employees based on leave plan and its effective
039                    // date.
040                    // If the list is not null, there are active employees and the leave
041                    // plan can't be inactivated, so return false otherwise true
042                    if (!leavePlan.isActive()) {
043                            // this has to use the effective date of the job passed in
044                            List<PrincipalHRAttributes> pList = TkServiceLocator
045                                            .getPrincipalHRAttributeService()
046                                            .getActiveEmployeesForLeavePlan(leavePlan.getLeavePlan(),
047                                                            leavePlan.getEffectiveDate());
048    
049                            if (pList != null && pList.size() > 0) {
050                                    // error.leaveplan.inactivate=Can not inactivate leave plan {0}.
051                                    // There are active employees in the plan.
052                                    this.putFieldError("active", "error.leaveplan.inactivate",
053                                                    leavePlan.getLeavePlan());
054                                    valid = false;
055                            }
056                    }
057    
058                    return valid;
059            }
060    
061            // KPME-1407 Kagata
062            boolean validatePlanningMonths(String planningMonths) {
063                    boolean valid = true;
064                    if (planningMonths != null) {
065                            int iPlanningMonths = Integer.parseInt(planningMonths);
066                            // error.leaveplan.planningMonths='{0}' should be between 1 and 24.
067                            if (iPlanningMonths > 24 || iPlanningMonths <= 0) {
068                                    this.putFieldError("planningMonths",
069                                                    "error.leaveplan.planningMonths", "Planning Months");
070                                    valid = false;
071                            }
072                    }
073                    return valid;
074            }
075    
076            boolean validateEffectiveDate(Date effectiveDate) {
077                    boolean valid = true;
078                    valid = ValidationUtils.validateOneYearFutureEffectiveDate(effectiveDate);
079                    if(!valid) {
080                            this.putFieldError("effectiveDate", "error.date.exceed.year", "Effective Date");
081                    } 
082                    return valid;
083            }
084    
085            boolean validateCalendarYearStart(String dateString) {
086                    if (StringUtils.isBlank(dateString)) {
087                            return false;
088                    }
089                    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd");
090                    sdf.setLenient(false);
091                    try {
092                            sdf.parse(dateString);
093                    } catch (ParseException e) {
094                            this.putFieldError("calendarYearStart",
095                                            "error.calendar.year.start", "Calendar Year Start");
096                            return false;
097                    }
098                    return true;
099            }
100    
101            @Override
102            protected boolean processCustomRouteDocumentBusinessRules(
103                            MaintenanceDocument document) {
104                    boolean valid = true;
105                    LOG.debug("entering custom validation for Leave Plan");
106                    PersistableBusinessObject pbo = (PersistableBusinessObject) this
107                                    .getNewBo();
108                    if (pbo instanceof LeavePlan) {
109                            LeavePlan leavePlan = (LeavePlan) pbo;
110                            if (leavePlan != null) {
111                                    valid = true;
112                                    valid &= this.validateInactivation(leavePlan);
113                                    if (StringUtils.isNotEmpty(leavePlan.getPlanningMonths())) {
114                                            valid &= this.validatePlanningMonths(leavePlan
115                                                            .getPlanningMonths());
116                                    }
117                                    if (leavePlan.getEffectiveDate() != null) {
118                                            valid &= this.validateEffectiveDate(
119                                                            leavePlan.getEffectiveDate());
120                                    }
121                                    valid &= this.validateCalendarYearStart(leavePlan
122                                                    .getCalendarYearStart());
123                            }
124                    }
125                    return valid;
126            }
127    }