/*
* 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.cg.document.validation.impl;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.kuali.kfs.module.cg.businessobject.Proposal;
import org.kuali.kfs.module.cg.businessobject.ProposalOrganization;
import org.kuali.kfs.module.cg.businessobject.ProposalProjectDirector;
import org.kuali.kfs.module.cg.businessobject.ProposalSubcontractor;
import org.kuali.kfs.sys.KFSKeyConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.rice.kns.document.MaintenanceDocument;
import org.kuali.rice.krad.bo.PersistableBusinessObject;
import org.kuali.rice.krad.util.GlobalVariables;
/**
* Rules for the Proposal maintenance document.
*/
public class ProposalRule extends CGMaintenanceDocumentRuleBase {
protected static Logger LOG = org.apache.log4j.Logger.getLogger(ProposalRule.class);
protected Proposal newProposalCopy;
@Override
protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument documentCopy) {
LOG.debug("Entering ProposalRule.processCustomSaveDocumentBusinessRules");
processCustomRouteDocumentBusinessRules(documentCopy); // chain call but ignore success
LOG.info("Leaving ProposalRule.processCustomSaveDocumentBusinessRules");
return true; // save despite error messages
}
@Override
protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument documentCopy) {
LOG.debug("Entering ProposalRule.processCustomRouteDocumentBusinessRules");
boolean success = true;
success &= checkEndAfterBegin(newProposalCopy.getProposalBeginningDate(), newProposalCopy.getProposalEndingDate(), KFSPropertyConstants.PROPOSAL_ENDING_DATE);
success &= checkPrimary(newProposalCopy.getProposalOrganizations(), ProposalOrganization.class, KFSPropertyConstants.PROPOSAL_ORGANIZATIONS, Proposal.class);
success &= checkPrimary(newProposalCopy.getProposalProjectDirectors(), ProposalProjectDirector.class, KFSPropertyConstants.PROPOSAL_PROJECT_DIRECTORS, Proposal.class);
success &= checkProjectDirectorsAreDirectors(newProposalCopy.getProposalProjectDirectors(), ProposalProjectDirector.class, KFSPropertyConstants.PROPOSAL_PROJECT_DIRECTORS);
success &= checkProjectDirectorsExist(newProposalCopy.getProposalProjectDirectors(), ProposalProjectDirector.class, KFSPropertyConstants.PROPOSAL_PROJECT_DIRECTORS);
success &= checkProjectDirectorsStatuses(newProposalCopy.getProposalProjectDirectors(), ProposalProjectDirector.class, KFSPropertyConstants.PROPOSAL_PROJECT_DIRECTORS);
success &= checkFederalPassThrough(newProposalCopy.getProposalFederalPassThroughIndicator(), newProposalCopy.getAgency(), newProposalCopy.getFederalPassThroughAgencyNumber(), Proposal.class, KFSPropertyConstants.PROPOSAL_FEDERAL_PASS_THROUGH_INDICATOR);
success &= checkAgencyNotEqualToFederalPassThroughAgency(newProposalCopy.getAgency(), newProposalCopy.getFederalPassThroughAgency(), KFSPropertyConstants.AGENCY_NUMBER, KFSPropertyConstants.FEDERAL_PASS_THROUGH_AGENCY_NUMBER);
LOG.info("Leaving ProposalRule.processCustomRouteDocumentBusinessRules");
return success;
}
/**
* @return
*/
@Override
public boolean processCustomAddCollectionLineBusinessRules(MaintenanceDocument document, String collectionName, PersistableBusinessObject line) {
if (LOG.isDebugEnabled()) {
LOG.debug("Entering ProposalRule.processCustomAddNewCollectionLineBusinessRules( " + collectionName + " )");
}
boolean success = true;
success &= validateAddSubcontractor(line);
if (LOG.isDebugEnabled()) {
LOG.debug("Leaving ProposalRule.processCustomAddNewCollectionLineBusinessRules( " + collectionName + " )");
}
return success;
}
/**
* This method takes a look at the new line being added and applies appropriate validation checks if the line is a new line for
* the {@link Subcontractor} collection. If the validation checks fail, an appropriate error message will be added to the global
* error map and the method will return a value of false.
*
* @param addLine New business object values being added.
* @return True is the value being added passed all applicable validation rules.
*/
protected boolean validateAddSubcontractor(PersistableBusinessObject addLine) {
boolean success = true;
if (addLine.getClass().isAssignableFrom(ProposalSubcontractor.class)) {
ProposalSubcontractor subc = (ProposalSubcontractor) addLine;
if (StringUtils.isBlank(subc.getSubcontractorNumber())) {
String propertyName = KFSPropertyConstants.SUBCONTRACTOR_NUMBER;
String errorKey = KFSKeyConstants.ERROR_PROPOSAL_SUBCONTRACTOR_NUMBER_REQUIRED_FOR_ADD;
GlobalVariables.getMessageMap().putError(propertyName, errorKey);
success = false;
}
}
return success;
}
/**
* Performs convenience cast for Maintenance framework. Note that the {@link MaintenanceDocumentRule} events provide only a deep
* copy of the document (from KualiDocumentEventBase), so these BOs are a copy too. The framework does this to prevent these
* rules from changing any data.
*
* @see org.kuali.rice.kns.rules.MaintenanceDocumentRule#setupConvenienceObjects()
*/
@Override
public void setupConvenienceObjects() {
// oldProposalCopy = (Proposal) super.getOldBo();
newProposalCopy = (Proposal) super.getNewBo();
}
}