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 java.util.ArrayList;
019 import java.util.HashMap;
020 import java.util.List;
021 import java.util.Map;
022
023 import org.apache.log4j.Logger;
024 import org.kuali.kfs.module.cg.businessobject.Agency;
025 import org.kuali.kfs.module.cg.businessobject.AgencyType;
026 import org.kuali.kfs.sys.KFSKeyConstants;
027 import org.kuali.kfs.sys.context.SpringContext;
028 import org.kuali.rice.kns.document.MaintenanceDocument;
029 import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase;
030 import org.kuali.rice.kns.service.BusinessObjectService;
031
032 /**
033 * Rules for processing Agency instances.
034 */
035 public class AgencyRule extends MaintenanceDocumentRuleBase {
036 protected static Logger LOG = org.apache.log4j.Logger.getLogger(AgencyRule.class);
037
038 protected Agency newAgency;
039 protected Agency oldAgency;
040
041 BusinessObjectService businessObjectService;
042
043 /**
044 * Default constructor.
045 */
046 public AgencyRule() {
047 super();
048 businessObjectService = SpringContext.getBean(BusinessObjectService.class);
049 }
050
051 @Override
052 protected boolean processCustomApproveDocumentBusinessRules(MaintenanceDocument document) {
053 LOG.info("Entering AgencyRule.processCustomApproveDocumentBusinessRules");
054 boolean success = super.processCustomApproveDocumentBusinessRules(document);
055
056 success &= checkAgencyReportsTo(document);
057
058 LOG.info("Leaving AgencyRule.processCustomApproveDocumentBusinessRules");
059 return success;
060 }
061
062 @Override
063 protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) {
064 LOG.info("Entering AgencyRule.processCustomRouteDocumentBusinessRules");
065 boolean success = super.processCustomRouteDocumentBusinessRules(document);
066
067 success &= checkAgencyReportsTo(document);
068
069 LOG.info("Leaving AgencyRule.processCustomRouteDocumentBusinessRules");
070 return success;
071 }
072
073 @Override
074 protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) {
075 LOG.info("Entering AgencyRule.processCustomSaveDocumentBusinessRules");
076 boolean success = super.processCustomSaveDocumentBusinessRules(document);
077
078 success &= checkAgencyReportsTo(document);
079 success &= validateAgencyType(document);
080
081 LOG.info("Leaving AgencyRule.processCustomSaveDocumentBusinessRules");
082 return success;
083 }
084
085 protected boolean validateAgencyType(MaintenanceDocument document) {
086 String agencyType = newAgency.getAgencyTypeCode();
087 Map params = new HashMap();
088 params.put("code", agencyType);
089 Object o = businessObjectService.findByPrimaryKey(AgencyType.class, params);
090 if (null == o) {
091 putFieldError("agencyTypeCode", KFSKeyConstants.ERROR_AGENCY_TYPE_NOT_FOUND, agencyType);
092 return false;
093 }
094 return false;
095 }
096
097 protected boolean checkAgencyReportsTo(MaintenanceDocument document) {
098 boolean success = true;
099
100 if (newAgency.getReportsToAgencyNumber() != null) {
101 if (newAgency.getReportsToAgency() == null) { // Agency must exist
102
103 putFieldError("reportsToAgencyNumber", KFSKeyConstants.ERROR_AGENCY_NOT_FOUND, newAgency.getReportsToAgencyNumber());
104 success = false;
105
106 }
107 else if (!newAgency.getReportsToAgency().isActive()) { // Agency must be active. See KULCG-263
108
109 putFieldError("reportsToAgencyNumber", KFSKeyConstants.ERROR_AGENCY_INACTIVE, newAgency.getReportsToAgencyNumber());
110 success = false;
111
112 }
113 else if (newAgency.getAgencyNumber().equals(newAgency.getReportsToAgencyNumber())) {
114
115 putFieldError("reportsToAgencyNumber", KFSKeyConstants.ERROR_AGENCY_REPORTS_TO_SELF, newAgency.getAgencyNumber());
116 success = false;
117
118 }
119 else { // No circular references
120
121 List agencies = new ArrayList();
122
123 Agency agency = newAgency;
124
125 while (agency.getReportsToAgency() != null && success) {
126 if (!agencies.contains(agency.getAgencyNumber())) {
127 agencies.add(agency.getAgencyNumber());
128 }
129 else {
130
131 putFieldError("reportsToAgencyNumber", KFSKeyConstants.ERROR_AGENCY_CIRCULAR_REPORTING, agency.getAgencyNumber());
132 success = false;
133 }
134
135 agency = agency.getReportsToAgency();
136 }
137 }
138 }
139 return success;
140 }
141
142 /**
143 * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#setupConvenienceObjects()
144 */
145 @Override
146 public void setupConvenienceObjects() {
147 newAgency = (Agency) super.getNewBo();
148 oldAgency = (Agency) super.getOldBo();
149 }
150
151 }