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.ar.document.validation.impl; 017 018 import org.apache.log4j.Logger; 019 import org.kuali.kfs.coa.businessobject.Account; 020 import org.kuali.kfs.coa.service.AccountService; 021 import org.kuali.kfs.coa.service.ObjectTypeService; 022 import org.kuali.kfs.module.ar.ArKeyConstants; 023 import org.kuali.kfs.module.ar.ArPropertyConstants; 024 import org.kuali.kfs.module.ar.businessobject.SystemInformation; 025 import org.kuali.kfs.module.ar.document.service.SystemInformationService; 026 import org.kuali.kfs.sys.context.SpringContext; 027 import org.kuali.rice.kns.document.MaintenanceDocument; 028 import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase; 029 import org.kuali.rice.kns.util.ObjectUtils; 030 031 public class SystemInformationRule extends MaintenanceDocumentRuleBase { 032 protected static Logger LOG = org.apache.log4j.Logger.getLogger(SystemInformationRule.class); 033 034 protected ObjectTypeService objectTypeService; 035 protected AccountService accountService; 036 protected SystemInformation newSystemInformation; 037 protected SystemInformation oldSystemInformation; 038 039 public SystemInformationRule() { 040 super(); 041 // insert object type service 042 this.setObjectTypeService(SpringContext.getBean(ObjectTypeService.class)); 043 } 044 045 @Override 046 public void setupConvenienceObjects() { 047 // setup oldAccount convenience objects, make sure all possible sub-objects are populated 048 oldSystemInformation = (SystemInformation) super.getOldBo(); 049 050 // setup newAccount convenience objects, make sure all possible sub-objects are populated 051 newSystemInformation = (SystemInformation) super.getNewBo(); 052 } 053 054 /** 055 * This performs the following checks on document approve: 056 * <ul> 057 * <li>{@link SystemInformationRule#checkClearingAccountIsActive()}</li> 058 * </ul> 059 * This rule fails on rule failure 060 * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomApproveDocumentBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument) 061 */ 062 @Override 063 protected boolean processCustomApproveDocumentBusinessRules(MaintenanceDocument document) { 064 065 boolean success = true; 066 067 LOG.info("Entering processCustomApproveDocumentBusinessRules()"); 068 069 success &= checkClearingAccountIsActive(); 070 // success &= checkWireAccountIsActive(); 071 success &= checkLockboxNumberIsUnique(); 072 073 return success; 074 } 075 076 /** 077 * This performs the following checks on document route: 078 * <ul> 079 * <ul> 080 * <li>{@link SystemInformationRule#checkClearingAccountIsActive()}</li> 081 * </ul> 082 * </ul> 083 * This rule fails on rule failure 084 * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomRouteDocumentBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument) 085 */ 086 @Override 087 protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) { 088 089 boolean success = true; 090 091 LOG.info("Entering processCustomRouteDocumentBusinessRules()"); 092 093 success &= checkClearingAccountIsActive(); 094 // success &= checkWireAccountIsActive(); 095 success &= checkLockboxNumberIsUnique(); 096 097 return success; 098 } 099 100 /** 101 * This performs the following checks on document save: 102 * <ul> 103 * <ul> 104 * <li>{@link SystemInformationRule#checkClearingAccountIsActive()}</li> 105 * </ul> 106 * </ul> 107 * This rule does not fail on rule failure 108 * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomSaveDocumentBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument) 109 */ 110 @Override 111 protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) { 112 113 boolean success = true; 114 115 LOG.info("Entering processCustomSaveDocumentBusinessRules()"); 116 117 success &= checkClearingAccountIsActive(); 118 // success &= checkWireAccountIsActive(); 119 success &= checkLockboxNumberIsUnique(); 120 121 //return success; 122 return true; 123 // TODO method never shows any errors even if returning false; just says 'Document was successfully saved' 124 } 125 126 /** 127 * 128 * This checks to see if the account is active 129 * @return true if the account is active or false otherwise 130 */ 131 protected boolean checkClearingAccountIsActive() { 132 133 LOG.info("Entering checkClearingAccountIsActive()"); 134 boolean success = true; 135 136 AccountService accountService = SpringContext.getBean(AccountService.class); 137 Account clearingAccount = accountService.getByPrimaryId(newSystemInformation.getUniversityClearingChartOfAccountsCode(), newSystemInformation.getUniversityClearingAccountNumber()); 138 139 // check clearing account is not in-active 140 if (ObjectUtils.isNull(clearingAccount)) { 141 return false; 142 } 143 if (!clearingAccount.isActive()) { 144 success &= false; 145 putGlobalError(ArKeyConstants.SystemInformation.ERROR_CLEARING_ACCOUNT_INACTIVE); 146 } 147 148 return success; 149 } 150 151 // /** 152 // * This checks to see if the account is active 153 // * 154 // * @return true if the account is active or false otherwise 155 // */ 156 // protected boolean checkWireAccountIsActive() { 157 // 158 // LOG.info("Entering checkWireAccountIsActive()"); 159 // boolean success = true; 160 // 161 // AccountService accountService = SpringContext.getBean(AccountService.class); 162 // Account wireAccount = accountService.getByPrimaryId(newSystemInformation.getWireChartOfAccountsCode(), newSystemInformation.getWireAccountNumber()); 163 // 164 // // check wire account is not in-active 165 // if (ObjectUtils.isNull(wireAccount)) { 166 // return false; 167 // } 168 // 169 // if (!wireAccount.isActive()) { 170 // success &= false; 171 // putGlobalError(ArKeyConstants.SystemInformation.ERROR_WIRE_ACCOUNT_INACTIVE); 172 // } 173 // 174 // return success; 175 // } 176 177 /** 178 * 179 * This checks to see if the lockbox number is unique 180 * @return true if the lockbox number is active or false otherwise 181 */ 182 protected boolean checkLockboxNumberIsUnique() { 183 184 LOG.info("Entering checkLockboxNumberIsUnique()"); 185 boolean success = true; 186 187 SystemInformationService systemInformationService = SpringContext.getBean(SystemInformationService.class); 188 int recordNumber = systemInformationService.getCountByChartOrgAndLockboxNumber(newSystemInformation.getProcessingChartOfAccountCode(), 189 newSystemInformation.getProcessingOrganizationCode(), 190 newSystemInformation.getLockboxNumber()); 191 // if not unique 192 if (recordNumber > 0) { 193 success = false; 194 putFieldError(ArPropertyConstants.SystemInformationFields.LOCKBOX_NUMBER, ArKeyConstants.SystemInformation.ERROR_LOCKBOX_NUMBER_NOT_UNIQUE); 195 } 196 197 return success; 198 } 199 200 /* 201 @Override 202 protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) { 203 204 boolean success; 205 success = checkSalesTaxObjectValidCode(newSystemInformation); 206 207 return success; 208 } 209 */ 210 211 /* 212 @Override 213 protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) { 214 // always return true even if there are business rule failures. 215 //processCustomRouteDocumentBusinessRules(document); 216 return true; 217 } 218 */ 219 220 /** 221 * 222 * This method checks that the Sales Tax Objcet Code is of type Income 223 * Using the ParameterService to find this valid value? 224 * <ul> 225 * <li>IC</li> 226 * <li>IH</li> 227 * <li>CN</li> 228 * </ul> 229 * @return true if it is an income object 230 */ 231 /* 232 protected boolean checkSalesTaxObjectValidCode(SystemInformation document) { 233 boolean success = true; 234 Integer universityFiscalYear = document.getUniversityFiscalYear(); 235 ObjectCode salesTaxFinancialObject = document.getSalesTaxFinancialObject(); 236 237 if (ObjectUtils.isNotNull(universityFiscalYear) && ObjectUtils.isNotNull(salesTaxFinancialObject)) { 238 success = objectTypeService.getBasicIncomeObjectTypes(universityFiscalYear).contains(salesTaxFinancialObject.getFinancialObjectTypeCode()); 239 240 if (!success) { 241 putFieldError("salesTaxFinancialObjectCode",ArKeyConstants.SystemInformation.SALES_TAX_OBJECT_CODE_INVALID,salesTaxFinancialObject.getCode()); 242 } 243 } 244 return success; 245 } 246 */ 247 248 249 public ObjectTypeService getObjectTypeService() { 250 return objectTypeService; 251 } 252 253 public void setObjectTypeService(ObjectTypeService objectTypeService) { 254 this.objectTypeService = objectTypeService; 255 } 256 }