/* * The Kuali Financial System, a comprehensive financial management system for higher education. * * Copyright 2005-2014 The Kuali Foundation * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.kuali.kfs.module.cg.document.validation.impl; import java.sql.Date; import org.apache.commons.lang.StringUtils; import org.kuali.kfs.coa.document.validation.impl.MaintenancePreRulesBase; import org.kuali.kfs.module.cg.businessobject.Award; import org.kuali.kfs.sys.KFSKeyConstants; import org.kuali.kfs.sys.KFSPropertyConstants; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.rice.core.api.config.property.ConfigurationService; import org.kuali.rice.core.api.util.type.KualiDecimal; import org.kuali.rice.kns.document.MaintenanceDocument; import org.kuali.rice.kns.service.DataDictionaryService; import org.kuali.rice.krad.util.ObjectUtils; /** * PreRules checks for the Account that needs to occur while still in the Struts processing. This includes defaults, confirmations, * etc. */ public class AwardPreRules extends MaintenancePreRulesBase { protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(AwardPreRules.class); protected ConfigurationService configService; protected DataDictionaryService dataDictionaryService; protected Award newAward; /** * Constructs a AwardPreRules.java. */ public AwardPreRules() { dataDictionaryService = SpringContext.getBean(DataDictionaryService.class); configService = SpringContext.getBean(ConfigurationService.class); } /** * @see org.kuali.kfs.coa.document.validation.impl.MaintenancePreRulesBase#doCustomPreRules(org.kuali.rice.kns.document.MaintenanceDocument) */ @Override protected boolean doCustomPreRules(MaintenanceDocument document) { setupConvenienceObjects(document); boolean proceed = true; if (proceed) { proceed = continueIfEntryDateBeforeBeginDate(); } if (proceed) { proceed = continueIfSubcontractorTotalGreaterThanAwardTotal(); } if (!proceed) { abortRulesCheck(); } return true; } /** * 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 * further validation is aborted and the user is returned to the award document. * * @return true if the user selects yes, false otherwise */ protected boolean continueIfEntryDateBeforeBeginDate() { boolean proceed = true; Date entryDate = newAward.getAwardEntryDate(); Date beginDate = newAward.getAwardBeginningDate(); if (ObjectUtils.isNotNull(entryDate) && ObjectUtils.isNotNull(beginDate) && entryDate.before(beginDate)) { String entryDateLabel = dataDictionaryService.getAttributeErrorLabel(Award.class, KFSPropertyConstants.AWARD_ENTRY_DATE); String beginDateLabel = dataDictionaryService.getAttributeErrorLabel(Award.class, KFSPropertyConstants.AWARD_BEGINNING_DATE); proceed = askOrAnalyzeYesNoQuestion("entryDateBeforeStartDate", buildConfirmationQuestion(KFSKeyConstants.WARNING_AWARD_ENTRY_BEFORE_START_DATE, entryDateLabel, beginDateLabel)); } return proceed; } /** * Checks if the {@link Subcontractor} total amount is greater than the award total. If so asks the user if they want to * continue validation. if no is selected further validation is aborted and the user is returned to the award document. * * @return true if the user selects yes, false otherwise */ protected boolean continueIfSubcontractorTotalGreaterThanAwardTotal() { boolean proceed = true; KualiDecimal awardTotal = newAward.getAwardTotalAmount(); KualiDecimal subcontractorTotal = newAward.getAwardSubcontractorsTotalAmount(); if ((ObjectUtils.isNotNull(awardTotal) && subcontractorTotal.isGreaterThan(awardTotal)) || (ObjectUtils.isNull(awardTotal) && subcontractorTotal.isPositive())) { String subcontracorLabel = dataDictionaryService.getCollectionLabel(Award.class, KFSPropertyConstants.AWARD_SUBCONTRACTORS); String awardLabel = dataDictionaryService.getAttributeErrorLabel(Award.class, KFSPropertyConstants.AWARD_TOTAL_AMOUNT); proceed = askOrAnalyzeYesNoQuestion("subcontractorTotalGreaterThanAwardTotal", buildConfirmationQuestion(KFSKeyConstants.WARNING_AWARD_SUBCONTRACTOR_TOTAL_GREATER_THAN_AWARD_TOTAL, subcontracorLabel, awardLabel)); } return proceed; } /** * Builds out the confirmation question. * * @param messageKey * @param parameters * @return */ protected String buildConfirmationQuestion(String messageKey, String... parameters) { String result = configService.getPropertyValueAsString(messageKey); if (null != parameters) { for (int i = 0; i < parameters.length; i++) { result = StringUtils.replace(result, "{" + i + "}", parameters[i]); } } return result; } /** * @param document */ protected void setupConvenienceObjects(MaintenanceDocument document) { // setup newAccount convenience objects, make sure all possible sub-objects are populated newAward = (Award) document.getNewMaintainableObject().getBusinessObject(); } }