/**
   * builds report body
   *
   * @param BudgetConstructionLevelSummary bcas
   */
  public void buildReportsBody(
      BudgetConstructionOrgLevelSummaryReport orgLevelSummaryReportEntry,
      BudgetConstructionLevelSummary levelSummary) {

    if (levelSummary.getFinancialObjectLevel() == null) {
      orgLevelSummaryReportEntry.setFinancialObjectLevelName(
          kualiConfigurationService.getPropertyValueAsString(
              BCKeyConstants.ERROR_REPORT_GETTING_OBJECT_LEVEL_NAME));
    } else {
      orgLevelSummaryReportEntry.setFinancialObjectLevelName(
          levelSummary.getFinancialObjectLevel().getFinancialObjectLevelName());
    }

    orgLevelSummaryReportEntry.setPositionCsfLeaveFteQuantity(
        BudgetConstructionReportHelper.setDecimalDigit(
            levelSummary.getPositionCsfLeaveFteQuantity(), 2, true));
    orgLevelSummaryReportEntry.setCsfFullTimeEmploymentQuantity(
        BudgetConstructionReportHelper.setDecimalDigit(
            levelSummary.getCsfFullTimeEmploymentQuantity(), 2, true));
    orgLevelSummaryReportEntry.setAppointmentRequestedCsfFteQuantity(
        BudgetConstructionReportHelper.setDecimalDigit(
            levelSummary.getAppointmentRequestedCsfFteQuantity(), 2, true));
    orgLevelSummaryReportEntry.setAppointmentRequestedFteQuantity(
        BudgetConstructionReportHelper.setDecimalDigit(
            levelSummary.getAppointmentRequestedFteQuantity(), 2, true));

    if (levelSummary.getAccountLineAnnualBalanceAmount() != null) {
      orgLevelSummaryReportEntry.setAccountLineAnnualBalanceAmount(
          levelSummary.getAccountLineAnnualBalanceAmount());
    }

    if (levelSummary.getFinancialBeginningBalanceLineAmount() != null) {
      orgLevelSummaryReportEntry.setFinancialBeginningBalanceLineAmount(
          levelSummary.getFinancialBeginningBalanceLineAmount());
    }

    if (levelSummary.getAccountLineAnnualBalanceAmount() != null
        && levelSummary.getFinancialBeginningBalanceLineAmount() != null) {
      orgLevelSummaryReportEntry.setAmountChange(
          levelSummary
              .getAccountLineAnnualBalanceAmount()
              .subtract(levelSummary.getFinancialBeginningBalanceLineAmount()));
    }

    orgLevelSummaryReportEntry.setPercentChange(
        BudgetConstructionReportHelper.calculatePercent(
            orgLevelSummaryReportEntry.getAmountChange(),
            orgLevelSummaryReportEntry.getFinancialBeginningBalanceLineAmount()));
  }
  /**
   * builds report total
   *
   * @param BudgetConstructionLevelSummary bcas
   * @param List reportTotalList
   */
  public void buildReportsTotal(
      BudgetConstructionOrgLevelSummaryReport orgLevelSummaryReportEntry,
      BudgetConstructionLevelSummary levelSummary,
      List<BudgetConstructionOrgLevelSummaryReportTotal> levelSummaryTotalConsList,
      List<BudgetConstructionOrgLevelSummaryReportTotal> levelSummaryTotalGexpAndTypeList,
      List<BudgetConstructionOrgLevelSummaryReportTotal> levelSummaryTotalList) {

    for (BudgetConstructionOrgLevelSummaryReportTotal consTotal : levelSummaryTotalConsList) {
      if (BudgetConstructionReportHelper.isSameEntry(
          levelSummary, consTotal.getBcls(), fieldsForCons())) {
        orgLevelSummaryReportEntry.setTotalConsolidationDescription(
            levelSummary.getFinancialConsolidationObject().getFinConsolidationObjectName());

        // The total part shouldn't have null value, so just checking '0'
        orgLevelSummaryReportEntry.setTotalConsolidationPositionCsfLeaveFteQuantity(
            BudgetConstructionReportHelper.setDecimalDigit(
                consTotal.getTotalConsolidationPositionCsfLeaveFteQuantity(), 2, true));
        orgLevelSummaryReportEntry.setTotalConsolidationPositionCsfFullTimeEmploymentQuantity(
            BudgetConstructionReportHelper.setDecimalDigit(
                consTotal.getTotalConsolidationPositionCsfFullTimeEmploymentQuantity(), 2, true));
        orgLevelSummaryReportEntry.setTotalConsolidationFinancialBeginningBalanceLineAmount(
            consTotal.getTotalConsolidationFinancialBeginningBalanceLineAmount());
        orgLevelSummaryReportEntry.setTotalConsolidationAppointmentRequestedCsfFteQuantity(
            BudgetConstructionReportHelper.setDecimalDigit(
                consTotal.getTotalConsolidationAppointmentRequestedCsfFteQuantity(), 2, true));
        orgLevelSummaryReportEntry.setTotalConsolidationAppointmentRequestedFteQuantity(
            BudgetConstructionReportHelper.setDecimalDigit(
                consTotal.getTotalConsolidationAppointmentRequestedFteQuantity(), 2, true));
        orgLevelSummaryReportEntry.setTotalConsolidationAccountLineAnnualBalanceAmount(
            consTotal.getTotalConsolidationAccountLineAnnualBalanceAmount());

        KualiInteger amountChange =
            consTotal
                .getTotalConsolidationAccountLineAnnualBalanceAmount()
                .subtract(consTotal.getTotalConsolidationFinancialBeginningBalanceLineAmount());
        orgLevelSummaryReportEntry.setTotalConsolidationAmountChange(amountChange);
        orgLevelSummaryReportEntry.setTotalConsolidationPercentChange(
            BudgetConstructionReportHelper.calculatePercent(
                amountChange,
                consTotal.getTotalConsolidationFinancialBeginningBalanceLineAmount()));
      }
    }

    for (BudgetConstructionOrgLevelSummaryReportTotal gexpAndTypeTotal :
        levelSummaryTotalGexpAndTypeList) {
      if (BudgetConstructionReportHelper.isSameEntry(
          levelSummary, gexpAndTypeTotal.getBcls(), fieldsForGexpAndType())) {

        orgLevelSummaryReportEntry.setGrossFinancialBeginningBalanceLineAmount(
            gexpAndTypeTotal.getGrossFinancialBeginningBalanceLineAmount());
        orgLevelSummaryReportEntry.setGrossAccountLineAnnualBalanceAmount(
            gexpAndTypeTotal.getGrossAccountLineAnnualBalanceAmount());
        KualiInteger gexpAndTypeAmountChange =
            gexpAndTypeTotal
                .getGrossAccountLineAnnualBalanceAmount()
                .subtract(gexpAndTypeTotal.getGrossFinancialBeginningBalanceLineAmount());
        orgLevelSummaryReportEntry.setGrossAmountChange(gexpAndTypeAmountChange);
        orgLevelSummaryReportEntry.setGrossPercentChange(
            BudgetConstructionReportHelper.calculatePercent(
                gexpAndTypeAmountChange,
                gexpAndTypeTotal.getGrossFinancialBeginningBalanceLineAmount()));

        if (levelSummary.getIncomeExpenseCode().equals(BCConstants.Report.INCOME_EXP_TYPE_A)) {
          orgLevelSummaryReportEntry.setTypeDesc(
              kualiConfigurationService.getPropertyValueAsString(
                  BCKeyConstants.MSG_REPORT_INCOME_EXP_DESC_UPPERCASE_REVENUE));
        } else {
          orgLevelSummaryReportEntry.setTypeDesc(
              kualiConfigurationService.getPropertyValueAsString(
                  BCKeyConstants.MSG_REPORT_INCOME_EXP_DESC_EXPENDITURE_NET_TRNFR));
        }
        orgLevelSummaryReportEntry.setTypePositionCsfLeaveFteQuantity(
            BudgetConstructionReportHelper.setDecimalDigit(
                gexpAndTypeTotal.getTypePositionCsfLeaveFteQuantity(), 2, true));
        orgLevelSummaryReportEntry.setTypePositionCsfFullTimeEmploymentQuantity(
            BudgetConstructionReportHelper.setDecimalDigit(
                gexpAndTypeTotal.getTypePositionCsfFullTimeEmploymentQuantity(), 2, true));
        orgLevelSummaryReportEntry.setTypeFinancialBeginningBalanceLineAmount(
            gexpAndTypeTotal.getTypeFinancialBeginningBalanceLineAmount());
        orgLevelSummaryReportEntry.setTypeAppointmentRequestedCsfFteQuantity(
            BudgetConstructionReportHelper.setDecimalDigit(
                gexpAndTypeTotal.getTypeAppointmentRequestedCsfFteQuantity(), 2, true));
        orgLevelSummaryReportEntry.setTypeAppointmentRequestedFteQuantity(
            BudgetConstructionReportHelper.setDecimalDigit(
                gexpAndTypeTotal.getTypeAppointmentRequestedFteQuantity(), 2, true));

        orgLevelSummaryReportEntry.setTypeAccountLineAnnualBalanceAmount(
            gexpAndTypeTotal.getTypeAccountLineAnnualBalanceAmount());
        KualiInteger typeAmountChange =
            gexpAndTypeTotal
                .getTypeAccountLineAnnualBalanceAmount()
                .subtract(gexpAndTypeTotal.getTypeFinancialBeginningBalanceLineAmount());
        orgLevelSummaryReportEntry.setTypeAmountChange(typeAmountChange);
        orgLevelSummaryReportEntry.setTypePercentChange(
            BudgetConstructionReportHelper.calculatePercent(
                typeAmountChange, gexpAndTypeTotal.getTypeFinancialBeginningBalanceLineAmount()));
      }
    }

    for (BudgetConstructionOrgLevelSummaryReportTotal total : levelSummaryTotalList) {
      if (BudgetConstructionReportHelper.isSameEntry(
          levelSummary, total.getBcls(), fieldsForTotal())) {

        orgLevelSummaryReportEntry.setTotalSubFundGroupDesc(
            levelSummary.getSubFundGroup().getSubFundGroupDescription());
        orgLevelSummaryReportEntry.setRevenueFinancialBeginningBalanceLineAmount(
            total.getRevenueFinancialBeginningBalanceLineAmount());
        orgLevelSummaryReportEntry.setRevenueAccountLineAnnualBalanceAmount(
            total.getRevenueAccountLineAnnualBalanceAmount());
        orgLevelSummaryReportEntry.setExpenditureFinancialBeginningBalanceLineAmount(
            total.getExpenditureFinancialBeginningBalanceLineAmount());
        orgLevelSummaryReportEntry.setExpenditureAccountLineAnnualBalanceAmount(
            total.getExpenditureAccountLineAnnualBalanceAmount());

        KualiInteger revenueAmountChange =
            total
                .getRevenueAccountLineAnnualBalanceAmount()
                .subtract(total.getRevenueFinancialBeginningBalanceLineAmount());
        orgLevelSummaryReportEntry.setRevenueAmountChange(revenueAmountChange);
        orgLevelSummaryReportEntry.setRevenuePercentChange(
            BudgetConstructionReportHelper.calculatePercent(
                revenueAmountChange, total.getRevenueFinancialBeginningBalanceLineAmount()));

        KualiInteger expenditureAmountChange =
            total
                .getExpenditureAccountLineAnnualBalanceAmount()
                .subtract(total.getExpenditureFinancialBeginningBalanceLineAmount());
        orgLevelSummaryReportEntry.setExpenditureAmountChange(expenditureAmountChange);
        orgLevelSummaryReportEntry.setExpenditurePercentChange(
            BudgetConstructionReportHelper.calculatePercent(
                expenditureAmountChange,
                total.getExpenditureFinancialBeginningBalanceLineAmount()));

        orgLevelSummaryReportEntry.setDifferenceFinancialBeginningBalanceLineAmount(
            total.getDifferenceFinancialBeginningBalanceLineAmount());
        orgLevelSummaryReportEntry.setDifferenceAccountLineAnnualBalanceAmount(
            total.getDifferenceAccountLineAnnualBalanceAmount());

        KualiInteger differenceAmountChange =
            total
                .getDifferenceAccountLineAnnualBalanceAmount()
                .subtract(total.getDifferenceFinancialBeginningBalanceLineAmount());
        orgLevelSummaryReportEntry.setDifferenceAmountChange(differenceAmountChange);
        orgLevelSummaryReportEntry.setDifferencePercentChange(
            BudgetConstructionReportHelper.calculatePercent(
                differenceAmountChange, total.getDifferenceFinancialBeginningBalanceLineAmount()));
      }
    }
  }
  /**
   * 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());
  }