public List calculateGexpAndTypeTotal(
      List<BudgetConstructionLevelSummary> bclsList,
      List<BudgetConstructionLevelSummary> simpleList) {

    KualiInteger grossFinancialBeginningBalanceLineAmount = KualiInteger.ZERO;
    KualiInteger grossAccountLineAnnualBalanceAmount = KualiInteger.ZERO;

    BigDecimal typePositionCsfLeaveFteQuantity = BigDecimal.ZERO;
    BigDecimal typePositionCsfFullTimeEmploymentQuantity = BigDecimal.ZERO;
    KualiInteger typeFinancialBeginningBalanceLineAmount = KualiInteger.ZERO;
    BigDecimal typeAppointmentRequestedCsfFteQuantity = BigDecimal.ZERO;
    BigDecimal typeAppointmentRequestedFteQuantity = BigDecimal.ZERO;
    KualiInteger typeAccountLineAnnualBalanceAmount = KualiInteger.ZERO;
    KualiInteger typeAmountChange = KualiInteger.ZERO;
    BigDecimal typePercentChange = BigDecimal.ZERO;

    List returnList = new ArrayList();
    for (BudgetConstructionLevelSummary simpleBclsEntry : simpleList) {
      BudgetConstructionOrgLevelSummaryReportTotal bcLevelTotal =
          new BudgetConstructionOrgLevelSummaryReportTotal();
      for (BudgetConstructionLevelSummary bclsListEntry : bclsList) {
        if (BudgetConstructionReportHelper.isSameEntry(
            simpleBclsEntry, bclsListEntry, fieldsForGexpAndType())) {

          typeFinancialBeginningBalanceLineAmount =
              typeFinancialBeginningBalanceLineAmount.add(
                  bclsListEntry.getFinancialBeginningBalanceLineAmount());
          typeAccountLineAnnualBalanceAmount =
              typeAccountLineAnnualBalanceAmount.add(
                  bclsListEntry.getAccountLineAnnualBalanceAmount());
          typePositionCsfLeaveFteQuantity =
              typePositionCsfLeaveFteQuantity.add(bclsListEntry.getPositionCsfLeaveFteQuantity());
          typePositionCsfFullTimeEmploymentQuantity =
              typePositionCsfFullTimeEmploymentQuantity.add(
                  bclsListEntry.getCsfFullTimeEmploymentQuantity());
          typeAppointmentRequestedCsfFteQuantity =
              typeAppointmentRequestedCsfFteQuantity.add(
                  bclsListEntry.getAppointmentRequestedCsfFteQuantity());
          typeAppointmentRequestedFteQuantity =
              typeAppointmentRequestedFteQuantity.add(
                  bclsListEntry.getAppointmentRequestedFteQuantity());

          if (bclsListEntry.getIncomeExpenseCode().equals("B")
              && !bclsListEntry.getFinancialObjectLevelCode().equals("CORI")
              && !bclsListEntry.getFinancialObjectLevelCode().equals("TRIN")) {
            grossFinancialBeginningBalanceLineAmount =
                grossFinancialBeginningBalanceLineAmount.add(
                    bclsListEntry.getFinancialBeginningBalanceLineAmount());
            grossAccountLineAnnualBalanceAmount =
                grossAccountLineAnnualBalanceAmount.add(
                    bclsListEntry.getAccountLineAnnualBalanceAmount());
          }
        }
      }
      bcLevelTotal.setBcls(simpleBclsEntry);

      bcLevelTotal.setGrossFinancialBeginningBalanceLineAmount(
          grossFinancialBeginningBalanceLineAmount);
      bcLevelTotal.setGrossAccountLineAnnualBalanceAmount(grossAccountLineAnnualBalanceAmount);

      bcLevelTotal.setTypePositionCsfLeaveFteQuantity(typePositionCsfLeaveFteQuantity);
      bcLevelTotal.setTypePositionCsfFullTimeEmploymentQuantity(
          typePositionCsfFullTimeEmploymentQuantity);
      bcLevelTotal.setTypeFinancialBeginningBalanceLineAmount(
          typeFinancialBeginningBalanceLineAmount);
      bcLevelTotal.setTypeAppointmentRequestedCsfFteQuantity(
          typeAppointmentRequestedCsfFteQuantity);
      bcLevelTotal.setTypeAppointmentRequestedFteQuantity(typeAppointmentRequestedFteQuantity);
      bcLevelTotal.setTypeAccountLineAnnualBalanceAmount(typeAccountLineAnnualBalanceAmount);

      returnList.add(bcLevelTotal);
      grossFinancialBeginningBalanceLineAmount = KualiInteger.ZERO;
      grossAccountLineAnnualBalanceAmount = KualiInteger.ZERO;

      typePositionCsfLeaveFteQuantity = BigDecimal.ZERO;
      typePositionCsfFullTimeEmploymentQuantity = BigDecimal.ZERO;
      typeFinancialBeginningBalanceLineAmount = KualiInteger.ZERO;
      typeAppointmentRequestedCsfFteQuantity = BigDecimal.ZERO;
      typeAppointmentRequestedFteQuantity = BigDecimal.ZERO;
      typeAccountLineAnnualBalanceAmount = KualiInteger.ZERO;
      typeAmountChange = KualiInteger.ZERO;
      typePercentChange = BigDecimal.ZERO;
    }
    return returnList;
  }
  /**
   * builds report Header
   *
   * @param BudgetConstructionLevelSummary bcas
   */
  public void buildReportsHeader(
      Integer universityFiscalYear,
      BudgetConstructionOrgLevelSummaryReport orgLevelSummaryReportEntry,
      BudgetConstructionLevelSummary levelSummary) {
    String orgChartDesc =
        levelSummary.getOrganizationChartOfAccounts().getFinChartOfAccountDescription();
    String chartDesc = levelSummary.getChartOfAccounts().getFinChartOfAccountDescription();
    String orgName = levelSummary.getOrganization().getOrganizationName();
    String reportChartDesc =
        levelSummary
            .getChartOfAccounts()
            .getReportsToChartOfAccounts()
            .getFinChartOfAccountDescription();
    String subFundGroupName = levelSummary.getSubFundGroup().getSubFundGroupCode();
    String subFundGroupDes = levelSummary.getSubFundGroup().getSubFundGroupDescription();
    String fundGroupName = levelSummary.getSubFundGroup().getFundGroupCode();
    String fundGroupDes = levelSummary.getSubFundGroup().getFundGroup().getName();

    Integer prevFiscalyear = universityFiscalYear - 1;
    orgLevelSummaryReportEntry.setFiscalYear(
        prevFiscalyear.toString() + "-" + universityFiscalYear.toString().substring(2, 4));
    orgLevelSummaryReportEntry.setOrgChartOfAccountsCode(
        levelSummary.getOrganizationChartOfAccountsCode());

    if (orgChartDesc == null) {
      orgLevelSummaryReportEntry.setOrgChartOfAccountDescription(
          kualiConfigurationService.getPropertyValueAsString(
              BCKeyConstants.ERROR_REPORT_GETTING_CHART_DESCRIPTION));
    } else {
      orgLevelSummaryReportEntry.setOrgChartOfAccountDescription(orgChartDesc);
    }

    orgLevelSummaryReportEntry.setOrganizationCode(levelSummary.getOrganizationCode());
    if (orgName == null) {
      orgLevelSummaryReportEntry.setOrganizationName(
          kualiConfigurationService.getPropertyValueAsString(
              BCKeyConstants.ERROR_REPORT_GETTING_ORGANIZATION_NAME));
    } else {
      orgLevelSummaryReportEntry.setOrganizationName(orgName);
    }

    orgLevelSummaryReportEntry.setChartOfAccountsCode(levelSummary.getChartOfAccountsCode());
    if (chartDesc == null) {
      orgLevelSummaryReportEntry.setChartOfAccountDescription(
          kualiConfigurationService.getPropertyValueAsString(
              BCKeyConstants.ERROR_REPORT_GETTING_CHART_DESCRIPTION));
    } else {
      orgLevelSummaryReportEntry.setChartOfAccountDescription(chartDesc);
    }

    orgLevelSummaryReportEntry.setFundGroupCode(levelSummary.getSubFundGroup().getFundGroupCode());
    if (fundGroupDes == null) {
      orgLevelSummaryReportEntry.setFundGroupName(
          kualiConfigurationService.getPropertyValueAsString(
              BCKeyConstants.ERROR_REPORT_GETTING_FUNDGROUP_NAME));
    } else {
      orgLevelSummaryReportEntry.setFundGroupName(fundGroupDes);
    }

    orgLevelSummaryReportEntry.setSubFundGroupCode(levelSummary.getSubFundGroupCode());
    if (subFundGroupDes == null) {
      orgLevelSummaryReportEntry.setSubFundGroupDescription(
          kualiConfigurationService.getPropertyValueAsString(
              BCKeyConstants.ERROR_REPORT_GETTING_SUBFUNDGROUP_DESCRIPTION));
    } else {
      orgLevelSummaryReportEntry.setSubFundGroupDescription(subFundGroupDes);
    }

    Integer prevPrevFiscalyear = prevFiscalyear - 1;
    orgLevelSummaryReportEntry.setBaseFy(
        prevPrevFiscalyear.toString() + "-" + prevFiscalyear.toString().substring(2, 4));
    orgLevelSummaryReportEntry.setReqFy(
        prevFiscalyear.toString() + "-" + universityFiscalYear.toString().substring(2, 4));
    orgLevelSummaryReportEntry.setHeader1("Object Level Name");
    orgLevelSummaryReportEntry.setHeader2a("Lv. FTE");
    orgLevelSummaryReportEntry.setHeader2("FTE");
    orgLevelSummaryReportEntry.setHeader3("Amount");
    orgLevelSummaryReportEntry.setHeader31("FTE");
    orgLevelSummaryReportEntry.setHeader40("FTE");
    orgLevelSummaryReportEntry.setHeader4("Amount");
    orgLevelSummaryReportEntry.setHeader5(
        kualiConfigurationService.getPropertyValueAsString(
            BCKeyConstants.MSG_REPORT_HEADER_CHANGE));
    orgLevelSummaryReportEntry.setHeader6(
        kualiConfigurationService.getPropertyValueAsString(
            BCKeyConstants.MSG_REPORT_HEADER_CHANGE));
    orgLevelSummaryReportEntry.setConsHdr("");

    // For page break for objectLevelCode
    orgLevelSummaryReportEntry.setFinancialObjectLevelCode(
        levelSummary.getFinancialObjectLevelCode());
    orgLevelSummaryReportEntry.setIncomeExpenseCode(levelSummary.getIncomeExpenseCode());
    orgLevelSummaryReportEntry.setFinancialConsolidationSortCode(
        levelSummary.getFinancialConsolidationSortCode());
  }