class Ynaby::Account

Attributes

balance[R]
budget[R]
cleared_balance[R]
closed[R]
id[R]
name[R]
note[R]
on_budget[R]
type[R]
uncleared_balance[R]

Public Class Methods

new(id:, name:, type:, on_budget:, closed:, note:, balance:, cleared_balance:, uncleared_balance:, budget:) click to toggle source
# File lib/ynaby/account.rb, line 5
def initialize(id:,
               name:,
               type:,
               on_budget:,
               closed:,
               note:,
               balance:,
               cleared_balance:,
               uncleared_balance:,
               budget:)

  @id = id
  @name = name
  @type = type
  @on_budget = on_budget
  @closed = closed
  @note = note
  @balance = balance
  @cleared_balance = cleared_balance
  @uncleared_balance = uncleared_balance
  @budget = budget
end
parse(object:, budget:) click to toggle source
# File lib/ynaby/account.rb, line 76
def self.parse(object:, budget:)
  new(
    id: object.id,
    name: object.name,
    type: object.type,
    on_budget: object.on_budget,
    closed: object.closed,
    note: object.note,
    balance: object.balance,
    cleared_balance: object.cleared_balance,
    uncleared_balance: object.uncleared_balance,
    budget: budget
  )
end

Public Instance Methods

api_token() click to toggle source
# File lib/ynaby/account.rb, line 91
def api_token
  budget.api_token
end
bulk_upload_transactions(transactions) click to toggle source
# File lib/ynaby/account.rb, line 42
def bulk_upload_transactions(transactions)
  if transactions.to_a.empty?
    return {
      new: 0,
      updated: 0
    }
  end

  body = {
    transactions: transactions.map(&:upload_hash)
  }

  response = ynab_client.transactions.bulk_create_transactions(budget.id, body)
  duplicate_transactions = response.data.bulk.duplicate_import_ids

  if duplicate_transactions.any?
    update_duplicate_transactions(
      new_transactions: transactions,
      duplicate_transactions_ids: response.data.bulk.duplicate_import_ids
    )
  end

  {
    new: response.data.bulk.transaction_ids.count,
    updated: duplicate_transactions.count
  }
end
transaction(transaction_id) click to toggle source
# File lib/ynaby/account.rb, line 70
def transaction(transaction_id)
  response = ynab_client.transactions.get_transaction_by_id(budget.id, transaction_id)

  Transaction.parse(object: response.data.transaction, account: self)
end
transactions(since: nil) click to toggle source
# File lib/ynaby/account.rb, line 28
def transactions(since: nil)
  response = ynab_client
    .transactions
    .get_transactions_by_account(
      budget.id,
      @id,
      since_date: since&.to_date&.iso8601
    )

  response.data.transactions.map do |transaction|
    Transaction.parse(object: transaction, account: self)
  end
end

Private Instance Methods

find_from_import_ids(import_ids) click to toggle source
# File lib/ynaby/account.rb, line 110
def find_from_import_ids(import_ids)
  earliest_import_date = import_ids.sort.first.split(":")[2]

  ynab_transactions = ynab_client.transactions.get_transactions(
    budget.id,
    since_date: earliest_import_date
  ).data.transactions

  parsed_transactions = ynab_transactions.map do |transaction_object|
    Transaction.parse(object: transaction_object, account: self)
  end

  parsed_transactions.select do |transaction|
    import_ids.include?(transaction.import_id)
  end
end
update_duplicate_transactions(new_transactions:, duplicate_transactions_ids:) click to toggle source
# File lib/ynaby/account.rb, line 97
def update_duplicate_transactions(new_transactions:, duplicate_transactions_ids:)
  old_transactions = find_from_import_ids(duplicate_transactions_ids)

  old_transactions.each do |old_transaction|
    new_transaction = new_transactions.find do |transaction|
      transaction.import_id == old_transaction.import_id
    end

    new_transaction.id = old_transaction.id
    new_transaction.update
  end
end