001/*
002 * Copyright 2007 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 */
016package org.kuali.ole.module.cg.document.validation.impl;
017
018import java.sql.Date;
019
020import org.apache.commons.lang.StringUtils;
021import org.kuali.ole.coa.document.validation.impl.MaintenancePreRulesBase;
022import org.kuali.ole.module.cg.businessobject.Award;
023import org.kuali.ole.sys.OLEKeyConstants;
024import org.kuali.ole.sys.OLEPropertyConstants;
025import org.kuali.ole.sys.context.SpringContext;
026import org.kuali.rice.core.api.config.property.ConfigurationService;
027import org.kuali.rice.core.api.util.type.KualiDecimal;
028import org.kuali.rice.kns.document.MaintenanceDocument;
029import org.kuali.rice.kns.service.DataDictionaryService;
030import org.kuali.rice.krad.util.ObjectUtils;
031
032/**
033 * PreRules checks for the Account that needs to occur while still in the Struts processing. This includes defaults, confirmations,
034 * etc.
035 */
036public class AwardPreRules extends MaintenancePreRulesBase {
037
038    protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AwardPreRules.class);
039
040    protected ConfigurationService configService;
041    protected DataDictionaryService dataDictionaryService;
042
043    protected Award newAward;
044
045    /**
046     * Constructs a AwardPreRules.java.
047     */
048    public AwardPreRules() {
049        dataDictionaryService = SpringContext.getBean(DataDictionaryService.class);
050        configService = SpringContext.getBean(ConfigurationService.class);
051    }
052
053    /**
054     * @see org.kuali.ole.coa.document.validation.impl.MaintenancePreRulesBase#doCustomPreRules(org.kuali.rice.kns.document.MaintenanceDocument)
055     */
056    @Override
057    protected boolean doCustomPreRules(MaintenanceDocument document) {
058        setupConvenienceObjects(document);
059        boolean proceed = true;
060        if (proceed) {
061            proceed = continueIfEntryDateBeforeBeginDate();
062        }
063        if (proceed) {
064            proceed = continueIfSubcontractorTotalGreaterThanAwardTotal();
065        }
066
067        if (!proceed) {
068            abortRulesCheck();
069        }
070
071        return true;
072    }
073
074    /**
075     * Checks if the entry date is before the begin date. if so asks the user if they want to continue validation. if no is selected
076     * further validation is aborted and the user is returned to the award document.
077     * 
078     * @return true if the user selects yes, false otherwise
079     */
080    protected boolean continueIfEntryDateBeforeBeginDate() {
081        boolean proceed = true;
082        Date entryDate = newAward.getAwardEntryDate();
083        Date beginDate = newAward.getAwardBeginningDate();
084
085        if (ObjectUtils.isNotNull(entryDate) && ObjectUtils.isNotNull(beginDate) && entryDate.before(beginDate)) {
086            String entryDateLabel = dataDictionaryService.getAttributeErrorLabel(Award.class, OLEPropertyConstants.AWARD_ENTRY_DATE);
087            String beginDateLabel = dataDictionaryService.getAttributeErrorLabel(Award.class, OLEPropertyConstants.AWARD_BEGINNING_DATE);
088            proceed = askOrAnalyzeYesNoQuestion("entryDateBeforeStartDate", buildConfirmationQuestion(OLEKeyConstants.WARNING_AWARD_ENTRY_BEFORE_START_DATE, entryDateLabel, beginDateLabel));
089        }
090        return proceed;
091    }
092
093    /**
094     * Checks if the {@link Subcontractor} total amount is greater than the award total. If so asks the user if they want to
095     * continue validation. if no is selected further validation is aborted and the user is returned to the award document.
096     * 
097     * @return true if the user selects yes, false otherwise
098     */
099    protected boolean continueIfSubcontractorTotalGreaterThanAwardTotal() {
100        boolean proceed = true;
101
102        KualiDecimal awardTotal = newAward.getAwardTotalAmount();
103        KualiDecimal subcontractorTotal = newAward.getAwardSubcontractorsTotalAmount();
104        if ((ObjectUtils.isNotNull(awardTotal) && subcontractorTotal.isGreaterThan(awardTotal)) || (ObjectUtils.isNull(awardTotal) && subcontractorTotal.isPositive())) {
105
106            String subcontracorLabel = dataDictionaryService.getCollectionLabel(Award.class, OLEPropertyConstants.AWARD_SUBCONTRACTORS);
107            String awardLabel = dataDictionaryService.getAttributeErrorLabel(Award.class, OLEPropertyConstants.AWARD_TOTAL_AMOUNT);
108
109            proceed = askOrAnalyzeYesNoQuestion("subcontractorTotalGreaterThanAwardTotal", buildConfirmationQuestion(OLEKeyConstants.WARNING_AWARD_SUBCONTRACTOR_TOTAL_GREATER_THAN_AWARD_TOTAL, subcontracorLabel, awardLabel));
110        }
111
112        return proceed;
113    }
114
115    /**
116     * Builds out the confirmation question.
117     * 
118     * @param messageKey
119     * @param parameters
120     * @return
121     */
122    protected String buildConfirmationQuestion(String messageKey, String... parameters) {
123        String result = configService.getPropertyValueAsString(messageKey);
124        if (null != parameters) {
125            for (int i = 0; i < parameters.length; i++) {
126                result = StringUtils.replace(result, "{" + i + "}", parameters[i]);
127            }
128        }
129        return result;
130    }
131
132    /**
133     * @param document
134     */
135    protected void setupConvenienceObjects(MaintenanceDocument document) {
136        // setup newAccount convenience objects, make sure all possible sub-objects are populated
137        newAward = (Award) document.getNewMaintainableObject().getBusinessObject();
138    }
139
140}