org.kuali.kfs.module.ec.document.web.struts.CertificationReportAction.java Source code

Java tutorial

Introduction

Here is the source code for org.kuali.kfs.module.ec.document.web.struts.CertificationReportAction.java

Source

/*
 * 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.ec.document.web.struts;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.kuali.kfs.integration.cg.ContractsAndGrantsModuleService;
import org.kuali.kfs.module.ec.EffortConstants;
import org.kuali.kfs.module.ec.EffortConstants.EffortCertificationEditMode;
import org.kuali.kfs.module.ec.EffortPropertyConstants;
import org.kuali.kfs.module.ec.businessobject.EffortCertificationDetail;
import org.kuali.kfs.module.ec.businessobject.EffortCertificationDetailLineOverride;
import org.kuali.kfs.module.ec.document.EffortCertificationDocument;
import org.kuali.kfs.module.ec.document.authorization.EffortCertificationDocumentAuthorizer;
import org.kuali.kfs.module.ec.document.validation.event.AddDetailLineEvent;
import org.kuali.kfs.module.ec.document.validation.event.CheckDetailLineAmountEvent;
import org.kuali.kfs.module.ec.document.validation.impl.EffortCertificationDocumentRuleUtil;
import org.kuali.kfs.module.ec.service.EffortCertificationDocumentService;
import org.kuali.kfs.module.ec.util.DetailLineGroup;
import org.kuali.kfs.sys.DynamicCollectionComparator;
import org.kuali.kfs.sys.DynamicCollectionComparator.SortOrder;
import org.kuali.kfs.sys.KFSConstants;
import org.kuali.kfs.sys.KFSPropertyConstants;
import org.kuali.kfs.sys.ObjectUtil;
import org.kuali.kfs.sys.context.SpringContext;
import org.kuali.rice.core.api.util.type.KualiDecimal;
import org.kuali.rice.kew.api.exception.WorkflowException;
import org.kuali.rice.kim.api.KimConstants;
import org.kuali.rice.kns.service.DocumentHelperService;
import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase;
import org.kuali.rice.krad.service.BusinessObjectService;
import org.kuali.rice.krad.util.GlobalVariables;
import org.kuali.rice.krad.util.KRADConstants;
import org.kuali.rice.krad.util.ObjectUtils;

/**
 * This class handles Actions for EffortCertification document approval.
 */
public class CertificationReportAction extends EffortCertificationAction {
    protected static org.apache.log4j.Logger LOG = org.apache.log4j.Logger
            .getLogger(CertificationReportAction.class);

    /**
     * recalculate the detail line
     */
    public ActionForward recalculate(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        int lineToRecalculateIndex = getLineToDelete(request);

        EffortCertificationForm effortForm = (EffortCertificationForm) form;
        EffortCertificationDocument effortDocument = (EffortCertificationDocument) effortForm.getDocument();
        List<EffortCertificationDetail> detailLines = effortDocument.getEffortCertificationDetailLines();
        EffortCertificationDetail lineToRecalculate = detailLines.get(lineToRecalculateIndex);
        EffortCertificationDocumentRuleUtil.applyDefaultValues(lineToRecalculate);

        String errorPathPrefix = KFSPropertyConstants.DOCUMENT + "."
                + EffortPropertyConstants.EFFORT_CERTIFICATION_DETAIL_LINES;
        boolean isValid = this.invokeRules(
                new CheckDetailLineAmountEvent("", errorPathPrefix, effortDocument, lineToRecalculate));
        if (isValid) {
            KualiDecimal totalPayrollAmount = effortDocument.getTotalOriginalPayrollAmount();
            lineToRecalculate.recalculatePayrollAmount(totalPayrollAmount);
        }

        return mapping.findForward(KFSConstants.MAPPING_BASIC);
    }

    /**
     * add New Effort Certification Detail Lines
     */
    public ActionForward add(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        CertificationReportForm certificationReportForm = (CertificationReportForm) form;
        EffortCertificationDocument effortDocument = (EffortCertificationDocument) certificationReportForm
                .getDocument();
        List<EffortCertificationDetail> detailLines = effortDocument.getEffortCertificationDetailLines();
        EffortCertificationDetail newDetailLine = certificationReportForm.getNewDetailLine();

        // KFSMI-798 - refreshNonUpdatableReferences() used instead of refresh(),
        // EffortCertificationDetail does not have any updatable references
        newDetailLine.refreshNonUpdateableReferences();
        newDetailLine.setPositionNumber(effortDocument.getDefaultPositionNumber());
        newDetailLine.setFinancialObjectCode(effortDocument.getDefaultObjectCode());
        newDetailLine.setNewLineIndicator(true);

        EffortCertificationDetail workingDetailLine = new EffortCertificationDetail();
        ObjectUtil.buildObject(workingDetailLine, newDetailLine);

        EffortCertificationDocumentRuleUtil.applyDefaultValues(workingDetailLine);

        if (newDetailLine.isAccountExpiredOverride()) {
            this.updateDetailLineOverrideCode(workingDetailLine);
            this.updateDetailLineOverrideCode(newDetailLine);
        }

        // check business rules
        boolean isValid = this.invokeRules(new AddDetailLineEvent("",
                EffortPropertyConstants.EFFORT_CERTIFICATION_DOCUMENT_NEW_LINE, effortDocument, workingDetailLine));
        if (isValid) {
            if (EffortCertificationDocumentRuleUtil.hasA21SubAccount(workingDetailLine)) {
                EffortCertificationDocumentRuleUtil.updateSourceAccountInformation(workingDetailLine);
            }

            this.resetPersistedFields(workingDetailLine);
            detailLines.add(workingDetailLine);
            certificationReportForm.setNewDetailLine(certificationReportForm.createNewDetailLine());
        } else {
            EffortCertificationDetailLineOverride.processForOutput(newDetailLine);
        }

        this.processDetailLineOverrides(detailLines);

        return mapping.findForward(KFSConstants.MAPPING_BASIC);
    }

    /**
     * delete detail line
     */
    public ActionForward delete(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        int lineToDeleteIndex = getLineToDelete(request);

        EffortCertificationForm effortForm = (EffortCertificationForm) form;
        EffortCertificationDocument effortDocument = (EffortCertificationDocument) effortForm.getDocument();
        List<EffortCertificationDetail> detailLines = effortDocument.getEffortCertificationDetailLines();

        detailLines.remove(lineToDeleteIndex);

        return mapping.findForward(KFSConstants.MAPPING_BASIC);
    }

    /**
     * revert the detail line to the original values
     */
    public ActionForward revert(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        int lineToRevertIndex = getLineToDelete(request);

        EffortCertificationForm effortForm = (EffortCertificationForm) form;
        EffortCertificationDocument effortDocument = (EffortCertificationDocument) effortForm.getDocument();
        List<EffortCertificationDetail> detailLines = effortDocument.getEffortCertificationDetailLines();

        this.revertDetaiLine(detailLines, lineToRevertIndex);

        return mapping.findForward(KFSConstants.MAPPING_BASIC);
    }

    /**
     * @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);

        CertificationReportForm certificationReportForm = (CertificationReportForm) kualiDocumentFormBase;
        if (this.isSummarizeDetailLinesRendered(certificationReportForm)) {
            this.refreshDetailLineGroupMap(certificationReportForm);
        }
    }

    /**
     * @see org.kuali.rice.kns.web.struts.action.KualiAction#refresh(org.apache.struts.action.ActionMapping,
     *      org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    @Override
    public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        ActionForward actionForward = super.refresh(mapping, form, request, response);

        CertificationReportForm certificationReportForm = (CertificationReportForm) form;
        for (EffortCertificationDetail detailLine : certificationReportForm.getDetailLines()) {
            detailLine.refreshNonUpdateableReferences();

            EffortCertificationDocumentRuleUtil.applyDefaultValues(detailLine);
        }

        return actionForward;
    }

    /**
     * @see org.apache.struts.action.Action#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 {
        CertificationReportForm certificationReportForm = (CertificationReportForm) form;
        if (this.isSummarizeDetailLinesRendered(certificationReportForm)) {
            this.updateDetailLinesFromSummaryLines(certificationReportForm);
        }

        ActionForward actionForward = super.execute(mapping, form, request, response);
        this.refresh(mapping, form, request, response);

        return actionForward;
    }

    /**
     * sort the detail lines by column
     */
    public ActionForward sortDetailLineByColumn(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        CertificationReportForm certificationReportForm = (CertificationReportForm) form;

        String methodToCallAttribute = (String) request.getAttribute(KRADConstants.METHOD_TO_CALL_ATTRIBUTE);
        String sortMethodName = EffortConstants.SORT_DETAIL_LINE_BY_COLUMN_METHOD_NAME + ".";
        String sortColumn = StringUtils.substringBetween(methodToCallAttribute, sortMethodName, ".");

        this.toggleSortOrder(certificationReportForm);
        this.sortDetailLine(certificationReportForm, certificationReportForm.getDetailLines(), sortColumn);

        if (this.isSummarizeDetailLinesRendered(certificationReportForm)) {
            this.sortDetailLine(certificationReportForm, certificationReportForm.getSummarizedDetailLines(),
                    sortColumn);
        }

        return mapping.findForward(KFSConstants.MAPPING_BASIC);
    }

    /**
     * recalculate a detail line in summarized detail lines and make a corresponding update on the underlying detail lines
     */
    public ActionForward recalculateSummarizedDetailLine(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        CertificationReportForm certificationReportForm = (CertificationReportForm) form;
        EffortCertificationDocument effortDocument = (EffortCertificationDocument) certificationReportForm
                .getDocument();
        KualiDecimal totalPayrollAmount = effortDocument.getTotalOriginalPayrollAmount();

        // recalculate the selected summary line
        List<EffortCertificationDetail> summarizedDetailLines = certificationReportForm.getSummarizedDetailLines();
        int lineToRecalculateIndex = this.getSelectedLine(request);
        EffortCertificationDetail lineToRecalculate = summarizedDetailLines.get(lineToRecalculateIndex);
        EffortCertificationDocumentRuleUtil.applyDefaultValues(lineToRecalculate);

        String errorPathPrefix = KFSPropertyConstants.DOCUMENT + "."
                + EffortPropertyConstants.SUMMARIZED_DETAIL_LINES + "[" + lineToRecalculateIndex + "]";
        boolean isValid = this.invokeRules(
                new CheckDetailLineAmountEvent("", errorPathPrefix, effortDocument, lineToRecalculate));
        if (isValid) {
            lineToRecalculate.recalculatePayrollAmount(totalPayrollAmount);

            String groupId = lineToRecalculate.getGroupId();
            List<EffortCertificationDetail> detailLines = certificationReportForm.getDetailLines();
            List<EffortCertificationDetail> detailLinesToRecalculate = this.findDetailLinesInGroup(detailLines,
                    groupId);
            for (EffortCertificationDetail line : detailLinesToRecalculate) {
                ObjectUtil.buildObject(line, lineToRecalculate, EffortConstants.DETAIL_LINES_GROUPING_FILEDS);
            }

            // rebuild the detail line groups from the detail lines of the current document
            Map<String, DetailLineGroup> detailLineGroupMap = DetailLineGroup
                    .groupDetailLines(certificationReportForm.getDetailLines());
            DetailLineGroup detailLineGroup = detailLineGroupMap
                    .get(DetailLineGroup.getKeysAsString(lineToRecalculate));
            this.updateDetailLineGroup(detailLineGroup, lineToRecalculate, totalPayrollAmount);
        }

        return mapping.findForward(KFSConstants.MAPPING_BASIC);
    }

    /**
     * add a new detail line and make a corresponding update on the underlying detail lines
     */
    public ActionForward addSummarizedDetailLine(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        ActionForward actionForward = this.add(mapping, form, request, response);

        if (GlobalVariables.getMessageMap().getErrorCount() >= 0) {
            CertificationReportForm certificationReportForm = (CertificationReportForm) form;
            this.refreshDetailLineGroupMap(certificationReportForm);
        }

        return actionForward;
    }

    /**
     * delete a detail line from summarized detail lines and make a corresponding update on the underlying detail lines
     */
    public ActionForward deleteSummarizedDetailLine(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        CertificationReportForm certificationReportForm = (CertificationReportForm) form;

        // remove the selected summary line
        List<EffortCertificationDetail> summarizedDetailLines = certificationReportForm.getSummarizedDetailLines();
        int lineToRecalculateIndex = this.getSelectedLine(request);
        EffortCertificationDetail lineToDelete = summarizedDetailLines.get(lineToRecalculateIndex);
        summarizedDetailLines.remove(lineToDelete);

        String groupId = lineToDelete.getGroupId();
        List<EffortCertificationDetail> detailLines = certificationReportForm.getDetailLines();
        List<EffortCertificationDetail> detailLinesToDelete = this.findDetailLinesInGroup(detailLines, groupId);
        detailLines.removeAll(detailLinesToDelete);

        return mapping.findForward(KFSConstants.MAPPING_BASIC);
    }

    /**
     * revert a detail line in summarized detail lines and make a corresponding update on the underlying detail lines
     */
    public ActionForward revertSummarizedDetailLine(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        CertificationReportForm certificationReportForm = (CertificationReportForm) form;

        List<EffortCertificationDetail> summarizedDetailLines = certificationReportForm.getSummarizedDetailLines();
        int lineToRevertIndex = this.getSelectedLine(request);
        EffortCertificationDetail lineToRevert = summarizedDetailLines.get(lineToRevertIndex);

        Map<String, DetailLineGroup> detailLineGroupMap = DetailLineGroup
                .groupDetailLines(certificationReportForm.getDetailLines());
        DetailLineGroup detailLineGroup = detailLineGroupMap.get(DetailLineGroup.getKeysAsString(lineToRevert));
        List<EffortCertificationDetail> detailLinesInGroup = detailLineGroup.getDetailLines();

        List<EffortCertificationDetail> detailLines = certificationReportForm.getDetailLines();
        for (EffortCertificationDetail detailLine : detailLinesInGroup) {
            this.revertDetaiLine(detailLines, detailLine);
        }

        this.refreshDetailLineGroupMap(certificationReportForm);

        return mapping.findForward(KFSConstants.MAPPING_BASIC);
    }

    /**
     * find the detail lines belonging to the given group from the given detail lines
     * 
     * @param detailLines the given detail lines
     * @param groupId the given group id
     * @return the detail lines belonging to the given group
     */
    protected List<EffortCertificationDetail> findDetailLinesInGroup(List<EffortCertificationDetail> detailLines,
            String groupId) {
        List<EffortCertificationDetail> detailLinesInGroup = new ArrayList<EffortCertificationDetail>();

        for (EffortCertificationDetail line : detailLines) {
            if (StringUtils.equals(groupId, line.getGroupId())) {
                detailLinesInGroup.add(line);
            }
        }

        return detailLinesInGroup;
    }

    /**
     * determine whether the summarized detail lines need to be rendered
     * 
     * @param certificationReportForm the action form
     * @return true if the summarized detail lines need to be rendered; otherwise, false
     */
    protected boolean isSummarizeDetailLinesRendered(CertificationReportForm certificationReportForm) {
        populateAuthorizationFields(certificationReportForm);
        //super.populateAuthorizationFields(certificationReportForm);

        return certificationReportForm.getEditingMode().containsKey(EffortCertificationEditMode.SUMMARY_TAB_ENTRY);
    }

    /**
     * recalculate all detail lines with the information in summarized detail lines
     * 
     * @param certificationReportForm the given action form
     */
    protected void recalculateAllDetailLines(CertificationReportForm certificationReportForm) {
        Map<String, DetailLineGroup> detailLineGroupMap = DetailLineGroup
                .groupDetailLines(certificationReportForm.getDetailLines());

        EffortCertificationDocument effortDocument = (EffortCertificationDocument) certificationReportForm
                .getDocument();
        KualiDecimal totalPayrollAmount = effortDocument.getTotalOriginalPayrollAmount();

        List<EffortCertificationDetail> summarizedDetailLines = certificationReportForm.getSummarizedDetailLines();
        for (EffortCertificationDetail detailLine : summarizedDetailLines) {
            // recalculate the selected summary line
            detailLine.recalculatePayrollAmount(totalPayrollAmount);

            // rebuild the detail line groups from the detail lines of the current document
            DetailLineGroup detailLineGroup = detailLineGroupMap.get(DetailLineGroup.getKeysAsString(detailLine));
            this.updateDetailLineGroup(detailLineGroup, detailLine, totalPayrollAmount);
        }
    }

    /**
     * recalculate all detail lines with the information in summarized detail lines
     * 
     * @param certificationReportForm the given action form
     */
    protected void updateDetailLinesFromSummaryLines(CertificationReportForm certificationReportForm) {
        EffortCertificationDocument effortDocument = (EffortCertificationDocument) certificationReportForm
                .getDocument();
        List<EffortCertificationDetail> detailLines = certificationReportForm.getDetailLines();
        List<EffortCertificationDetail> summarizedDetailLines = certificationReportForm.getSummarizedDetailLines();

        boolean isValid = true;
        int index = 0;
        for (EffortCertificationDetail detailLine : summarizedDetailLines) {
            EffortCertificationDocumentRuleUtil.applyDefaultValues(detailLine);

            String errorPathPrefix = KFSPropertyConstants.DOCUMENT + "."
                    + EffortPropertyConstants.SUMMARIZED_DETAIL_LINES + "[" + index + "]";
            isValid &= this
                    .invokeRules(new CheckDetailLineAmountEvent("", errorPathPrefix, effortDocument, detailLine));

            ++index;
        }

        if (!isValid) {
            return;
        }

        for (EffortCertificationDetail detailLine : summarizedDetailLines) {
            if (!detailLine.isNewLineIndicator()) {
                continue;
            }

            if (detailLine.isAccountExpiredOverride()) {
                detailLine.refreshReferenceObject(KFSPropertyConstants.ACCOUNT);
                this.updateDetailLineOverrideCode(detailLine);
            }

            List<EffortCertificationDetail> detailLinesToUpdate = this.findDetailLinesInGroup(detailLines,
                    detailLine.getGroupId());
            for (EffortCertificationDetail line : detailLinesToUpdate) {
                ObjectUtil.buildObject(line, detailLine, EffortConstants.DETAIL_LINES_GROUPING_FILEDS);

                line.setAccountExpiredOverride(detailLine.isAccountExpiredOverride());
                line.setAccountExpiredOverrideNeeded(detailLine.isAccountExpiredOverrideNeeded());
                line.setOverrideCode(detailLine.getOverrideCode());
            }
        }

        Map<String, DetailLineGroup> detailLineGroupMap = DetailLineGroup.groupDetailLines(detailLines);
        KualiDecimal totalPayrollAmount = effortDocument.getTotalOriginalPayrollAmount();
        for (EffortCertificationDetail detailLine : summarizedDetailLines) {
            // rebuild the detail line groups from the detail lines of the current document
            detailLine.setGroupId(DetailLineGroup.getKeysAsString(detailLine));
            DetailLineGroup detailLineGroup = detailLineGroupMap.get(DetailLineGroup.getKeysAsString(detailLine));
            this.updateDetailLineGroup(detailLineGroup, detailLine, totalPayrollAmount);
        }

        this.processDetailLineOverrides(detailLines);
        this.processDetailLineOverrides(summarizedDetailLines);
    }

    /**
     * update detail line group with the the information in the given detail line
     * 
     * @param detailLineGroup the given detail line group
     * @param detailLine the given detail line
     * @param totalPayrollAmount the total payroll amount of the document associating with the detail line group
     */
    protected void updateDetailLineGroup(DetailLineGroup detailLineGroup, EffortCertificationDetail detailLine,
            KualiDecimal totalPayrollAmount) {
        EffortCertificationDetail summaryLine = detailLineGroup.getSummaryDetailLine();
        summaryLine.setEffortCertificationUpdatedOverallPercent(
                detailLine.getEffortCertificationUpdatedOverallPercent());
        summaryLine.setEffortCertificationPayrollAmount(detailLine.getEffortCertificationPayrollAmount());

        detailLineGroup.updateDetailLineEffortPercent();
        detailLineGroup.updateDetailLinePayrollAmount();
    }

    /**
     * Toggles the sort order between ascending and descending. If the current order is ascending, then the sort order will be set
     * to descending, and vice versa.
     */
    protected void toggleSortOrder(CertificationReportForm certificationReportForm) {
        if (SortOrder.ASC.name().equals(certificationReportForm.getSortOrder())) {
            certificationReportForm.setSortOrder(SortOrder.DESC.name());
        } else {
            certificationReportForm.setSortOrder(SortOrder.ASC.name());
        }
    }

    /**
     * sort the detail lines based on the values of the sort order and sort column
     */
    protected void sortDetailLine(CertificationReportForm certificationReportForm,
            List<EffortCertificationDetail> detailLines, String... sortColumn) {
        String sortOrder = certificationReportForm.getSortOrder();
        DynamicCollectionComparator.sort(detailLines, SortOrder.valueOf(sortOrder), sortColumn);
    }

    /**
     * rebuild the detail line group map from the detail lines of the current document
     */
    protected Map<String, DetailLineGroup> refreshDetailLineGroupMap(
            CertificationReportForm certificationReportForm) {
        LOG.debug("refreshDetailLineGroupMap() started");

        List<EffortCertificationDetail> summarizedDetailLines = certificationReportForm.getSummarizedDetailLines();
        if (summarizedDetailLines == null) {
            EffortCertificationDocument effortCertificationDocument = (EffortCertificationDocument) certificationReportForm
                    .getDocument();
            effortCertificationDocument.setSummarizedDetailLines(new ArrayList<EffortCertificationDetail>());
        }
        summarizedDetailLines.clear();

        Map<String, DetailLineGroup> detailLineGroupMap = DetailLineGroup
                .groupDetailLines(certificationReportForm.getDetailLines());

        for (String key : detailLineGroupMap.keySet()) {
            EffortCertificationDetail sumaryline = detailLineGroupMap.get(key).getSummaryDetailLine();

            summarizedDetailLines.add(sumaryline);
        }

        return detailLineGroupMap;
    }

    /**
     * find the given detail line from the given collection of detail lines and revert it
     */
    protected void revertDetaiLine(List<EffortCertificationDetail> detailLines,
            EffortCertificationDetail lineToRevert) {
        int lineToRevertIndex = detailLines.lastIndexOf(lineToRevert);

        this.revertDetaiLine(detailLines, lineToRevertIndex);
    }

    /**
     * revert the detail line in the specified position
     */
    protected void revertDetaiLine(List<EffortCertificationDetail> detailLines, int lineToRevertIndex) {
        EffortCertificationDetail lineToRevert = detailLines.get(lineToRevertIndex);

        BusinessObjectService businessObjectService = SpringContext.getBean(BusinessObjectService.class);
        EffortCertificationDetail revertedLine = (EffortCertificationDetail) businessObjectService
                .retrieve(lineToRevert);
        this.resetPersistedFields(revertedLine);

        detailLines.remove(lineToRevertIndex);
        detailLines.add(lineToRevertIndex, revertedLine);
    }

    /**
     * reset the persisted fields of the given detail line
     */
    protected void resetPersistedFields(EffortCertificationDetail detailLine) {
        int persistedEffortPercent = detailLine.getEffortCertificationUpdatedOverallPercent();
        detailLine.setPersistedEffortPercent(new Integer(persistedEffortPercent));

        BigDecimal persistedPayrollAmount = detailLine.getEffortCertificationPayrollAmount().bigDecimalValue();
        detailLine.setPersistedPayrollAmount(new KualiDecimal(persistedPayrollAmount));
    }

    /**
     * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#approve(org.apache.struts.action.ActionMapping,
     *      org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    @Override
    public ActionForward approve(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        KualiDocumentFormBase kualiDocumentFormBase = (KualiDocumentFormBase) form;
        EffortCertificationDocument effortDocument = (EffortCertificationDocument) kualiDocumentFormBase
                .getDocument();

        EffortCertificationDocumentService effortCertificationDocumentService = SpringContext
                .getBean(EffortCertificationDocumentService.class);
        effortCertificationDocumentService.addRouteLooping(effortDocument);

        ActionForward actionForward = super.approve(mapping, kualiDocumentFormBase, request, response);

        return actionForward;
    }

    /**
     * @see org.kuali.rice.kns.web.struts.action.KualiDocumentActionBase#insertBONote(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
     */
    @Override
    public ActionForward insertBONote(ActionMapping mapping, ActionForm form, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        KualiDocumentFormBase kualiDocumentFormBase = (KualiDocumentFormBase) form;
        kualiDocumentFormBase.getNewNote().setNewCollectionRecord(true);

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

    /**
     * Do one additional check on Use Transactional for Summary Tab
     * @see org.kuali.rice.kns.web.struts.action.KualiTransactionalDocumentActionBase#populateAuthorizationFields(org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase)
     */
    @Override
    protected void populateAuthorizationFields(KualiDocumentFormBase formBase) {

        //call super for authorization fields
        super.populateAuthorizationFields(formBase);

        CertificationReportForm certificationReportForm = (CertificationReportForm) formBase;

        //get document authorizer
        EffortCertificationDocumentAuthorizer certReportDocAuthorizer = (EffortCertificationDocumentAuthorizer) SpringContext
                .getBean(DocumentHelperService.class)
                .getDocumentAuthorizer(EffortConstants.EffortDocumentTypes.EFFORT_CERTIFICATION_DOCUMENT);

        //grab document
        KualiDocumentFormBase kualiDocumentFormBase = (KualiDocumentFormBase) formBase;
        EffortCertificationDocument effortDocument = (EffortCertificationDocument) kualiDocumentFormBase
                .getDocument();

        //get principal id
        String currentPrincipalId = GlobalVariables.getUserSession().getPrincipalId();

        //set additional details for summary tab 
        Map<String, String> additionalPermissionDetails = new HashMap<String, String>();
        additionalPermissionDetails.put(KimConstants.AttributeConstants.EDIT_MODE,
                EffortCertificationEditMode.SUMMARY_TAB_ENTRY);

        //get list of chart/account numbers
        List<EffortCertificationDetail> summarizedDetailLines = createSummarizedDetailLines(
                certificationReportForm);

        //set additional role qualifiers
        Map<String, String> additionalRoleQualifiers = new HashMap<String, String>();
        String proposalNumber = getPropsalNumberForProjectDirector(currentPrincipalId, summarizedDetailLines);

        //set proposal number if found
        if (StringUtils.isNotBlank(proposalNumber)) {
            additionalRoleQualifiers.put(KFSPropertyConstants.PROPOSAL, proposalNumber);

            //re-check summary permission
            if (certReportDocAuthorizer.doPermissionExistsByTemplate(effortDocument, KRADConstants.KNS_NAMESPACE,
                    KimConstants.PermissionTemplateNames.USE_TRANSACTIONAL_DOCUMENT, additionalPermissionDetails)
                    && !certReportDocAuthorizer.isAuthorizedByTemplate(effortDocument, KRADConstants.KNS_NAMESPACE,
                            KimConstants.PermissionTemplateNames.USE_TRANSACTIONAL_DOCUMENT, currentPrincipalId,
                            additionalPermissionDetails, additionalRoleQualifiers)) {

                formBase.getEditingMode().put(EffortCertificationEditMode.SUMMARY_TAB_ENTRY,
                        KRADConstants.KUALI_DEFAULT_TRUE_VALUE);
            }
        }
    }

    /**
     * Retrieves a proposal number for a project director from a list of awards pulled by chart/account number. 
     * 
     * @param projectDirectorId
     * @return
     */
    protected String getPropsalNumberForProjectDirector(String projectDirectorId,
            List<EffortCertificationDetail> summarizedDetailLines) {

        String proposalNumber = null;
        String chartOfAccountsCode = null;
        String accountNumber = null;

        for (EffortCertificationDetail line : summarizedDetailLines) {
            proposalNumber = SpringContext.getBean(ContractsAndGrantsModuleService.class)
                    .getProposalNumberForAccountAndProjectDirector(line.getChartOfAccountsCode(),
                            line.getAccountNumber(), projectDirectorId);

            //if found a proposal number, break and return
            if (StringUtils.isNotEmpty(proposalNumber))
                break;
        }

        return proposalNumber;
    }

    protected List<EffortCertificationDetail> createSummarizedDetailLines(
            CertificationReportForm certificationReportForm) {

        List<EffortCertificationDetail> summarizedDetailLines = new ArrayList<EffortCertificationDetail>();
        Map<String, DetailLineGroup> detailLineGroupMap = null;

        summarizedDetailLines = certificationReportForm.getSummarizedDetailLines();

        if (ObjectUtils.isNull(summarizedDetailLines) || summarizedDetailLines.isEmpty()) {
            if (ObjectUtils.isNotNull(certificationReportForm.getDetailLines())
                    && !certificationReportForm.getDetailLines().isEmpty()) {
                summarizedDetailLines = certificationReportForm.getDetailLines();
            }
        }

        return summarizedDetailLines;

    }

    /**
     * Transforms the summarized effort detail lines into a chart/account number map
     * 
     * @param summaryDetail
     * @return
     */
    protected Map<String, String> convertSummarizedDetailToChartAccountMap(
            List<EffortCertificationDetail> summaryDetail) {

        Map<String, String> chartAccountMap = new HashMap<String, String>();

        for (EffortCertificationDetail line : summaryDetail) {
            chartAccountMap.put(line.getChartOfAccountsCode(), line.getAccountNumber());
        }

        return chartAccountMap;
    }
}