ledgerrb/lib/ledger.rb

107 lines
2.9 KiB
Ruby
Raw Normal View History

# encoding: utf-8
2014-08-01 22:25:36 +02:00
require 'csv'
2014-07-14 16:18:41 +02:00
# Ruby wrapper module for calling ledger
module Ledger
module_function
@binary = 'ledger'
2014-07-31 17:14:08 +02:00
@file = ENV[ 'LEDGER_FILE' ]
def run( options, command = '', command_parameters = '' )
2014-07-14 16:18:22 +02:00
`#{@binary} -f #{@file} #{options} #{command} #{command_parameters}`
end
def version
run '--version'
end
def accounts( depth = 9999 )
run( '', 'accounts' )
.split( "\n" )
2014-07-14 16:18:41 +02:00
.map do |a|
a.split( ':' )
.each_slice( depth )
.to_a.first
end.uniq
end
2014-09-30 12:15:37 +02:00
def dates_salaries( category = 'salaire' )
CSV.parse( run( '', 'csv', category ) )
.map do
|row|
Date.parse row[ 0 ]
end
.uniq
end
2014-08-01 22:25:36 +02:00
def register( period = nil, categories = '' )
period = period.nil? ? '' : "-p '#{period}'"
2014-08-01 22:25:36 +02:00
CSV.parse( run( "--exchange '#{CURRENCY}' #{period}", 'csv', categories ) )
.map do
|row|
{ date: row[ 0 ],
payee: row[ 2 ],
account: row[ 3 ],
amount: row[ 5 ],
2014-08-01 22:32:40 +02:00
currency: row[ 4 ] }
2014-07-27 22:04:00 +02:00
end
end
2014-10-20 21:24:44 +02:00
def balance( cleared = false, depth = nil, period = nil, categories = '' )
period = period.nil? ? '' : "-p '#{period}'"
depth = depth.nil? ? '' : "--depth #{depth}"
operation = cleared ? 'cleared' : 'balance'
run( "--flat --no-total --exchange '#{CURRENCY}' #{period} #{depth}", operation, categories )
.split( "\n" )
.map do |line|
line_array = line.split( "#{CURRENCY}" )
{ account: line_array[ 1 ].strip,
amount: line_array[ 0 ].tr( SEPARATOR, '.' ).to_f }
end
end
2014-10-20 12:36:41 +02:00
def cleared
run( "--flat --no-total --exchange '#{CURRENCY}'", 'cleared', 'Assets Equity' )
.split( "\n" )
.map do |row|
fields = row.match( /\s*(\S+ €)\s*(\S+ €)\s*(\S+)\s*(\S+)/ )
{ account: fields[ 4 ],
amount: { cleared: fields[ 2 ],
all: fields[ 1 ] } } unless fields.nil?
2014-10-20 12:36:41 +02:00
end
end
2014-11-06 16:46:18 +01:00
2014-11-08 17:40:48 +01:00
def budget( period, categories )
2014-11-06 16:46:18 +01:00
period = period.nil? ? '' : "-p '#{period}'"
budgeted = run( "--flat --no-total --budget --exchange '#{CURRENCY}' #{period}", 'budget', categories )
.lines
.map do |line|
2014-11-06 16:46:18 +01:00
ary = line.split
{ currency: ary[1],
amount: ary[0].tr( SEPARATOR, '.' ).to_f,
budget: ary[2].tr( SEPARATOR, '.' ).to_f,
percentage: ary.last( 2 ).first.gsub( /%/, '' ).tr( SEPARATOR, '.' ).to_f,
2014-11-06 16:46:18 +01:00
account: ary.last }
end
unbudgeted_amount = run( "--flat --no-total --unbudgeted -Mn --exchange '#{CURRENCY}' #{period}", 'register', categories )
.lines
.map do |line|
line.split[4].tr( SEPARATOR, '.' ).to_f
end
.reduce( :+ )
budgeted << { currency: CURRENCY,
amount: unbudgeted_amount,
budget: 0,
percentage: -1,
account: '(unbudgeted)' }
2014-11-06 16:46:18 +01:00
end
end