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.ar.document.validation.impl;
017    
018    import java.util.HashMap;
019    import java.util.Map;
020    
021    import org.apache.commons.lang.StringUtils;
022    import org.apache.log4j.Logger;
023    import org.kuali.kfs.module.ar.ArConstants;
024    import org.kuali.kfs.module.ar.ArKeyConstants;
025    import org.kuali.kfs.module.ar.ArPropertyConstants;
026    import org.kuali.kfs.module.ar.businessobject.OrganizationOptions;
027    import org.kuali.kfs.module.ar.businessobject.SystemInformation;
028    import org.kuali.kfs.sys.KFSConstants;
029    import org.kuali.kfs.sys.KFSKeyConstants;
030    import org.kuali.kfs.sys.context.SpringContext;
031    import org.kuali.kfs.sys.service.UniversityDateService;
032    import org.kuali.kfs.sys.service.impl.KfsParameterConstants;
033    import org.kuali.rice.kns.document.MaintenanceDocument;
034    import org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase;
035    import org.kuali.rice.kns.service.BusinessObjectService;
036    import org.kuali.rice.kns.service.ParameterService;
037    import org.kuali.rice.kns.util.ErrorMap;
038    import org.kuali.rice.kns.util.ErrorMessage;
039    import org.kuali.rice.kns.util.ObjectUtils;
040    import org.kuali.rice.kns.util.TypedArrayList;
041    
042    public class OrganizationOptionsRule extends MaintenanceDocumentRuleBase {
043        protected static Logger LOG = org.apache.log4j.Logger.getLogger(OrganizationOptionsRule.class);
044    
045        protected OrganizationOptions newOrganizationOptions;
046        protected OrganizationOptions oldOrganizationOptions;
047    
048        @Override
049        public void setupConvenienceObjects() {
050            newOrganizationOptions = (OrganizationOptions) super.getNewBo();
051            oldOrganizationOptions = (OrganizationOptions) super.getOldBo();
052        }
053    
054        @Override
055        protected boolean processCustomRouteDocumentBusinessRules(MaintenanceDocument document) {
056    
057            boolean success = true;
058            success &= doesSystemInformationExistForProcessingChartAngOrg(newOrganizationOptions);
059            success &= isOrganizationOptionsPostalZipCodeNotEmpty(newOrganizationOptions);
060            return success;
061        }
062    
063        @Override
064        protected boolean processCustomSaveDocumentBusinessRules(MaintenanceDocument document) {
065            // always return true even if there are business rule failures.
066            processCustomRouteDocumentBusinessRules(document);
067            return true;
068    
069        }
070    
071        // TODO method is gone - fix for kim / session work
072    //    /**
073    //     * 
074    //     * @see org.kuali.rice.kns.maintenance.rules.MaintenanceDocumentRuleBase#checkAuthorizationRestrictions(org.kuali.rice.kns.document.MaintenanceDocument)
075    //     */
076    //    @Override
077    //    protected boolean checkAuthorizationRestrictions(MaintenanceDocument document) {
078    //        boolean success = super.checkAuthorizationRestrictions(document);
079    //
080    //        ErrorMap map = GlobalVariables.getMessageMap();
081    //        
082    //        if(map.containsMessageKey(KFSKeyConstants.ERROR_DOCUMENT_AUTHORIZATION_RESTRICTED_FIELD_CHANGED)) {
083    //            removeRestrictedFieldChangedErrors(map, KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.OrganizationOptionsFields.PROCESSING_CHART_OF_ACCOUNTS_CODE);
084    //            removeRestrictedFieldChangedErrors(map, KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.OrganizationOptionsFields.PROCESSING_ORGANIZATION_CODE);
085    //            removeRestrictedFieldChangedErrors(map, KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.OrganizationOptionsFields.ORGANIZATION_REMIT_TO_ADDRESS_NAME);
086    //            removeRestrictedFieldChangedErrors(map, KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.OrganizationOptionsFields.ORGANIZATION_REMIT_TO_LINE1_STREET_ADDRESS);
087    //            removeRestrictedFieldChangedErrors(map, KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.OrganizationOptionsFields.ORGANIZATION_REMIT_TO_LINE2_STREET_ADDRESS);
088    //            removeRestrictedFieldChangedErrors(map, KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.OrganizationOptionsFields.ORGANIZATION_REMIT_TO_CITY_NAME);
089    //            removeRestrictedFieldChangedErrors(map, KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.OrganizationOptionsFields.ORGANIZATION_REMIT_TO_STATE_CODE);
090    //            removeRestrictedFieldChangedErrors(map, KFSConstants.MAINTENANCE_NEW_MAINTAINABLE + ArPropertyConstants.OrganizationOptionsFields.ORGANIZATION_REMIT_TO_ZIP_CODE);
091    //        }
092    //        
093    //        return success;
094    //    }
095    
096        /**
097         * This method...
098         * @param map
099         */
100        protected void removeRestrictedFieldChangedErrors(ErrorMap map, String propertyKey) {
101            TypedArrayList errorMessages = (TypedArrayList)map.get(propertyKey);
102            if(errorMessages!=null) {
103                for(int i=0; i<errorMessages.size(); i++) {
104                    ErrorMessage eMessage = (ErrorMessage)errorMessages.get(i);
105                    String errorKey = eMessage.getErrorKey();
106                    if(errorKey.equals(KFSKeyConstants.ERROR_DOCUMENT_AUTHORIZATION_RESTRICTED_FIELD_CHANGED)) {
107                        errorMessages.remove(i);
108                    }
109                }
110            }
111        }
112            
113        /**
114         * This method this returns true if system information row exists for processing chart and org
115         * 
116         * @param organizationOptions
117         * @return
118         */
119        public boolean doesSystemInformationExistForProcessingChartAngOrg(OrganizationOptions organizationOptions) {
120            boolean success = true;
121    
122            String processingChartOfAccountCode = organizationOptions.getProcessingChartOfAccountCode();
123            String processingOrganizationCode = organizationOptions.getProcessingOrganizationCode();
124    
125            Map criteria = new HashMap();
126            criteria.put(KFSConstants.UNIVERSITY_FISCAL_YEAR_PROPERTY_NAME, SpringContext.getBean(UniversityDateService.class).getCurrentFiscalYear());
127            criteria.put(ArPropertyConstants.OrganizationOptionsFields.PROCESSING_CHART_OF_ACCOUNTS_CODE, processingChartOfAccountCode);
128            criteria.put(ArPropertyConstants.OrganizationOptionsFields.PROCESSING_ORGANIZATION_CODE, processingOrganizationCode);
129    
130            SystemInformation systemInformation = (SystemInformation) SpringContext.getBean(BusinessObjectService.class).findByPrimaryKey(SystemInformation.class, criteria);
131    
132            if (ObjectUtils.isNull(systemInformation)) {
133                putFieldError(ArPropertyConstants.OrganizationOptionsFields.PROCESSING_CHART_OF_ACCOUNTS_CODE, ArKeyConstants.OrganizationOptionsErrors.SYS_INFO_DOES_NOT_EXIST_FOR_PROCESSING_CHART_AND_ORG, new String[] { processingChartOfAccountCode, processingOrganizationCode });
134                success = false;
135            }
136            return success;
137        }
138    
139        /**
140         * This method returns false if org option postal code is empty and sales tax indicator is set to Y.  Else, returns true.
141         * @param organizationOptions
142         * @return
143         */
144        public boolean isOrganizationOptionsPostalZipCodeNotEmpty(OrganizationOptions organizationOptions) {
145            boolean success = true;
146    
147            // check if sales tax is enabled && if org postal code is empty
148            if (SpringContext.getBean(ParameterService.class).getIndicatorParameter(KfsParameterConstants.ACCOUNTS_RECEIVABLE_DOCUMENT.class, ArConstants.ENABLE_SALES_TAX_IND) && StringUtils.isBlank(organizationOptions.getOrganizationPostalZipCode())) {
149                putFieldError(ArPropertyConstants.OrganizationOptionsFields.ORGANIZATION_POSTAL_ZIP_CODE, ArKeyConstants.OrganizationOptionsErrors.ERROR_ORG_OPTIONS_ZIP_CODE_REQUIRED);
150                success = false;
151            }
152    
153            return success;
154        }
155    }