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.purap.document.validation.impl;
017    
018    import java.util.HashMap;
019    import java.util.Iterator;
020    import java.util.List;
021    import java.util.Map;
022    
023    import org.kuali.kfs.module.purap.PurapConstants;
024    import org.kuali.kfs.module.purap.PurapKeyConstants;
025    import org.kuali.kfs.module.purap.PurapPropertyConstants;
026    import org.kuali.kfs.module.purap.businessobject.ContractManagerAssignmentDetail;
027    import org.kuali.kfs.module.purap.document.ContractManagerAssignmentDocument;
028    import org.kuali.kfs.sys.context.SpringContext;
029    import org.kuali.kfs.vnd.businessobject.ContractManager;
030    import org.kuali.rice.kns.document.Document;
031    import org.kuali.rice.kns.rule.event.ApproveDocumentEvent;
032    import org.kuali.rice.kns.rules.TransactionalDocumentRuleBase;
033    import org.kuali.rice.kns.service.BusinessObjectService;
034    import org.kuali.rice.kns.util.GlobalVariables;
035    import org.kuali.rice.kns.util.KNSPropertyConstants;
036    import org.kuali.rice.kns.util.ObjectUtils;
037    
038    /**
039     * Business rule(s) applicable to Contract Manager Assignment document.
040     */
041    public class ContractManagerAssignmentDocumentRule extends TransactionalDocumentRuleBase {
042        protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(ContractManagerAssignmentDocumentRule.class);
043    
044        /**
045         * @see org.kuali.rice.kns.rules.TransactionalDocumentRuleBase#processCustomRouteDocumentBusinessRules(Document)
046         */
047        @Override
048        protected boolean processCustomRouteDocumentBusinessRules(Document document) {
049            boolean isValid = true;
050            ContractManagerAssignmentDocument acmDocument = (ContractManagerAssignmentDocument) document;
051            return isValid &= processValidation(acmDocument);
052        }
053    
054        /**
055         * @see org.kuali.rice.kns.rules.DocumentRuleBase#processCustomApproveDocumentBusinessRules(org.kuali.rice.kns.rule.event.ApproveDocumentEvent)
056         */
057        @Override
058        protected boolean processCustomApproveDocumentBusinessRules(ApproveDocumentEvent approveEvent) {
059            boolean isValid = true;
060            ContractManagerAssignmentDocument acmDocument = (ContractManagerAssignmentDocument) approveEvent.getDocument();
061            // isValid &= processValidation(acmDocument);
062            return isValid;
063        }
064    
065        /**
066         * Perform validation for Contract Manager Assignment document such as validating contract manager codes.
067         * 
068         * @param document Contract Manager Assignment document
069         * @return Boolean indicating if validation succeeded
070         */
071        protected boolean processValidation(ContractManagerAssignmentDocument document) {
072            return validateContractManagerCodes(document.getContractManagerAssignmentDetails());
073        }
074    
075        /**
076         * Review the list of ContractManagerAssignmentDetails where the user has entered ContractManagerCodes,
077         * validates that each entered code is valid;
078         * on the other hand, validate that at least one row has a valid CM code assigned.
079         * 
080         * @param contractManagerAssignmentDetails A list containing the code to be validated.
081         * @return Boolean indicating if validation succeeded
082         */
083        public boolean validateContractManagerCodes(List contractManagerAssignmentDetails) {
084            LOG.debug("validateContractManagerCodes(): entered method.");
085            boolean isValid = true;
086            int count = 0;
087            
088            for (Iterator iter = contractManagerAssignmentDetails.iterator(); iter.hasNext();) {
089                ContractManagerAssignmentDetail detail = (ContractManagerAssignmentDetail) iter.next();
090    
091                // Look for the contractManagerCode in the table. If not there the code is invalid.
092                if (ObjectUtils.isNotNull(detail.getContractManagerCode())) {
093                    Map fieldValues = new HashMap();
094                    fieldValues.put(PurapPropertyConstants.CONTRACT_MANAGER_CODE, detail.getContractManagerCode());
095                    fieldValues.put(KNSPropertyConstants.ACTIVE, true);
096                    if (SpringContext.getBean(BusinessObjectService.class).countMatching(ContractManager.class, fieldValues) != 1) {
097                        GlobalVariables.getMessageMap().putError(PurapConstants.ASSIGN_CONTRACT_MANAGER_TAB_ERRORS, PurapKeyConstants.INVALID_CONTRACT_MANAGER_CODE, detail.getContractManagerCode().toString());
098                        isValid = false;
099                    }
100                    else count++;
101                    if (detail.getContractManagerCode().equals(PurapConstants.APO_CONTRACT_MANAGER)) {
102                        GlobalVariables.getMessageMap().putError(PurapConstants.ASSIGN_CONTRACT_MANAGER_TAB_ERRORS, PurapKeyConstants.ERROR_APO_CONTRACT_MANAGER_CODE_CHOSEN, detail.getContractManagerCode().toString());
103                        isValid = false;
104                    }
105                }
106            }
107            
108            // check if at least one row has a valid CM code assigned
109            if (count < 1) {
110                GlobalVariables.getMessageMap().putError(PurapConstants.ASSIGN_CONTRACT_MANAGER_TAB_ERRORS, PurapKeyConstants.NO_CONTRACT_MANAGER_ASSIGNED);
111                isValid = false;
112            }
113            
114            LOG.debug("validateContractManagerCodes(): leaving method.");
115            return isValid;
116        }
117    }