/*
* 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.ar.document.validation.impl;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.kuali.kfs.coa.businessobject.ObjectCode;
import org.kuali.kfs.module.ar.ArConstants;
import org.kuali.kfs.module.ar.ArKeyConstants;
import org.kuali.kfs.module.ar.businessobject.CustomerInvoiceItemCode;
import org.kuali.kfs.module.ar.businessobject.OrganizationOptions;
import org.kuali.kfs.module.ar.document.CustomerInvoiceDocument;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.kfs.sys.service.UniversityDateService;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.kim.api.KimConstants;
import org.kuali.rice.kns.document.MaintenanceDocument;
import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase;
import org.kuali.rice.krad.maintenance.MaintenanceDocumentAuthorizer;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.KRADConstants;
import org.kuali.rice.krad.util.ObjectUtils;
public class CustomerInvoiceItemCodeRule extends MaintenanceDocumentRuleBase {
protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(CustomerInvoiceItemCodeRule.class);
protected CustomerInvoiceItemCode newInvoiceItemCode;
@Override
public void setupConvenienceObjects() {
newInvoiceItemCode = (CustomerInvoiceItemCode) super.getNewBo();
}
@Override
protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) {
boolean success;
success = validateItemDefaultPrice(newInvoiceItemCode);
success &= validateItemDefaultQuantity(newInvoiceItemCode);
success &= validateExistenceOfOrganizationOption(newInvoiceItemCode);
success &= isCustomerInvoiceItemCodeObjectValid(newInvoiceItemCode);
success &= validateBillingOrg(document);
return success;
}
@Override
protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) {
// always return true even if there are business rule failures.
processCustomRouteDocumentBusinessRules(document);
return true;
}
public boolean validateBillingOrg(MaintenanceDocument document) {
boolean success = true;
String billingChartCode = newInvoiceItemCode.getChartOfAccountsCode();
String billingOrganizationCode = newInvoiceItemCode.getOrganizationCode();
if (ObjectUtils.isNull(billingChartCode) || ObjectUtils.isNull(billingOrganizationCode)) {
return success;
}
// get the documentAuthorizer for this document
MaintenanceDocumentAuthorizer documentAuthorizer = (MaintenanceDocumentAuthorizer) getDocumentHelperService().getDocumentAuthorizer(document);
success = documentAuthorizer.isAuthorizedByTemplate(document, KRADConstants.KNS_NAMESPACE, KimConstants.PermissionTemplateNames.CREATE_MAINTAIN_RECORDS, GlobalVariables.getUserSession().getPerson().getPrincipalId());
if (!success){
putFieldError(KFSPropertyConstants.CHART_OF_ACCOUNTS_CODE, ArKeyConstants.InvoiceItemCode.ERROR_INVALID_CHART_OF_ACCOUNTS_CODE);
putFieldError(KFSPropertyConstants.ORGANIZATION_CODE,ArKeyConstants.InvoiceItemCode.ERROR_INVALID_ORGANIZATION_CODE );
success = false;
}
return success;
}
public boolean validateItemDefaultPrice(CustomerInvoiceItemCode customerInvoiceItemCode) {
boolean validEntry = true;
BigDecimal itemDefaultPrice = null;
if (customerInvoiceItemCode.getItemDefaultPrice() != null) {
itemDefaultPrice = customerInvoiceItemCode.getItemDefaultPrice().bigDecimalValue();
}
if (ObjectUtils.isNotNull(itemDefaultPrice)) {
validEntry = itemDefaultPrice.compareTo(BigDecimal.ZERO) == 1;
if (!validEntry) {
putFieldError("itemDefaultPrice",ArKeyConstants.InvoiceItemCode.NONPOSITIVE_ITEM_DEFAULT_PRICE, "Item Default Price" );
}
}
return validEntry;
}
public boolean validateItemDefaultQuantity(CustomerInvoiceItemCode customerInvoiceItemCode) {
boolean validEntry = true;
BigDecimal itemDefaultQuantity = customerInvoiceItemCode.getItemDefaultQuantity();
if (ObjectUtils.isNotNull(itemDefaultQuantity)) {
if (itemDefaultQuantity.floatValue() <= 0) {
putFieldError("itemDefaultQuantity",ArKeyConstants.InvoiceItemCode.NONPOSITIVE_ITEM_DEFAULT_QUANTITY, "Item Default Quantity" );
validEntry = false;
}
}
return validEntry;
}
/**
* This method returns true of organization option row exists with the same chart of accounts code and organization code
* as the customer invoice item code
*
* @param customerInvoiceItemCode
* @return
*/
public boolean validateExistenceOfOrganizationOption(CustomerInvoiceItemCode customerInvoiceItemCode) {
boolean isValid = true;
Map<String, String> criteria = new HashMap<String, String>();
criteria.put("chartOfAccountsCode", customerInvoiceItemCode.getChartOfAccountsCode());
criteria.put("organizationCode", customerInvoiceItemCode.getOrganizationCode());
BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class);
if( businessObjectService.countMatching(OrganizationOptions.class, criteria) == 0) {
putFieldError("organizationCode",ArKeyConstants.InvoiceItemCode.ORG_OPTIONS_DOES_NOT_EXIST_FOR_CHART_AND_ORG, new String[]{customerInvoiceItemCode.getChartOfAccountsCode(),customerInvoiceItemCode.getOrganizationCode()});
isValid = false;
}
return isValid;
}
/**
*
* This method checks to see if the customer invoice item object code is not restricted by the two parameters
*
* namespace: KFS-AR
* component: Customer Invoice
* parameter: OBJECT_CONSOLIDATIONS, OBJECT_LEVELS
*
* @return true if it is an income object
*/
protected boolean isCustomerInvoiceItemCodeObjectValid(CustomerInvoiceItemCode customerInvoiceItemCode) {
boolean success = true;
Integer universityFiscalYear = SpringContext.getBean(UniversityDateService.class).getCurrentFiscalYear();
ObjectCode defaultInvoiceItemCodeObject = customerInvoiceItemCode.getDefaultInvoiceFinancialObject();
if (ObjectUtils.isNotNull(universityFiscalYear) && ObjectUtils.isNotNull(defaultInvoiceItemCodeObject)) {
ParameterService parameterSerivce = SpringContext.getBean(ParameterService.class);
Collection<String> restrictedObjectConsolidations = parameterSerivce.getParameterValuesAsString(CustomerInvoiceDocument.class, ArConstants.OBJECT_CONSOLIDATIONS);
Collection<String> restrictedObjectLevels = parameterSerivce.getParameterValuesAsString(CustomerInvoiceDocument.class, ArConstants.OBJECT_LEVELS);
//first check consolidation is not in the restricted
if (restrictedObjectConsolidations.contains(defaultInvoiceItemCodeObject.getFinancialObjectLevel().getFinancialConsolidationObjectCode())){
putFieldError("defaultInvoiceFinancialObjectCode", ArKeyConstants.OrganizationAccountingDefaultErrors.DEFAULT_INVOICE_FINANCIAL_OBJECT_CODE_INVALID_RESTRICTED,
new String[]{defaultInvoiceItemCodeObject.getCode(), "Object Consolidation", restrictedObjectConsolidations.toString()});
success = false;
}else if (restrictedObjectLevels.contains(defaultInvoiceItemCodeObject.getFinancialObjectLevelCode())){
putFieldError("defaultInvoiceFinancialObjectCode", ArKeyConstants.OrganizationAccountingDefaultErrors.DEFAULT_INVOICE_FINANCIAL_OBJECT_CODE_INVALID_RESTRICTED,
new String[]{defaultInvoiceItemCodeObject.getCode(), "Object Level", restrictedObjectLevels.toString()});
success = false;
}
}
return success;
}
}