budgetcrmod 0.0.0 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/budgetcrmod.gemspec +64 -0
- data/lib/budgetcrmod/budget.rb +460 -421
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd1d0b4f3a58bce91cd2ad56229fed7e745a73fb
|
4
|
+
data.tar.gz: 9e7aa5398882fa4f219eb78fcb6f97e518550b88
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 13cb28562e021786af1945ad3e050dfdb016d3effd719fab216edb58d0330bb400243abf8b303bc71326ea5dcddd60120e49d2897ef109268b8603a3f3ec5313
|
7
|
+
data.tar.gz: 4fa8496fb757cdffdba9eaf10a480ed2d2942723c82ce6690eb62b676951fa4bb2ac16947611d5815f9c8b032d2a8c4acfc16d3d0fbfaeb3597cff276b4cfa50
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.1.0
|
data/budgetcrmod.gemspec
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
# stub: budgetcrmod 0.1.0 ruby lib
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "budgetcrmod"
|
9
|
+
s.version = "0.1.0"
|
10
|
+
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib"]
|
13
|
+
s.authors = ["Edmund Highcock"]
|
14
|
+
s.date = "2014-06-02"
|
15
|
+
s.description = "A CodeRunner module to help you do your budget"
|
16
|
+
s.email = "edmundhighcock@users.sourceforge.net"
|
17
|
+
s.extra_rdoc_files = [
|
18
|
+
"LICENSE.txt",
|
19
|
+
"README.rdoc"
|
20
|
+
]
|
21
|
+
s.files = [
|
22
|
+
".document",
|
23
|
+
"Gemfile",
|
24
|
+
"LICENSE.txt",
|
25
|
+
"README.rdoc",
|
26
|
+
"Rakefile",
|
27
|
+
"VERSION",
|
28
|
+
"budgetcrmod.gemspec",
|
29
|
+
"lib/budgetcrmod.rb",
|
30
|
+
"lib/budgetcrmod/budget.rb",
|
31
|
+
"lib/budgetcrmod/defaults_files/budget_defaults.rb",
|
32
|
+
"test/helper.rb",
|
33
|
+
"test/test_budgetcrmod.rb"
|
34
|
+
]
|
35
|
+
s.homepage = "http://github.com/edmundhighcock/budgetcrmod"
|
36
|
+
s.licenses = ["MIT"]
|
37
|
+
s.rubygems_version = "2.2.2"
|
38
|
+
s.summary = "A CodeRunner module to help you do your budget"
|
39
|
+
|
40
|
+
if s.respond_to? :specification_version then
|
41
|
+
s.specification_version = 4
|
42
|
+
|
43
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
+
s.add_runtime_dependency(%q<coderunner>, [">= 0.11.0"])
|
45
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
46
|
+
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
47
|
+
s.add_development_dependency(%q<bundler>, ["> 1.0.0"])
|
48
|
+
s.add_development_dependency(%q<jeweler>, [">= 1.8.4"])
|
49
|
+
else
|
50
|
+
s.add_dependency(%q<coderunner>, [">= 0.11.0"])
|
51
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
52
|
+
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
53
|
+
s.add_dependency(%q<bundler>, ["> 1.0.0"])
|
54
|
+
s.add_dependency(%q<jeweler>, [">= 1.8.4"])
|
55
|
+
end
|
56
|
+
else
|
57
|
+
s.add_dependency(%q<coderunner>, [">= 0.11.0"])
|
58
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
59
|
+
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
60
|
+
s.add_dependency(%q<bundler>, ["> 1.0.0"])
|
61
|
+
s.add_dependency(%q<jeweler>, [">= 1.8.4"])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
data/lib/budgetcrmod/budget.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'date'
|
1
2
|
class String
|
2
3
|
def latex_escape
|
3
4
|
self.gsub(/(?<!\\)([%_&^])/, '\\\\\1')
|
@@ -43,26 +44,48 @@ class CodeRunner
|
|
43
44
|
# "11.50",
|
44
45
|
# "4506.80"]
|
45
46
|
#
|
46
|
-
@component_results = [:date, :type, :sc, :ac, :description, :
|
47
|
-
@results = [:data] + @component_results
|
47
|
+
@component_results = [:date, :type, :sc, :ac, :description, :deposit, :withdrawal, :balance]
|
48
|
+
@results = [:data, :data_line] + @component_results
|
48
49
|
def generate_input_file
|
49
50
|
FileUtils.cp @data_file.sub(/~/, ENV['HOME']), @directory + '/data.cvs'
|
50
51
|
end
|
52
|
+
def debit
|
53
|
+
case @account_type
|
54
|
+
when :Asset, :Expense
|
55
|
+
deposit
|
56
|
+
else
|
57
|
+
withdrawal
|
58
|
+
end
|
59
|
+
end
|
60
|
+
def credit
|
61
|
+
case @account_type
|
62
|
+
when :Asset, :Expense
|
63
|
+
withdrawal
|
64
|
+
else
|
65
|
+
deposit
|
66
|
+
end
|
67
|
+
end
|
51
68
|
DOUBLE_STRING=/"(?:\\\\|\\"|[^"\\]|\\[^"\\])*"/
|
52
69
|
def process_directory_code_specific
|
53
70
|
@status=:Complete
|
54
71
|
data = File.read('data.cvs')
|
55
72
|
data = data.split("\n").map do |line|
|
56
|
-
|
73
|
+
matches = line.scan(Regexp.new("((?:#{DOUBLE_STRING}|[^,])*)(?:,|$)"))
|
57
74
|
matches.flatten
|
58
75
|
end
|
59
|
-
pp data
|
76
|
+
#pp data
|
60
77
|
@data = data
|
61
|
-
@data.shift
|
78
|
+
@first_line = @data.shift.join(',')
|
79
|
+
end
|
80
|
+
def reversed?
|
81
|
+
#case account_type(@account)
|
82
|
+
#when :Asset
|
83
|
+
@first_line =~ /Debit.*Credit/
|
84
|
+
#end
|
62
85
|
end
|
63
86
|
def print_out_line
|
64
87
|
if @is_component
|
65
|
-
sprintf("%4d. %10s %3s %
|
88
|
+
sprintf("%4d. %10s %10s %3s %-30s %8s %8s %8s %8s %8s", id, account, *rcp.component_results.find_all{|r| r!=:ac and r!=:sc}.map{|res| send(res)}, budget, external_account)
|
66
89
|
else
|
67
90
|
#pr = component_runs.sort_by{|r| r.id}
|
68
91
|
"#{sprintf("%3d", @id)}. #{sprintf("%-20s", @account)} Start: #{start_date} End: #{end_date} Final Balance: #{final_balance} "
|
@@ -72,39 +95,50 @@ class CodeRunner
|
|
72
95
|
@date_sorted_component ||= component_runs.sort_by{|r| r.id}
|
73
96
|
end
|
74
97
|
def end_date
|
75
|
-
date_sorted_component[-1].date
|
98
|
+
date_sorted_component[-1].date rescue nil
|
76
99
|
end
|
77
100
|
def start_date
|
78
|
-
date_sorted_component[0].date
|
101
|
+
date_sorted_component[0].date rescue nil
|
79
102
|
end
|
80
103
|
def final_balance
|
81
|
-
date_sorted_component[-1].balance
|
104
|
+
date_sorted_component[-1].balance rescue nil
|
82
105
|
end
|
83
106
|
def parameter_transition(run)
|
84
107
|
end
|
85
108
|
def parameter_string
|
86
109
|
""
|
87
110
|
end
|
111
|
+
|
112
|
+
#def external_account
|
113
|
+
#(sub_account.to_s + '_' + budget.to_s).to_sum
|
114
|
+
#end
|
88
115
|
|
89
116
|
def generate_component_runs
|
90
117
|
@runner.cache[:data] ||= []
|
118
|
+
reslts = rcp.component_results
|
119
|
+
if reversed?
|
120
|
+
reslts[5] = :withdrawal
|
121
|
+
reslts[6] = :deposit
|
122
|
+
end
|
91
123
|
@data.each do |dataset|
|
92
124
|
next if @runner.cache[:data].include? dataset and Date.parse(dataset[0]) > Date.parse("1/1/2013")
|
93
125
|
component = create_component
|
94
|
-
|
126
|
+
reslts.each_with_index do |res,index|
|
95
127
|
value = dataset[index]
|
96
128
|
# ep value
|
97
129
|
value = Date.parse value if res == :date
|
98
|
-
value = value.to_f if [:
|
130
|
+
value = value.to_f if [:deposit, :withdrawal, :balance].include? res
|
99
131
|
component.set(res, value)
|
132
|
+
component.set(:data_line, reslts.map{|r| component.send(r).to_s}.join(','))
|
100
133
|
end
|
101
134
|
@runner.cache[:data].push dataset
|
102
135
|
#component.account = @account
|
103
136
|
end
|
104
137
|
end
|
105
|
-
def days_ago
|
138
|
+
def days_ago(today = Date.today)
|
139
|
+
#ep ['today', today, date]
|
106
140
|
# sprintf("%04d%02d%02d", date.year, date.month, date.day).to_i
|
107
|
-
- ((date.to_datetime.to_time.to_i -
|
141
|
+
- ((date.to_datetime.to_time.to_i - today.to_datetime.to_time.to_i) / 24 / 3600).to_i
|
108
142
|
end
|
109
143
|
def idate
|
110
144
|
date.to_datetime.to_time.to_i
|
@@ -114,157 +148,157 @@ class CodeRunner
|
|
114
148
|
end
|
115
149
|
|
116
150
|
|
117
|
-
def self.sum_future(future_items, end_date)
|
118
|
-
sum = future_items.inject(0) do |sum, (name, item)|
|
119
|
-
item = [item] unless item.kind_of? Array
|
120
|
-
value = item.inject(0) do |value,info|
|
121
|
-
value += info[:size] unless (Date.today > info[:date]) or (info[:date] > end_date) # add unless we have already passed that date
|
122
|
-
value
|
123
|
-
end
|
124
|
-
rcp.excluding.include?(name) ? sum : sum + value
|
125
|
-
end
|
126
|
-
sum
|
127
|
-
end
|
128
|
-
|
129
|
-
def self.budget_expenditure(runner, budget, budget_info, start_date)
|
130
|
-
dates = []
|
131
|
-
expenditures = []
|
132
|
-
budget_items = []
|
133
|
-
date = budget_info[:end]||Date.today
|
134
|
-
start_date = [(budget_info[:start]||start_date), start_date].max
|
135
|
-
expenditure = 0
|
136
|
-
items_temp = []
|
137
|
-
items = runner.component_run_list.values.find_all{|r| r.budget == budget and r.in_date(budget_info)}
|
138
|
-
|
139
|
-
|
140
|
-
counter = 0
|
141
|
-
if not budget_info[:period]
|
142
|
-
dates.push date
|
143
|
-
budget_items.push items
|
144
|
-
expenditures.push (items.map{|r| r.debit - r.credit}+[0]).sum
|
145
|
-
else
|
146
|
-
|
147
|
-
case budget_info[:period][1]
|
148
|
-
when :month
|
149
|
-
while date > start_date
|
150
|
-
items_temp += items.find_all{|r| r.date == date}
|
151
|
-
if date.mday == (budget_info[:monthday] or 1)
|
152
|
-
counter +=1
|
153
|
-
if counter % budget_info[:period][0] == 0
|
154
|
-
expenditure = (items_temp.map{|r| r.debit - r.credit}+[0]).sum
|
155
|
-
dates.push date
|
156
|
-
expenditures.push expenditure
|
157
|
-
budget_items.push items_temp
|
158
|
-
items_temp = []
|
159
|
-
expenditure = 0
|
160
|
-
end
|
161
|
-
end
|
162
|
-
date-=1
|
163
|
-
end
|
164
|
-
when :day
|
165
|
-
while date > start_date
|
166
|
-
items_temp += items.find_all{|r| r.date == date}
|
167
|
-
|
168
|
-
counter +=1
|
169
|
-
if counter % budget_info[:period][0] == 0
|
170
|
-
expenditure = (items_temp.map{|r| r.debit - r.credit}+[0]).sum
|
171
|
-
dates.push date
|
172
|
-
expenditures.push expenditure
|
173
|
-
budget_items.push items_temp
|
174
|
-
items_temp = []
|
175
|
-
expenditure = 0
|
176
|
-
end
|
177
|
-
date-=1
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
[dates, expenditures, budget_items]
|
183
|
-
|
184
|
-
end
|
185
|
-
|
186
|
-
def self.sum_regular(regular_items, end_date)
|
187
|
-
today = Date.today
|
188
|
-
sum = regular_items.inject(0) do |sum, (name, item)|
|
189
|
-
item = [item] unless item.kind_of? Array
|
190
|
-
|
191
|
-
value = item.inject(0) do |value,info|
|
192
|
-
finish = (info[:end] and info[:end] < end_date) ? info[:end] : end_date
|
193
|
-
|
151
|
+
#def self.sum_future(future_items, end_date, options={})
|
152
|
+
#sum = future_items.inject(0) do |sum, (name, item)|
|
153
|
+
#item = [item] unless item.kind_of? Array
|
154
|
+
#value = item.inject(0) do |value,info|
|
155
|
+
#value += info[:size] unless (options[:today]||Date.today > info[:date]) or (info[:date] > end_date) # add unless we have already passed that date
|
156
|
+
#value
|
157
|
+
#end
|
158
|
+
#rcp.excluding.include?(name) ? sum : sum + value
|
159
|
+
#end
|
160
|
+
#sum
|
161
|
+
#end
|
162
|
+
|
163
|
+
#def self.budget_expenditure(runner, budget, budget_info, start_date, options={})
|
164
|
+
#dates = []
|
165
|
+
#expenditures = []
|
166
|
+
#budget_items = []
|
167
|
+
#date = budget_info[:end]||options[:today]||Date.today
|
168
|
+
#start_date = [(budget_info[:start]||start_date), start_date].max
|
169
|
+
#expenditure = 0
|
170
|
+
#items_temp = []
|
171
|
+
#items = runner.component_run_list.values.find_all{|r| r.budget == budget and r.in_date(budget_info)}
|
172
|
+
##ep ['items', items]
|
173
|
+
##ep ['budget', budget]
|
174
|
+
#counter = 0
|
175
|
+
#if not budget_info[:period]
|
176
|
+
#dates.push date
|
177
|
+
#budget_items.push items
|
178
|
+
#expenditures.push (items.map{|r| r.debit - r.credit}+[0]).sum
|
179
|
+
#else
|
180
|
+
|
181
|
+
#case budget_info[:period][1]
|
182
|
+
#when :month
|
183
|
+
#while date > start_date
|
184
|
+
#items_temp += items.find_all{|r| r.date == date}
|
185
|
+
#if date.mday == (budget_info[:monthday] or 1)
|
186
|
+
#counter +=1
|
187
|
+
#if counter % budget_info[:period][0] == 0
|
188
|
+
#expenditure = (items_temp.map{|r| r.debit - r.credit}+[0]).sum
|
189
|
+
#dates.push date
|
190
|
+
#expenditures.push expenditure
|
191
|
+
#budget_items.push items_temp
|
192
|
+
#items_temp = []
|
193
|
+
#expenditure = 0
|
194
|
+
#end
|
195
|
+
#end
|
196
|
+
#date-=1
|
197
|
+
#end
|
198
|
+
#when :day
|
199
|
+
#while date > start_date
|
200
|
+
#items_temp += items.find_all{|r| r.date == date}
|
201
|
+
##expenditure += (budget_items[-1].map{|r| r.debit}+[0]).sum
|
202
|
+
#counter +=1
|
203
|
+
#if counter % budget_info[:period][0] == 0
|
204
|
+
#expenditure = (items_temp.map{|r| r.debit - r.credit}+[0]).sum
|
205
|
+
#dates.push date
|
206
|
+
#expenditures.push expenditure
|
207
|
+
#budget_items.push items_temp
|
208
|
+
#items_temp = []
|
209
|
+
#expenditure = 0
|
210
|
+
#end
|
211
|
+
#date-=1
|
212
|
+
#end
|
213
|
+
#end
|
214
|
+
#end
|
215
|
+
|
216
|
+
#[dates, expenditures, budget_items]
|
217
|
+
|
218
|
+
#end
|
219
|
+
|
220
|
+
#def self.sum_regular(regular_items, end_date, options={})
|
221
|
+
#today = options[:today]||Date.today
|
222
|
+
#sum = regular_items.inject(0) do |sum, (name, item)|
|
223
|
+
#item = [item] unless item.kind_of? Array
|
224
|
+
## ep item
|
225
|
+
#value = item.inject(0) do |value,info|
|
226
|
+
#finish = (info[:end] and info[:end] < end_date) ? info[:end] : end_date
|
227
|
+
##today = (Time.now.to_i / (24.0*3600.0)).round
|
194
228
|
|
195
|
-
nunits = 0
|
196
|
-
counter = info[:period][0] == 1 ? 0 : nil
|
197
|
-
unless counter
|
198
|
-
date = today
|
199
|
-
counter = 0
|
200
|
-
case info[:period][1]
|
201
|
-
when :month
|
202
|
-
while date >= (info[:start] or Date.today)
|
203
|
-
counter +=1 if date.mday == (info[:monthday] or 1)
|
204
|
-
date -= 1
|
205
|
-
end
|
206
|
-
when :year
|
207
|
-
while date >= (info[:start] or Date.today)
|
208
|
-
counter +=1 if date.yday == (info[:yearday] or 1)
|
209
|
-
date -= 1
|
210
|
-
end
|
211
|
-
when :day
|
212
|
-
while date > (info[:start] or Date.today)
|
213
|
-
counter +=1
|
214
|
-
date -= 1
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end
|
218
|
-
date = today
|
219
|
-
case info[:period][1]
|
220
|
-
when :month
|
221
|
-
|
222
|
-
while date <= finish
|
223
|
-
if date.mday == (info[:monthday] or 1)
|
224
|
-
nunits += 1 if counter % info[:period][0] == 0
|
225
|
-
counter +=1
|
226
|
-
end
|
227
|
-
date += 1
|
228
|
-
end
|
229
|
-
when :year
|
230
|
-
while date <= finish
|
231
|
-
if date.yday == (info[:yearday] or 1)
|
232
|
-
nunits += 1 if counter % info[:period][0] == 0
|
233
|
-
counter +=1
|
234
|
-
end
|
235
|
-
date += 1
|
236
|
-
end
|
237
|
-
when :day
|
238
|
-
while date <= finish
|
239
|
-
nunits += 1 if counter % info[:period][0] == 0
|
240
|
-
counter +=1
|
241
|
-
date += 1
|
242
|
-
end
|
243
|
-
end
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
value + nunits * info[:size]
|
262
|
-
|
263
|
-
end
|
264
|
-
(rcp.excluding? and rcp.excluding.include?(name)) ? sum : sum + value
|
265
|
-
end
|
266
|
-
sum
|
267
|
-
end
|
229
|
+
#nunits = 0
|
230
|
+
#counter = info[:period][0] == 1 ? 0 : nil
|
231
|
+
#####################unless counter
|
232
|
+
#####################date = today
|
233
|
+
#####################counter = 0
|
234
|
+
#####################case info[:period][1]
|
235
|
+
#####################when :month
|
236
|
+
#####################while date >= (info[:start] or Date.today)
|
237
|
+
#####################counter +=1 if date.mday == (info[:monthday] or 1)
|
238
|
+
#####################date -= 1
|
239
|
+
#####################end
|
240
|
+
#####################when :year
|
241
|
+
#####################while date >= (info[:start] or Date.today)
|
242
|
+
#####################counter +=1 if date.yday == (info[:yearday] or 1)
|
243
|
+
#####################date -= 1
|
244
|
+
#####################end
|
245
|
+
#####################when :day
|
246
|
+
#####################while date > (info[:start] or Date.today)
|
247
|
+
#####################counter +=1
|
248
|
+
#####################date -= 1
|
249
|
+
#####################end
|
250
|
+
#####################end
|
251
|
+
#####################end
|
252
|
+
#date = today
|
253
|
+
#########################case info[:period][1]
|
254
|
+
#########################when :month
|
255
|
+
##########################p date, info
|
256
|
+
#########################while date <= finish
|
257
|
+
#########################if date.mday == (info[:monthday] or 1)
|
258
|
+
#########################nunits += 1 if counter % info[:period][0] == 0
|
259
|
+
#########################counter +=1
|
260
|
+
#########################end
|
261
|
+
#########################date += 1
|
262
|
+
#########################end
|
263
|
+
#########################when :year
|
264
|
+
#########################while date <= finish
|
265
|
+
#########################if date.yday == (info[:yearday] or 1)
|
266
|
+
#########################nunits += 1 if counter % info[:period][0] == 0
|
267
|
+
#########################counter +=1
|
268
|
+
#########################end
|
269
|
+
#########################date += 1
|
270
|
+
#########################end
|
271
|
+
#########################when :day
|
272
|
+
#########################while date <= finish
|
273
|
+
#########################nunits += 1 if counter % info[:period][0] == 0
|
274
|
+
#########################counter +=1
|
275
|
+
#########################date += 1
|
276
|
+
#########################end
|
277
|
+
#########################end
|
278
|
+
|
279
|
+
|
280
|
+
|
281
|
+
|
282
|
+
|
283
|
+
##nyears = (finish.year - today.year)
|
284
|
+
##nmonths = nyears * 12 + (finish.month - today.month)
|
285
|
+
##(puts "Number of Months: #{nmonths}"; @pnmonths=true) unless @pnmonths
|
286
|
+
##ndays = nyears * 12 + (finish.yday - today.yday)
|
287
|
+
##number = case info[:period][1]
|
288
|
+
##when :month
|
289
|
+
##(nmonths / info[:period][0]).ceil
|
290
|
+
##when :day
|
291
|
+
##(ndays / info[:period][0]).ceil
|
292
|
+
##end
|
293
|
+
##value + number * info[:size]
|
294
|
+
##eputs "Regular Expenditure Item: #{sprintf("%10s", name)} -- #{nunits} payments, total #{nunits * info[:size]}"
|
295
|
+
#value + nunits * info[:size]
|
296
|
+
|
297
|
+
#end
|
298
|
+
#(rcp.excluding? and rcp.excluding.include?(name)) ? sum : sum + value
|
299
|
+
#end
|
300
|
+
#sum
|
301
|
+
#end
|
268
302
|
def self.predictable_component_ids(runner)
|
269
303
|
#runner.instance_variable_set(:@component_run_list, {})
|
270
304
|
#runner.instance_variable_set(:@component_ids, [])
|
@@ -299,270 +333,275 @@ class CodeRunner
|
|
299
333
|
puts "Weekly Budget: #{total / ((end_date.to_datetime.to_time.to_i - Time.now.to_i) / 3600 / 24 /7)}"
|
300
334
|
end
|
301
335
|
|
302
|
-
def self.budgets_with_averages(runner, budgets, start_date)
|
303
|
-
projected_budgets = budgets.dup
|
304
|
-
projected_budgets.each{|key,v| projected_budgets[key]=projected_budgets[key].dup}
|
305
|
-
projected_budgets.each do |budget, budget_info|
|
306
|
-
#budget_info = budgets[budget]
|
307
|
-
dates, expenditures, items = budget_expenditure(runner, budget, budget_info, start_date)
|
308
|
-
budget_info[:size] = expenditures.mean rescue 0.0
|
309
|
-
end
|
310
|
-
projected_budgets
|
311
|
-
end
|
312
|
-
|
313
|
-
def self.latex_budget_transfers(runner, budgets, options)
|
314
|
-
numdays = options[:days]
|
315
|
-
"#{budgets.map{|budget, budget_info|
|
316
|
-
dates, expenditures, items = budget_expenditure(runner, budget, budget_info, Date.today - numdays)
|
317
|
-
#ep ['budget', budget, dates, expenditures]
|
318
|
-
kit = GraphKit.quick_create([dates.map{|d| d.to_time.to_i}, expenditures])
|
319
|
-
kit.data.each{|dk| dk.gp.with="boxes"}
|
320
|
-
kit.gp.style = "fill solid"
|
321
|
-
kit.xlabel = nil
|
322
|
-
kit.ylabel = "Expenditure"
|
323
|
-
unless options[:transfers]
|
324
|
-
kits = budgets_with_averages(runner, {budget => budget_info}, Date.today - numdays).map{|budget, budget_info|
|
325
|
-
#ep 'Budget is ', budget
|
326
|
-
kit2 = GraphKit.quick_create([
|
327
|
-
[dates[0], dates[-1]].map{|d| d.to_time.to_i},
|
328
|
-
[budget_info[:size], budget_info[:size]]
|
329
|
-
])
|
330
|
-
kit2.data[0].gp.with = 'lp lw 4'
|
331
|
-
kit2
|
332
|
-
}
|
333
|
-
#$debug_gnuplot = true
|
334
|
-
#kits.sum.gnuplot
|
335
|
-
kit += kits.sum
|
336
|
-
|
337
|
-
else
|
338
|
-
kit.data[0].y.data.map!{|expen| expen*-1.0}
|
339
|
-
end
|
340
|
-
kit.title = "#{budget} Expenditure with average (Total = #{kit.data[0].y.data.sum})"
|
341
|
-
kit_time_format_x(kit)
|
342
|
-
#kit.gnuplot
|
343
|
-
kit.gnuplot_write("#{budget}.eps")
|
344
|
-
"\\begin{center}\\includegraphics[width=4.0in]{#{budget}.eps}\\vspace{1em}\\end{center}"
|
345
|
-
}.join("\n\n")
|
346
|
-
}"
|
347
|
-
end
|
348
|
-
|
349
|
-
def self.latex_report(options={})
|
350
|
-
runner = CodeRunner.fetch_runner(Y: Dir.pwd, h: :component)
|
351
|
-
numdays = options[:days]
|
352
|
-
# Delete budgets that contain no items
|
353
|
-
actual_budgets = BUDGETS.dup
|
354
|
-
BUDGETS.keys.each do |budget|
|
355
|
-
actual_budgets.delete(budget) if budget_expenditure(runner, budget, BUDGETS[budget], Date.today - numdays)[0].size == 0
|
356
|
-
end
|
357
|
-
#predictable_component_ids(runner)
|
358
|
-
days_ahead = options[:days_ahead]
|
359
|
-
runs = runner.component_run_list.values
|
360
|
-
indateruns = runs.find_all{|r| r.days_ago < numdays}
|
361
|
-
accounts = runs.map{|r| r.account}.uniq
|
362
|
-
ep 'Accounts', accounts
|
363
|
-
projected_budgets = Hash[actual_budgets.dup.find_all{|k,v| v[:discretionary]}]
|
364
|
-
projected_budgets = budgets_with_averages(runner,projected_budgets, Date.today - numdays)
|
336
|
+
#def self.budgets_with_averages(runner, budgets, start_date, options={})
|
337
|
+
#projected_budgets = budgets.dup
|
365
338
|
#projected_budgets.each{|key,v| projected_budgets[key]=projected_budgets[key].dup}
|
366
339
|
#projected_budgets.each do |budget, budget_info|
|
367
340
|
##budget_info = budgets[budget]
|
368
|
-
#dates, expenditures, items = budget_expenditure(runner, budget, budget_info,
|
369
|
-
#budget_info[:size] = expenditures.mean
|
341
|
+
#dates, expenditures, items = budget_expenditure(runner, budget, budget_info, start_date, today: options[:today])
|
342
|
+
#budget_info[:size] = expenditures.mean rescue 0.0
|
370
343
|
#end
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
#{
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
}
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
}
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
}
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
\\
|
452
|
-
#{
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
#{
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
"
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
#
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
535
|
-
|
536
|
-
}
|
537
|
-
}
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
|
562
|
-
|
344
|
+
#projected_budgets
|
345
|
+
#end
|
346
|
+
|
347
|
+
#def self.latex_budget_transfers(runner, budgets, options)
|
348
|
+
#numdays = options[:days]
|
349
|
+
#today = options[:today]||Date.today
|
350
|
+
#"#{budgets.map{|budget, budget_info|
|
351
|
+
#dates, expenditures, items = budget_expenditure(runner, budget, budget_info, today - numdays, today: options[:today])
|
352
|
+
##ep ['budget', budget, dates, expenditures]
|
353
|
+
#kit = GraphKit.quick_create([dates.map{|d| d.to_time.to_i}, expenditures])
|
354
|
+
#kit.data.each{|dk| dk.gp.with="boxes"}
|
355
|
+
#kit.gp.style = "fill solid"
|
356
|
+
#kit.xlabel = nil
|
357
|
+
#kit.ylabel = "Expenditure"
|
358
|
+
#unless options[:transfers]
|
359
|
+
#kits = budgets_with_averages(runner, {budget => budget_info}, today - numdays, today: today).map{|budget, budget_info|
|
360
|
+
##ep 'Budget is ', budget
|
361
|
+
#kit2 = GraphKit.quick_create([
|
362
|
+
#[dates[0], dates[-1]].map{|d| d.to_time.to_i},
|
363
|
+
#[budget_info[:size], budget_info[:size]]
|
364
|
+
#])
|
365
|
+
#kit2.data[0].gp.with = 'lp lw 4'
|
366
|
+
#kit2
|
367
|
+
#}
|
368
|
+
##$debug_gnuplot = true
|
369
|
+
##kits.sum.gnuplot
|
370
|
+
#kit += kits.sum
|
371
|
+
|
372
|
+
#else
|
373
|
+
#kit.data[0].y.data.map!{|expen| expen*-1.0}
|
374
|
+
#end
|
375
|
+
#kit.title = "#{budget} Expenditure with average (Total = #{kit.data[0].y.data.sum})"
|
376
|
+
#kit_time_format_x(kit)
|
377
|
+
##kit.gnuplot
|
378
|
+
#kit.gnuplot_write("#{budget}.eps")
|
379
|
+
#"\\begin{center}\\includegraphics[width=4.0in]{#{budget}.eps}\\vspace{1em}\\end{center}"
|
380
|
+
#}.join("\n\n")
|
381
|
+
#}"
|
382
|
+
#end
|
383
|
+
|
384
|
+
#def self.latex_report(options={})
|
385
|
+
#runner = CodeRunner.fetch_runner(Y: Dir.pwd, h: :component)
|
386
|
+
#numdays = options[:days]
|
387
|
+
#today = options[:today] || Date.today
|
388
|
+
## Delete budgets that contain no items
|
389
|
+
#actual_budgets = BUDGETS.dup
|
390
|
+
#BUDGETS.keys.each do |budget|
|
391
|
+
#actual_budgets.delete(budget) if budget_expenditure(runner, budget, BUDGETS[budget], today - numdays, today: today)[0].size == 0
|
392
|
+
#end
|
393
|
+
##predictable_component_ids(runner)
|
394
|
+
#days_ahead = options[:days_ahead]
|
395
|
+
#runs = runner.component_run_list.values
|
396
|
+
#indateruns = runs.find_all{|r| r.days_ago < numdays}
|
397
|
+
#accounts = runs.map{|r| r.account}.uniq
|
398
|
+
#ep 'Accounts', accounts
|
399
|
+
#projected_budgets = Hash[actual_budgets.dup.find_all{|k,v| v[:discretionary]}]
|
400
|
+
#projected_budgets = budgets_with_averages(runner,projected_budgets, today - numdays, today: today)
|
401
|
+
##projected_budgets.each{|key,v| projected_budgets[key]=projected_budgets[key].dup}
|
402
|
+
##projected_budgets.each do |budget, budget_info|
|
403
|
+
###budget_info = budgets[budget]
|
404
|
+
##dates, expenditures, items = budget_expenditure(runner, budget, budget_info, today - numdays)
|
405
|
+
##budget_info[:size] = expenditures.mean
|
406
|
+
##end
|
407
|
+
#ep 'projected_budgets', projected_budgets
|
408
|
+
#File.open('report.tex', 'w') do |file|
|
409
|
+
#file.puts <<EOF
|
410
|
+
#\\documentclass{article}
|
411
|
+
#\\usepackage[cm]{fullpage}
|
412
|
+
#\\usepackage{tabulary}
|
413
|
+
#\\usepackage{graphicx}
|
414
|
+
#%\\usepackage{hyperlink}
|
415
|
+
#\\newcommand\\Tstrut{\\rule{0pt}{2.8ex}}
|
416
|
+
#\\begin{document}
|
417
|
+
#\\title{#{numdays}-day Budget Report}
|
418
|
+
#\\maketitle
|
419
|
+
#\\tableofcontents
|
420
|
+
|
421
|
+
#\\section{Summary of Accounts}
|
422
|
+
##{accounts.map{|acc|
|
423
|
+
#"\\subsection{#{acc}}
|
424
|
+
#\\begin{tabulary}{0.8\\textwidth}{ r l}
|
425
|
+
###Balance & #{runs.find_all{|r| r.account==acc}.sort_by{|r|
|
426
|
+
###r.date
|
427
|
+
###}[-1].balance} \\\\
|
428
|
+
#####Expenditure & #{runs.find_all{|r| r.account==acc &&
|
429
|
+
#####r.days_ago < numdays
|
430
|
+
#####}.map{|r|
|
431
|
+
#####r.debit
|
432
|
+
#####}.sum} \\\\
|
433
|
+
###Income & #{runs.find_all{|r| r.account==acc &&
|
434
|
+
###r.days_ago < numdays
|
435
|
+
###}.map{|r| r.credit}.sum} \\\\
|
436
|
+
#\\end{tabulary}"}.join("\n\n")
|
437
|
+
#}
|
438
|
+
|
439
|
+
#\\section{Graphs of Recent Balances}
|
440
|
+
##{accounts.map{|acc|
|
441
|
+
#balance = runs.find_all{|r| r.account==acc}.sort_by{|r| r.date }[-1].balance
|
442
|
+
#accshort = acc.gsub(/\s/, '')
|
443
|
+
#kit = runner.graphkit(['date.to_time.to_i', 'balance'], {conditions: "account == #{acc.inspect} and days_ago < #{numdays}", sort: 'date'})
|
444
|
+
#futuredates = (today..today+days_ahead).to_a
|
445
|
+
##p ["Regtrans", REGULAR_TRANSFERS.values_at(*REGULAR_TRANSFERS.keys.find_all{|from,to| to == acc})]
|
446
|
+
|
447
|
+
#budgets = Hash[projected_budgets.find_all{|k,v| v[:account] == acc}]
|
448
|
+
#ep ['budgets', budgets]
|
449
|
+
#projection = futuredates.map{|date| balance -
|
450
|
+
#sum_regular(REGULAR_EXPENDITURE[acc], date, today: today) +
|
451
|
+
#sum_regular(REGULAR_INCOME[acc], date, today: today) -
|
452
|
+
#sum_regular(budgets, date, today: today) -
|
453
|
+
#sum_future(FUTURE_EXPENDITURE[acc], date, today: today) +
|
454
|
+
#sum_future(FUTURE_INCOME[acc], date, today: today) +
|
455
|
+
#(REGULAR_TRANSFERS.keys.find_all{|from,to| to == acc}.map{|key|
|
456
|
+
##p [acc, 'to', "key", key]
|
457
|
+
#sum_regular( REGULAR_TRANSFERS[key], date, today: today)
|
458
|
+
#}.sum||0) -
|
459
|
+
#(REGULAR_TRANSFERS.keys.find_all{|from,to| from == acc}.map{|key|
|
460
|
+
##p [acc, 'from',"key", key]
|
461
|
+
#sum_regular( REGULAR_TRANSFERS[key], date, today: today)
|
462
|
+
#}.sum||0)
|
463
|
+
#}
|
464
|
+
#kit2 = GraphKit.quick_create([futuredates.map{|d| d.to_time.to_i}, projection])
|
465
|
+
#kit += kit2
|
466
|
+
#kit.title = "Balance for #{acc}"
|
467
|
+
#kit.xlabel = %['Date' offset 0,-2]
|
468
|
+
#kit.xlabel = nil
|
469
|
+
#kit.ylabel = "Balance"
|
470
|
+
|
471
|
+
#kit.data[0].gp.title = 'Previous'
|
472
|
+
#kit.data[1].gp.title = '0 GBP Discretionary'
|
473
|
+
#kit.data[1].gp.title = 'Projection'
|
474
|
+
#kit.data.each{|dk| dk.gp.with = "lp"}
|
475
|
+
|
476
|
+
#kit_time_format_x(kit)
|
477
|
+
|
478
|
+
#(kit).gnuplot_write("#{accshort}_balance.eps", size: "4.0in,3.0in")
|
479
|
+
#"\\begin{center}\\includegraphics[width=4.0in]{#{accshort}_balance.eps}\\end{center}"
|
480
|
+
#}.join("\n\n")
|
481
|
+
#}
|
482
|
+
|
483
|
+
|
484
|
+
#\\section{Budget Expenditure}
|
485
|
+
##{latex_budget_transfers(runner,actual_budgets, options)}
|
486
|
+
|
487
|
+
#\\section{Transfers}
|
488
|
+
##{latex_budget_transfers(runner, TRANSFERS, options.dup.absorb({transfers: true}))}
|
489
|
+
|
490
|
+
|
491
|
+
|
492
|
+
#\\section{Budget Resolutions}
|
493
|
+
|
494
|
+
#This section sums items from budgets drawn from an alternate account, i.e. it determines how much should be transferred from one account to another as a result of expenditure from a given budget.
|
495
|
+
|
496
|
+
##{actual_budgets.map{|budget, budget_info|
|
497
|
+
|
498
|
+
########################################"\\subsection{#{budget} }
|
499
|
+
########################################\\setlength{\\parindent}{0cm}\n\n\\begin{tabulary}{0.99\\textwidth}{r l}
|
500
|
+
########################################%\\hline
|
501
|
+
########################################Account Owed & Amount \\\\
|
502
|
+
########################################\\hline
|
503
|
+
########################################\\Tstrut
|
504
|
+
#########################################{budget_items = indateruns.find_all{|r| r.budget == budget}
|
505
|
+
########################################alternate_accounts = budget_items.map{|r| r.account}.uniq - [budget_info[:account]]
|
506
|
+
########################################alternate_accounts.map{|acc|
|
507
|
+
########################################alternate_items = budget_items.find_all{|r| r.account == acc}
|
508
|
+
########################################total = alternate_items.map{|r| r.debit - r.credit}.sum
|
509
|
+
########################################"#{acc} & #{total} \\\\"
|
510
|
+
########################################}.join("\n\n")
|
511
|
+
########################################}
|
512
|
+
|
513
|
+
########################################\\\\
|
514
|
+
########################################\\hline
|
515
|
+
########################################\\end{tabulary}
|
516
|
+
########################################\\normalsize
|
517
|
+
########################################\\vspace{1em}\n\n
|
518
|
+
|
519
|
+
#########################################{ alternate_accounts.map{|acc|
|
520
|
+
########################################alternate_items = budget_items.find_all{|r| r.account == acc}
|
521
|
+
########################################alternate_items.pieces((alternate_items.size.to_f/50.to_f).ceil).map{|piece|
|
522
|
+
########################################"\\footnotesize\\setlength{\\parindent}{0cm}\n\n\\begin{tabulary}{0.99\\textwidth}{ #{"c " * 4 + " L " + " r " * 3 }}
|
523
|
+
#########################################{budget}: & #{budget_info[:account]} & owes & #{acc} &&&&\\\\
|
524
|
+
########################################\\hline
|
525
|
+
|
526
|
+
########################################\\Tstrut
|
527
|
+
|
528
|
+
#########################################{piece.map{|r|
|
529
|
+
########################################([:id] + rcp.component_results - [:sc]).map{|res|
|
530
|
+
########################################r.send(res).to_s.latex_escape
|
531
|
+
#########################################rcp.component_results.map{|res| r.send(res).to_s.gsub(/(.{20})/, '\1\\\\\\\\').latex_escape
|
532
|
+
########################################}.join(" & ")
|
533
|
+
########################################}.join("\\\\\n")
|
534
|
+
########################################}
|
535
|
+
########################################\\end{tabulary}\\normalsize"}.join("\n\n")
|
536
|
+
########################################}.join("\n\n")}
|
537
|
+
########################################"
|
538
|
+
#}.join("\n\n")
|
539
|
+
#}
|
540
|
+
|
541
|
+
|
542
|
+
|
543
|
+
#\\section{Budget and Transfer Breakdown}
|
544
|
+
##{(TRANSFERS + actual_budgets).map{|budget, budget_info|
|
545
|
+
#dates, expenditures, budget_items = budget_expenditure(runner, budget, budget_info, today - numdays, today: today)
|
546
|
+
#pp budget, budget_items.map{|items| items.map{|i| i.date.to_s}}
|
547
|
+
#"\\subsection{#{budget}}" +
|
548
|
+
########################budget_items.zip(dates, expenditures).map{|items, date, expenditure|
|
549
|
+
########################if items.size > 0
|
550
|
+
########################"
|
551
|
+
########################\\footnotesize
|
552
|
+
########################\\setlength{\\parindent}{0cm}\n\n\\begin{tabulary}{0.99\\textwidth}{ #{"c " * 4 + " L " + " r " * 2 }}
|
553
|
+
########################%\\hline
|
554
|
+
########################& #{date.to_s.latex_escape} & & & Total & #{expenditure} & \\\\
|
555
|
+
########################\\hline
|
556
|
+
########################\\Tstrut
|
557
|
+
#########################{items.map{|r|
|
558
|
+
########################([:id] + rcp.component_results - [:sc, :balance]).map{|res|
|
559
|
+
########################r.send(res).to_s.latex_escape
|
560
|
+
########################}.join(" & ")
|
561
|
+
########################}.join("\\\\\n")
|
562
|
+
########################}
|
563
|
+
########################\\\\
|
564
|
+
########################\\hline
|
565
|
+
########################\\end{tabulary}
|
566
|
+
########################\\normalsize
|
567
|
+
########################\\vspace{1em}\n\n"
|
568
|
+
########################else
|
569
|
+
########################""
|
570
|
+
########################end
|
571
|
+
########################}.join("\n\n")
|
572
|
+
#}.join("\n\n")
|
573
|
+
#}
|
574
|
+
|
575
|
+
|
576
|
+
|
577
|
+
#\\section{Recent Transactions}
|
578
|
+
##{accounts.map{|acc|
|
579
|
+
#"\\subsection{#{acc}}
|
580
|
+
#\\footnotesize
|
581
|
+
##{all = runs.find_all{|r| r.account == acc and r.days_ago < numdays}.sort_by{|r| [r.date, r.id]}.reverse
|
582
|
+
#ep ['acc', acc, 'ids', all.map{|r| r.id}, 'size', all.size]
|
583
|
+
########all.pieces((all.size.to_f/50.to_f).ceil).map{|piece|
|
584
|
+
########"\\setlength{\\parindent}{0cm}\n\n\\begin{tabulary}{0.99\\textwidth}{ #{"c " * 4 + " L " + " r " * 3 + "l"}}
|
585
|
+
#########{piece.map{|r|
|
586
|
+
########([:id] + rcp.component_results - [:sc] + [:budget]).map{|res| r.send(res).to_s.latex_escape
|
587
|
+
#########rcp.component_results.map{|res| r.send(res).to_s.gsub(/(.{20})/, '\1\\\\\\\\').latex_escape
|
588
|
+
########}.join(" & ")
|
589
|
+
########}.join("\\\\\n")}
|
590
|
+
########\\end{tabulary}"}.join("\n\n")}"
|
591
|
+
#}.join("\n\n")}
|
592
|
+
#\\end{document}
|
593
|
+
#EOF
|
594
|
+
|
595
|
+
|
596
|
+
#end
|
597
|
+
#system "latex report.tex && latex report.tex"
|
598
|
+
#end
|
599
|
+
#require 'treasurer'
|
600
|
+
#require 'local_customisations.rb'
|
601
|
+
#include Treasurer::LocalCustomisations
|
563
602
|
|
564
603
|
end # class Budget
|
565
604
|
end #class CodeRunner
|
566
605
|
|
567
606
|
p Dir.pwd
|
568
|
-
require Dir.pwd + '/local_customisations.rb'
|
607
|
+
#require Dir.pwd + '/local_customisations.rb'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: budgetcrmod
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Edmund Highcock
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coderunner
|
@@ -94,6 +94,7 @@ files:
|
|
94
94
|
- README.rdoc
|
95
95
|
- Rakefile
|
96
96
|
- VERSION
|
97
|
+
- budgetcrmod.gemspec
|
97
98
|
- lib/budgetcrmod.rb
|
98
99
|
- lib/budgetcrmod/budget.rb
|
99
100
|
- lib/budgetcrmod/defaults_files/budget_defaults.rb
|