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.cg.document.validation.impl;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.apache.log4j.Logger;
020 import org.kuali.kfs.module.cg.businessobject.Proposal;
021 import org.kuali.kfs.module.cg.businessobject.ProposalOrganization;
022 import org.kuali.kfs.module.cg.businessobject.ProposalProjectDirector;
023 import org.kuali.kfs.module.cg.businessobject.ProposalSubcontractor;
024 import org.kuali.kfs.sys.KFSKeyConstants;
025 import org.kuali.kfs.sys.KFSPropertyConstants;
026 import org.kuali.rice.kns.bo.PersistableBusinessObject;
027 import org.kuali.rice.kns.document.MaintenanceDocument;
028 import org.kuali.rice.kns.util.GlobalVariables;
029
030 /**
031 * Rules for the Proposal maintenance document.
032 */
033 public class ProposalRule extends CGMaintenanceDocumentRuleBase {
034 protected static Logger LOG = org.apache.log4j.Logger.getLogger(ProposalRule.class);
035
036 protected Proposal newProposalCopy;
037
038 @Override
039 protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument documentCopy) {
040 LOG.info("Entering ProposalRule.processCustomSaveDocumentBusinessRules");
041 processCustomRouteDocumentBusinessRules(documentCopy); // chain call but ignore success
042 LOG.info("Leaving ProposalRule.processCustomSaveDocumentBusinessRules");
043 return true; // save despite error messages
044 }
045
046 @Override
047 protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument documentCopy) {
048 LOG.info("Entering ProposalRule.processCustomRouteDocumentBusinessRules");
049 boolean success = true;
050 success &= checkEndAfterBegin(newProposalCopy.getProposalBeginningDate(), newProposalCopy.getProposalEndingDate(), KFSPropertyConstants.PROPOSAL_ENDING_DATE);
051 success &= checkPrimary(newProposalCopy.getProposalOrganizations(), ProposalOrganization.class, KFSPropertyConstants.PROPOSAL_ORGANIZATIONS, Proposal.class);
052 success &= checkPrimary(newProposalCopy.getProposalProjectDirectors(), ProposalProjectDirector.class, KFSPropertyConstants.PROPOSAL_PROJECT_DIRECTORS, Proposal.class);
053 success &= checkProjectDirectorsAreDirectors(newProposalCopy.getProposalProjectDirectors(), ProposalProjectDirector.class, KFSPropertyConstants.PROPOSAL_PROJECT_DIRECTORS);
054 success &= checkProjectDirectorsExist(newProposalCopy.getProposalProjectDirectors(), ProposalProjectDirector.class, KFSPropertyConstants.PROPOSAL_PROJECT_DIRECTORS);
055 success &= checkProjectDirectorsStatuses(newProposalCopy.getProposalProjectDirectors(), ProposalProjectDirector.class, KFSPropertyConstants.PROPOSAL_PROJECT_DIRECTORS);
056 success &= checkFederalPassThrough(newProposalCopy.getProposalFederalPassThroughIndicator(), newProposalCopy.getAgency(), newProposalCopy.getFederalPassThroughAgencyNumber(), Proposal.class, KFSPropertyConstants.PROPOSAL_FEDERAL_PASS_THROUGH_INDICATOR);
057 success &= checkAgencyNotEqualToFederalPassThroughAgency(newProposalCopy.getAgency(), newProposalCopy.getFederalPassThroughAgency(), KFSPropertyConstants.AGENCY_NUMBER, KFSPropertyConstants.FEDERAL_PASS_THROUGH_AGENCY_NUMBER);
058 LOG.info("Leaving ProposalRule.processCustomRouteDocumentBusinessRules");
059 return success;
060 }
061
062 /**
063 * @return
064 */
065 @Override
066 public boolean processCustomAddCollectionLineBusinessRules(MaintenanceDocument document, String collectionName, PersistableBusinessObject line) {
067 LOG.debug("Entering ProposalRule.processCustomAddNewCollectionLineBusinessRules( " + collectionName + " )");
068 boolean success = true;
069 success &= validateAddSubcontractor(line);
070 LOG.debug("Leaving ProposalRule.processCustomAddNewCollectionLineBusinessRules( " + collectionName + " )");
071 return success;
072 }
073
074 /**
075 * This method takes a look at the new line being added and applies appropriate validation checks if the line is a new line for
076 * the {@link Subcontractor} collection. If the validation checks fail, an appropriate error message will be added to the global
077 * error map and the method will return a value of false.
078 *
079 * @param addLine New business object values being added.
080 * @return True is the value being added passed all applicable validation rules.
081 */
082 protected boolean validateAddSubcontractor(PersistableBusinessObject addLine) {
083 boolean success = true;
084 if (addLine.getClass().isAssignableFrom(ProposalSubcontractor.class)) {
085 ProposalSubcontractor subc = (ProposalSubcontractor) addLine;
086 if (StringUtils.isBlank(subc.getSubcontractorNumber())) {
087 String propertyName = KFSPropertyConstants.SUBCONTRACTOR_NUMBER;
088 String errorKey = KFSKeyConstants.ERROR_PROPOSAL_SUBCONTRACTOR_NUMBER_REQUIRED_FOR_ADD;
089 GlobalVariables.getMessageMap().putError(propertyName, errorKey);
090 success = false;
091 }
092 }
093 return success;
094 }
095
096 /**
097 * Performs convenience cast for Maintenance framework. Note that the {@link MaintenanceDocumentRule} events provide only a deep
098 * copy of the document (from KualiDocumentEventBase), so these BOs are a copy too. The framework does this to prevent these
099 * rules from changing any data.
100 *
101 * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRule#setupConvenienceObjects()
102 */
103 @Override
104 public void setupConvenienceObjects() {
105 // oldProposalCopy = (Proposal) super.getOldBo();
106 newProposalCopy = (Proposal) super.getNewBo();
107 }
108
109
110 }