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.sys.document.validation.impl; 017 018 import java.util.Date; 019 import java.util.HashMap; 020 import java.util.Map; 021 022 import org.apache.commons.lang.StringUtils; 023 import org.kuali.kfs.sys.KFSConstants; 024 import org.kuali.kfs.sys.KFSKeyConstants; 025 import org.kuali.rice.kns.bo.County; 026 import org.kuali.rice.kns.bo.PostalCode; 027 import org.kuali.rice.kns.bo.State; 028 import org.kuali.kfs.sys.businessobject.TaxRegion; 029 import org.kuali.kfs.sys.businessobject.TaxRegionCounty; 030 import org.kuali.kfs.sys.businessobject.TaxRegionPostalCode; 031 import org.kuali.kfs.sys.businessobject.TaxRegionRate; 032 import org.kuali.kfs.sys.businessobject.TaxRegionState; 033 import org.kuali.kfs.sys.context.SpringContext; 034 import org.kuali.rice.kns.service.CountyService; 035 import org.kuali.rice.kns.service.PostalCodeService; 036 import org.kuali.rice.kns.service.StateService; 037 import org.kuali.rice.kns.bo.PersistableBusinessObject; 038 import org.kuali.rice.kns.document.MaintenanceDocument; 039 import org.kuali.rice.kns.service.BusinessObjectService; 040 import org.kuali.rice.kns.service.DateTimeService; 041 import org.kuali.rice.kns.util.GlobalVariables; 042 import org.kuali.rice.kns.util.ObjectUtils; 043 044 /** 045 * This class implements add collection line business rule for tax district rate. 046 */ 047 public class TaxRegionRule extends KfsMaintenanceDocumentRuleBase { 048 049 protected BusinessObjectService businessObjectService; 050 051 public TaxRegionRule() { 052 businessObjectService = SpringContext.getBean(BusinessObjectService.class); 053 } 054 055 /** 056 * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomAddCollectionLineBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument, 057 * java.lang.String, org.kuali.rice.kns.bo.PersistableBusinessObject) 058 */ 059 @Override 060 public boolean processCustomAddCollectionLineBusinessRules(MaintenanceDocument document, String collectionName, PersistableBusinessObject bo) { 061 062 boolean success = true; 063 if (KFSConstants.TaxRegionConstants.TAX_REGION_RATES.equals(collectionName)) { 064 success &= isValidTaxRegionRate((TaxRegionRate) bo, null); 065 } 066 else if (KFSConstants.TaxRegionConstants.TAX_REGION_STATES.equals(collectionName)) { 067 success &= isValidTaxRegionState((TaxRegionState) bo); 068 } 069 else if (KFSConstants.TaxRegionConstants.TAX_REGION_COUNTIES.equals(collectionName)) { 070 success &= isValidTaxRegionCounty((TaxRegionCounty) bo); 071 } 072 else if (KFSConstants.TaxRegionConstants.TAX_REGION_POSTAL_CODES.equals(collectionName)) { 073 success &= isValidTaxRegionPostalCode((TaxRegionPostalCode) bo); 074 } 075 076 return success; 077 } 078 079 /** 080 * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomAddCollectionLineBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument, 081 * java.lang.String, org.kuali.rice.kns.bo.PersistableBusinessObject) 082 */ 083 protected boolean isValidTaxRegionRate(TaxRegionRate taxRegionRate, TaxRegion taxRegion) { 084 085 boolean success = true; 086 if (ObjectUtils.isNotNull(taxRegionRate)) { 087 success &= isValidEffectiveDate(taxRegionRate); 088 success &= isValidTaxRate(taxRegionRate); 089 } 090 091 return success; 092 } 093 094 095 /** 096 * This method returns true if the effective date is not a date in the past or today's date. 097 * 098 * @param taxRegionRate 099 * @return 100 */ 101 protected boolean isValidEffectiveDate(TaxRegionRate taxRegionRate) { 102 boolean success = true; 103 if (taxRegionRate.getEffectiveDate() != null) { 104 Date currentDate = SpringContext.getBean(DateTimeService.class).getCurrentDate(); 105 int comparison = taxRegionRate.getEffectiveDate().compareTo(currentDate); 106 if (comparison == 0 || comparison < 0) { 107 GlobalVariables.getMessageMap().putError(KFSConstants.TaxRegionConstants.TAX_REGION_EFFECTIVE_DATE, KFSKeyConstants.ERROR_DOCUMENT_TAX_REGION_CANT_ADD_PAST_OR_CURRENT_DATE_FOR_TAX_DISTRICT); 108 success = false; 109 } 110 } 111 return success; 112 } 113 114 /** 115 * This method returns true if the tax rate is between 0 and 1. 116 * 117 * @param taxRegionRate 118 * @return 119 */ 120 protected boolean isValidTaxRate(TaxRegionRate taxRegionRate) { 121 boolean success = true; 122 if (taxRegionRate.getTaxRate() != null) { 123 if (taxRegionRate.getTaxRate().intValue() > 1 || taxRegionRate.getTaxRate().intValue() < 0) { 124 GlobalVariables.getMessageMap().putError(KFSConstants.TaxRegionConstants.TAX_REGION_TAX_RATE, KFSKeyConstants.ERROR_DOCUMENT_TAX_REGION_TAX_RATE_BETWEEN0AND1); 125 success = false; 126 } 127 } 128 129 return success; 130 } 131 132 /** 133 * This method returns true if the state on tax region state object is valid. 134 * 135 * @param taxRegionState 136 * @return 137 */ 138 protected boolean isValidTaxRegionState(TaxRegionState taxRegionState) { 139 boolean success = true; 140 141 State state = SpringContext.getBean(StateService.class).getByPrimaryId(taxRegionState.getStateCode()); 142 if (ObjectUtils.isNull(state) || !state.isActive()) { 143 GlobalVariables.getMessageMap().putError(KFSConstants.TaxRegionConstants.TAX_REGION_STATE_CODE, KFSKeyConstants.ERROR_DOCUMENT_TAX_REGION_INVALID_STATE, taxRegionState.getStateCode()); 144 success = false; 145 } 146 147 return success; 148 } 149 150 /** 151 * This method returns true if the state and county on the tax region county object is valid. 152 * 153 * @param taxRegionCounty 154 * @return 155 */ 156 protected boolean isValidTaxRegionCounty(TaxRegionCounty taxRegionCounty) { 157 boolean success = true; 158 159 County county = SpringContext.getBean(CountyService.class).getByPrimaryId(taxRegionCounty.getStateCode(), taxRegionCounty.getCountyCode()); 160 if (ObjectUtils.isNull(county) || !county.isActive()) { 161 GlobalVariables.getMessageMap().putError(KFSConstants.TaxRegionConstants.TAX_REGION_COUNTY_CODE, KFSKeyConstants.ERROR_DOCUMENT_TAX_REGION_INVALID_COUNTY, new String[] { taxRegionCounty.getCountyCode(), taxRegionCounty.getStateCode() }); 162 success = false; 163 } 164 165 return success; 166 } 167 168 /** 169 * This method returns true if the postal code on the tax region postal code is valid. 170 * 171 * @param taxRegionPostalCode 172 * @return 173 */ 174 protected boolean isValidTaxRegionPostalCode(TaxRegionPostalCode taxRegionPostalCode) { 175 boolean success = true; 176 177 PostalCode postalZipCode = SpringContext.getBean(PostalCodeService.class).getByPostalCodeInDefaultCountry(taxRegionPostalCode.getPostalCode()); 178 if (ObjectUtils.isNull(postalZipCode) || !postalZipCode.isActive()) { 179 GlobalVariables.getMessageMap().putError(KFSConstants.TaxRegionConstants.TAX_REGION_POSTAL_CODE, KFSKeyConstants.ERROR_DOCUMENT_TAX_REGION_INVALID_POSTAL_CODE, taxRegionPostalCode.getPostalCode()); 180 success = false; 181 } 182 183 return success; 184 } 185 }