/**
   * This method creates an account to be used for automatic maintenance document
   *
   * @param AccountParametersDTO
   * @return Account
   */
  public Account createAccountObject(
      AccountParametersDTO parameters, AccountAutoCreateDefaults defaults) {

    Account account = new Account();

    // * Account: required but off campus indicator, closed, fringe benefit indicator, fringe
    // benefit COA, endowment
    account.setChartOfAccountsCode(defaults.getChartOfAccountsCode());
    account.setOrganizationCode(defaults.getOrganizationCode());
    account.setAccountNumber(parameters.getAccountNumber()); // what if account number is null?
    account.setAccountName(parameters.getAccountName());
    account.setAccountPhysicalCampusCode(defaults.getAccountPhysicalCampusCode());
    if (parameters.getExpirationDate() != null) {
      account.setAccountExpirationDate(new java.sql.Date(parameters.getExpirationDate().getTime()));
    }
    if (parameters.getEffectiveDate() != null) {
      account.setAccountEffectiveDate(new java.sql.Date(parameters.getEffectiveDate().getTime()));
    }
    boolean isKCOverrideKFS =
        parameterService.getParameterValueAsBoolean(
            Account.class,
            KcConstants.AccountCreationService.PARAMETER_KC_OVERRIDES_KFS_DEFAULT_ACCOUNT_IND);
    if (isKCOverrideKFS) {
      // set the right address based on the system parameter RESEARCH_ADMIN_ACCOUNT_ADDRESS_TYPE
      List<String> addressTypes =
          new ArrayList<String>(
              parameterService.getParameterValuesAsString(
                  Account.class,
                  KcConstants.AccountCreationService.PARAMETER_KC_ACCOUNT_ADDRESS_TYPE));
      for (String addressType : addressTypes) {
        if (addressType.equals(KcConstants.AccountCreationService.PI_ADDRESS_TYPE)
            && (!StringUtils.isBlank(parameters.getDefaultAddressStreetAddress()))) {
          account.setAccountStreetAddress(parameters.getDefaultAddressStreetAddress());
          account.setAccountCityName(parameters.getDefaultAddressCityName());
          account.setAccountStateCode(parameters.getDefaultAddressStateCode());
          account.setAccountZipCode(parameters.getDefaultAddressZipCode());
          break;
        } else if (addressType.equals(KcConstants.AccountCreationService.ADMIN_ADDRESS_TYPE)
            && (!StringUtils.isBlank(parameters.getAdminContactAddressStreetAddress()))) {
          account.setAccountStreetAddress(parameters.getAdminContactAddressStreetAddress());
          account.setAccountCityName(parameters.getAdminContactAddressCityName());
          account.setAccountStateCode(parameters.getAdminContactAddressStateCode());
          account.setAccountZipCode(parameters.getAdminContactAddressZipCode());
          break;
        }
      }

    } else {
      // use default address
      account.setAccountStreetAddress(defaults.getAccountStreetAddress());
      account.setAccountCityName(defaults.getAccountCityName());
      account.setAccountStateCode(defaults.getAccountStateCode());
      account.setAccountZipCode(defaults.getAccountZipCode());
    }

    // set the following from parameters
    account.setAccountOffCampusIndicator(parameters.isOffCampusIndicator());
    account.setFinancialHigherEdFunctionCd(parameters.getHigherEdFunctionCode());
    account.setAcctIndirectCostRcvyTypeCd(parameters.getIndirectCostTypeCode());
    account.setFinancialIcrSeriesIdentifier(parameters.getIndirectCostRate());
    account.setAccountGuideline(new AccountGuideline());
    account
        .getAccountGuideline()
        .setAccountExpenseGuidelineText(parameters.getExpenseGuidelineText());
    account
        .getAccountGuideline()
        .setAccountIncomeGuidelineText(parameters.getIncomeGuidelineText());
    account.getAccountGuideline().setAccountPurposeText(parameters.getPurposeText());

    account.setClosed(false);
    account.setAccountTypeCode(defaults.getAccountTypeCode());
    account.setSubFundGroupCode(defaults.getSubFundGroupCode());

    account.setAccountsFringesBnftIndicator(defaults.isAccountsFringesBnftIndicator());

    account.setReportsToAccountNumber(defaults.getReportsToAccountNumber());
    account.setReportsToChartOfAccountsCode(defaults.getReportsToChartOfAccountsCode());

    account.setAccountRestrictedStatusCode("R");
    account.setAccountRestrictedStatusDate(null);

    account.setEndowmentIncomeChartOfAccounts(null);
    account.setEndowmentIncomeAccountNumber(null);

    // * Accounts Responsibility: required - fiscal officer principal name, account supervisor
    // principal name, account manager
    // principal name, budget record level, account sufficient funds
    account.setAccountFiscalOfficerSystemIdentifier(
        defaults.getAccountFiscalOfficerSystemIdentifier());

    account.setAccountsSupervisorySystemsIdentifier(
        defaults.getAccountsSupervisorySystemsIdentifier());
    account.setAccountManagerSystemIdentifier(defaults.getAccountManagerSystemIdentifier());

    account.setContinuationFinChrtOfAcctCd(defaults.getContinuationFinChrtOfAcctCd());
    account.setContinuationAccountNumber(defaults.getContinuationAccountNumber());

    account.setIncomeStreamAccountNumber(defaults.getIncomeStreamAccountNumber());
    account.setIncomeStreamChartOfAccounts(defaults.getIncomeStreamChartOfAccounts());
    account.setIncomeStreamFinancialCoaCode(defaults.getIncomeStreamFinancialCoaCode());

    account.setBudgetRecordingLevelCode(defaults.getBudgetRecordingLevelCode());
    account.setAccountSufficientFundsCode(defaults.getAccountSufficientFundsCode());

    account.setPendingAcctSufficientFundsIndicator(
        defaults.isPendingAcctSufficientFundsIndicator());
    account.setExtrnlFinEncumSufficntFndIndicator(defaults.isExtrnlFinEncumSufficntFndIndicator());
    account.setIntrnlFinEncumSufficntFndIndicator(defaults.isIntrnlFinEncumSufficntFndIndicator());
    account.setFinPreencumSufficientFundIndicator(defaults.isFinPreencumSufficientFundIndicator());
    account.setFinancialObjectivePrsctrlIndicator(defaults.isFinancialObjectivePrsctrlIndicator());

    // * Contract and Grants: not required
    account.setContractControlFinCoaCode(null);
    account.setContractControlAccountNumber(null);
    account.setContractsAndGrantsAccountResponsibilityId(
        defaults.getContractsAndGrantsAccountResponsibilityId());
    account.setAccountCfdaNumber(parameters.getCfdaNumber());

    // set up ICR distribution
    for (IndirectCostRecoveryAutoDefAccount indirectCostRecoveryAutoDefAccount :
        defaults.getIndirectCostRecoveryAutoDefAccounts()) {
      account
          .getIndirectCostRecoveryAccounts()
          .add(
              createIndirectCostRecoveryAccount(
                  indirectCostRecoveryAutoDefAccount,
                  account.getChartOfAccountsCode(),
                  account.getAccountNumber()));
    }
    return account;
  }