budgetcrmod 0.1.0 → 0.2.1
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 +28 -28
- data/lib/budgetcrmod/budget.rb +125 -16
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a1ed45d12e5021db3fce47df4b4ba1a5e93d8c9
|
4
|
+
data.tar.gz: 34f6c04868dc0b676e3aba3e9ae681ffb7c95549
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 65178bcb5e47004f7e8e34500fcbc764821bcf8ac0e2c67f3107d3fc31b6ce9715c5e176077fb6c5728dcdd4ed5c06e8b5b06414d6b93595b3c715a1da6d8cb3
|
7
|
+
data.tar.gz: 5097b5c98f9028f75b90a42280d15d225b9ee3b326060ddd7bfdbb41877c6937e2ed9c47b90862c53d37fda61dc453bbbd85a429ab91ae7ea9514113800ab1ba
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1
|
1
|
+
0.2.1
|
data/budgetcrmod.gemspec
CHANGED
@@ -2,18 +2,18 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: budgetcrmod 0.1
|
5
|
+
# stub: budgetcrmod 0.2.1 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
|
-
s.name = "budgetcrmod"
|
9
|
-
s.version = "0.1
|
8
|
+
s.name = "budgetcrmod".freeze
|
9
|
+
s.version = "0.2.1"
|
10
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 = "
|
15
|
-
s.description = "A CodeRunner module to help you do your budget"
|
16
|
-
s.email = "edmundhighcock@users.sourceforge.net"
|
11
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
|
+
s.require_paths = ["lib".freeze]
|
13
|
+
s.authors = ["Edmund Highcock".freeze]
|
14
|
+
s.date = "2018-03-04"
|
15
|
+
s.description = "A CodeRunner module to help you do your budget".freeze
|
16
|
+
s.email = "edmundhighcock@users.sourceforge.net".freeze
|
17
17
|
s.extra_rdoc_files = [
|
18
18
|
"LICENSE.txt",
|
19
19
|
"README.rdoc"
|
@@ -32,33 +32,33 @@ Gem::Specification.new do |s|
|
|
32
32
|
"test/helper.rb",
|
33
33
|
"test/test_budgetcrmod.rb"
|
34
34
|
]
|
35
|
-
s.homepage = "http://github.com/edmundhighcock/budgetcrmod"
|
36
|
-
s.licenses = ["MIT"]
|
37
|
-
s.rubygems_version = "2.
|
38
|
-
s.summary = "A CodeRunner module to help you do your budget"
|
35
|
+
s.homepage = "http://github.com/edmundhighcock/budgetcrmod".freeze
|
36
|
+
s.licenses = ["MIT".freeze]
|
37
|
+
s.rubygems_version = "2.6.8".freeze
|
38
|
+
s.summary = "A CodeRunner module to help you do your budget".freeze
|
39
39
|
|
40
40
|
if s.respond_to? :specification_version then
|
41
41
|
s.specification_version = 4
|
42
42
|
|
43
43
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
44
|
-
s.add_runtime_dependency(%q<coderunner
|
45
|
-
s.add_development_dependency(%q<shoulda
|
46
|
-
s.add_development_dependency(%q<rdoc
|
47
|
-
s.add_development_dependency(%q<bundler
|
48
|
-
s.add_development_dependency(%q<jeweler
|
44
|
+
s.add_runtime_dependency(%q<coderunner>.freeze, [">= 0.11.0"])
|
45
|
+
s.add_development_dependency(%q<shoulda>.freeze, [">= 0"])
|
46
|
+
s.add_development_dependency(%q<rdoc>.freeze, ["~> 3.12"])
|
47
|
+
s.add_development_dependency(%q<bundler>.freeze, ["> 1.0.0"])
|
48
|
+
s.add_development_dependency(%q<jeweler>.freeze, [">= 1.8.4"])
|
49
49
|
else
|
50
|
-
s.add_dependency(%q<coderunner
|
51
|
-
s.add_dependency(%q<shoulda
|
52
|
-
s.add_dependency(%q<rdoc
|
53
|
-
s.add_dependency(%q<bundler
|
54
|
-
s.add_dependency(%q<jeweler
|
50
|
+
s.add_dependency(%q<coderunner>.freeze, [">= 0.11.0"])
|
51
|
+
s.add_dependency(%q<shoulda>.freeze, [">= 0"])
|
52
|
+
s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
|
53
|
+
s.add_dependency(%q<bundler>.freeze, ["> 1.0.0"])
|
54
|
+
s.add_dependency(%q<jeweler>.freeze, [">= 1.8.4"])
|
55
55
|
end
|
56
56
|
else
|
57
|
-
s.add_dependency(%q<coderunner
|
58
|
-
s.add_dependency(%q<shoulda
|
59
|
-
s.add_dependency(%q<rdoc
|
60
|
-
s.add_dependency(%q<bundler
|
61
|
-
s.add_dependency(%q<jeweler
|
57
|
+
s.add_dependency(%q<coderunner>.freeze, [">= 0.11.0"])
|
58
|
+
s.add_dependency(%q<shoulda>.freeze, [">= 0"])
|
59
|
+
s.add_dependency(%q<rdoc>.freeze, ["~> 3.12"])
|
60
|
+
s.add_dependency(%q<bundler>.freeze, ["> 1.0.0"])
|
61
|
+
s.add_dependency(%q<jeweler>.freeze, [">= 1.8.4"])
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
data/lib/budgetcrmod/budget.rb
CHANGED
@@ -1,8 +1,20 @@
|
|
1
|
+
class Float
|
2
|
+
def to_str
|
3
|
+
sprintf("%.2f", self)
|
4
|
+
end
|
5
|
+
def to_s
|
6
|
+
sprintf("%.2f", self)
|
7
|
+
end
|
8
|
+
end
|
1
9
|
require 'date'
|
2
10
|
class String
|
3
11
|
def latex_escape
|
4
12
|
self.gsub(/(?<!\\)([%_&^])/, '\\\\\1')
|
5
13
|
end
|
14
|
+
#alias :old_to_f :to_f
|
15
|
+
#def to_f
|
16
|
+
#gsub(/,/, '').old_to_f
|
17
|
+
#end
|
6
18
|
end
|
7
19
|
|
8
20
|
class Date
|
@@ -45,7 +57,7 @@ class CodeRunner
|
|
45
57
|
# "4506.80"]
|
46
58
|
#
|
47
59
|
@component_results = [:date, :type, :sc, :ac, :description, :deposit, :withdrawal, :balance]
|
48
|
-
@results = [:data, :data_line] + @component_results
|
60
|
+
@results = [:date_i, :data, :data_line] + @component_results
|
49
61
|
def generate_input_file
|
50
62
|
FileUtils.cp @data_file.sub(/~/, ENV['HOME']), @directory + '/data.cvs'
|
51
63
|
end
|
@@ -69,23 +81,46 @@ class CodeRunner
|
|
69
81
|
def process_directory_code_specific
|
70
82
|
@status=:Complete
|
71
83
|
data = File.read('data.cvs')
|
72
|
-
|
84
|
+
#p ['encoding', data.encoding]
|
85
|
+
#data.encode(Encoding::UTF_8)
|
86
|
+
tries = 1
|
87
|
+
begin
|
88
|
+
data = data.split(/\n\r|\r\n|\n|\r/)
|
89
|
+
rescue
|
90
|
+
#require 'ensure/encoding.rb'
|
91
|
+
if tries > 0
|
92
|
+
if tries==1
|
93
|
+
#data.force_encoding('iso-8859-1')
|
94
|
+
data = File.read('data.cvs', encoding: "ISO-8859-1")
|
95
|
+
data = data.encode('utf-8')
|
96
|
+
end
|
97
|
+
tries-=1
|
98
|
+
retry
|
99
|
+
end
|
100
|
+
end
|
101
|
+
if data[0] =~ /^\d{2} \w{3} \d\d,/ # BarclayCard format
|
102
|
+
data.unshift 'date,description,type,user,expensetype,withdrawal,withdrawal'
|
103
|
+
end
|
104
|
+
|
105
|
+
@first_line_string = data[0].dup
|
106
|
+
data = data.map do |line|
|
73
107
|
matches = line.scan(Regexp.new("((?:#{DOUBLE_STRING}|[^,])*)(?:,|$)"))
|
74
108
|
matches.flatten
|
75
109
|
end
|
76
110
|
#pp data
|
77
111
|
@data = data
|
78
112
|
@first_line = @data.shift.join(',')
|
113
|
+
generate_component_runs
|
79
114
|
end
|
80
|
-
def reversed?
|
115
|
+
#def reversed?
|
81
116
|
#case account_type(@account)
|
82
117
|
#when :Asset
|
83
|
-
|
118
|
+
#@first_line =~ /Debit.*Credit/
|
84
119
|
#end
|
85
|
-
end
|
120
|
+
#end
|
86
121
|
def print_out_line
|
87
122
|
if @is_component
|
88
|
-
sprintf("%4d. %10s %10s %3s %-
|
123
|
+
sprintf("%4d. %10s %10s %3s %-40s %8s %8s %8s %8s %8s", id, account, *rcp.component_results.find_all{|r| r!=:ac and r!=:sc}.map{|res| send(res).to_s.gsub(/\s+/, ' ')}, external_account, sub_account)
|
89
124
|
else
|
90
125
|
#pr = component_runs.sort_by{|r| r.id}
|
91
126
|
"#{sprintf("%3d", @id)}. #{sprintf("%-20s", @account)} Start: #{start_date} End: #{end_date} Final Balance: #{final_balance} "
|
@@ -108,36 +143,108 @@ class CodeRunner
|
|
108
143
|
def parameter_string
|
109
144
|
""
|
110
145
|
end
|
146
|
+
#def external_account
|
147
|
+
#name = super
|
148
|
+
#if ACCOUNT_INFO[name] and ACCOUNT_INFO[name][:currencies].size > 2
|
149
|
+
#end
|
150
|
+
#def sub_account
|
151
|
+
#end
|
152
|
+
|
153
|
+
def sub_account
|
154
|
+
cache[:sub_account] ||= super
|
155
|
+
end
|
156
|
+
def external_account
|
157
|
+
cache[:external_account] ||= super
|
158
|
+
end
|
111
159
|
|
112
160
|
#def external_account
|
113
|
-
#(
|
161
|
+
#(budget.to_s + '_' + sub_account.to_s).to_sym
|
114
162
|
#end
|
115
163
|
|
164
|
+
def csv_data_fields
|
165
|
+
case @first_line_string
|
166
|
+
when /Date,Type,Sort Code,Account Number,Description,In,Out,Balance/ # Old Lloyds Bank Format
|
167
|
+
[:date, :type, :sc, :ac, :description, :deposit, :withdrawal, :balance]
|
168
|
+
when /Transaction Date,Transaction Type,Sort Code,Account Number,Transaction Description,Debit Amount,Credit Amount,Balance/ # 2013 Lloyds Bank Format, NB they are using debit and credit as if the account is an equity account (when of course a bank account is really an asset)
|
169
|
+
[:date, :type, :sc, :ac, :description, :withdrawal, :deposit, :balance]
|
170
|
+
when /Date,Date entered,Reference,Description,Amount/ # Lloyds Credit Card statement
|
171
|
+
[:date, :dummy, :dummy, :description, :withdrawal]
|
172
|
+
when /date,description,type,user,expensetype,withdrawal,withdrawal/
|
173
|
+
[:date,:description,:type,:dummy,:dummy, :withdrawal, :withdrawal]
|
174
|
+
when /Datum,Transaktion,Kategori,Belopp,Saldo/ # Nordea.se privat, Belopp is positive when the asset increases
|
175
|
+
[:date,:description,:dummy,:deposit,:balance]
|
176
|
+
when /Bokföringsdatum,Transaktionsreferens,Mottagare,Belopp,Valuta/ # Forex.se privat, Belopp is positive when the asset increases
|
177
|
+
[:date,:description,:dummy,:deposit,:dummy]
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
#def withdrawn
|
182
|
+
#@withdrawn||0.0
|
183
|
+
#end
|
184
|
+
|
185
|
+
def has_balance?
|
186
|
+
@has_balance ||= csv_data_fields.include? :balance
|
187
|
+
end
|
188
|
+
|
189
|
+
attr_accessor :dummy
|
190
|
+
|
191
|
+
|
192
|
+
def set_zeroes
|
193
|
+
@withdrawal||=0.0
|
194
|
+
@deposit||=0.0
|
195
|
+
end
|
116
196
|
def generate_component_runs
|
197
|
+
#puts Kernel.caller
|
198
|
+
#p ['generate_component_runs', @component_runs.class, (@component_runs.size rescue nil), @runner.component_run_list.size, @directory]
|
199
|
+
return if @component_runs and @component_runs.size > 0
|
117
200
|
@runner.cache[:data] ||= []
|
118
|
-
reslts = rcp.component_results
|
119
|
-
if reversed?
|
120
|
-
reslts[5] = :withdrawal
|
121
|
-
reslts[6] = :deposit
|
122
|
-
end
|
201
|
+
#reslts = rcp.component_results
|
202
|
+
#if reversed?
|
203
|
+
#reslts[5] = :withdrawal
|
204
|
+
#reslts[6] = :deposit
|
205
|
+
#end
|
123
206
|
@data.each do |dataset|
|
124
|
-
next if @runner.cache[:data].include? dataset and Date.parse(dataset[0]) > Date.parse("1/1/2013")
|
207
|
+
#next if @runner.cache[:data].include? dataset and Date.parse(dataset[0]) > Date.parse("1/1/2013")
|
208
|
+
next if @runner.component_run_list.map{|k,v| v.instance_variable_get(:@dataset)}.include? dataset and Date.parse(dataset[0]) > Date.parse("1/1/2013")
|
209
|
+
next if @first_line_string =~ /^Datum/ and dataset[1] =~ /Reservation/
|
125
210
|
component = create_component
|
211
|
+
ep 'Generating Component', @component_runs.size
|
212
|
+
reslts = csv_data_fields
|
126
213
|
reslts.each_with_index do |res,index|
|
127
214
|
value = dataset[index]
|
128
|
-
#
|
215
|
+
#ep value
|
129
216
|
value = Date.parse value if res == :date
|
130
|
-
|
217
|
+
if [:deposit, :withdrawal, :balance].include? res
|
218
|
+
case @first_line_string
|
219
|
+
when /^Datum/i # we are dealing with European numbers
|
220
|
+
value = value.gsub(/[."]/, '')
|
221
|
+
value = value.sub(/[,]/, '.')
|
222
|
+
else
|
223
|
+
value = value.gsub(/[",]/, '')
|
224
|
+
end
|
225
|
+
next unless value =~ /\d/
|
226
|
+
value = value.to_f
|
227
|
+
end
|
228
|
+
component.instance_variable_set(:@dataset, dataset)
|
131
229
|
component.set(res, value)
|
230
|
+
component.set_zeroes
|
132
231
|
component.set(:data_line, reslts.map{|r| component.send(r).to_s}.join(','))
|
232
|
+
component.date_i = component.date.to_datetime.to_time.to_i
|
133
233
|
end
|
234
|
+
if component.deposit < 0.0 and component.withdrawal == 0.0
|
235
|
+
component.withdrawal = -component.deposit
|
236
|
+
component.deposit = 0.0
|
237
|
+
end
|
134
238
|
@runner.cache[:data].push dataset
|
239
|
+
component.external_account; component.sub_account # Triggers interactive account choices
|
135
240
|
#component.account = @account
|
136
241
|
end
|
137
242
|
end
|
138
243
|
def days_ago(today = Date.today)
|
139
244
|
#ep ['today', today, date]
|
140
245
|
# sprintf("%04d%02d%02d", date.year, date.month, date.day).to_i
|
246
|
+
#cache[:days_ago] ||= {}
|
247
|
+
#cache[:days_ago][today.to_s] ||=
|
141
248
|
- ((date.to_datetime.to_time.to_i - today.to_datetime.to_time.to_i) / 24 / 3600).to_i
|
142
249
|
end
|
143
250
|
def idate
|
@@ -312,8 +419,10 @@ class CodeRunner
|
|
312
419
|
kit.data.each{|dk| dk.gp.using = "1:2"}
|
313
420
|
kit.gp.xdata = "time"
|
314
421
|
kit.gp.format = %[x "%d %B %Y"]
|
422
|
+
kit.gp.format = %[x "%b %Y"]
|
423
|
+
kit.gp.mxtics = "30"
|
315
424
|
kit.gp.xtics = "rotate by 340 offset 0,-0.5 #{24*3600*14}"
|
316
|
-
kit.gp.xtics = "rotate by 340 offset 0,-0.5 "
|
425
|
+
kit.gp.xtics = "rotate by 340 offset 0,-0.5 2629746"
|
317
426
|
end
|
318
427
|
|
319
428
|
def self.print_budget(options={})
|
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.1
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Edmund Highcock
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coderunner
|
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
120
|
version: '0'
|
121
121
|
requirements: []
|
122
122
|
rubyforge_project:
|
123
|
-
rubygems_version: 2.
|
123
|
+
rubygems_version: 2.6.8
|
124
124
|
signing_key:
|
125
125
|
specification_version: 4
|
126
126
|
summary: A CodeRunner module to help you do your budget
|