lucabook 0.2.20 → 0.2.21

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
  SHA256:
3
- metadata.gz: 82bb098ac3acfbb37c600908b75174c34a665f4d7c9003d9956738783bb9a617
4
- data.tar.gz: b963a24873e226c898c7b14dba4cf21edaacf4cfdc9f7e6eeab0d04959fa788b
3
+ metadata.gz: 3f7366698bee6b770fbae39f8fe650e1f460b04dec25c8036c84013f970adaa3
4
+ data.tar.gz: 8ecbf412b31f001f0cfa2de27ceb879463d17f28e3db552770866b44c0b73114
5
5
  SHA512:
6
- metadata.gz: b56ef4dd42ee782bf488cd50e6992415d878f388663ed0fb4f983f7353310ea53a2a0a4e1d94be5f06b51102eb73f7e9d0a7404a05cdccf6487248a1041196d3
7
- data.tar.gz: 12cfe5f1194d34236ebe69541a9d4b0adf3333a39c1e73024ce0d3ad43639e4147ab48c19c5fc52e08bcbe6473821c850189c0b81e252101456ce70eea80a3c4
6
+ metadata.gz: e30fabd50119ad470c90512bcf066b3992b5df2d67139f437a5f4336d73c843fb65dab2a70b5914c190155de68f82ec722840e0f056079061634f77bb5da4964
7
+ data.tar.gz: 3e8775200e05f8bfe0923b53690fa5245441ea4d71768246a7309ee503294d847a466e82da85568d3071f47eccd4f9783a79199b4d4eb630c961de84488a31ed
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/ruby
2
2
 
3
+ require 'json'
3
4
  require 'optparse'
4
5
  require 'luca_book'
5
6
 
6
- module LucaCmd
7
- class Journal
7
+ class LucaCmd
8
+ class Journal < LucaCmd
8
9
  def self.import(args, params)
9
10
  if params['config']
10
11
  LucaBook::Import.new(args[0], params['config']).import_csv
@@ -17,43 +18,56 @@ module LucaCmd
17
18
  end
18
19
 
19
20
  def self.list(args, params)
20
- args = LucaCmd.gen_range(params[:n] || 1) if args.empty?
21
+ args = gen_range(params[:n] || 1) if args.empty?
21
22
  if params['code']
22
- LucaBook::List.term(*args, code: params['code']).list_on_code.to_yaml
23
+ render(LucaBook::List.term(*args, code: params['code']).list_on_code, params)
23
24
  else
24
- LucaBook::List.term(*args).list_journals.to_yaml
25
+ render(LucaBook::List.term(*args).list_journals, params)
25
26
  end
26
27
  end
27
28
 
28
29
  def self.stats(args, params)
29
- args = LucaCmd.gen_range(params[:n]) if args.empty?
30
- LucaBook::State.term(*args).stats(params[:level])
30
+ args = gen_range(params[:n]) if args.empty?
31
+ if params['code']
32
+ render(LucaBook::State.by_code(params['code'], *args), params)
33
+ else
34
+ render(LucaBook::State.term(*args).stats(params[:level]), params)
35
+ end
31
36
  end
32
37
  end
33
38
 
34
- class Report
39
+ class Report < LucaCmd
35
40
  def self.balancesheet(args, params)
36
41
  level = params[:level] || 3
37
42
  legal = params[:legal] || false
38
- args = LucaCmd.gen_range(params[:n] || 1) if args.empty?
39
- LucaBook::State.term(*args).bs(level, legal: legal)
43
+ args = gen_range(params[:n] || 1) if args.empty?
44
+ render(LucaBook::State.term(*args).bs(level, legal: legal), params)
40
45
  end
41
46
 
42
47
  def self.profitloss(args, params)
43
48
  level = params[:level] || 2
44
- args = LucaCmd.gen_range(params[:n]) if args.empty?
45
- LucaBook::State.term(*args).pl(level).to_yaml
49
+ args = gen_range(params[:n]) if args.empty?
50
+ render(LucaBook::State.term(*args).pl(level), params)
46
51
  end
47
52
  end
48
53
 
49
- module_function
50
-
51
- def gen_range(count)
54
+ def self.gen_range(count)
52
55
  count ||= 3
53
56
  today = Date.today
54
57
  start = today.prev_month(count - 1)
55
58
  [start.year, start.month, today.year, today.month]
56
59
  end
60
+
61
+ def self.render(dat, params)
62
+ case params[:output]
63
+ when 'json'
64
+ puts JSON.dump(dat)
65
+ when 'nu'
66
+ LucaSupport::View.nushell(YAML.dump(dat))
67
+ else
68
+ puts YAML.dump(dat)
69
+ end
70
+ end
57
71
  end
58
72
 
59
73
  def new_pj(args = nil, params = {})
@@ -81,6 +95,8 @@ when /journals?/, 'j'
81
95
  opt.banner = 'Usage: luca-book journals list [options] [YYYY M]'
82
96
  opt.on('-c', '--code VAL', 'search with code') { |v| params['code'] = v }
83
97
  opt.on('-n VAL', 'report count') { |v| params[:n] = v.to_i }
98
+ opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
99
+ opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
84
100
  opt.on_tail('List records. If you specify code and/or month, search on each criteria.')
85
101
  args = opt.parse!(ARGV)
86
102
  LucaCmd::Journal.list(args, params)
@@ -88,7 +104,10 @@ when /journals?/, 'j'
88
104
  when 'stats'
89
105
  OptionParser.new do |opt|
90
106
  opt.banner = 'Usage: luca-book journals stats [options] [YYYY M]'
107
+ opt.on('-c', '--code VAL', 'search with code') { |v| params['code'] = v }
91
108
  opt.on('-n VAL', 'report count') { |v| params[:n] = v.to_i }
109
+ opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
110
+ opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
92
111
  args = opt.parse!(ARGV)
93
112
  LucaCmd::Journal.stats(args, params)
94
113
  end
@@ -116,6 +135,8 @@ when /reports?/, 'r'
116
135
  opt.banner = 'Usage: luca-book reports bs [options] [YYYY M]'
117
136
  opt.on('-l', '--level VAL', 'account level') { |v| params[:level] = v.to_i }
118
137
  opt.on('--legal', 'show legal mandatory account') { |_v| params[:legal] = true }
138
+ opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
139
+ opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
119
140
  args = opt.parse!(ARGV)
120
141
  LucaCmd::Report.balancesheet(args, params)
121
142
  end
@@ -124,6 +145,8 @@ when /reports?/, 'r'
124
145
  opt.banner = 'Usage: luca-book reports pl [options] [YYYY M YYYY M]'
125
146
  opt.on('-l', '--level VAL', 'account level') { |v| params[:level] = v.to_i }
126
147
  opt.on('-n VAL', 'report count') { |v| params[:n] = v.to_i }
148
+ opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
149
+ opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
127
150
  args = opt.parse!(ARGV)
128
151
  LucaCmd::Report.profitloss(args, params)
129
152
  end
@@ -47,7 +47,7 @@ module LucaBook
47
47
  res['note'] = dat[:note]
48
48
  end
49
49
  end
50
- self
50
+ readable(@data)
51
51
  end
52
52
 
53
53
  def list_journals
@@ -65,7 +65,7 @@ module LucaBook
65
65
  res['note'] = dat[:note]
66
66
  end
67
67
  end
68
- self
68
+ readable(@data)
69
69
  end
70
70
 
71
71
  def accumulate_code
@@ -56,21 +56,33 @@ module LucaBook
56
56
  new(reports, counts, date: Date.new(from_year.to_i, from_month.to_i, -1))
57
57
  end
58
58
 
59
- def by_code(code, year=nil, month=nil)
60
- raise 'not supported year range yet' if ! year.nil? && month.nil?
61
-
62
- balance = @book.load_start.dig(code) || 0
63
- full_term = self.class.scan_terms
64
- if ! month.nil?
65
- pre_term = full_term.select { |y, m| y <= year.to_i && m < month.to_i }
66
- balance += pre_term.map { |y, m| self.class.net(y, m)}.inject(0){|sum, h| sum + h[code] }
67
- [{ code: code, balance: balance, note: "#{code} #{@dict.dig(code, :label)}" }] + records_with_balance(year, month, code, balance)
68
- else
69
- start = { code: code, balance: balance, note: "#{code} #{@dict.dig(code, :label)}" }
70
- full_term.map { |y, m| y }.uniq.map { |y|
71
- records_with_balance(y, nil, code, balance)
72
- }.flatten.prepend(start)
59
+ def self.by_code(code, from_year, from_month, to_year = from_year, to_month = from_month)
60
+ date = Date.new(from_year.to_i, from_month.to_i, -1)
61
+ last_date = Date.new(to_year.to_i, to_month.to_i, -1)
62
+ raise 'invalid term specified' if date > last_date
63
+
64
+ reports = [].tap do |r|
65
+ while date <= last_date do
66
+ diff = {}.tap do |h|
67
+ g = gross(date.year, date.month, code)
68
+ sum = g.dig(:debit).nil? ? BigDecimal('0') : Util.calc_diff(g[:debit], code)
69
+ sum -= g.dig(:credit).nil? ? BigDecimal('0') : Util.calc_diff(g[:credit], code)
70
+ h['code'] = code
71
+ h['label'] = LucaRecord::Dict.load('base.tsv').dig(code, :label)
72
+ h['net'] = sum
73
+ h['debit_amount'] = g[:debit]
74
+ h['debit_count'] = g[:debit_count]
75
+ h['credit_amount'] = g[:credit]
76
+ h['credit_count'] = g[:credit_count]
77
+ h['_d'] = date.to_s
78
+ end
79
+ r << diff
80
+ date = Date.new(date.next_month.year, date.next_month.month, -1)
81
+ end
73
82
  end
83
+ #YAML.dump(LucaSupport::Code.readable(reports)) #.tap{ |data| puts data }
84
+ #new(reports, counts, date: Date.new(from_year.to_i, from_month.to_i, -1))
85
+ LucaSupport::Code.readable(reports)
74
86
  end
75
87
 
76
88
  def records_with_balance(year, month, code, balance)
@@ -114,7 +126,6 @@ module LucaBook
114
126
  end
115
127
  keys.map! { |k| k[0, level] }.uniq.select! { |k| k.length <= level } if level
116
128
  @count.prepend({}.tap { |header| keys.each { |k| header[k] = @dict.dig(k, :label) }})
117
- puts YAML.dump(@count)
118
129
  @count
119
130
  end
120
131
 
@@ -137,8 +148,7 @@ module LucaBook
137
148
  end
138
149
  end
139
150
  end
140
- puts YAML.dump(readable(@statement))
141
- self
151
+ readable(@statement)
142
152
  end
143
153
 
144
154
  def accumulate_balance(monthly_diffs)
@@ -182,7 +192,7 @@ module LucaBook
182
192
  end
183
193
  @statement << term.tap { |h| h['_d'] = 'Period Total' }
184
194
  @statement << fy.tap { |h| h['_d'] = 'FY Total' }
185
- self
195
+ readable(code2label)
186
196
  end
187
197
 
188
198
  def self.accumulate_term(start_year, start_month, end_year, end_month)
@@ -297,7 +307,7 @@ module LucaBook
297
307
 
298
308
  sum = { debit: {}, credit: {}, debit_count: {}, credit_count: {} }
299
309
  idx_memo = []
300
- asof(year, month) do |f, _path|
310
+ search(year, month, nil, code) do |f, _path|
301
311
  CSV.new(f, headers: false, col_sep: "\t", encoding: 'UTF-8')
302
312
  .each_with_index do |row, i|
303
313
  break if i >= rows
@@ -305,17 +315,23 @@ module LucaBook
305
315
  case i
306
316
  when 0
307
317
  idx_memo = row.map(&:to_s)
318
+ next if code && !idx_memo.include?(code)
319
+
308
320
  idx_memo.each do |r|
309
321
  sum[:debit][r] ||= BigDecimal('0')
310
322
  sum[:debit_count][r] ||= 0
311
323
  end
312
324
  when 1
325
+ next if code && !idx_memo.include?(code)
326
+
313
327
  row.each_with_index do |r, j|
314
328
  sum[:debit][idx_memo[j]] += BigDecimal(r.to_s)
315
329
  sum[:debit_count][idx_memo[j]] += 1
316
330
  end
317
331
  when 2
318
332
  idx_memo = row.map(&:to_s)
333
+ break if code && !idx_memo.include?(code)
334
+
319
335
  idx_memo.each do |r|
320
336
  sum[:credit][r] ||= BigDecimal('0')
321
337
  sum[:credit_count][r] ||= 0
@@ -330,6 +346,12 @@ module LucaBook
330
346
  end
331
347
  end
332
348
  end
349
+ if code
350
+ sum[:debit] = sum[:debit][code] || BigDecimal('0')
351
+ sum[:credit] = sum[:credit][code] || BigDecimal('0')
352
+ sum[:debit_count] = sum[:debit_count][code] || 0
353
+ sum[:credit_count] = sum[:credit_count][code] || 0
354
+ end
333
355
  sum
334
356
  end
335
357
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LucaBook
4
- VERSION = '0.2.20'
4
+ VERSION = '0.2.21'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lucabook
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.20
4
+ version: 0.2.21
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chuma Takahiro
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-11-21 00:00:00.000000000 Z
11
+ date: 2020-11-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lucarecord