gnucash2bmd 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 501affd56837d858bf0df493370866f483bb703c
4
- data.tar.gz: '09e3714dc472c4e08b31577c3d2f40481123affb'
3
+ metadata.gz: 0ec98047035b2e2fd232e4450a0f18037ed59176
4
+ data.tar.gz: 7a0813cad9b10972ec58dfdfad208ad7f5f81836
5
5
  SHA512:
6
- metadata.gz: 17b0da69b647a1ec46133b2ddb07b43185b9bc86dabafe2e4e80c53c2a0fbf518d3e85e6f4e2a221c9bca5ec0727ca0cd39b8de6bdf951ad6500434f69d126d0
7
- data.tar.gz: 3dd2c1f0357c9e9576efc6fcc835573fa7315b71dea3fe95d2b95a58e1c9cb9d3dd5b0d2403e7c821f461cb700fb159e78e0a1524532a151561a9f38c4cb08eb
6
+ metadata.gz: a981030fc377f59f39258f8219f272e44f0883796729233f598eea30ce84ef5d5cce482d846cedbd34e5140fb0d55c7aeb46e5d9ac75013b9614caf76333e740
7
+ data.tar.gz: b77bd6342f27e07b6be1e01c832aa276e2811deb9eee7156990a0ed419683570389d49b2ad6f301999c5602c598b572ea17bcb1881c118af80c92d094e0eb85e
data/gnucash2bmd.gemspec CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.require_paths = ["lib"]
18
18
 
19
19
  spec.add_dependency 'trollop'
20
- spec.add_dependency 'oga'
20
+ spec.add_dependency 'gnucash'
21
21
 
22
22
  spec.add_development_dependency "bundler"
23
23
  spec.add_development_dependency "rake"
data/history.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.0.3 of 2017.05.26
2
+
3
+ - Added reading gnucash files directly
4
+
1
5
  ## 0.0.2 of 2017.05.26
2
6
 
3
7
  - Force col-sep to ';', force quotes for BMD importer
@@ -1,3 +1,3 @@
1
1
  module Gnucash2Bmd
2
- VERSION = '0.0.2'
2
+ VERSION = '0.0.3'
3
3
  end
data/lib/gnucash2bmd.rb CHANGED
@@ -6,6 +6,9 @@ require 'csv'
6
6
  require 'ostruct'
7
7
  require 'gnucash2bmd/version'
8
8
  require 'pp'
9
+ require "gnucash"
10
+ require 'zlib'
11
+
9
12
  begin
10
13
  require 'pry'
11
14
  rescue LoadError
@@ -34,6 +37,7 @@ Wobei folgende Optionen vorhanden sind:
34
37
  EOS
35
38
  opt :jahr, "Jahr des Gnucas-Exports", :type => :integer, :default=> OLD_YEAR
36
39
  opt :ausgabe, "Name der erstellten Datei", :type => :string, :default =>"bmd_#{OLD_YEAR}.csv"
40
+ opt :gnucash, "Name der zu lesenden Gnucash-Datei", :type => :string, :default => nil
37
41
  end
38
42
 
39
43
  files_read = [
@@ -41,6 +45,8 @@ files_read = [
41
45
  ]
42
46
 
43
47
  AUSGABE = opts[:ausgabe]
48
+ GNUCASH = opts[:gnucash]
49
+ DATE_FORMAT= '%Y.%m.%d'
44
50
 
45
51
  KONTEN_GNUCASH_HEADERS = {
46
52
  'type' => nil,
@@ -76,7 +82,6 @@ KONTEN_JOURNAL_HEADERS = {
76
82
  }
77
83
  Mandant_ID = 1
78
84
 
79
- BMD_LINE = OpenStruct.new
80
85
  BANK_GUIDS ||= {}
81
86
  IDS = {
82
87
  :satzart => 'satzart',
@@ -91,6 +96,13 @@ KONTEN_JOURNAL_HEADERS = {
91
96
  :belegnr => 'belegnr',
92
97
  :buchcode => 'buchcode',
93
98
  }
99
+ BMD_LINE = eval("Struct.new( :#{IDS.keys.join(', :')})")
100
+ class BMD_LINE
101
+ attr_accessor :name, :name_voll
102
+ def satzart
103
+ 0
104
+ end
105
+ end
94
106
  class Helpers
95
107
  IDS.each do |id, name|
96
108
  eval("attr_accessor :#{id}")
@@ -98,10 +110,6 @@ KONTEN_JOURNAL_HEADERS = {
98
110
  def id_to_name(id)
99
111
  return @@ids[ide]
100
112
  end
101
- def self.new_account
102
- info = OpenStruct.new(:satzart =>0)
103
- return info
104
- end
105
113
  def self.search_bank_guid(konto_bezeichung)
106
114
  if value = BANK_GUIDS.key(konto_bezeichung)
107
115
  return value
@@ -127,7 +135,7 @@ def read_accounts(filename)
127
135
  name_voll = row[1]
128
136
  bezeichung = row[2]
129
137
  next unless bezeichung && bezeichung.size > 0
130
- bmd = Helpers.new_account
138
+ bmd = BMD_LINE.new
131
139
  bmd.bank_guid = Helpers.search_bank_guid(bezeichung)
132
140
  bmd.account_nr = bezeichung
133
141
  @contents << bmd
@@ -144,7 +152,7 @@ end
144
152
  def read_journal(filename)
145
153
  line_nr = 0
146
154
  @bmd = nil
147
- @mehrteilig
155
+ @mehrteilig = nil
148
156
  @buchungs_nr = 0 # Will be added by column Aktion
149
157
  puts "reading journal from #{filename}"
150
158
  CSV.foreach(filename) do |row|
@@ -161,7 +169,7 @@ def read_journal(filename)
161
169
  @contents << @bmd if @bmd # save terminated
162
170
  @buchungs_nr += 1
163
171
  @mehrteilig = row[6] && /mehrteilig/i.match(row[6])
164
- @bmd = Helpers.new_account
172
+ @bmd = BMD_LINE.new
165
173
  @bmd.buchdatum = row[0]
166
174
  @bmd.konto = Helpers.search_bank_guid(row[1])
167
175
  @bmd.buchungstext = row[3]
@@ -202,15 +210,15 @@ def check_cmd(filename)
202
210
  exit 2
203
211
  end
204
212
  end
205
- puts "All #{idx} lines of #{filename} have #{nr_rows} elements"
213
+ puts "Alle #{idx} Zeilen von #{filename} haben #{nr_rows} Elemente"
206
214
  rescue => error
207
215
  puts "got #{error} at line #{idx}"
208
216
  end
209
217
 
210
218
  def emit_bmd(filename)
211
- CSV.open(filename, "wb", :encoding => 'UTF-8', :force_quotes => true, :col_sep => ';') do |csv|
219
+ CSV.open(filename, "wb", :encoding => 'UTF-8', :col_sep => ';') do |csv|
212
220
  csv << IDS.values
213
- @contents.each do |content|
221
+ @contents.uniq.each do |content|
214
222
  value_array = []
215
223
  IDS.keys.each do |key|
216
224
  begin
@@ -224,12 +232,89 @@ def emit_bmd(filename)
224
232
  end
225
233
  end
226
234
 
227
- read_accounts("Konten#{OLD_YEAR}.csv")
228
- BANK_GUIDS.freeze
229
- files_read.each do |filename|
230
- read_journal(filename)
235
+ def read_gnucash(filename)
236
+ puts "Lese GnuCash Datei #{filename}"
237
+ book = Gnucash.open(filename)
238
+ book.accounts.each do |account|
239
+ bmd = BMD_LINE.new
240
+ # bmd.bank_guid = Helpers.search_bank_guid(account.name)
241
+ bmd.bank_guid = account.id
242
+ bmd.name = account.name
243
+ bmd.name_voll = account.full_name
244
+ bmd.account_nr = account.description
245
+ $stdout.puts "bmd; #{bmd}" if $VERBOSE
246
+ @contents << bmd
247
+ end
248
+ @first_transaction_date = nil
249
+ @last_transaction_date = nil
250
+ @buchungs_nr = 0
251
+ book.accounts.each do |account|
252
+ balance = Gnucash::Value.zero
253
+ account.transactions.each do |txn|
254
+ balance += txn.value
255
+ @buchungs_nr += 1
256
+ # $VERBOSE = true if /-408.00/.match(txn.value.to_s)
257
+ $stdout.puts(sprintf("%s %8s %8s %s",
258
+ txn.date,
259
+ txn.value,
260
+ balance,
261
+ txn.description)) if $VERBOSE
262
+ @buchung = BMD_LINE.new
263
+ @buchung.buchdatum = txn.date.strftime(DATE_FORMAT)
264
+ @last_transaction_date = @buchung.buchdatum if !@last_transaction_date || @last_transaction_date < @buchung.buchdatum
265
+ @first_transaction_date = @buchung.buchdatum if !@first_transaction_date || @first_transaction_date > @buchung.buchdatum
266
+ @buchung.buchungstext = txn.description
267
+ @buchung.belegnr = txn.id # or @buchungs_nr ?? TODO
268
+
269
+ if txn.splits.size == 2
270
+ @buchung.konto = txn.splits.first[:account].id
271
+ @buchung.gkonto = txn.splits.last[:account].id
272
+ @buchung.betrag = txn.splits.first[:value]
273
+ @buchung.buchcode = getBuchcode(txn.splits.first[:value])
274
+ @contents << @buchung
275
+ else
276
+ # Splittbuchungen werden vom Programm automatisch erkannt, wenn in mehreren aufeinanderfolgenden Buchungszeilen folgende Felder identisch sind:
277
+ # Konto
278
+ # Belegnr
279
+ # Belegdatum
280
+ gegenbuchungen = []
281
+ txn.splits.each_with_index do |split, idx|
282
+ $stdout.puts(sprintf("idx %d: %s %8s %8s",
283
+ idx,
284
+ split[:quantity],
285
+ split[:value],
286
+ split[:account].id,
287
+ ))
288
+ end if $VERBOSE
289
+ txn.splits.each_with_index do |split, idx|
290
+ if txn.value.to_s.eql?(split[:value].to_s)
291
+ @buchung.konto = split[:account].id
292
+ @buchung.betrag = split[:value]
293
+ @buchung.buchcode = getBuchcode(split[:value])
294
+ else
295
+ gegenbuchung = @buchung.clone
296
+ gegenbuchung.gkonto = split[:account].id
297
+ gegenbuchung.betrag = split[:value]
298
+ gegenbuchung.buchcode = getBuchcode(split[:value])
299
+ gegenbuchungen << gegenbuchung
300
+ end
301
+ end
302
+ gegenbuchungen.each do |info| info.konto = @buchung.konto; @contents << info; end
303
+ end
304
+ end
305
+ end
306
+ puts "Las #{@buchungs_nr} Buchungen von #{filename} vom #{@first_transaction_date} bis zum #{@last_transaction_date}"
307
+ end
308
+ if GNUCASH
309
+ read_gnucash(GNUCASH)
310
+ else
311
+ read_accounts("Konten#{OLD_YEAR}.csv")
312
+ BANK_GUIDS.freeze
313
+ files_read.each do |filename|
314
+ read_journal(filename)
315
+ end
231
316
  end
232
317
  emit_bmd(AUSGABE)
233
318
  check_cmd(AUSGABE)
234
319
 
235
- puts "Created #{AUSGABE} with #{@contents.size} lines"
320
+ puts "Erstellte #{AUSGABE} mit #{@contents.size} Zeilen"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gnucash2bmd
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Niklaus Giger
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: oga
28
+ name: gnucash
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="