Sha256: 39ac411304ddf6ef24f171ed0d1441571ce772a2c811ad40dc5e80d451f4a804

Contents?: true

Size: 1.79 KB

Versions: 1

Compression:

Stored size: 1.79 KB

Contents

# frozen_string_literal: true

module Generalis
  module Accountable
    extend ActiveSupport::Concern

    included do
      has_many :ledger_accounts, as: :owner, class_name: 'Generalis::Account', dependent: false, inverse_of: :owner
      has_many :ledger_entries, through: :ledger_accounts, source: :entries
      has_many :ledger_transactions, through: :ledger_accounts
    end

    class_methods do
      # rubocop:disable Naming/PredicateName
      def has_asset_account(name, auto_create: true, dependent: :restrict_with_error)
        has_account(name, class_name: 'Generalis::Asset', auto_create: auto_create, dependent: dependent)
      end

      def has_expense_account(name, auto_create: true, dependent: :restrict_with_error)
        has_account(name, class_name: 'Generalis::Expense', auto_create: auto_create, dependent: dependent)
      end

      def has_liability_account(name, auto_create: true, dependent: :restrict_with_error)
        has_account(name, class_name: 'Generalis::Liability', auto_create: auto_create, dependent: dependent)
      end

      def has_revenue_account(name, auto_create: true, dependent: :restrict_with_error)
        has_account(name, class_name: 'Generalis::Revenue', auto_create: auto_create, dependent: dependent)
      end

      def has_account(name, class_name:, auto_create: true, dependent: :restrict_with_error)
        has_one(name, -> { where(name: name) },
                as: :owner, class_name: class_name, # rubocop:disable Rails/ReflectionClassName
                dependent: dependent, inverse_of: :owner)

        after_create(:"create_#{name}", if: -> { send(name).nil? }) if auto_create

        scope :"without_#{name}", -> { left_joins(name.to_sym).merge(Generalis::Account.where(id: nil)) }
      end
      # rubocop:enable Naming/PredicateName
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
generalis-0.1.0 lib/generalis/accountable.rb