/* * 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.module.purap.document.validation.impl; import java.util.Collection; import java.util.HashMap; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.coa.service.AccountService; import org.kuali.kfs.coa.service.ChartService; import org.kuali.kfs.module.purap.PurapKeyConstants; import org.kuali.kfs.module.purap.businessobject.ReceivingThreshold; import org.kuali.kfs.module.purap.util.ThresholdField; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.vnd.VendorUtils; import org.kuali.kfs.vnd.businessobject.VendorDetail; import org.kuali.rice.kns.document.MaintenanceDocument; import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase; import org.kuali.rice.krad.util.ObjectUtils; public class ThresholdRule extends MaintenanceDocumentRuleBase { protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ThresholdRule.class); protected ChartService chartService; protected AccountService accountService; protected ReceivingThreshold newThreshold; protected ReceivingThreshold oldThreshold; public ThresholdRule(){ chartService = SpringContext.getBean(ChartService.class); accountService = SpringContext.getBean(AccountService.class); } protected boolean isValidDocument(ReceivingThreshold newThreshold, boolean checkDuplicate){ boolean valid = isValidThresholdCriteria(newThreshold); if (valid) { valid = isValidVendorNumber(newThreshold); // check duplication if needed if (valid && checkDuplicate){ valid = !isDuplicateEntry(newThreshold); } } else { constructFieldError(newThreshold); } return valid; } protected void constructFieldError(ReceivingThreshold threshold){ if (StringUtils.isNotBlank(threshold.getAccountTypeCode())){ putFieldError(ThresholdField.ACCOUNT_TYPE_CODE.getName(), PurapKeyConstants.INVALID_THRESHOLD_CRITERIA); } if (StringUtils.isNotBlank(threshold.getSubFundGroupCode())){ putFieldError(ThresholdField.SUBFUND_GROUP_CODE.getName(), PurapKeyConstants.INVALID_THRESHOLD_CRITERIA); } if (StringUtils.isNotBlank(threshold.getPurchasingCommodityCode())){ putFieldError(ThresholdField.COMMODITY_CODE.getName(), PurapKeyConstants.INVALID_THRESHOLD_CRITERIA); } if (StringUtils.isNotBlank(threshold.getFinancialObjectCode())){ putFieldError(ThresholdField.FINANCIAL_OBJECT_CODE.getName(), PurapKeyConstants.INVALID_THRESHOLD_CRITERIA); } if (StringUtils.isNotBlank(threshold.getOrganizationCode())){ putFieldError(ThresholdField.ORGANIZATION_CODE.getName(), PurapKeyConstants.INVALID_THRESHOLD_CRITERIA); } if (StringUtils.isNotBlank(threshold.getVendorNumber())){ putFieldError(ThresholdField.VENDOR_NUMBER.getName(), PurapKeyConstants.INVALID_THRESHOLD_CRITERIA); } } protected boolean isValidVendorNumber(ReceivingThreshold threshold){ if (StringUtils.isNotBlank(threshold.getVendorNumber())){ String vendorNumber = threshold.getVendorNumber(); if (StringUtils.isNotBlank(vendorNumber)){ Map<String, Integer> keys = new HashMap<String, Integer>(); Integer headerId = VendorUtils.getVendorHeaderId(vendorNumber); Integer detailId = VendorUtils.getVendorDetailId(vendorNumber); keys.put(KFSPropertyConstants.VENDOR_HEADER_GENERATED_ID, headerId); keys.put(KFSPropertyConstants.VENDOR_DETAIL_ASSIGNED_ID, detailId); VendorDetail vendorDetail = getBoService().findByPrimaryKey(VendorDetail.class, keys); if (ObjectUtils.isNull(vendorDetail)) { putFieldError(KFSPropertyConstants.VENDOR_NUMBER, PurapKeyConstants.THRESHOLD_FIELD_INVALID, "Vendor Number " + vendorNumber); return false; } else{ VendorDetail vendor = threshold.getVendorDetail(); vendor.setVendorHeaderGeneratedIdentifier(headerId); vendor.setVendorDetailAssignedIdentifier(detailId); } } return true; } return true; } protected boolean isValidThresholdCriteria(ReceivingThreshold threshold){ if (StringUtils.isBlank(threshold.getAccountTypeCode()) && StringUtils.isBlank(threshold.getSubFundGroupCode()) && StringUtils.isBlank(threshold.getPurchasingCommodityCode()) && StringUtils.isBlank(threshold.getFinancialObjectCode()) && StringUtils.isBlank(threshold.getOrganizationCode()) && StringUtils.isBlank(threshold.getVendorNumber())){ return true; }else if (StringUtils.isNotBlank(threshold.getAccountTypeCode()) && StringUtils.isBlank(threshold.getSubFundGroupCode()) && StringUtils.isBlank(threshold.getPurchasingCommodityCode()) && StringUtils.isBlank(threshold.getFinancialObjectCode()) && StringUtils.isBlank(threshold.getOrganizationCode()) && StringUtils.isBlank(threshold.getVendorNumber())){ return true; }else if (StringUtils.isBlank(threshold.getAccountTypeCode()) && StringUtils.isNotBlank(threshold.getSubFundGroupCode()) && StringUtils.isBlank(threshold.getPurchasingCommodityCode()) && StringUtils.isBlank(threshold.getFinancialObjectCode()) && StringUtils.isBlank(threshold.getOrganizationCode()) && StringUtils.isBlank(threshold.getVendorNumber())){ return true; }else if (StringUtils.isBlank(threshold.getAccountTypeCode()) && StringUtils.isBlank(threshold.getSubFundGroupCode()) && StringUtils.isNotBlank(threshold.getPurchasingCommodityCode()) && StringUtils.isBlank(threshold.getFinancialObjectCode()) && StringUtils.isBlank(threshold.getOrganizationCode()) && StringUtils.isBlank(threshold.getVendorNumber())){ return true; }else if (StringUtils.isBlank(threshold.getAccountTypeCode()) && StringUtils.isBlank(threshold.getSubFundGroupCode()) && StringUtils.isBlank(threshold.getPurchasingCommodityCode()) && StringUtils.isNotBlank(threshold.getFinancialObjectCode()) && StringUtils.isBlank(threshold.getOrganizationCode()) && StringUtils.isBlank(threshold.getVendorNumber())){ return true; }else if (StringUtils.isBlank(threshold.getAccountTypeCode()) && StringUtils.isBlank(threshold.getSubFundGroupCode()) && StringUtils.isBlank(threshold.getPurchasingCommodityCode()) && StringUtils.isBlank(threshold.getFinancialObjectCode()) && StringUtils.isNotBlank(threshold.getOrganizationCode()) && StringUtils.isBlank(threshold.getVendorNumber())){ return true; }else if (StringUtils.isBlank(threshold.getAccountTypeCode()) && StringUtils.isBlank(threshold.getSubFundGroupCode()) && StringUtils.isBlank(threshold.getPurchasingCommodityCode()) && StringUtils.isBlank(threshold.getFinancialObjectCode()) && StringUtils.isBlank(threshold.getOrganizationCode()) && StringUtils.isNotBlank(threshold.getVendorNumber())){ return true; } return false; } protected boolean isDuplicateEntry(ReceivingThreshold newThreshold){ Map fieldValues = new HashMap(); fieldValues.put(ThresholdField.CHART_OF_ACCOUNTS_CODE.getName(), newThreshold.getChartOfAccountsCode()); if (StringUtils.isNotBlank(newThreshold.getAccountTypeCode())){ fieldValues.put(ThresholdField.ACCOUNT_TYPE_CODE.getName(), newThreshold.getAccountTypeCode()); }else if (StringUtils.isNotBlank(newThreshold.getSubFundGroupCode())){ fieldValues.put(ThresholdField.SUBFUND_GROUP_CODE.getName(), newThreshold.getSubFundGroupCode()); }else if (StringUtils.isNotBlank(newThreshold.getPurchasingCommodityCode())){ fieldValues.put(ThresholdField.COMMODITY_CODE.getName(), newThreshold.getPurchasingCommodityCode()); }else if (StringUtils.isNotBlank(newThreshold.getFinancialObjectCode())){ fieldValues.put(ThresholdField.FINANCIAL_OBJECT_CODE.getName(), newThreshold.getFinancialObjectCode()); }else if (StringUtils.isNotBlank(newThreshold.getOrganizationCode())){ fieldValues.put(ThresholdField.ORGANIZATION_CODE.getName(), newThreshold.getOrganizationCode()); }else if (StringUtils.isNotBlank(newThreshold.getVendorNumber())){ fieldValues.put(ThresholdField.VENDOR_HEADER_GENERATED_ID.getName(), newThreshold.getVendorHeaderGeneratedIdentifier()); fieldValues.put(ThresholdField.VENDOR_DETAIL_ASSIGNED_ID.getName(), newThreshold.getVendorDetailAssignedIdentifier()); } Collection<ReceivingThreshold> result = getBoService().findMatching(ReceivingThreshold.class, fieldValues); if (result != null && result.size() > 0) { putGlobalError(PurapKeyConstants.PURAP_GENERAL_POTENTIAL_DUPLICATE); return true; } return false; } /** * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#processCustomRouteDocumentBusinessRules(org.kuali.rice.kns.document.MaintenanceDocument) */ @Override protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) { boolean valid = true; if (document.isNew() || document.isEdit() || document.isNewWithExisting()) { newThreshold = (ReceivingThreshold) document.getNewMaintainableObject().getBusinessObject(); oldThreshold = document.getOldMaintainableObject() != null ? (ReceivingThreshold)document.getOldMaintainableObject().getBusinessObject() : null; // compare oldThreshold and newThreshold, check if there's any update on the various code fields // if yes, then we need to check duplicate of the new threshold among other thresholds; otherwise no need to check boolean checkDuplicate = oldThreshold == null; checkDuplicate |= !StringUtils.equals(newThreshold.getChartOfAccountsCode(), oldThreshold.getChartOfAccountsCode()); checkDuplicate |= !StringUtils.equals(newThreshold.getAccountTypeCode(), oldThreshold.getAccountTypeCode()); checkDuplicate |= !StringUtils.equals(newThreshold.getSubFundGroupCode(), oldThreshold.getSubFundGroupCode()); checkDuplicate |= !StringUtils.equals(newThreshold.getPurchasingCommodityCode(), oldThreshold.getPurchasingCommodityCode()); checkDuplicate |= !StringUtils.equals(newThreshold.getFinancialObjectCode(), oldThreshold.getFinancialObjectCode()); checkDuplicate |= !StringUtils.equals(newThreshold.getOrganizationCode(), oldThreshold.getOrganizationCode()); checkDuplicate |= !StringUtils.equals(newThreshold.getVendorNumber(), oldThreshold.getVendorNumber()); valid &= isValidDocument(newThreshold, checkDuplicate); } return valid && super.processCustomRouteDocumentBusinessRules(document); } }