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 java.math.BigDecimal; 019 import java.util.HashMap; 020 import java.util.Map; 021 022 import org.kuali.kfs.coa.businessobject.ObjectCode; 023 import org.kuali.kfs.coa.service.ObjectTypeService; 024 import org.kuali.kfs.module.ar.ArKeyConstants; 025 import org.kuali.kfs.module.ar.ArPropertyConstants; 026 import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceItemCode; 027 import org.kuali.kfs.module.ar.businessobject.OrganizationOptions; 028 import org.kuali.kfs.sys.context.SpringContext; 029 import org.kuali.kfs.sys.service.UniversityDateService; 030 import org.kuali.rice.kim.util.KimConstants; 031 import org.kuali.rice.kns.document.MaintenanceDocument; 032 import org.kuali.rice.kns.document.authorization.MaintenanceDocumentAuthorizer; 033 import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase; 034 import org.kuali.rice.kns.service.BusinessObjectService; 035 import org.kuali.rice.kns.util.GlobalVariables; 036 import org.kuali.rice.kns.util.KNSConstants; 037 import org.kuali.rice.kns.util.ObjectUtils; 038 039 040 public class CustomerInvoiceItemCodeRule extends MaintenanceDocumentRuleBase { 041 042 protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ArKeyConstants.InvoiceItemCode.class); 043 044 protected CustomerInvoiceItemCode newInvoiceItemCode; 045 046 @Override 047 public void setupConvenienceObjects() { 048 newInvoiceItemCode = (CustomerInvoiceItemCode) super.getNewBo(); 049 } 050 051 @Override 052 protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) { 053 054 boolean success; 055 success = validateItemDefaultPrice(newInvoiceItemCode); 056 success &= validateItemDefaultQuantity(newInvoiceItemCode); 057 success &= validateExistenceOfOrganizationOption(newInvoiceItemCode); 058 success &= isCustomerInvoiceItemCodeObjectValid(newInvoiceItemCode); 059 success &= validateBillingOrg(document); 060 061 return success; 062 } 063 064 @Override 065 protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) { 066 // always return true even if there are business rule failures. 067 processCustomRouteDocumentBusinessRules(document); 068 return true; 069 } 070 071 public boolean validateBillingOrg(MaintenanceDocument document) { 072 boolean success = true; 073 074 String billingChartCode = newInvoiceItemCode.getChartOfAccountsCode(); 075 String billingOrganizationCode = newInvoiceItemCode.getOrganizationCode(); 076 077 if (ObjectUtils.isNull(billingChartCode) || ObjectUtils.isNull(billingOrganizationCode)) 078 return success; 079 080 // get the documentAuthorizer for this document 081 MaintenanceDocumentAuthorizer documentAuthorizer = (MaintenanceDocumentAuthorizer) getDocumentHelperService().getDocumentAuthorizer(document); 082 success = documentAuthorizer.isAuthorizedByTemplate(document, KNSConstants.KNS_NAMESPACE, KimConstants.PermissionTemplateNames.CREATE_MAINTAIN_RECORDS, GlobalVariables.getUserSession().getPerson().getPrincipalId()); 083 if (!success){ 084 putFieldError(ArPropertyConstants.CustomerInvoiceItemCodes.CHART_OF_ACCOUNTS_CODE, ArKeyConstants.InvoiceItemCode.ERROR_INVALID_CHART_OF_ACCOUNTS_CODE); 085 putFieldError(ArPropertyConstants.CustomerInvoiceItemCodes.ORGANIZATION_CODE,ArKeyConstants.InvoiceItemCode.ERROR_INVALID_ORGANIZATION_CODE ); 086 success = false; 087 } 088 return success; 089 } 090 091 public boolean validateItemDefaultPrice(CustomerInvoiceItemCode customerInvoiceItemCode) { 092 093 boolean validEntry = true; 094 BigDecimal itemDefaultPrice = null; 095 if (customerInvoiceItemCode.getItemDefaultPrice() != null) { 096 itemDefaultPrice = customerInvoiceItemCode.getItemDefaultPrice().bigDecimalValue(); 097 } 098 099 if (ObjectUtils.isNotNull(itemDefaultPrice)) { 100 validEntry = itemDefaultPrice.compareTo(BigDecimal.ZERO) == 1; 101 if (!validEntry) { 102 putFieldError("itemDefaultPrice",ArKeyConstants.InvoiceItemCode.NONPOSITIVE_ITEM_DEFAULT_PRICE, "Item Default Price" ); 103 } 104 } 105 return validEntry; 106 } 107 108 public boolean validateItemDefaultQuantity(CustomerInvoiceItemCode customerInvoiceItemCode) { 109 110 boolean validEntry = true; 111 BigDecimal itemDefaultQuantity = customerInvoiceItemCode.getItemDefaultQuantity(); 112 113 if (ObjectUtils.isNotNull(itemDefaultQuantity)) { 114 if (itemDefaultQuantity.floatValue() <= 0) { 115 putFieldError("itemDefaultQuantity",ArKeyConstants.InvoiceItemCode.NONPOSITIVE_ITEM_DEFAULT_QUANTITY, "Item Default Quantity" ); 116 validEntry = false; 117 } 118 } 119 return validEntry; 120 } 121 122 /** 123 * This method returns true of organization option row exists with the same chart of accounts code and organization code 124 * as the customer invoice item code 125 * 126 * @param customerInvoiceItemCode 127 * @return 128 */ 129 public boolean validateExistenceOfOrganizationOption(CustomerInvoiceItemCode customerInvoiceItemCode) { 130 131 boolean isValid = true; 132 133 Map<String, String> criteria = new HashMap<String, String>(); 134 criteria.put("chartOfAccountsCode", customerInvoiceItemCode.getChartOfAccountsCode()); 135 criteria.put("organizationCode", customerInvoiceItemCode.getOrganizationCode()); 136 137 BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class); 138 if( businessObjectService.countMatching(OrganizationOptions.class, criteria) == 0) { 139 putFieldError("organizationCode",ArKeyConstants.InvoiceItemCode.ORG_OPTIONS_DOES_NOT_EXIST_FOR_CHART_AND_ORG, new String[]{customerInvoiceItemCode.getChartOfAccountsCode(),customerInvoiceItemCode.getOrganizationCode()}); 140 isValid = false; 141 } 142 143 return isValid; 144 } 145 146 /** 147 * 148 * This method checks to see if the customer invoice item object code is of type Income 149 * 150 * @return true if it is an income object 151 */ 152 protected boolean isCustomerInvoiceItemCodeObjectValid(CustomerInvoiceItemCode customerInvoiceItemCode) { 153 boolean success = true; 154 155 Integer universityFiscalYear = SpringContext.getBean(UniversityDateService.class).getCurrentFiscalYear(); 156 ObjectCode defaultInvoiceItemCodeObject = customerInvoiceItemCode.getDefaultInvoiceFinancialObject(); 157 158 if (ObjectUtils.isNotNull(universityFiscalYear) && ObjectUtils.isNotNull(defaultInvoiceItemCodeObject)) { 159 ObjectTypeService objectTypeService = SpringContext.getBean(ObjectTypeService.class); 160 success = objectTypeService.getBasicIncomeObjectTypes(universityFiscalYear).contains(defaultInvoiceItemCodeObject.getFinancialObjectTypeCode()); 161 162 if (!success) { 163 // RE-USE this OrgAccDef error because it applies here 164 putFieldError("defaultInvoiceFinancialObjectCode", ArKeyConstants.OrganizationAccountingDefaultErrors.DEFAULT_INVOICE_FINANCIAL_OBJECT_CODE_INVALID, defaultInvoiceItemCodeObject.getCode()); 165 } 166 } 167 168 return success; 169 } 170 }