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.fp.document.validation.impl; 017 018 import java.util.ArrayList; 019 import java.util.List; 020 021 import org.kuali.kfs.fp.document.BudgetAdjustmentDocument; 022 import org.kuali.kfs.fp.document.service.BudgetAdjustmentLaborBenefitsService; 023 import org.kuali.kfs.fp.document.web.struts.BudgetAdjustmentForm; 024 import org.kuali.kfs.sys.KFSConstants; 025 import org.kuali.kfs.sys.KFSKeyConstants; 026 import org.kuali.kfs.sys.businessobject.AccountingLine; 027 import org.kuali.kfs.sys.context.SpringContext; 028 import org.kuali.rice.kns.document.Document; 029 import org.kuali.rice.kns.rules.PromptBeforeValidationBase; 030 import org.kuali.rice.kns.service.KualiConfigurationService; 031 import org.kuali.rice.kns.util.KNSConstants; 032 import org.kuali.rice.kns.util.ObjectUtils; 033 import org.kuali.rice.kns.workflow.service.KualiWorkflowDocument; 034 035 /** 036 * Checks warnings and prompt conditions for ba document. 037 */ 038 public class BudgetAdjustmentDocumentPreRules extends PromptBeforeValidationBase { 039 protected KualiConfigurationService kualiConfiguration; 040 041 042 /** 043 * Execute pre-rules for BudgetAdjustmentDocument 044 * 045 * @document document with pre-rules being applied 046 * @return true if pre-rules fire without problem 047 * @see org.kuali.rice.kns.rules.PromptBeforeValidationBase#doRules(org.kuali.rice.kns.document.MaintenanceDocument) 048 */ 049 @Override 050 public boolean doPrompts(Document document) { 051 boolean preRulesOK = true; 052 053 BudgetAdjustmentDocument budgetDocument = (BudgetAdjustmentDocument) document; 054 preRulesOK = askLaborBenefitsGeneration(budgetDocument); 055 056 return preRulesOK; 057 } 058 059 060 /** 061 * Calls service to determine if any labor object codes are present on the ba document. If so, asks the user if they want the 062 * system to automatically generate the benefit lines. If Yes, calls service to generate the accounting lines. 063 * 064 * @param budgetDocument submitted budget document 065 * @return true if labor benefits generation question is NOT asked 066 */ 067 protected boolean askLaborBenefitsGeneration(BudgetAdjustmentDocument budgetDocument) { 068 // before prompting, check the document contains one or more labor object codes 069 final boolean hasLaborObjectCodes = SpringContext.getBean(BudgetAdjustmentLaborBenefitsService.class).hasLaborObjectCodes(budgetDocument); 070 final boolean canEdit = ((BudgetAdjustmentForm)form).getDocumentActions().containsKey(KNSConstants.KUALI_ACTION_CAN_EDIT); 071 final boolean canGenerateLaborBenefitsByRouteStatusResult = canGenerateLaborBenefitsByRouteStatus(budgetDocument); 072 if (canEdit && hasLaborObjectCodes && canGenerateLaborBenefitsByRouteStatusResult) { 073 final String questionText = SpringContext.getBean(KualiConfigurationService.class).getPropertyString(KFSKeyConstants.QUESTION_GENERATE_LABOR_BENEFIT_LINES); 074 final boolean generateBenefits = super.askOrAnalyzeYesNoQuestion(KFSConstants.BudgetAdjustmentDocumentConstants.GENERATE_BENEFITS_QUESTION_ID, questionText); 075 if (generateBenefits) { 076 SpringContext.getBean(BudgetAdjustmentLaborBenefitsService.class).generateLaborBenefitsAccountingLines(budgetDocument); 077 // return to document after lines are generated 078 super.event.setActionForwardName(KFSConstants.MAPPING_BASIC); 079 return false; 080 } 081 } 082 083 return true; 084 } 085 086 /** 087 * TODO: remove this method once baseline accounting lines has been removed 088 */ 089 protected List deepCopyAccountingLinesList(List originals) { 090 if (originals == null) { 091 return null; 092 } 093 List copiedLines = new ArrayList(); 094 for (int i = 0; i < originals.size(); i++) { 095 copiedLines.add(ObjectUtils.deepCopy((AccountingLine) originals.get(i))); 096 } 097 return copiedLines; 098 } 099 100 /** 101 * Based on the routing status of the document, determines if labor benefits can be generated on the document 102 * @param budgetAdjustmentDocument the budget adjustment document that labor benefits would be generated on 103 * @return true if labor benefits can be generated, false otherwise 104 */ 105 protected boolean canGenerateLaborBenefitsByRouteStatus(BudgetAdjustmentDocument budgetAdjustmentDocument) { 106 final KualiWorkflowDocument workflowDocument = budgetAdjustmentDocument.getDocumentHeader().getWorkflowDocument(); 107 if (workflowDocument.stateIsInitiated() || workflowDocument.stateIsSaved()) return true; // we're pre-route; we can add labor benefits 108 if (workflowDocument.stateIsEnroute() && workflowDocument.getCurrentRouteNodeNames().contains(KFSConstants.RouteLevelNames.ACCOUNT)) return true; // we're fiscal officers approving; we can add labor benefits 109 return false; // we're someone else and we're plum out of luck 110 } 111 } 112