/* * 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.fp.document.web.struts; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.kuali.kfs.fp.businessobject.CapitalAccountingLines; import org.kuali.kfs.fp.businessobject.CapitalAssetAccountsGroupDetails; import org.kuali.kfs.fp.businessobject.CapitalAssetInformation; import org.kuali.kfs.fp.businessobject.CapitalAssetInformationDetail; import org.kuali.kfs.fp.businessobject.options.CapitalAccountingLinesComparator; import org.kuali.kfs.fp.document.CapitalAccountingLinesDocumentBase; import org.kuali.kfs.fp.document.validation.event.CapitalAccountingLinesSameObjectCodeSubTypeEvent; import org.kuali.kfs.fp.document.validation.impl.CapitalAssetAccountingLineUniquenessEnforcementValidation; import org.kuali.kfs.integration.cab.CapitalAssetBuilderModuleService; import org.kuali.kfs.sys.KFSConstants; import org.kuali.kfs.sys.KFSKeyConstants; import org.kuali.kfs.sys.businessobject.AccountingLine; import org.kuali.kfs.sys.businessobject.SourceAccountingLine; import org.kuali.kfs.sys.businessobject.TargetAccountingLine; import org.kuali.kfs.sys.context.SpringContext; import org.kuali.kfs.sys.document.AccountingDocument; import org.kuali.kfs.sys.document.validation.event.AttributedRouteDocumentEvent; import org.kuali.kfs.sys.web.struts.KualiAccountingDocumentFormBase; import org.kuali.rice.core.api.config.property.ConfigurationService; import org.kuali.rice.core.api.util.RiceConstants; import org.kuali.rice.kew.api.exception.WorkflowException; import org.kuali.rice.kns.question.ConfirmationQuestion; import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase; import org.kuali.rice.kns.web.struts.form.KualiForm; import org.kuali.rice.krad.document.Document; import org.kuali.rice.krad.rules.rule.event.SaveDocumentEvent; import org.kuali.rice.krad.service.KualiRuleService; import org.kuali.rice.krad.util.GlobalVariables; import org.kuali.rice.krad.util.KRADConstants; /** * This is the action class for the CapitalAccountingLinesActionBase. */ public abstract class CapitalAccountingLinesActionBase extends CapitalAssetInformationActionBase { private CapitalAssetBuilderModuleService capitalAssetBuilderModuleService = SpringContext.getBean(CapitalAssetBuilderModuleService.class); /** * Upon entry we need to set the capitalAccountingLinesExist boolean and check the tab states * @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentActionBase#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { KualiDocumentFormBase kualiDocumentFormBase = (KualiDocumentFormBase) form; AccountingDocument tdoc = (AccountingDocument) kualiDocumentFormBase.getDocument(); initializeCapitalAccountingLinesExist(tdoc); setTabStatesForCapitalAssets(form); return super.execute(mapping, form, request, response); } /** * Upon entry we need to set the capitalAccountingLinesExist boolean and check the tab states * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#docHandler(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward docHandler(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { KualiDocumentFormBase kualiDocumentFormBase = (KualiDocumentFormBase) form; AccountingDocument tdoc = (AccountingDocument) kualiDocumentFormBase.getDocument(); initializeCapitalAccountingLinesExist(tdoc); setTabStatesForCapitalAssets(form); return super.docHandler(mapping, form, request, response); } /** * removes capitalaccountinglines which is a transient bo.. and call the super method to * create a error correction document. * @see org.kuali.kfs.sys.document.web.struts.FinancialSystemTransactionalDocumentActionBase#correct(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ @Override public ActionForward correct(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CapitalAccountingLinesFormBase capitalAccountingLinesFormBase = (CapitalAccountingLinesFormBase) form; CapitalAccountingLinesDocumentBase caldb = (CapitalAccountingLinesDocumentBase) capitalAccountingLinesFormBase.getFinancialDocument(); caldb.getCapitalAccountingLines().clear(); super.correct(mapping, capitalAccountingLinesFormBase, request, response); KualiAccountingDocumentFormBase kadfb = (KualiAccountingDocumentFormBase) form; List<CapitalAssetInformation> currentCapitalAssetInformation = this.getCurrentCapitalAssetInformationObject(kadfb); for (CapitalAssetInformation capitalAsset : currentCapitalAssetInformation) { capitalAsset.setCapitalAssetProcessedIndicator(false); capitalAsset.setCapitalAssetLineAmount(capitalAsset.getCapitalAssetLineAmount().negated()); //remove capital asset tag/location asset tag number and serial number as //they will fail because these values will be duplicates. List<CapitalAssetInformationDetail> tagLocationDetails = capitalAsset.getCapitalAssetInformationDetails(); for (CapitalAssetInformationDetail tagLocationDetail : tagLocationDetails) { tagLocationDetail.setCapitalAssetTagNumber(null); tagLocationDetail.setCapitalAssetSerialNumber(null); } List<CapitalAssetAccountsGroupDetails> groupAccountLines = capitalAsset.getCapitalAssetAccountsGroupDetails(); for (CapitalAssetAccountsGroupDetails groupAccountLine : groupAccountLines) { groupAccountLine.setAmount(groupAccountLine.getAmount().negated()); } } String distributionAmountCode = capitalAccountingLinesFormBase.getCapitalAccountingLine().getDistributionCode(); AccountingDocument tdoc = (AccountingDocument) capitalAccountingLinesFormBase.getDocument(); List<CapitalAccountingLines> capitalAccountingLines = new ArrayList(); //for every source/target accounting line that has an object code that requires a //capital asset, creates a capital accounting line that the user can select to //perform create or modify asset functions. createCapitalAccountingLines(capitalAccountingLines, tdoc, distributionAmountCode); sortCaptitalAccountingLines(capitalAccountingLines); caldb.setCapitalAccountingLines(capitalAccountingLines); //checks capital accounting lines for capital assets and if so checks the select box checkSelectForCapitalAccountingLines(capitalAccountingLinesFormBase); checkCapitalAccountingLinesSelected(capitalAccountingLinesFormBase); calculatePercentsForSelectedCapitalAccountingLines(capitalAccountingLinesFormBase); //setup the initial next sequence number column.. setupIntialNextCapitalAssetLineNumber(capitalAccountingLinesFormBase); return mapping.findForward(RiceConstants.MAPPING_BASIC); } /** * All document-load operations get routed through here * * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#loadDocument(org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase) */ @Override protected void loadDocument(KualiDocumentFormBase kualiDocumentFormBase) throws WorkflowException { super.loadDocument(kualiDocumentFormBase); CapitalAccountingLinesFormBase capitalAccountingLinesFormBase = (CapitalAccountingLinesFormBase) kualiDocumentFormBase; AccountingDocument tdoc = (AccountingDocument) kualiDocumentFormBase.getDocument(); initializeCapitalAccountingLinesExist(tdoc); setTabStatesForCapitalAssets(kualiDocumentFormBase); // Since the UI display depends on whether or not capitalAccountingLines is empty to display asset information, we // need to be careful of only generating them if there actually is asset information. Otherwise the user is forced to // select the generate button when they are ready if (checkCreateAssetsExist(capitalAccountingLinesFormBase) || checkModifyAssetsExist(capitalAccountingLinesFormBase)) { String distributionAmountCode = capitalAccountingLinesFormBase.getCapitalAccountingLine().getDistributionCode(); List<CapitalAccountingLines> capitalAccountingLines = new ArrayList(); //for every source/target accounting line that has an object code that requires a //capital asset, creates a capital accounting line that the user can select to //perform create or modify asset functions. createCapitalAccountingLines(capitalAccountingLines, tdoc, distributionAmountCode); sortCaptitalAccountingLines(capitalAccountingLines); CapitalAccountingLinesDocumentBase caldb = (CapitalAccountingLinesDocumentBase) tdoc; caldb.setCapitalAccountingLines(capitalAccountingLines); //checks capital accounting lines for capital assets and if so checks the select box checkSelectForCapitalAccountingLines(capitalAccountingLinesFormBase); checkCapitalAccountingLinesSelected(capitalAccountingLinesFormBase); calculatePercentsForSelectedCapitalAccountingLines(capitalAccountingLinesFormBase); //setup the initial next sequence number column.. setupIntialNextCapitalAssetLineNumber(kualiDocumentFormBase); KualiForm kualiForm = kualiDocumentFormBase; //based on the records in capital accounting lines, capital asset information lists //set the tabs to open if lists not empty else set to close setTabStatesForCapitalAssets(kualiForm); } } /** * checks if the document has any capital accounting lines associated with it and sets * CapitalAccountingLinesDocumentBase.capitalAccountingLinesExist if necessary * * @param tdoc */ protected void initializeCapitalAccountingLinesExist(AccountingDocument tdoc) { CapitalAccountingLinesDocumentBase caldb = (CapitalAccountingLinesDocumentBase) tdoc; List<SourceAccountingLine> sourceAccountLines = tdoc.getSourceAccountingLines(); for (SourceAccountingLine line : sourceAccountLines) { if (capitalAssetBuilderModuleService.hasCapitalAssetObjectSubType(line)) { caldb.setCapitalAccountingLinesExist(true); break; } } // If it isn't true already, check the target lines if (!caldb.isCapitalAccountingLinesExist()) { List<TargetAccountingLine> targetAccountLines = tdoc.getTargetAccountingLines(); for (TargetAccountingLine line : targetAccountLines) { if (capitalAssetBuilderModuleService.hasCapitalAssetObjectSubType(line)) { caldb.setCapitalAccountingLinesExist(true); break; } } } } /** * When user adds an accounting line to the either source or target, if the object code on * that line has capital object type code group then a capital accounting line is created. * @see org.kuali.kfs.sys.web.struts.KualiAccountingDocumentActionBase#insertAccountingLine(boolean, org.kuali.kfs.sys.web.struts.KualiAccountingDocumentFormBase, org.kuali.kfs.sys.businessobject.AccountingLine) */ @Override protected void insertAccountingLine(boolean isSource, KualiAccountingDocumentFormBase kualiDocumentFormBase, AccountingLine line) { AccountingDocument tdoc = (AccountingDocument) kualiDocumentFormBase.getDocument(); CapitalAccountingLinesDocumentBase caldb = (CapitalAccountingLinesDocumentBase) tdoc; if(capitalAssetBuilderModuleService.hasCapitalAssetObjectSubType(line) && caldb.getCapitalAccountingLines().size() > 0) { if (line.isSourceAccountingLine()) { GlobalVariables.getMessageMap().putError(KFSConstants.NEW_SOURCE_LINE_ERRORS, KFSKeyConstants.ERROR_DOCUMENT_CANT_ADD_CAPITALIZATION_ACCOUNTING_LINES); } else { GlobalVariables.getMessageMap().putError(KFSConstants.NEW_TARGET_LINE_ERRORS, KFSKeyConstants.ERROR_DOCUMENT_CANT_ADD_CAPITALIZATION_ACCOUNTING_LINES); } } else { super.insertAccountingLine(isSource, kualiDocumentFormBase, line); initializeCapitalAccountingLinesExist(tdoc); setTabStatesForCapitalAssets(kualiDocumentFormBase); } } /** * creates the capital accounting lines looking at source and/or target accounting lines. * * @param capitalAccountingLines * @param tdoc * @param distributionAmountCode distribution amount code for the line */ protected void createCapitalAccountingLines(List<CapitalAccountingLines> capitalAccountingLines, AccountingDocument tdoc, String distributionAmountCode) { List<SourceAccountingLine> sourceAccountLines = tdoc.getSourceAccountingLines(); CapitalAccountingLinesDocumentBase caldb = (CapitalAccountingLinesDocumentBase) tdoc; for (SourceAccountingLine line : sourceAccountLines) { //create source capital accounting line createCapitalAccountingLine(capitalAccountingLines, line, distributionAmountCode); } List<TargetAccountingLine> targetAccountLines = tdoc.getTargetAccountingLines(); for (TargetAccountingLine line : targetAccountLines) { // create target capital accounting line createCapitalAccountingLine(capitalAccountingLines, line, distributionAmountCode); } //sort the capital accounting lines collection sortCaptitalAccountingLines(capitalAccountingLines); } /** * Checks if the accounting line has an object code that belongs to object sub type group codes and * if so, creates a capital accounting line that will be displayed on the jsp. * * @param capitalAccountingLines * @param line * @param distributionAmountCode * @return List of capitalAccountingLines */ protected List<CapitalAccountingLines> createCapitalAccountingLine(List<CapitalAccountingLines> capitalAccountingLines, AccountingLine line, String distributionAmountCode) { Integer sequenceNumber = capitalAccountingLines.size() + 1; if (capitalAssetBuilderModuleService.hasCapitalAssetObjectSubType(line)) { //capital object code so we need to build the capital accounting line... CapitalAccountingLines cal = addCapitalAccountingLine(capitalAccountingLines, line); cal.setDistributionAmountCode(distributionAmountCode); capitalAccountingLines.add(cal); } return capitalAccountingLines; } /** * convenience method to add a new capital accounting line to the collection of capital * accounting lines. * * @param capitalAccountingLines * @param line * @return cal newly created capital accounting line */ protected CapitalAccountingLines addCapitalAccountingLine(List<CapitalAccountingLines> capitalAccountingLines, AccountingLine line) { CapitalAccountingLines cal = new CapitalAccountingLines(); if (line instanceof SourceAccountingLine) { cal.setLineType(KFSConstants.SOURCE); } else { cal.setLineType(KFSConstants.TARGET); } cal.setSequenceNumber(line.getSequenceNumber()); cal.setChartOfAccountsCode(line.getChartOfAccountsCode()); cal.setAccountNumber(line.getAccountNumber()); cal.setSubAccountNumber(line.getSubAccountNumber()); cal.setFinancialObjectCode(line.getFinancialObjectCode()); cal.setFinancialSubObjectCode(line.getFinancialSubObjectCode()); cal.setProjectCode(line.getProjectCode()); cal.setOrganizationReferenceId(line.getOrganizationReferenceId()); cal.setFinancialDocumentLineDescription(line.getFinancialDocumentLineDescription()); cal.setAmount(line.getAmount()); cal.setAccountLinePercent(null); cal.setSelectLine(false); return cal; } /** * sort the capital accounting lines collection based on financial object code and account number. * @param capitalAccountingLines List of capital accounting lines */ protected void sortCaptitalAccountingLines(List<CapitalAccountingLines> capitalAccountingLines) { CapitalAccountingLinesComparator calComparator = new CapitalAccountingLinesComparator(); //sort the collection based on financial object code and account number Collections.sort(capitalAccountingLines, calComparator); } /** * Supports the generate button on the UI. It generates the capital accounting lines * @param mapping * @param form * @param request * @param response * @return * @throws Exception */ public ActionForward generateAccountingLinesForCapitalization(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { KualiAccountingDocumentFormBase kualiAccountingDocumentFormBase = (KualiAccountingDocumentFormBase) form; CapitalAccountingLinesFormBase capitalAccountingLinesFormBase = (CapitalAccountingLinesFormBase) form; CapitalAccountingLinesDocumentBase caldb = (CapitalAccountingLinesDocumentBase) capitalAccountingLinesFormBase.getFinancialDocument(); CapitalAssetAccountingLineUniquenessEnforcementValidation uniquenessValidation = new CapitalAssetAccountingLineUniquenessEnforcementValidation(); uniquenessValidation.setAccountingDocumentForValidation(caldb); if (uniquenessValidation.validate(new AttributedRouteDocumentEvent(caldb)) && getRuleService().applyRules(new SaveDocumentEvent(caldb))) { String distributionAmountCode = capitalAccountingLinesFormBase.getCapitalAccountingLine().getDistributionCode(); List<CapitalAccountingLines> capitalAccountingLines = caldb.getCapitalAccountingLines(); AccountingDocument tdoc = (AccountingDocument) kualiAccountingDocumentFormBase.getDocument(); createCapitalAccountingLines(capitalAccountingLines, tdoc, distributionAmountCode); } return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * Supports the delete button for capital accounting lines on the UI * @param mapping * @param form * @param request * @param response * @return * @throws Exception */ public ActionForward deleteAccountingLinesForCapitalization(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CapitalAccountingLinesFormBase capitalAccountingLinesFormBase = (CapitalAccountingLinesFormBase) form; CapitalAccountingLinesDocumentBase caldb = (CapitalAccountingLinesDocumentBase) capitalAccountingLinesFormBase.getFinancialDocument(); if (capitalAccountingLinesFormBase.getDocumentActions().containsKey(KRADConstants.KUALI_ACTION_CAN_EDIT)) { caldb.setCapitalAccountingLines(new ArrayList<CapitalAccountingLines>()); caldb.setCapitalAssetInformation(new ArrayList()); } return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * Action "create" creates assets for the selected capital * accounting lines. An error message is shown if no capital accounting lines * are selected for processing. The action checks if the selected * capital accounting lines object sub type cross based on the system paramter * values for the object subtypes and if so prompts the user to confirm to continue * to create the assets for the select capital accounting lines. * * @param mapping * @param form * @param request * @param response * @return ActionForward * @throws Exception */ public ActionForward createAsset(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CapitalAccountingLinesFormBase calfb = (CapitalAccountingLinesFormBase) form; String distributionAmountCode = calfb.getCapitalAccountingLine().getDistributionCode(); if (KFSConstants.CapitalAssets.DISTRIBUTE_COST_EQUALLY_CODE.equals(distributionAmountCode)) { calfb.setDistributeEqualAmount(true); } else { calfb.setDistributeEqualAmount(false); } boolean createAction = calfb.getCapitalAccountingLine().isCanCreateAsset(); calfb.setEditCreateOrModify(false); GlobalVariables.getMessageMap().clearErrorMessages(); if (!capitalAccountingLinesSelected(calfb)) { GlobalVariables.getMessageMap().putError(KFSConstants.EDIT_ACCOUNTING_LINES_FOR_CAPITALIZATION_ERRORS, KFSKeyConstants.ERROR_DOCUMENT_ACCOUNTING_LINE_FOR_CAPITALIZATAION_REQUIRED_CREATE); return mapping.findForward(KFSConstants.MAPPING_BASIC); } else { calfb.setEditCreateOrModify(false); } Document document = calfb.getFinancialDocument(); //if same object subtypes then continue creating capital assets.... if (checkObjecSubTypeCrossingCapitalAccountingLines(document)) { //question the user if to continue.... ActionForward forward = performQuestionPrompt(mapping, form, request, response, KFSConstants.CapitalAssets.CAPITAL_ASSET_CREATE_ACTION_INDICATOR, distributionAmountCode); if (forward != null) { return forward; } } else { createCapitalAssetsForSelectedAccountingLines(form , calfb, KFSConstants.CapitalAssets.CAPITAL_ASSET_CREATE_ACTION_INDICATOR, distributionAmountCode); } //restore the tab states.... setTabStatesForCapitalAssets(form); return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * Action "modify" creates assets for the selected capital * accounting lines. An error message is shown if no capital accounting lines * are selected for processing. The action checks if the selected * capital accounting lines object sub type cross based on the system paramter * values for the object subtypes and if so prompts the user to confirm to continue * to create the assets for the select capital accounting lines. * * @param mapping * @param form * @param request * @param response * @return ActionForward * @throws Exception */ public ActionForward modifyAsset(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { CapitalAccountingLinesFormBase calfb = (CapitalAccountingLinesFormBase) form; String distributionAmountCode = calfb.getCapitalAccountingLine().getDistributionCode(); if (KFSConstants.CapitalAssets.DISTRIBUTE_COST_EQUALLY_CODE.equals(distributionAmountCode)) { calfb.setDistributeEqualAmount(true); } else { calfb.setDistributeEqualAmount(false); } GlobalVariables.getMessageMap().clearErrorMessages(); if (!capitalAccountingLinesSelected(calfb)) { GlobalVariables.getMessageMap().putError(KFSConstants.EDIT_ACCOUNTING_LINES_FOR_CAPITALIZATION_ERRORS, KFSKeyConstants.ERROR_DOCUMENT_ACCOUNTING_LINE_FOR_CAPITALIZATAION_REQUIRED_MODIFY); return mapping.findForward(KFSConstants.MAPPING_BASIC); } else { calfb.setEditCreateOrModify(false); } Document document = calfb.getFinancialDocument(); //if same object subtypes then continue creating capital assets.... if (checkObjecSubTypeCrossingCapitalAccountingLines(document)) { //question the user if to continue.... ActionForward forward = performQuestionPrompt(mapping, form, request, response, KFSConstants.CapitalAssets.CAPITAL_ASSET_MODIFY_ACTION_INDICATOR, distributionAmountCode); if (forward != null) { return forward; } } else { createCapitalAssetsForSelectedAccountingLines(form , calfb, KFSConstants.CapitalAssets.CAPITAL_ASSET_MODIFY_ACTION_INDICATOR, distributionAmountCode); } //restore the tab states.... setTabStatesForCapitalAssets(form); return mapping.findForward(KFSConstants.MAPPING_BASIC); } /** * Helper method to first calculate the percents for the selected capital accounting lines as * the percent is required if the user is distributing the amounts by individual amount * method. It then populates created or modified assets with asset accounting lines. * * @param form * @param calfb * @param actionTypeIndicator indicates whether creating an asset for "create" or "modify" actions. * @param distributionAmountCode amount distribution code */ protected void createCapitalAssetsForSelectedAccountingLines(ActionForm form, CapitalAccountingLinesFormBase calfb, String actionTypeIndicator, String distributionAmountCode) { calculatePercentsForSelectedCapitalAccountingLines(calfb); createCapitalAssetForGroupAccountingLines(calfb, actionTypeIndicator, distributionAmountCode); checkCapitalAccountingLinesSelected(calfb); KualiForm kualiForm = (KualiForm) form; setTabStatesForCapitalAssets(kualiForm); } /** * checks the capital accounting lines if any of the lines have been selected for * further processing. * * @param calfb * @return selected return true if lines have been selected else return false */ protected boolean capitalAccountingLinesSelected(CapitalAccountingLinesFormBase calfb) { boolean selected = false; CapitalAccountingLinesDocumentBase caldb = (CapitalAccountingLinesDocumentBase) calfb.getFinancialDocument(); List<CapitalAccountingLines> capitalAccountingLines = caldb.getCapitalAccountingLines(); for (CapitalAccountingLines capitalAccountingLine : capitalAccountingLines) { if (capitalAccountingLine.isSelectLine()) { selected = true; break; } } return selected; } /** * runs the validation to check if object subtypes crosses groups on * selected capital accounting lines. * * @param form * @return true if rule passed else false */ protected boolean checkObjecSubTypeCrossingCapitalAccountingLines(Document document) { boolean differentObjecSubtypes = true; differentObjecSubtypes &= getRuleService().applyRules(new CapitalAccountingLinesSameObjectCodeSubTypeEvent(document)); return differentObjecSubtypes; } /** * * @param mapping An ActionMapping * @param form An ActionForm * @param request The HttpServletRequest * @param response The HttpServletResponse * @throws Exception * @param distributionAmountCode * @return An ActionForward */ protected ActionForward performQuestionPrompt(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, String actionTypeCode, String distributionAmountCode) throws Exception { ActionForward forward = null; Object question = request.getParameter(KFSConstants.QUESTION_INST_ATTRIBUTE_NAME); CapitalAccountingLinesFormBase calfb = (CapitalAccountingLinesFormBase) form; if (question == null) { String questionText = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(KFSKeyConstants.WARNING_NOT_SAME_OBJECT_SUB_TYPES); return this.performQuestionWithoutInput(mapping, form, request, response, KFSConstants.OBJECT_SUB_TYPES_DIFFERENT_QUESTION, questionText, KFSConstants.CONFIRMATION_QUESTION, KFSConstants.ROUTE_METHOD, ""); } else { Object buttonClicked = request.getParameter(KFSConstants.QUESTION_CLICKED_BUTTON); // If the user replies 'Yes' the question, proceed.. if (KFSConstants.OBJECT_SUB_TYPES_DIFFERENT_QUESTION.equals(question) && ConfirmationQuestion.YES.equals(buttonClicked)) { createCapitalAssetsForSelectedAccountingLines(form , calfb, actionTypeCode, distributionAmountCode); KualiForm kualiForm = (KualiForm) form; setTabStatesForCapitalAssets(kualiForm); return mapping.findForward(KFSConstants.MAPPING_BASIC); } // If the user replies 'No' to either of the questions else { uncheckCapitalAccountingLinesSelected(calfb); forward = mapping.findForward(KFSConstants.MAPPING_BASIC); } } return forward; } /** * Get the rule service * * @return ruleService */ protected KualiRuleService getRuleService() { return SpringContext.getBean(KualiRuleService.class); } }