org.kuali.coeus.common.budget.impl.struts.BudgetVersionsAction.java Source code

Java tutorial

Introduction

Here is the source code for org.kuali.coeus.common.budget.impl.struts.BudgetVersionsAction.java

Source

/*
 * Kuali Coeus, a comprehensive research administration system for higher education.
 * 
 * Copyright 2005-2015 Kuali, Inc.
 * 
 * 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.coeus.common.budget.impl.struts;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.kuali.coeus.common.budget.framework.core.*;
import org.kuali.coeus.sys.framework.controller.StrutsConfirmation;
import org.kuali.coeus.sys.framework.service.KcServiceLocator;
import org.kuali.kra.award.budget.AwardBudgetService;
import org.kuali.kra.award.budget.document.AwardBudgetDocument;
import org.kuali.kra.award.document.AwardDocument;
import org.kuali.kra.award.home.Award;
import org.kuali.coeus.common.budget.framework.rate.BudgetRate;
import org.kuali.coeus.common.budget.framework.rate.BudgetRatesService;
import org.kuali.coeus.common.budget.framework.rate.RateClass;
import org.kuali.kra.infrastructure.Constants;
import org.kuali.kra.infrastructure.KeyConstants;
import org.kuali.coeus.common.budget.framework.copy.CopyPeriodsQuestion;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.kns.authorization.AuthorizationConstants;
import org.kuali.rice.krad.service.DocumentService;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

import static org.apache.commons.lang3.StringUtils.isNotBlank;
import static org.kuali.kra.infrastructure.Constants.MAPPING_BASIC;
import static org.kuali.rice.krad.util.KRADConstants.QUESTION_CLICKED_BUTTON;
import static org.kuali.rice.krad.util.KRADConstants.QUESTION_INST_ATTRIBUTE_NAME;

/**
 * Struts Action class for requests from the Budget Versions page.
 */
public class BudgetVersionsAction extends BudgetAction {

    private static final Log LOG = LogFactory.getLog(BudgetVersionsAction.class);

    private static final String TOGGLE_TAB = "toggleTab";
    private static final String CONFIRM_SYNCH_BUDGET_RATE_BUDGET_DOCUMENT = "confirmSynchBudgetRateForBudgetDocument";
    private static final String NO_SYNCH_BUDGET_RATE_BUDGET_DOCUMENT = "noSynchBudgetRateForBudgetDocument";

    /**
     * Main execute method that is run. Populates A map of rate types in the {@link HttpServletRequest} instance to be used
     * in the JSP. The map is called <code>rateClassMap</code> this is set everytime execute is called in this class. This should only
     * happen for the BudgetVersions tab. This ensures that even if {@link RateClass} persisted data may change, it will update the map
     * correctly.
     * 
     * @param mapping {@link ActionMapping}
     * @param form {@link ActionForm} instance
     * @param request {@link HttpServletRequest} instance
     * @param response {@link HttpServletResponse} instance 
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        request.setAttribute("rateClassMap", getBudgetRatesService().getBudgetRateClassMap("O"));

        final BudgetForm budgetForm = (BudgetForm) form;
        AwardBudgetDocument awardBudgetDocument = budgetForm.getBudgetDocument();
        BudgetParent budgetParent = awardBudgetDocument.getBudget().getBudgetParent();

        //when this is an award budget even though the budget cannot be saved a budget can still
        //be copied. By doing this here we make sure that it will still save
        //new budgets names even though the document itself cannot be saved
        if (!StringUtils.equals(budgetForm.getMethodToCall(), "save") && budgetForm.isSaveAfterCopy()) {
            List<? extends Budget> budgets = budgetParent.getBudgets();
            Budget copiedBudget = budgets.get(budgets.size() - 1);
            String copiedName = copiedBudget.getName();
            copiedBudget.setName("copied placeholder");
            LOG.debug("validating " + copiedName);
            boolean valid = getBudgetService().isBudgetVersionNameValid(budgetParent, copiedName);
            copiedBudget.setName(copiedName);
            budgetForm.setSaveAfterCopy(!valid);
            if (!valid) {
                return mapping.findForward(Constants.MAPPING_BASIC);
            }
        }

        return super.execute(mapping, form, request, response);
    }

    @Override
    public ActionForward docHandler(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        final ActionForward forward = super.docHandler(mapping, form, request, response);
        final BudgetForm budgetForm = (BudgetForm) form;
        Budget budget = budgetForm.getBudget();
        BudgetParentDocument parentDocument = budget.getBudgetParent().getDocument();
        BudgetParent budgetParent = budget.getBudgetParent();
        AwardBudgetService awardBudgetService = KcServiceLocator.getService(AwardBudgetService.class);
        BudgetRatesService budgetService = KcServiceLocator.getService(BudgetRatesService.class);
        Collection<BudgetRate> savedBudgetRates = budgetService.getSavedBudgetRates(budget);
        Collection<BudgetRate> allPropRates = budgetService.getSavedBudgetRates(budget);
        if (isAwardBudget(budget)) {
            Award award = (Award) budget.getBudgetParent().getDocument().getBudgetParent();
            if (awardBudgetService.checkRateChange(savedBudgetRates, award)) {
                return confirm(
                        syncAwardBudgetRateConfirmationQuestion(mapping, form, request, response,
                                KeyConstants.QUESTION_SYNCH_AWARD_RATE),
                        CONFIRM_SYNCH_AWARD_RATES, NO_SYNCH_AWARD_RATES);
            }
        }
        if (budgetService.checkActivityTypeChange(allPropRates, budgetParent.getActivityTypeCode())) {
            //Rates-Refresh Scenario-2
            budget.setRateClassTypesReloaded(true);
            return confirm(
                    syncBudgetRateConfirmationQuestion(mapping, form, request, response,
                            KeyConstants.QUESTION_SYNCH_BUDGET_RATE),
                    CONFIRM_SYNCH_BUDGET_RATE_BUDGET_DOCUMENT, NO_SYNCH_BUDGET_RATE_BUDGET_DOCUMENT);
        } else if (CollectionUtils.isEmpty(allPropRates)) {
            //Throw Empty Rates message
            return confirm(
                    syncBudgetRateConfirmationQuestion(mapping, form, request, response,
                            KeyConstants.QUESTION_NO_RATES_ATTEMPT_SYNCH),
                    CONFIRM_SYNCH_BUDGET_RATE_BUDGET_DOCUMENT, NO_SYNCH_BUDGET_RATE_BUDGET_DOCUMENT);
        }
        return forward;
    }

    /**
     * Action called to create a new budget version.
     * 
     * @param mapping 
     * @param form
     * @param request
     * @param response
     * @return ActionForward instance for forwarding to the tab.
     */
    public ActionForward addBudgetVersion(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        BudgetForm budgetForm = (BudgetForm) form;
        Budget budget = budgetForm.getBudget();
        BudgetParentDocument parentDocument = budget.getBudgetParent().getDocument();

        getBudgetService().addBudgetVersion(parentDocument, budgetForm.getNewBudgetVersionName(),
                Collections.EMPTY_MAP);
        budgetForm.setNewBudgetVersionName("");

        return mapping.findForward(Constants.MAPPING_BASIC);
    }

    private BudgetParentDocument getBudgetParentDocument(BudgetForm budgetForm) {
        AwardBudgetDocument awardBudgetDocument = budgetForm.getBudgetDocument();
        BudgetParentDocument parentDocument = awardBudgetDocument.getBudget().getBudgetParent().getDocument();
        return parentDocument;
    }

    private BudgetService getBudgetService() {
        return KcServiceLocator.getService(BudgetService.class);
    }

    /**
     * This method opens a budget version.
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws Exception
     */
    public ActionForward openBudgetVersion(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        BudgetForm budgetForm = (BudgetForm) form;

        BudgetRatesService budgetService = KcServiceLocator.getService(BudgetRatesService.class);

        if (!"TRUE".equals(budgetForm.getEditingMode().get(AuthorizationConstants.EditMode.VIEW_ONLY))) {
            save(mapping, form, request, response);
        }
        AwardBudgetDocument budgetDoc = budgetForm.getBudgetDocument();

        Budget budget = budgetDoc.getBudget();
        BudgetParentDocument budgetParentDocument = getBudgetParentDocument(budgetForm);
        BudgetParent budgetParent = budgetParentDocument.getBudgetParent();

        Budget budgetToOpen = budgetParentDocument.getBudgetDocumentVersion(getSelectedLine(request));
        DocumentService documentService = KcServiceLocator.getService(DocumentService.class);
        AwardBudgetDocument awardBudgetDocument = (AwardBudgetDocument) documentService
                .getByDocumentHeaderId(budgetToOpen.getDocumentNumber());
        Budget budgetOpen = awardBudgetDocument.getBudget();
        String routeHeaderId = awardBudgetDocument.getDocumentHeader().getWorkflowDocument().getDocumentId();

        Collection<BudgetRate> allPropRates = budgetService.getSavedBudgetRates(budgetOpen);
        if (getBudgetRateService().performSyncFlag(budgetOpen)) {
            budget.setRateClassTypesReloaded(true);
        }
        if (budgetService.checkActivityTypeChange(allPropRates, budgetParent.getActivityTypeCode())) {
            //Rates-Refresh Scenario-2
            budget.setRateClassTypesReloaded(true);
            return confirm(
                    syncBudgetRateConfirmationQuestion(mapping, form, request, response,
                            KeyConstants.QUESTION_SYNCH_BUDGET_RATE),
                    CONFIRM_SYNCH_BUDGET_RATE, NO_SYNCH_BUDGET_RATE);
        } else if (CollectionUtils.isEmpty(allPropRates)) {
            //Throw Empty Rates message
            return confirm(
                    syncBudgetRateConfirmationQuestion(mapping, form, request, response,
                            KeyConstants.QUESTION_NO_RATES_ATTEMPT_SYNCH),
                    CONFIRM_SYNCH_BUDGET_RATE, NO_SYNCH_BUDGET_RATE);
        }

        String forward = buildForwardUrl(routeHeaderId);
        return new ActionForward(forward, true);
    }

    protected StrutsConfirmation syncBudgetRateConfirmationQuestion(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response, String message) throws Exception {
        return buildParameterizedConfirmationQuestion(mapping, form, request, response, CONFIRM_SYNCH_BUDGET_RATE,
                message, "");
    }

    public ActionForward confirmSynchBudgetRateForBudgetDocument(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        BudgetForm budgetForm = (BudgetForm) form;
        AwardBudgetDocument awardBudgetDocument = budgetForm.getBudgetDocument();

        return synchBudgetRate(awardBudgetDocument, true);
    }

    public ActionForward noSynchBudgetRateForBudgetDocument(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        BudgetForm budgetForm = (BudgetForm) form;
        AwardBudgetDocument awardBudgetDocument = budgetForm.getBudgetDocument();

        return synchBudgetRate(awardBudgetDocument, false);
    }

    protected ActionForward synchBudgetRate(AwardBudgetDocument awardBudgetDocument, boolean confirm)
            throws Exception {
        Budget budgetOpen = awardBudgetDocument.getBudget();
        String routeHeaderId = awardBudgetDocument.getDocumentHeader().getWorkflowDocument().getDocumentId();
        budgetOpen.setActivityTypeCode(awardBudgetDocument.getBudget().getBudgetParent().getDocument()
                .getBudgetParent().getActivityTypeCode());
        budgetOpen.setRateClassTypesReloaded(true);
        String forward = buildForwardUrl(routeHeaderId);
        if (confirm) {
            forward = forward.replace("budgetParameters.do?", "budgetParameters.do?syncBudgetRate=Y&");
        }
        return new ActionForward(forward, true);
    }

    public ActionForward confirmSynchBudgetRate(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        BudgetForm budgetForm = (BudgetForm) form;
        AwardBudgetDocument awardBudgetDocument = getSelectedBudgetDocument(request, budgetForm);

        return synchBudgetRate(awardBudgetDocument, true);
    }

    private AwardBudgetDocument getSelectedBudgetDocument(HttpServletRequest request, BudgetForm budgetForm)
            throws WorkflowException {
        AwardBudgetDocument budgetDoc = budgetForm.getBudgetDocument();
        BudgetParentDocument budgetParentDocument = budgetDoc.getBudget().getBudgetParent().getDocument();
        Budget budgetToOpen = budgetParentDocument.getBudgetDocumentVersion(getSelectedLine(request));
        DocumentService documentService = KcServiceLocator.getService(DocumentService.class);
        AwardBudgetDocument awardBudgetDocument = (AwardBudgetDocument) documentService
                .getByDocumentHeaderId(budgetToOpen.getDocumentNumber());
        return awardBudgetDocument;
    }

    public ActionForward noSynchBudgetRate(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        BudgetForm budgetForm = (BudgetForm) form;
        AwardBudgetDocument awardBudgetDocument = getSelectedBudgetDocument(request, budgetForm);
        return synchBudgetRate(awardBudgetDocument, false);
    }

    private BudgetRatesService getBudgetRateService() {
        return KcServiceLocator.getService(BudgetRatesService.class);
    }

    /**
     * This method copies a budget version's data to a new budget version.
     * 
     * @param mapping
     * @param form
     * @param request
     * @param response
     * @return ActionForward
     * @throws Exception
     */
    public ActionForward copyBudgetVersion(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        BudgetForm budgetForm = (BudgetForm) form;
        Budget versionToCopy = getSelectedVersion(budgetForm, request);
        BudgetParentDocument parentDocument = budgetForm.getBudgetDocument().getBudget().getBudgetParent()
                .getDocument();
        BudgetParent budgetParent = budgetForm.getBudgetDocument().getBudget().getBudgetParent();
        BudgetCommonService<BudgetParent> budgetService = getBudgetCommonService(budgetParent);
        if (!budgetService.validateAddingNewBudget(parentDocument)) {
            return mapping.findForward(Constants.MAPPING_BASIC);
        }
        if (isNotBlank(request.getParameter(QUESTION_INST_ATTRIBUTE_NAME))) {
            Object buttonClicked = request.getParameter(QUESTION_CLICKED_BUTTON);
            if (CopyPeriodsQuestion.ONE.equals(buttonClicked)) {
                budgetForm.setSaveAfterCopy(true);
                return copyBudgetPeriodOne(mapping, form, request, response);
            } else if (CopyPeriodsQuestion.ALL.equals(buttonClicked)) {
                budgetForm.setSaveAfterCopy(true);
                return copyBudgetAllPeriods(mapping, form, request, response);
            } else {
                // URL hack, just return
                return mapping.findForward(Constants.MAPPING_BASIC);
            }
        }
        return performQuestionWithoutInput(mapping, form, request, response, COPY_BUDGET_PERIOD_QUESTION,
                QUESTION_TEXT + versionToCopy.getBudgetVersionNumber() + ".", QUESTION_TYPE,
                budgetForm.getMethodToCall(), "");

    }

    @Override
    public ActionForward save(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        BudgetForm budgetForm = (BudgetForm) form;
        boolean valid = true;
        AwardBudgetDocument awardBudgetDocument = budgetForm.getBudgetDocument();
        BudgetParentDocument parentDocument = awardBudgetDocument.getBudget().getBudgetParent().getDocument();
        Budget budget = awardBudgetDocument.getBudget();

        if (budgetForm.isSaveAfterCopy()) {
            List<? extends Budget> overviews = parentDocument.getBudgetParent().getBudgets();
            Budget copiedOverview = overviews.get(overviews.size() - 1);
            String copiedName = copiedOverview.getName();
            copiedOverview.setName("copied placeholder");
            LOG.debug("validating " + copiedName);
            valid = getBudgetService().isBudgetVersionNameValid(parentDocument.getBudgetParent(), copiedName);
            copiedOverview.setName(copiedName);
            budgetForm.setSaveAfterCopy(!valid);
        }

        ActionForward forward = super.save(mapping, form, request, response);
        return forward;
    }

    public ActionForward copyBudgetPeriodOne(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        Object question = request.getParameter(QUESTION_INST_ATTRIBUTE_NAME);
        if (COPY_BUDGET_PERIOD_QUESTION.equals(question)) {
            copyBudget(form, request, true);
        }

        return mapping.findForward(MAPPING_BASIC);
    }

    public ActionForward copyBudgetAllPeriods(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {

        Object question = request.getParameter(QUESTION_INST_ATTRIBUTE_NAME);
        if (COPY_BUDGET_PERIOD_QUESTION.equals(question)) {
            copyBudget(form, request, false);
        }
        return mapping.findForward(MAPPING_BASIC);
    }

    private Budget getSelectedVersion(BudgetForm budgetForm, HttpServletRequest request) {
        return budgetForm.getBudgetDocument().getBudget().getBudgetParent().getBudgets()
                .get(getSelectedLine(request));
    }

    private void copyBudget(ActionForm form, HttpServletRequest request, boolean copyPeriodOneOnly)
            throws WorkflowException {
        BudgetForm budgetForm = (BudgetForm) form;
        AwardBudgetDocument budgetDoc = budgetForm.getBudgetDocument();
        BudgetParentDocument pdDoc = budgetDoc.getBudget().getBudgetParent().getDocument();
        Budget budgetToCopy = getSelectedVersion(budgetForm, request);
        copyBudget(pdDoc, budgetToCopy, copyPeriodOneOnly);
    }

    /**
     * Action called to create a new budget version.
     * 
     * @param mapping 
     * @param form
     * @param request
     * @param response
     * @return ActionForward instance for forwarding to the tab.
     */
    public ActionForward rebudget(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        BudgetForm budgetForm = (BudgetForm) form;
        AwardBudgetDocument awardBudgetDocument = budgetForm.getBudgetDocument();
        AwardDocument parentDocument = (AwardDocument) awardBudgetDocument.getBudget().getBudgetParent()
                .getDocument();

        AwardBudgetDocument newBudgetDoc = getAwardBudgetService().rebudget(parentDocument,
                budgetForm.getNewBudgetVersionName());
        if (newBudgetDoc != null) {
            budgetForm.setNewBudgetVersionName("");
        }
        return mapping.findForward(Constants.MAPPING_BASIC);
    }

    private AwardBudgetService getAwardBudgetService() {
        return KcServiceLocator.getService(AwardBudgetService.class);
    }

    private BudgetRatesService getBudgetRatesService() {
        return KcServiceLocator.getService(BudgetRatesService.class);
    }
}