Module: DoubleEntry::Reporting

Extended by:
Reporting
Includes:
Configurable
Included in:
Reporting
Defined in:
lib/double_entry/reporting.rb,
lib/double_entry/reporting/version.rb,
lib/double_entry/reporting/aggregate.rb,
lib/double_entry/reporting/day_range.rb,
lib/double_entry/reporting/hour_range.rb,
lib/double_entry/reporting/time_range.rb,
lib/double_entry/reporting/week_range.rb,
lib/double_entry/reporting/year_range.rb,
lib/double_entry/reporting/month_range.rb,
lib/double_entry/reporting/line_aggregate.rb,
lib/double_entry/reporting/aggregate_array.rb,
lib/double_entry/reporting/time_range_array.rb,
lib/double_entry/reporting/line_metadata_filter.rb,
lib/double_entry/reporting/line_aggregate_filter.rb,
lib/generators/double_entry/reporting/install/install_generator.rb

Defined Under Namespace

Modules: Generators Classes: Aggregate, AggregateArray, AggregateFunctionNotSupported, Configuration, DayRange, HourRange, LineAggregate, LineAggregateFilter, LineMetadataFilter, MonthRange, TimeRange, TimeRangeArray, WeekRange, YearRange

Constant Summary collapse

VERSION =
'0.1.0'.freeze

Instance Method Summary collapse

Instance Method Details

#aggregate(function:, account:, code:, range:, partner_account: nil, filter: nil) ⇒ Money, Integer

Perform an aggregate calculation on a set of transfers for an account.

The transfers included in the calculation can be limited by time range and provided custom filters.

Examples:

Find the sum for all $10 :save transfers in all :checking accounts in the current month, made by Australian users (assume the date is January 30, 2014).

time_range = DoubleEntry::Reporting::TimeRange.make(2014, 1)

DoubleEntry::Line.class_eval do
  scope :specific_transfer_amount, ->(amount) { where(:amount => amount.fractional) }
end

DoubleEntry::Reporting.aggregate(
  :sum,
  :checking,
  :save,
  time_range,
  :filter => [
    :scope    => {
      :name      => :specific_transfer_amount,
      :arguments => [Money.new(10_00)]
    },
    :metadata => {
      :user_location => 'AU'
    },
  ]
)

Parameters:

  • function (Symbol)

    The function to perform on the set of transfers. Valid functions are :sum, :count, and :average

  • account (Symbol)

    The symbol identifying the account to perform the aggregate calculation on. As specified in the account configuration.

  • code (Symbol)

    The application specific code for the type of transfer to perform an aggregate calculation on. As specified in the transfer configuration.

  • range (DoubleEntry::Reporting::TimeRange)

    Only include transfers in the given time range in the calculation.

  • partner_account (Symbol) (defaults to: nil)

    The symbol identifying the partner account to perform the aggregate calculatoin on. As specified in the account configuration.

  • filter (Array<Hash<Symbol,Hash<Symbol,Object>>>) (defaults to: nil)

    An array of custom filter to apply before performing the aggregate calculation. Filters can be either scope filters, where the name must be specified, or they can be metadata filters, where the key/value pair to match on must be specified. Scope filters must be monkey patched as scopes into the DoubleEntry::Line class, as the example above shows. Scope filters may also take a list of arguments to pass into the monkey patched scope, and, if provided, must be contained within an array.

Returns:

  • (Money, Integer)

    Returns a Money object for :sum and :average calculations, or a Integer for :count calculations.

Raises:



85
86
87
88
# File 'lib/double_entry/reporting.rb', line 85

def aggregate(function:, account:, code:, range:, partner_account: nil, filter: nil)
  Aggregate.formatted_amount(function: function, account: , code: code, range: range,
                             partner_account: , filter: filter)
end

#aggregate_array(function:, account:, code:, partner_account: nil, filter: nil, range_type: nil, start: nil, finish: nil) ⇒ Array<Money, Integer>

Perform an aggregate calculation on a set of transfers for an account and return the results in an array partitioned by a time range type.

The transfers included in the calculation can be limited by a time range and provided custom filters.

Examples:

Find the number of all $10 :save transfers in all :checking accounts per month for the entire year (Assume the year is 2014).

DoubleEntry::Reporting.aggregate_array(
  :sum,
  :checking,
  :save,
  :range_type => 'month',
  :start      => '2014-01-01',
  :finish     => '2014-12-31',
)

Parameters:

  • function (Symbol)

    The function to perform on the set of transfers. Valid functions are :sum, :count, and :average

  • account (Symbol)

    The symbol identifying the account to perform the aggregate calculation on. As specified in the account configuration.

  • code (Symbol)

    The application specific code for the type of transfer to perform an aggregate calculation on. As specified in the transfer configuration.

  • partner_account (Symbol) (defaults to: nil)

    The symbol identifying the partner account to perform the aggregative calculation on. As specified in the account configuration.

  • filter (Array<Symbol>, Array<Hash<Symbol, Object>>) (defaults to: nil)

    A custom filter to apply before performing the aggregate calculation. Currently, filters must be monkey patched as scopes into the DoubleEntry::Line class in order to be used as filters, as the example shows. If the filter requires a parameter, it must be given in a Hash, otherwise pass an array with the symbol names for the defined scopes.

  • range_type (String) (defaults to: nil)

    The type of time range to return data for. For example, specifying ‘month’ will return an array of the resulting aggregate calculation for each month. Valid range_types are ‘hour’, ‘day’, ‘week’, ‘month’, and ‘year’

  • start (String) (defaults to: nil)

    The start date for the time range to perform calculations in. The default start date is the start_of_business (can be specified in configuration). The format of the string must be as follows: ‘YYYY-mm-dd’

  • finish (String) (defaults to: nil)

    The finish (or end) date for the time range to perform calculations in. The default finish date is the current date. The format of the string must be as follows: ‘YYYY-mm-dd’

Returns:

  • (Array<Money, Integer>)

    Returns an array of Money objects for :sum and :average calculations, or an array of Integer for :count calculations. The array is indexed by the range_type. For example, if range_type is specified as ‘month’, each index in the array will represent a month.

Raises:



139
140
141
142
143
# File 'lib/double_entry/reporting.rb', line 139

def aggregate_array(function:, account:, code:, partner_account: nil, filter: nil,
                    range_type: nil, start: nil, finish: nil)
  AggregateArray.new(function: function, account: , code: code, partner_account: ,
                     filter: filter, range_type: range_type, start: start, finish: finish)
end