/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.sys.document.validation.impl; import java.util.Date; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSKeyConstants; import org.kuali.kfs.sys.businessobject.TaxRegion; import org.kuali.kfs.sys.businessobject.TaxRegionCounty; import org.kuali.kfs.sys.businessobject.TaxRegionPostalCode; import org.kuali.kfs.sys.businessobject.TaxRegionRate; import org.kuali.kfs.sys.businessobject.TaxRegionState; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.rice.core.api.datetime.DateTimeService; import org.kuali.rice.kns.document.MaintenanceDocument; import org.kuali.rice.krad.bo.PersistableBusinessObject; import org.kuali.rice.krad.util.GlobalVariables; import org.kuali.rice.krad.util.ObjectUtils; import org.kuali.rice.location.api.county.County; import org.kuali.rice.location.api.county.CountyService; import org.kuali.rice.location.api.postalcode.PostalCode; import org.kuali.rice.location.api.postalcode.PostalCodeService; import org.kuali.rice.location.api.state.State; import org.kuali.rice.location.api.state.StateService; /** * This class implements add collection line business rule for tax district rate. */ public class TaxRegionRule extends KfsMaintenanceDocumentRuleBase { /** * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomAddCollectionLineBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument, * java.lang.String, org.kuali.rice.krad.bo.PersistableBusinessObject) */ @Override public boolean processCustomAddCollectionLineBusinessRules(MaintenanceDocument document, String collectionName, PersistableBusinessObject bo) { boolean success = true; if (KFSConstants.TaxRegionConstants.TAX_REGION_RATES.equals(collectionName)) { success &= isValidTaxRegionRate((TaxRegionRate) bo, null); } else if (KFSConstants.TaxRegionConstants.TAX_REGION_STATES.equals(collectionName)) { success &= isValidTaxRegionState((TaxRegionState) bo); } else if (KFSConstants.TaxRegionConstants.TAX_REGION_COUNTIES.equals(collectionName)) { success &= isValidTaxRegionCounty((TaxRegionCounty) bo); } else if (KFSConstants.TaxRegionConstants.TAX_REGION_POSTAL_CODES.equals(collectionName)) { success &= isValidTaxRegionPostalCode((TaxRegionPostalCode) bo); } return success; } /** * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomAddCollectionLineBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument, * java.lang.String, org.kuali.rice.krad.bo.PersistableBusinessObject) */ protected boolean isValidTaxRegionRate(TaxRegionRate taxRegionRate, TaxRegion taxRegion) { boolean success = true; if (ObjectUtils.isNotNull(taxRegionRate)) { success &= isValidEffectiveDate(taxRegionRate); success &= isValidTaxRate(taxRegionRate); } return success; } /** * This method returns true if the effective date is not a date in the past or today's date. * * @param taxRegionRate * @return */ protected boolean isValidEffectiveDate(TaxRegionRate taxRegionRate) { boolean success = true; if (taxRegionRate.getEffectiveDate() != null) { Date currentDate = SpringContext.getBean(DateTimeService.class).getCurrentDate(); int comparison = taxRegionRate.getEffectiveDate().compareTo(currentDate); if (comparison == 0 || comparison < 0) { GlobalVariables.getMessageMap().putError(KFSConstants.TaxRegionConstants.TAX_REGION_EFFECTIVE_DATE, KFSKeyConstants.ERROR_DOCUMENT_TAX_REGION_CANT_ADD_PAST_OR_CURRENT_DATE_FOR_TAX_DISTRICT); success = false; } } return success; } /** * This method returns true if the tax rate is between 0 and 1. * * @param taxRegionRate * @return */ protected boolean isValidTaxRate(TaxRegionRate taxRegionRate) { boolean success = true; if (taxRegionRate.getTaxRate() != null) { if (taxRegionRate.getTaxRate().intValue() > 1 || taxRegionRate.getTaxRate().intValue() < 0) { GlobalVariables.getMessageMap().putError(KFSConstants.TaxRegionConstants.TAX_REGION_TAX_RATE, KFSKeyConstants.ERROR_DOCUMENT_TAX_REGION_TAX_RATE_BETWEEN0AND1); success = false; } } return success; } /** * This method returns true if the state on tax region state object is valid. * * @param taxRegionState * @return */ protected boolean isValidTaxRegionState(TaxRegionState taxRegionState) { boolean success = true; if ( StringUtils.isNotBlank(taxRegionState.getPostalCountryCode()) && StringUtils.isNotBlank(taxRegionState.getStateCode()) ) { State state = SpringContext.getBean(StateService.class).getState(taxRegionState.getPostalCountryCode(),taxRegionState.getStateCode()); if (ObjectUtils.isNull(state) || !state.isActive()) { GlobalVariables.getMessageMap().putError(KFSConstants.TaxRegionConstants.TAX_REGION_STATE_CODE, KFSKeyConstants.ERROR_DOCUMENT_TAX_REGION_INVALID_STATE, taxRegionState.getStateCode()); success = false; } } return success; } /** * This method returns true if the state and county on the tax region county object is valid. * * @param taxRegionCounty * @return */ protected boolean isValidTaxRegionCounty(TaxRegionCounty taxRegionCounty) { boolean success = true; if ( StringUtils.isNotBlank(taxRegionCounty.getPostalCountryCode()) && StringUtils.isNotBlank(taxRegionCounty.getStateCode()) && StringUtils.isNotBlank(taxRegionCounty.getCountyCode()) ) { County county = SpringContext.getBean(CountyService.class).getCounty(taxRegionCounty.getPostalCountryCode(),taxRegionCounty.getStateCode(), taxRegionCounty.getCountyCode()); if (ObjectUtils.isNull(county) || !county.isActive()) { GlobalVariables.getMessageMap().putError(KFSConstants.TaxRegionConstants.TAX_REGION_COUNTY_CODE, KFSKeyConstants.ERROR_DOCUMENT_TAX_REGION_INVALID_COUNTY, new String[] { taxRegionCounty.getCountyCode(), taxRegionCounty.getStateCode() }); success = false; } } return success; } /** * This method returns true if the postal code on the tax region postal code is valid. * * @param taxRegionPostalCode * @return */ protected boolean isValidTaxRegionPostalCode(TaxRegionPostalCode taxRegionPostalCode) { boolean success = true; if ( StringUtils.isNotBlank(taxRegionPostalCode.getPostalCountryCode()) && StringUtils.isNotBlank(taxRegionPostalCode.getPostalCode()) ) { PostalCode postalZipCode = SpringContext.getBean(PostalCodeService.class).getPostalCode( taxRegionPostalCode.getPostalCountryCode(), taxRegionPostalCode.getPostalCode() ); if (ObjectUtils.isNull(postalZipCode) || !postalZipCode.isActive()) { GlobalVariables.getMessageMap().putError(KFSConstants.TaxRegionConstants.TAX_REGION_POSTAL_CODE, KFSKeyConstants.ERROR_DOCUMENT_TAX_REGION_INVALID_POSTAL_CODE, taxRegionPostalCode.getPostalCode()); success = false; } } return success; } }