org.kuali.coeus.propdev.impl.budget.person.ProposalBudgetProjectPersonnelController.java Source code

Java tutorial

Introduction

Here is the source code for org.kuali.coeus.propdev.impl.budget.person.ProposalBudgetProjectPersonnelController.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.propdev.impl.budget.person;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.joda.time.Interval;
import org.kuali.coeus.common.budget.framework.core.Budget;
import org.kuali.coeus.common.budget.framework.core.BudgetConstants;
import org.kuali.coeus.common.budget.framework.nonpersonnel.BudgetLineItem;
import org.kuali.coeus.common.budget.framework.period.BudgetPeriod;
import org.kuali.coeus.common.budget.framework.personnel.*;
import org.kuali.coeus.common.budget.impl.nonpersonnel.BudgetExpensesRuleEvent;
import org.kuali.coeus.common.framework.person.PersonTypeConstants;
import org.kuali.coeus.common.view.wizard.framework.WizardControllerService;
import org.kuali.coeus.common.view.wizard.framework.WizardResultsDto;
import org.kuali.coeus.propdev.impl.budget.core.ProposalBudgetControllerBase;
import org.kuali.coeus.propdev.impl.budget.core.ProposalBudgetForm;
import org.kuali.kra.infrastructure.Constants;
import org.kuali.rice.coreservice.framework.parameter.ParameterConstants;
import org.kuali.rice.coreservice.framework.parameter.ParameterService;
import org.kuali.rice.krad.uif.UifConstants;
import org.kuali.rice.krad.uif.UifParameters;
import org.kuali.rice.krad.web.form.DialogResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value = "/proposalBudget")
public class ProposalBudgetProjectPersonnelController extends ProposalBudgetControllerBase {

    @Autowired
    @Qualifier("wizardControllerService")
    private WizardControllerService wizardControllerService;

    @Autowired
    @Qualifier("budgetPersonService")
    private BudgetPersonService budgetPersonService;

    @Autowired
    @Qualifier("budgetPersonnelBudgetService")
    BudgetPersonnelBudgetService budgetPersonnelBudgetService;

    @Autowired
    @Qualifier("parameterService")
    private ParameterService parameterService;

    private static final String EDIT_PROJECT_PERSONNEL_DIALOG_ID = "PropBudget-EditPersonnel-Section";
    private static final String EDIT_PERSONNEL_PERIOD_DIALOG_ID = "PropBudget-EditPersonnelPeriod-Section";
    private static final String EDIT_LINE_ITEM_DETAILS_DIALOG_ID = "PropBudget-AssignPersonnelToPeriodsPage-DetailsAndRates";
    private static final String CONFIRM_PERSONNEL_PERIOD_CHANGES_DIALOG_ID = "PropBudget-ConfirmPeriodChangesDialog";
    private static final String ADD_PERSONNEL_PERIOD_DIALOG_ID = "PropBudget-AssignPersonnelToPeriodsPage-AddPersonnel";
    private static final String ADD_PROJECT_PERSONNEL_DIALOG_ID = "PropBudget-ProjectPersonnelPage-Wizard";

    @Transactional
    @RequestMapping(params = "methodToCall=searchProjectPersonnel")
    public ModelAndView searchProjectPersonnel(@ModelAttribute("KualiForm") ProposalBudgetForm form)
            throws Exception {
        if (!StringUtils.isEmpty(form.getAddProjectPersonnelHelper().getLineType())) {
            form.getAddProjectPersonnelHelper().getResults().clear();
            form.getAddProjectPersonnelHelper()
                    .setResults(getWizardControllerService().performWizardSearch(
                            form.getAddProjectPersonnelHelper().getLookupFieldValues(),
                            form.getAddProjectPersonnelHelper().getLineType()));
        }
        return getModelAndViewService().getModelAndView(form);
    }

    @Transactional
    @RequestMapping(params = "methodToCall=addProjectPersonnel")
    public ModelAndView addProjectPersonnel(@ModelAttribute("KualiForm") ProposalBudgetForm form) throws Exception {
        if (StringUtils.equals(form.getAddProjectPersonnelHelper().getLineType(),
                PersonTypeConstants.TBN.getCode())) {
            for (TbnPerson person : form.getAddProjectPersonnelHelper().getTbnPersons()) {
                for (int index = 0; index < person.getQuantity(); index++) {
                    BudgetPerson newPerson = new BudgetPerson(person);
                    newPerson.setPersonName(newPerson.getPersonName() + " - " + (index + 1));
                    newPerson.setTbnId(newPerson.getTbnId() + (index + 1));
                    getBudgetPersonService().addBudgetPerson(form.getBudget(), newPerson);
                }
            }
        } else {
            for (Object object : form.getAddProjectPersonnelHelper().getResults()) {
                WizardResultsDto wizardResult = (WizardResultsDto) object;
                BudgetPerson newBudgetPerson = new BudgetPerson();
                if (wizardResult.isSelected() == true) {
                    if (wizardResult.isSelected() == true) {
                        if (wizardResult.getKcPerson() != null) {
                            newBudgetPerson.setPersonId(wizardResult.getKcPerson().getPersonId());
                            newBudgetPerson.setPersonName(wizardResult.getKcPerson().getFullName());
                            newBudgetPerson.setUserName(wizardResult.getKcPerson().getUserName());
                            newBudgetPerson.setNonEmployeeFlag(false);
                        } else if (wizardResult.getRolodex() != null) {
                            newBudgetPerson.setRolodexId(wizardResult.getRolodex().getRolodexId());
                            newBudgetPerson.setPersonName(wizardResult.getRolodex().getFullName());
                            newBudgetPerson.setNonEmployeeFlag(true);
                        }
                        getBudgetPersonService().addBudgetPerson(form.getBudget(), newBudgetPerson);
                    }
                }
            }
        }
        form.getAddProjectPersonnelHelper().reset();
        return getModelAndViewService().getModelAndView(form);
    }

    @Transactional
    @RequestMapping(params = "methodToCall=editPersonDetails")
    public ModelAndView editPersonDetails(@ModelAttribute("KualiForm") ProposalBudgetForm form) throws Exception {
        String selectedLine = form.getActionParamaterValue(UifParameters.SELECTED_LINE_INDEX);
        if (StringUtils.isNotEmpty(selectedLine)) {
            BudgetPerson editBudgetPerson = new BudgetPerson();
            editBudgetPerson = getDataObjectService()
                    .copyInstance(form.getBudget().getBudgetPerson(Integer.parseInt(selectedLine)));
            form.getAddProjectPersonnelHelper().setEditBudgetPerson(editBudgetPerson);
            form.getAddProjectPersonnelHelper().setEditLineIndex(selectedLine);
        }
        return getModelAndViewService().showDialog(EDIT_PROJECT_PERSONNEL_DIALOG_ID, true, form);
    }

    @Transactional
    @RequestMapping(params = "methodToCall=deleteProjectPersonnel")
    public ModelAndView deleteProjectPersonnel(@ModelAttribute("KualiForm") ProposalBudgetForm form)
            throws Exception {
        String selectedLine = form.getActionParamaterValue(UifParameters.SELECTED_LINE_INDEX);
        if (StringUtils.isNotEmpty(selectedLine)) {
            Budget budget = form.getBudget();
            BudgetPerson deleteBudgetPerson = budget.getBudgetPersons().get(Integer.parseInt(selectedLine));
            if (isProjectPersonnelDeleteRulePassed(budget, deleteBudgetPerson)) {
                budget.getBudgetPersons().remove(deleteBudgetPerson);
            }
        }
        return getModelAndViewService().getModelAndView(form);
    }

    @Transactional
    @RequestMapping(params = "methodToCall=prepareAddProjectPersonnel")
    public ModelAndView prepareAddProjectPersonnel(@ModelAttribute("KualiForm") ProposalBudgetForm form)
            throws Exception {
        form.getAddProjectPersonnelHelper().setLineType(PersonTypeConstants.EMPLOYEE.getCode());
        return getModelAndViewService().showDialog(ADD_PROJECT_PERSONNEL_DIALOG_ID, true, form);
    }

    @Transactional
    @RequestMapping(params = "methodToCall=updatePersonDetails")
    public ModelAndView updatePersonDetails(@ModelAttribute("KualiForm") ProposalBudgetForm form) throws Exception {
        int selectedLine = Integer.parseInt(form.getAddProjectPersonnelHelper().getEditLineIndex());
        BudgetPerson editedBudgetPerson = form.getAddProjectPersonnelHelper().getEditBudgetPerson();
        getBudgetPersonService().refreshBudgetPerson(editedBudgetPerson);
        boolean rulePassed = getKcBusinessRulesEngine().applyRules(new BudgetSaveProjectPersonnelEvent(
                form.getBudget(), editedBudgetPerson, "addProjectPersonnelHelper.editBudgetPerson."));
        if (rulePassed) {
            form.getBudget().getBudgetPersons().set(selectedLine,
                    form.getAddProjectPersonnelHelper().getEditBudgetPerson());
            super.save(form);
        }
        return getModelAndViewService().getModelAndView(form);
    }

    @Transactional
    @RequestMapping(params = "methodToCall=calculatePersonSalaryDetails")
    public ModelAndView calculatePersonSalaryDetails(@ModelAttribute("KualiForm") ProposalBudgetForm form)
            throws Exception {
        calculatePersonSalary(form);
        return getModelAndViewService().getModelAndView(form);
    }

    @Transactional
    @RequestMapping(params = "methodToCall=syncFromProposal")
    public ModelAndView syncFromProposal(@ModelAttribute("KualiForm") ProposalBudgetForm form) throws Exception {
        getBudgetPersonService().synchBudgetPersonsToProposal(form.getBudget());
        return getModelAndViewService().getModelAndView(form);
    }

    @Transactional
    @RequestMapping(params = "methodToCall=assignPersonnelToPeriod")
    public ModelAndView assignPersonnelToPeriod(@RequestParam("budgetPeriodId") String budgetPeriodId,
            @ModelAttribute("KualiForm") ProposalBudgetForm form) throws Exception {
        ModelAndView modelAndView = getModelAndViewService().getModelAndView(form);
        Budget budget = form.getBudget();
        Long currentTabBudgetPeriodId = Long.parseLong(budgetPeriodId);
        BudgetPeriod budgetPeriod = getBudgetPeriod(currentTabBudgetPeriodId, budget);
        DialogResponse dialogResponse = form.getDialogResponse(CONFIRM_PERSONNEL_PERIOD_CHANGES_DIALOG_ID);
        if (dialogResponse == null && budgetPeriod.getBudgetPeriod() > 1 && !isPersonnelBudgetExists(budget)) {
            modelAndView = getModelAndViewService().showDialog(CONFIRM_PERSONNEL_PERIOD_CHANGES_DIALOG_ID, true,
                    form);
        } else {
            boolean confirmResetDefault = dialogResponse == null ? true : dialogResponse.getResponseAsBoolean();
            if (confirmResetDefault) {
                form.getAddProjectPersonnelHelper().reset();
                form.getAddProjectPersonnelHelper().setCurrentTabBudgetPeriod(budgetPeriod);
                setBudgetPeriodStartDateAndEndDateOnLineItems(form, budgetPeriod);
                form.getAddProjectPersonnelHelper().getBudgetLineItem().setBudget(budget);
                form.getAddProjectPersonnelHelper().getBudgetPersonnelDetail().setBudget(budget);
                form.getAddProjectPersonnelHelper().getBudgetPersonnelDetail()
                        .setPeriodTypeCode(getDefualtPeriodTypeCode());
                modelAndView = getModelAndViewService().showDialog(ADD_PERSONNEL_PERIOD_DIALOG_ID, true, form);
            }
        }
        return modelAndView;
    }

    protected String getDefualtPeriodTypeCode() {
        return getParameterService().getParameterValueAsString(Constants.MODULE_NAMESPACE_BUDGET,
                ParameterConstants.DOCUMENT_COMPONENT, Constants.BUDGET_PERSON_DETAILS_DEFAULT_PERIODTYPE);
    }

    private void setBudgetPeriodStartDateAndEndDateOnLineItems(ProposalBudgetForm form, BudgetPeriod budgetPeriod) {
        form.getAddProjectPersonnelHelper().getBudgetLineItem().setStartDate(budgetPeriod.getStartDate());
        form.getAddProjectPersonnelHelper().getBudgetLineItem().setEndDate(budgetPeriod.getEndDate());
        form.getAddProjectPersonnelHelper().getBudgetPersonnelDetail().setStartDate(budgetPeriod.getStartDate());
        form.getAddProjectPersonnelHelper().getBudgetPersonnelDetail().setEndDate(budgetPeriod.getEndDate());
    }

    private boolean isPersonnelBudgetExists(Budget budget) {
        boolean lineItemExists = false;
        for (BudgetPeriod budgetPeriod : budget.getBudgetPeriods()) {
            if (budgetPeriod.getBudgetPeriod() > 1) {
                for (BudgetLineItem budgetLineItem : budgetPeriod.getBudgetLineItems()) {
                    if (budgetLineItem.getBudgetPersonnelDetailsList().size() > 0) {
                        lineItemExists = true;
                        break;
                    }
                }
            }
        }
        return lineItemExists;
    }

    private BudgetPeriod getBudgetPeriod(Long currentTabBudgetPeriodId, Budget budget) {
        for (BudgetPeriod budgetPeriod : budget.getBudgetPeriods()) {
            if (budgetPeriod.getBudgetPeriodId().equals(currentTabBudgetPeriodId)) {
                return budgetPeriod;
            }
        }
        return null;
    }

    @Transactional
    @RequestMapping(params = "methodToCall=addPersonnelToPeriod")
    public ModelAndView addPersonnelToPeriod(@ModelAttribute("KualiForm") ProposalBudgetForm form)
            throws Exception {
        Budget budget = form.getBudget();
        BudgetPeriod currentTabBudgetPeriod = form.getAddProjectPersonnelHelper().getCurrentTabBudgetPeriod();
        BudgetLineItem newBudgetLineItem = form.getAddProjectPersonnelHelper().getBudgetLineItem();
        BudgetPersonnelDetails newBudgetPersonnelDetail = form.getAddProjectPersonnelHelper()
                .getBudgetPersonnelDetail();
        boolean success = addNewPersonnelLineItemToPeriod(form, budget, currentTabBudgetPeriod, newBudgetLineItem,
                newBudgetPersonnelDetail, "addProjectPersonnelHelper.budgetPersonnelDetail.");
        if (success) {
            form.getAddProjectPersonnelHelper().reset();
        }
        return getModelAndViewService().getModelAndView(form);
    }

    protected boolean addNewPersonnelLineItemToPeriod(ProposalBudgetForm form, Budget budget,
            BudgetPeriod currentTabBudgetPeriod, BudgetLineItem newBudgetLineItem,
            BudgetPersonnelDetails newBudgetPersonnelDetail, String errorPath) {
        syncLineItemDates(newBudgetLineItem, newBudgetPersonnelDetail);
        refreshBudgetLineItemReferences(newBudgetLineItem);
        setBudgetLineItemGroupName(form, newBudgetLineItem);
        if (!isSummaryPersonnel(newBudgetPersonnelDetail)) {
            getBudgetPersonnelBudgetService().refreshBudgetPersonnelLineItemReferences(newBudgetPersonnelDetail);
        }
        boolean rulePassed = isAddBudgetPersonnelRulePassed(budget, currentTabBudgetPeriod, newBudgetLineItem,
                newBudgetPersonnelDetail, errorPath);
        if (rulePassed) {
            getBudgetPersonnelBudgetService().addBudgetPersonnelToPeriod(currentTabBudgetPeriod, newBudgetLineItem,
                    newBudgetPersonnelDetail);
            getBudgetCalculationService().calculateBudgetPeriod(budget, currentTabBudgetPeriod);
            getDataObjectService().save(budget);
            return true;
        }
        return false;
    }

    protected boolean isAddBudgetPersonnelRulePassed(Budget budget, BudgetPeriod budgetPeriod,
            BudgetLineItem newBudgetLineItem, BudgetPersonnelDetails newBudgetPersonnelDetail, String errorPath) {
        return getKcBusinessRulesEngine().applyRules(new BudgetAddPersonnelPeriodEvent(budget, budgetPeriod,
                newBudgetLineItem, newBudgetPersonnelDetail, errorPath));
    }

    @Transactional
    @RequestMapping(params = "methodToCall=refreshPageWithBudgetExpenseRules")
    public ModelAndView refreshPageWithBudgetExpenseRules(@ModelAttribute("KualiForm") ProposalBudgetForm form)
            throws Exception {
        String errorPath = BudgetConstants.BudgetAuditRules.PERSONNEL_COSTS.getPageId();
        getKcBusinessRulesEngine().applyRules(new BudgetExpensesRuleEvent(form.getBudget(), errorPath));
        form.setAjaxReturnType("update-page");
        return getModelAndViewService().getModelAndView(form);
    }

    private void setBudgetLineItemGroupName(ProposalBudgetForm form, BudgetLineItem newBudgetLineItem) {
        String groupName = form.getAddProjectPersonnelHelper().getBudgetPersonGroupName();
        if (!StringUtils.equals(groupName, BudgetConstants.BUDGET_PERSONNEL_NEW_GROUP_NAME)) {
            newBudgetLineItem.setGroupName(groupName);
        }
    }

    private void refreshBudgetLineItemReferences(BudgetLineItem newBudgetLineItem) {
        if (StringUtils.isNotEmpty(newBudgetLineItem.getCostElement())) {
            getDataObjectService().wrap(newBudgetLineItem).fetchRelationship("costElementBO");
        }
        newBudgetLineItem.setBudgetCategoryCode(newBudgetLineItem.getCostElementBO().getBudgetCategoryCode());
        if (StringUtils.isNotEmpty(newBudgetLineItem.getBudgetCategoryCode())) {
            getDataObjectService().wrap(newBudgetLineItem).fetchRelationship("budgetCategory");
        }
    }

    private void syncLineItemDates(BudgetLineItem budgetLineItem, BudgetPersonnelDetails budgetPersonnelDetails) {
        long longestDuration = 0;
        for (BudgetPersonnelDetails detail : budgetLineItem.getBudgetPersonnelDetailsList()) {
            Interval interval = new Interval(detail.getStartDate().getTime(), detail.getEndDate().getTime());
            if (interval.toDurationMillis() >= longestDuration) {
                longestDuration = interval.toDurationMillis();
                budgetLineItem.setStartDate(detail.getStartDate());
                budgetLineItem.setEndDate(detail.getEndDate());
            }
        }
    }

    private boolean isSaveRulePassed(Budget budget, BudgetPeriod budgetPeriod, BudgetLineItem newBudgetLineItem,
            BudgetPersonnelDetails newBudgetPersonnelDetail, int editLineIndex) {
        return getKcBusinessRulesEngine().applyRules(new BudgetSavePersonnelPeriodEvent(budget, budgetPeriod,
                newBudgetLineItem, newBudgetPersonnelDetail, editLineIndex,
                "addProjectPersonnelHelper.editBudgetPersonnelDetail."));
    }

    private boolean isProjectPersonnelDeleteRulePassed(Budget budget, BudgetPerson budgetPerson) {
        return getKcBusinessRulesEngine().applyRules(new DeleteBudgetPersonEvent(budget, budgetPerson,
                "PropBudget-ProjectPersonnelPage-CollectionGroup"));
    }

    @Transactional
    @RequestMapping(params = "methodToCall=editPersonPeriodDetails")
    public ModelAndView editPersonPeriodDetails(@RequestParam("budgetPeriodId") String budgetPeriodId,
            @ModelAttribute("KualiForm") ProposalBudgetForm form) throws Exception {
        Budget budget = form.getBudget();
        String selectedLine = form.getActionParamaterValue(UifParameters.SELECTED_LINE_INDEX);
        if (StringUtils.isNotEmpty(selectedLine)) {
            form.getAddProjectPersonnelHelper().reset();
            BudgetPersonnelDetails budgetPersonnelDetails = form.getBudget().getBudgetPersonnelDetails()
                    .get(Integer.parseInt(selectedLine));
            BudgetLineItem budgetLineItem = budgetPersonnelDetails.getBudgetLineItem();
            form.getAddProjectPersonnelHelper().setEditLineIndex(selectedLine);
            form.getAddProjectPersonnelHelper()
                    .setBudgetLineItem(getDataObjectService().copyInstance(budgetLineItem));
            form.getAddProjectPersonnelHelper()
                    .setEditBudgetPersonnelDetail(getDataObjectService().copyInstance(budgetPersonnelDetails));
            Long currentTabBudgetPeriodId = Long.parseLong(budgetPeriodId);
            BudgetPeriod budgetPeriod = getBudgetPeriod(currentTabBudgetPeriodId, budget);
            form.getAddProjectPersonnelHelper().setCurrentTabBudgetPeriod(budgetPeriod);
        }
        return getModelAndViewService().showDialog(EDIT_PERSONNEL_PERIOD_DIALOG_ID, true, form);
    }

    protected boolean isSummaryPersonChanged(BudgetLineItem budgetLineItem,
            BudgetPersonnelDetails editedBudgetPersonnelDetails) {
        if (!isSummaryPersonnel(editedBudgetPersonnelDetails) && !budgetLineItem.isPersonnelLineItem()) {
            return true;
        }
        return false;
    }

    protected boolean isPersonnelChangeToSummaryPerson(BudgetLineItem budgetLineItem,
            BudgetPersonnelDetails editedBudgetPersonnelDetails) {
        if (isSummaryPersonnel(editedBudgetPersonnelDetails) && budgetLineItem.isPersonnelLineItem()) {
            return true;
        }
        return false;
    }

    @Transactional
    @RequestMapping(params = "methodToCall=refreshEditBudgetLineItem")
    public ModelAndView refreshEditBudgetLineItem(@ModelAttribute("KualiForm") ProposalBudgetForm form)
            throws Exception {
        BudgetPersonnelDetails editBudgetPersonnel = form.getAddProjectPersonnelHelper()
                .getEditBudgetPersonnelDetail();
        getDataObjectService().wrap(editBudgetPersonnel).fetchRelationship("budgetPerson");
        return getModelAndViewService().getModelAndView(form);
    }

    @Transactional
    @RequestMapping(params = "methodToCall=savePersonPeriodDetails")
    public ModelAndView savePersonPeriodDetails(@ModelAttribute("KualiForm") ProposalBudgetForm form)
            throws Exception {
        Budget budget = form.getBudget();
        int selectedLine = Integer.parseInt(form.getAddProjectPersonnelHelper().getEditLineIndex());
        BudgetPersonnelDetails budgetPersonnelDetails = form.getBudget().getBudgetPersonnelDetails()
                .get(selectedLine);
        BudgetLineItem budgetLineItem = budgetPersonnelDetails.getBudgetLineItem();
        int editLineIndex = budgetLineItem.getBudgetPersonnelDetailsList().indexOf(budgetPersonnelDetails);
        BudgetPeriod budgetPeriod = form.getAddProjectPersonnelHelper().getCurrentTabBudgetPeriod();
        BudgetPersonnelDetails editBudgetPersonnel = form.getAddProjectPersonnelHelper()
                .getEditBudgetPersonnelDetail();
        BudgetLineItem editBudgetLineItem = form.getAddProjectPersonnelHelper().getBudgetLineItem();
        int budgetLineItemIndex = budgetPeriod.getBudgetLineItems().indexOf(budgetLineItem);
        if (isSummaryPersonChanged(editBudgetLineItem, editBudgetPersonnel)) {
            addNewPersonnelLineItemToPeriod(form, budget, budgetPeriod, editBudgetLineItem, editBudgetPersonnel,
                    "addProjectPersonnelHelper.editBudgetPersonnelDetail.");
        } else {
            syncLineItemDates(editBudgetLineItem, editBudgetPersonnel);
            if (!isSummaryPersonnel(editBudgetPersonnel)) {
                getDataObjectService().wrap(editBudgetPersonnel).fetchRelationship("budgetPeriodType");
            }
            boolean rulePassed = isSaveRulePassed(budget, budgetPeriod, editBudgetLineItem, editBudgetPersonnel,
                    editLineIndex);
            if (rulePassed) {
                calculatePersonnelLineItem(form, true);
                if (isSummaryPersonnel(editBudgetPersonnel)) {
                    editBudgetLineItem.setLineItemCost(editBudgetPersonnel.getSalaryRequested());
                } else {
                    editBudgetLineItem.getBudgetPersonnelDetailsList().set(editLineIndex, editBudgetPersonnel);
                }
                if (isPersonnelChangeToSummaryPerson(editBudgetLineItem, editBudgetPersonnel)) {
                    editBudgetLineItem.getBudgetPersonnelDetailsList().clear();
                }
                BudgetLineItem newBudgetLineItem = getDataObjectService().save(editBudgetLineItem);
                budgetPeriod.getBudgetLineItems().set(budgetLineItemIndex, newBudgetLineItem);
                getBudgetCalculationService().calculateBudgetPeriod(budget, budgetPeriod);
            }
        }
        return getModelAndViewService().getModelAndView(form);
    }

    protected boolean isSummaryPersonnel(BudgetPersonnelDetails budgetPersonnelDetails) {
        return budgetPersonnelDetails.getPersonSequenceNumber()
                .equals(BudgetConstants.BudgetPerson.SUMMARYPERSON.getPersonSequenceNumber());
    }

    @Transactional
    @RequestMapping(params = "methodToCall=calculatePersonnelPeriodLineItem")
    public ModelAndView calculatePersonnelPeriodLineItem(@ModelAttribute("KualiForm") ProposalBudgetForm form)
            throws Exception {
        BudgetPersonnelDetails editBudgetPersonnelDetail = form.getAddProjectPersonnelHelper()
                .getEditBudgetPersonnelDetail();
        BudgetLineItem budgetLineItem = form.getAddProjectPersonnelHelper().getBudgetLineItem();
        if (isSummaryPersonnel(editBudgetPersonnelDetail)) {
            budgetLineItem.setLineItemCost(editBudgetPersonnelDetail.getSalaryRequested());
            editBudgetPersonnelDetail.setBudgetLineItem(budgetLineItem);
        }
        calculatePersonnelLineItem(form, false);
        return getModelAndViewService().getModelAndView(form);
    }

    protected void calculatePersonnelLineItem(ProposalBudgetForm form, boolean ruleChecked) {
        Budget budget = form.getBudget();
        BudgetPeriod budgetPeriod = form.getAddProjectPersonnelHelper().getCurrentTabBudgetPeriod();
        int selectedLine = Integer.parseInt(form.getAddProjectPersonnelHelper().getEditLineIndex());
        BudgetPersonnelDetails budgetPersonnelDetails = form.getBudget().getBudgetPersonnelDetails()
                .get(selectedLine);
        BudgetLineItem budgetLineItem = budgetPersonnelDetails.getBudgetLineItem();
        int editLineIndex = budgetLineItem.getBudgetPersonnelDetailsList().indexOf(budgetPersonnelDetails);
        BudgetPersonnelDetails editBudgetPersonnel = form.getAddProjectPersonnelHelper()
                .getEditBudgetPersonnelDetail();
        BudgetLineItem editBudgetLineItem = form.getAddProjectPersonnelHelper().getBudgetLineItem();
        syncLineItemDates(editBudgetLineItem, editBudgetPersonnel);
        boolean rulePassed = ruleChecked ? ruleChecked
                : isSaveRulePassed(budget, budgetPeriod, editBudgetLineItem, editBudgetPersonnel, editLineIndex);
        if (rulePassed) {
            getBudgetPersonnelBudgetService().calculateBudgetPersonnelLineItem(budget, editBudgetLineItem,
                    editBudgetPersonnel, editLineIndex);
        }
    }

    protected void calculatePersonSalary(ProposalBudgetForm form) {
        Budget budget = form.getBudget();
        int selectedLine = Integer.parseInt(form.getAddProjectPersonnelHelper().getEditLineIndex());
        List<BudgetPersonSalaryDetails> budgetPersonSalaryDetails = new ArrayList<BudgetPersonSalaryDetails>();
        BudgetPerson budgetPerson = form.getAddProjectPersonnelHelper().getEditBudgetPerson();
        budgetPersonSalaryDetails = getBudgetPersonnelBudgetService().calculatePersonSalary(budget, selectedLine);
        budgetPerson.setBudgetPersonSalaryDetails(budgetPersonSalaryDetails);
    }

    @Transactional
    @RequestMapping(params = "methodToCall=calculateCurrentPeriod")
    public ModelAndView calculateCurrentPeriod(@RequestParam("budgetPeriodId") String budgetPeriodId,
            @ModelAttribute("KualiForm") ProposalBudgetForm form) throws Exception {
        Budget budget = form.getBudget();
        Long currentTabBudgetPeriodId = Long.parseLong(budgetPeriodId);
        BudgetPeriod currentTabBudgetPeriod = getBudgetPeriod(currentTabBudgetPeriodId, budget);
        form.getAddProjectPersonnelHelper().setCurrentTabBudgetPeriod(currentTabBudgetPeriod);
        getBudgetPersonnelBudgetService().calculateCurrentBudgetPeriod(currentTabBudgetPeriod);
        return getModelAndViewService().getModelAndView(form);
    }

    @Transactional
    @RequestMapping(params = "methodToCall=editBudgetDetailsAndRates")
    public ModelAndView editBudgetDetailsAndRates(@RequestParam("budgetPeriodId") String budgetPeriodId,
            @RequestParam("lineItemGroupKey") String lineItemGroupKey,
            @ModelAttribute("KualiForm") ProposalBudgetForm form) throws Exception {
        Budget budget = form.getBudget();
        Long currentTabBudgetPeriodId = Long.parseLong(budgetPeriodId);
        BudgetPeriod currentTabBudgetPeriod = getBudgetPeriod(currentTabBudgetPeriodId, budget);
        BudgetLineItem budgetLineItem = getSelectedBudgetLineItem(lineItemGroupKey, currentTabBudgetPeriod);
        form.getAddProjectPersonnelHelper().setBudgetLineItem(budgetLineItem);
        form.getAddProjectPersonnelHelper().setCurrentTabBudgetPeriod(currentTabBudgetPeriod);
        return getModelAndViewService().showDialog(EDIT_LINE_ITEM_DETAILS_DIALOG_ID, true, form);
    }

    @Transactional
    @RequestMapping(params = { "methodToCall=refresh",
            "refreshCaller=PropBudget-AssignPersonnelToPeriodsPage-DetailsAndRates" })
    public ModelAndView refreshBudgetDetailsAndRates(@ModelAttribute("KualiForm") ProposalBudgetForm form)
            throws Exception {
        form.setAjaxReturnType(UifConstants.AjaxReturnTypes.UPDATECOMPONENT.getKey());
        form.setUpdateComponentId("PropBudget-AssignPersonnelToPeriodsPage-DetailsAndRates");
        getDataObjectService().wrap(form.getAddProjectBudgetLineItemHelper().getBudgetLineItem())
                .fetchRelationship("costElementBO");
        return getRefreshControllerService().refresh(form);
    }

    @Transactional
    @RequestMapping(params = "methodToCall=applyToLaterPeriods")
    public ModelAndView applyToLaterPeriods(@ModelAttribute("KualiForm") ProposalBudgetForm form) throws Exception {
        Budget budget = form.getBudget();
        BudgetPeriod currentTabBudgetPeriod = form.getAddProjectPersonnelHelper().getCurrentTabBudgetPeriod();
        BudgetLineItem budgetLineItem = form.getAddProjectPersonnelHelper().getBudgetLineItem();
        getBudgetCalculationService().applyToLaterPeriods(budget, currentTabBudgetPeriod, budgetLineItem);
        return super.save(form);
    }

    @Transactional
    @RequestMapping(params = "methodToCall=deletePersonnelLineItem")
    public ModelAndView deletePersonnelLineItem(@RequestParam("budgetPeriodId") String budgetPeriodId,
            @ModelAttribute("KualiForm") ProposalBudgetForm form) throws Exception {
        Budget budget = form.getBudget();
        String selectedLine = form.getActionParamaterValue(UifParameters.SELECTED_LINE_INDEX);
        if (StringUtils.isNotEmpty(selectedLine)) {
            BudgetPersonnelDetails deletedPersonnelLineItem = form.getBudget().getBudgetPersonnelDetails()
                    .get(Integer.parseInt(selectedLine));
            Long currentTabBudgetPeriodId = Long.parseLong(budgetPeriodId);
            BudgetPeriod budgetPeriod = getBudgetPeriod(currentTabBudgetPeriodId, budget);
            BudgetLineItem budgetLineItem = deletedPersonnelLineItem.getBudgetLineItem();
            if (!isSummaryPersonnel(deletedPersonnelLineItem)) {
                budgetLineItem.getBudgetPersonnelDetailsList().remove(deletedPersonnelLineItem);
            }
            if (budgetLineItem.getBudgetPersonnelDetailsList().size() == 0) {
                budgetPeriod.getBudgetLineItems().remove(budgetLineItem);
            }
            getBudgetCalculationService().calculateBudgetPeriod(budget, budgetPeriod);
            refreshPageWithBudgetExpenseRules(form);
        }
        return getModelAndViewService().getModelAndView(form);
    }

    private BudgetLineItem getSelectedBudgetLineItem(String lineItemGroupKey, BudgetPeriod budgetPeriod) {
        for (BudgetLineItem budgetLineItem : budgetPeriod.getBudgetLineItems()) {
            if (budgetLineItem.getLineItemGroupDescription().equals(lineItemGroupKey)) {
                return budgetLineItem;
            }
        }
        return null;
    }

    public WizardControllerService getWizardControllerService() {
        return wizardControllerService;
    }

    public void setWizardControllerService(WizardControllerService wizardControllerService) {
        this.wizardControllerService = wizardControllerService;
    }

    public BudgetPersonService getBudgetPersonService() {
        return budgetPersonService;
    }

    public void setBudgetPersonService(BudgetPersonService budgetPersonService) {
        this.budgetPersonService = budgetPersonService;
    }

    public BudgetPersonnelBudgetService getBudgetPersonnelBudgetService() {
        return budgetPersonnelBudgetService;
    }

    public void setBudgetPersonnelBudgetService(BudgetPersonnelBudgetService budgetPersonnelBudgetService) {
        this.budgetPersonnelBudgetService = budgetPersonnelBudgetService;
    }

    public ParameterService getParameterService() {
        return parameterService;
    }

    public void setParameterService(ParameterService parameterService) {
        this.parameterService = parameterService;
    }
}