/**
   * 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 BudgetConstructionAccountSummary bcas
   * @param List reportTotalList
   */
  protected void buildReportsTotal(
      BudgetConstructionOrgAccountSummaryReport orgAccountSummaryReportEntry,
      BudgetConstructionAccountSummary accountSummary,
      List reportTotalList) {
    Iterator totalListIter = reportTotalList.iterator();
    while (totalListIter.hasNext()) {
      BudgetConstructionOrgAccountSummaryReportTotal bcasTotalEntry =
          (BudgetConstructionOrgAccountSummaryReportTotal) totalListIter.next();
      if (BudgetConstructionReportHelper.isSameEntry(
          accountSummary, bcasTotalEntry.getBcas(), fieldsForTotal())) {
        BigDecimal percentChange = BigDecimal.ZERO;
        orgAccountSummaryReportEntry.setTotalRevenueBaseAmount(
            bcasTotalEntry.getTotalRevenueBaseAmount());
        orgAccountSummaryReportEntry.setTotalGrossBaseAmount(
            bcasTotalEntry.getTotalGrossBaseAmount());
        orgAccountSummaryReportEntry.setTotalTransferInBaseAmount(
            bcasTotalEntry.getTotalTransferInBaseAmount());
        orgAccountSummaryReportEntry.setTotalNetTransferBaseAmount(
            bcasTotalEntry.getTotalNetTransferBaseAmount());

        orgAccountSummaryReportEntry.setTotalRevenueReqAmount(
            bcasTotalEntry.getTotalRevenueReqAmount());
        orgAccountSummaryReportEntry.setTotalGrossReqAmount(
            bcasTotalEntry.getTotalGrossReqAmount());
        orgAccountSummaryReportEntry.setTotalTransferInReqAmount(
            bcasTotalEntry.getTotalTransferInReqAmount());
        orgAccountSummaryReportEntry.setTotalNetTransferReqAmount(
            bcasTotalEntry.getTotalNetTransferReqAmount());

        orgAccountSummaryReportEntry.setTotalRevenueAmountChange(
            orgAccountSummaryReportEntry.getTotalRevenueReqAmount()
                - orgAccountSummaryReportEntry.getTotalRevenueBaseAmount());
        percentChange =
            BudgetConstructionReportHelper.calculatePercent(
                orgAccountSummaryReportEntry.getTotalRevenueAmountChange(),
                orgAccountSummaryReportEntry.getTotalRevenueBaseAmount());
        orgAccountSummaryReportEntry.setTotalRevenuePercentChange(percentChange);

        orgAccountSummaryReportEntry.setTotalGrossAmountChange(
            orgAccountSummaryReportEntry.getTotalGrossReqAmount()
                - orgAccountSummaryReportEntry.getTotalGrossBaseAmount());
        percentChange =
            BudgetConstructionReportHelper.calculatePercent(
                orgAccountSummaryReportEntry.getTotalGrossAmountChange(),
                orgAccountSummaryReportEntry.getTotalGrossBaseAmount());
        orgAccountSummaryReportEntry.setTotalGrossPercentChange(percentChange);

        orgAccountSummaryReportEntry.setTotalTransferAmountChange(
            orgAccountSummaryReportEntry.getTotalTransferInReqAmount()
                - orgAccountSummaryReportEntry.getTotalTransferInBaseAmount());
        percentChange =
            BudgetConstructionReportHelper.calculatePercent(
                orgAccountSummaryReportEntry.getTotalTransferAmountChange(),
                orgAccountSummaryReportEntry.getTotalTransferInBaseAmount());
        orgAccountSummaryReportEntry.setTotalTransferInPercentChange(percentChange);

        orgAccountSummaryReportEntry.setTotalNetTransferAmountChange(
            orgAccountSummaryReportEntry.getTotalNetTransferReqAmount()
                - orgAccountSummaryReportEntry.getTotalNetTransferBaseAmount());
        percentChange =
            BudgetConstructionReportHelper.calculatePercent(
                orgAccountSummaryReportEntry.getTotalNetTransferAmountChange(),
                orgAccountSummaryReportEntry.getTotalNetTransferBaseAmount());
        orgAccountSummaryReportEntry.setTotalNetTransferPercentChange(percentChange);

        orgAccountSummaryReportEntry.setRevExpDifferenceBaseAmount(
            orgAccountSummaryReportEntry.getTotalRevenueBaseAmount()
                - orgAccountSummaryReportEntry.getTotalNetTransferBaseAmount());
        orgAccountSummaryReportEntry.setRevExpDifferenceReqAmount(
            orgAccountSummaryReportEntry.getTotalRevenueReqAmount()
                - orgAccountSummaryReportEntry.getTotalNetTransferReqAmount());
        orgAccountSummaryReportEntry.setRevExpDifferenceAmountChange(
            orgAccountSummaryReportEntry.getRevExpDifferenceReqAmount()
                - orgAccountSummaryReportEntry.getRevExpDifferenceBaseAmount());
        percentChange =
            BudgetConstructionReportHelper.calculatePercent(
                orgAccountSummaryReportEntry.getRevExpDifferenceAmountChange(),
                orgAccountSummaryReportEntry.getRevExpDifferenceBaseAmount());
        orgAccountSummaryReportEntry.setRevExpDifferencePercentChange(percentChange);
      }
    }
  }
  /**
   * builds report body
   *
   * @param BudgetConstructionAccountSummary bcas
   */
  protected void buildReportsBody(
      BudgetConstructionOrgAccountSummaryReport orgAccountSummaryReportEntry,
      BudgetConstructionAccountSummary accountSummary) {
    orgAccountSummaryReportEntry.setAccountNumber(accountSummary.getAccountNumber());
    orgAccountSummaryReportEntry.setSubAccountNumber(accountSummary.getSubAccountNumber());

    if (accountSummary.getSubAccountNumber().equals(BCConstants.Report.DASHES_SUB_ACCOUNT_CODE)) {
      if (accountSummary.getAccount().getAccountName() == null) {
        orgAccountSummaryReportEntry.setAccountNameAndSubAccountName(
            kualiConfigurationService.getPropertyString(
                BCKeyConstants.ERROR_REPORT_GETTING_ACCOUNT_DESCRIPTION));
      } else
        orgAccountSummaryReportEntry.setAccountNameAndSubAccountName(
            accountSummary.getAccount().getAccountName());
    } else {
      try {
        if (accountSummary.getSubAccount().getSubAccountName() == null) {
          orgAccountSummaryReportEntry.setAccountNameAndSubAccountName(
              kualiConfigurationService.getPropertyString(
                  BCKeyConstants.ERROR_REPORT_GETTING_SUB_ACCOUNT_DESCRIPTION));
        } else
          orgAccountSummaryReportEntry.setAccountNameAndSubAccountName(
              accountSummary.getSubAccount().getSubAccountName());
      } catch (PersistenceBrokerException e) {
        orgAccountSummaryReportEntry.setAccountNameAndSubAccountName(
            kualiConfigurationService.getPropertyString(
                BCKeyConstants.ERROR_REPORT_GETTING_SUB_ACCOUNT_DESCRIPTION));
      }
    }

    // build income expense description
    if (accountSummary.getIncomeExpenseCode().equals(BCConstants.Report.INCOME_EXP_TYPE_A)) {
      orgAccountSummaryReportEntry.setIncExpDesc(
          kualiConfigurationService.getPropertyString(
              BCKeyConstants.MSG_REPORT_INCOME_EXP_DESC_REVENUE));
    } else if (accountSummary.getIncomeExpenseCode().equals(BCConstants.Report.INCOME_EXP_TYPE_E)) {
      orgAccountSummaryReportEntry.setIncExpDesc(
          kualiConfigurationService.getPropertyString(
              BCKeyConstants.MSG_REPORT_INCOME_EXP_DESC_EXP_GROSS));
    } else if (accountSummary.getIncomeExpenseCode().equals(BCConstants.Report.INCOME_EXP_TYPE_T)) {
      trExist = true;
      orgAccountSummaryReportEntry.setIncExpDesc(
          kualiConfigurationService.getPropertyString(
              BCKeyConstants.MSG_REPORT_INCOME_EXP_DESC_TRNFR_IN));
    } else {
      if (trExist) {
        trExist = false;
        orgAccountSummaryReportEntry.setIncExpDesc(
            kualiConfigurationService.getPropertyString(
                BCKeyConstants.MSG_REPORT_INCOME_EXP_DESC_EXP_NET_TRNFR));
      } else {
        orgAccountSummaryReportEntry.setIncExpDesc(
            kualiConfigurationService.getPropertyString(
                BCKeyConstants.MSG_REPORT_INCOME_EXP_DESC_EXPENDITURE));
      }
    }

    Integer beginingBalanceLineAmt = 0;
    Integer accountLineAnnualBalAmt = 0;
    if (accountSummary.getFinancialBeginningBalanceLineAmount() != null) {
      beginingBalanceLineAmt =
          BudgetConstructionReportHelper.convertKualiInteger(
              accountSummary.getFinancialBeginningBalanceLineAmount());
    }

    if (accountSummary.getFinancialBeginningBalanceLineAmount() != null) {
      accountLineAnnualBalAmt =
          BudgetConstructionReportHelper.convertKualiInteger(
              accountSummary.getAccountLineAnnualBalanceAmount());
    }

    orgAccountSummaryReportEntry.setBaseAmount(beginingBalanceLineAmt);
    orgAccountSummaryReportEntry.setReqAmount(accountLineAnnualBalAmt);
    orgAccountSummaryReportEntry.setAmountChange(accountLineAnnualBalAmt - beginingBalanceLineAmt);

    orgAccountSummaryReportEntry.setPercentChange(
        BudgetConstructionReportHelper.calculatePercent(
            orgAccountSummaryReportEntry.getAmountChange(), beginingBalanceLineAmt));
  }
  /**
   * 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()));
      }
    }
  }