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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cd1d0b4f3a58bce91cd2ad56229fed7e745a73fb
4
- data.tar.gz: 9e7aa5398882fa4f219eb78fcb6f97e518550b88
3
+ metadata.gz: 9a1ed45d12e5021db3fce47df4b4ba1a5e93d8c9
4
+ data.tar.gz: 34f6c04868dc0b676e3aba3e9ae681ffb7c95549
5
5
  SHA512:
6
- metadata.gz: 13cb28562e021786af1945ad3e050dfdb016d3effd719fab216edb58d0330bb400243abf8b303bc71326ea5dcddd60120e49d2897ef109268b8603a3f3ec5313
7
- data.tar.gz: 4fa8496fb757cdffdba9eaf10a480ed2d2942723c82ce6690eb62b676951fa4bb2ac16947611d5815f9c8b032d2a8c4acfc16d3d0fbfaeb3597cff276b4cfa50
6
+ metadata.gz: 65178bcb5e47004f7e8e34500fcbc764821bcf8ac0e2c67f3107d3fc31b6ce9715c5e176077fb6c5728dcdd4ed5c06e8b5b06414d6b93595b3c715a1da6d8cb3
7
+ data.tar.gz: 5097b5c98f9028f75b90a42280d15d225b9ee3b326060ddd7bfdbb41877c6937e2ed9c47b90862c53d37fda61dc453bbbd85a429ab91ae7ea9514113800ab1ba
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.0
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.0 ruby lib
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.0"
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 = "2014-06-02"
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.2.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>, [">= 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"])
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>, [">= 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"])
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>, [">= 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"])
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
 
@@ -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
- data = data.split("\n").map do |line|
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
- @first_line =~ /Debit.*Credit/
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 %-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)
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
- #(sub_account.to_s + '_' + budget.to_s).to_sum
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
- # ep value
215
+ #ep value
129
216
  value = Date.parse value if res == :date
130
- value = value.to_f if [:deposit, :withdrawal, :balance].include? res
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.0
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: 2014-06-02 00:00:00.000000000 Z
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.2.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