001 /** 002 * Copyright 2004-2014 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.kpme.pm.position.web; 017 018 import java.math.BigDecimal; 019 020 import org.apache.commons.collections.CollectionUtils; 021 import org.apache.commons.lang.StringUtils; 022 import org.kuali.kpme.core.bo.HrBusinessObject; 023 import org.kuali.kpme.core.bo.HrBusinessObjectMaintainableImpl; 024 import org.kuali.kpme.core.util.ValidationUtils; 025 import org.kuali.kpme.pm.classification.Classification; 026 import org.kuali.kpme.pm.classification.duty.ClassificationDuty; 027 import org.kuali.kpme.pm.classification.flag.ClassificationFlag; 028 import org.kuali.kpme.pm.classification.qual.ClassificationQualification; 029 import org.kuali.kpme.pm.position.Position; 030 import org.kuali.kpme.pm.position.PositionDuty; 031 import org.kuali.kpme.pm.position.PositionQualification; 032 import org.kuali.kpme.pm.position.PstnFlag; 033 import org.kuali.kpme.pm.position.funding.PositionFunding; 034 import org.kuali.kpme.pm.positionflag.PositionFlag; 035 import org.kuali.kpme.pm.service.base.PmServiceLocator; 036 import org.kuali.rice.krad.maintenance.MaintenanceDocument; 037 import org.kuali.rice.krad.uif.container.CollectionGroup; 038 import org.kuali.rice.krad.uif.view.View; 039 import org.kuali.rice.krad.util.GlobalVariables; 040 import org.kuali.rice.krad.util.KRADConstants; 041 import org.kuali.rice.krad.web.form.MaintenanceDocumentForm; 042 043 public class PositionMaintainableServiceImpl extends HrBusinessObjectMaintainableImpl { 044 045 private static final long serialVersionUID = 1L; 046 047 @Override 048 public HrBusinessObject getObjectById(String id) { 049 return PmServiceLocator.getPositionService().getPosition(id); 050 } 051 052 @Override 053 public void customSaveLogic(HrBusinessObject hrObj){ 054 Position aPosition = (Position) hrObj; 055 for(PositionQualification aQual : aPosition.getQualificationList()) { 056 aQual.setHrPositionId(aPosition.getHrPositionId()); 057 aQual.setPmQualificationId(null); 058 } 059 for(PositionDuty aDuty : aPosition.getDutyList()) { 060 aDuty.setHrPositionId(aPosition.getHrPositionId()); 061 aDuty.setPmDutyId(null); 062 } 063 for(PstnFlag aFlag : aPosition.getFlagList()) { 064 aFlag.setHrPositionId(aPosition.getHrPositionId()); 065 aFlag.setPmFlagId(null); 066 } 067 for(PositionFunding aFunding : aPosition.getFundingList()) { 068 aFunding.setHrPositionId(aPosition.getHrPositionId()); 069 aFunding.setPmPositionFunctionId(null); 070 } 071 072 } 073 074 @Override 075 protected boolean performAddLineValidation(View view, CollectionGroup collectionGroup, Object model, 076 Object addLine) { 077 boolean isValid = super.performAddLineValidation(view, collectionGroup, model, addLine); 078 if (model instanceof MaintenanceDocumentForm) { 079 MaintenanceDocumentForm maintenanceForm = (MaintenanceDocumentForm) model; 080 MaintenanceDocument document = maintenanceForm.getDocument(); 081 if (document.getNewMaintainableObject().getDataObject() instanceof Position) { 082 Position aPosition = (Position) document.getNewMaintainableObject().getDataObject(); 083 // Duty line validation 084 if (addLine instanceof PositionDuty) { 085 PositionDuty pd = (PositionDuty) addLine; 086 boolean results = this.validateDutyListPercentage(pd, aPosition); 087 if(!results) { 088 return false; 089 } 090 } 091 // Funding line validation 092 if (addLine instanceof PositionFunding) { 093 PositionFunding pf = (PositionFunding) addLine; 094 boolean results = this.validateAddFundingLine(pf, aPosition); 095 if(!results) { 096 return false; 097 } 098 } 099 } 100 } 101 102 return isValid; 103 } 104 105 private boolean validateDutyListPercentage(PositionDuty pd, Position aPosition) { 106 if(CollectionUtils.isNotEmpty(aPosition.getDutyList()) && pd.getPercentage() != null) { 107 BigDecimal sum = pd.getPercentage(); 108 for(PositionDuty aDuty : aPosition.getDutyList()) { 109 if(aDuty != null && aDuty.getPercentage() != null) { 110 sum = sum.add(aDuty.getPercentage()); 111 } 112 } 113 if(sum.compareTo(new BigDecimal(100)) > 0) { 114 GlobalVariables.getMessageMap().putError("Position-duties", "duty.percentage.exceedsMaximum", sum.toString()); 115 return false; 116 } 117 } 118 return true; 119 } 120 121 protected boolean validateAddFundingLine(PositionFunding pf, Position aPosition) { 122 if(pf.getEffectiveDate() != null && aPosition.getEffectiveDate() != null) { 123 if(pf.getEffectiveDate().compareTo(aPosition.getEffectiveDate()) < 0) { 124 String[] parameters = new String[2]; 125 parameters[0] = pf.getEffectiveDate().toString(); 126 parameters[1] = aPosition.getEffectiveDate().toString(); 127 // using section id as the error key because KRAD does not support error matching on property names for collections as in 2.3M2 128 GlobalVariables.getMessageMap().putError("Position-fundings","error.funding.effdt.invalid", parameters); 129 return false; 130 } 131 } 132 if(StringUtils.isNotEmpty(pf.getAccount())) { 133 boolean results = ValidationUtils.validateAccount(pf.getChart(), pf.getAccount()); 134 if(!results) { 135 GlobalVariables.getMessageMap().putError("Position-fundings", "error.existence", "Account '" + pf.getAccount() + "'"); 136 return results; 137 } 138 } 139 if(StringUtils.isNotEmpty(pf.getSubAccount())) { 140 boolean results = ValidationUtils.validateSubAccount(pf.getSubAccount(), pf.getAccount(), pf.getChart()); 141 if(!results) { 142 GlobalVariables.getMessageMap().putError("Position-fundings","error.existence", "SubAccount '" + pf.getSubAccount() + "'"); 143 return results; 144 } 145 } 146 if(StringUtils.isNotEmpty(pf.getObjectCode())) { 147 boolean results = ValidationUtils.validateObjectCode(pf.getObjectCode(), pf.getChart(), Integer.valueOf(pf.getEffectiveLocalDate().getYear())); 148 if(!results) { 149 GlobalVariables.getMessageMap().putError("Position-fundings","error.existence", "ObjectCode '" + pf.getObjectCode() + "'"); 150 return results; 151 } 152 } 153 if(StringUtils.isNotEmpty(pf.getSubObjectCode())) { 154 boolean results = ValidationUtils.validateSubObjectCode(String.valueOf(pf.getEffectiveLocalDate().getYear()), 155 pf.getChart(), 156 pf.getAccount(), 157 pf.getObjectCode(), 158 pf.getSubObjectCode()); 159 if(!results) { 160 GlobalVariables.getMessageMap().putError("Position-fundings","error.existence", "SubObjectCode '" + pf.getSubObjectCode() + "'"); 161 return results; 162 } 163 } 164 return true; 165 166 } 167 168 }