lucabook 0.2.26 → 0.2.27
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/exe/luca-book +6 -2
- data/lib/luca_book/accumulator.rb +18 -10
- data/lib/luca_book/list.rb +16 -20
- data/lib/luca_book/state.rb +27 -20
- data/lib/luca_book/util.rb +1 -1
- data/lib/luca_book/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ad4b1eba3419508d64bfeade5f776ed2ca0f32313deab25660864aff47767787
|
4
|
+
data.tar.gz: 57aef956cbc763dbf4d089d5745c9cc4d6a6ed44dd3ff726b9c80fbc6b29629d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 317b373f1a31c85c107dfa294ec6df0dcc89f13b8ab10277bb004b3bdceaaf0ec58cfa5c2220a088932965b5b156fd71fef1ce67be67c330857bbcea127de365
|
7
|
+
data.tar.gz: e7456d393a4309bafb9a3622c28da10067e1483c80b0bbbd73a05508bb3d9a6742051e2d190870a1f6e39df5ec10b5dd7d1de698faef969a3bc54efa7b46b153
|
data/exe/luca-book
CHANGED
@@ -24,7 +24,7 @@ class LucaCmd
|
|
24
24
|
if params['headers']
|
25
25
|
render(LucaBook::ListByHeader.term(*args, code: params['code'], header: params['headers']).list_by_code, params)
|
26
26
|
else
|
27
|
-
render(LucaBook::List.term(*args, code: params['code']).list_by_code, params)
|
27
|
+
render(LucaBook::List.term(*args, code: params['code'], recursive: params[:recursive]).list_by_code(params[:recursive]), params)
|
28
28
|
end
|
29
29
|
else
|
30
30
|
render(LucaBook::List.term(*args).list_journals, params)
|
@@ -34,7 +34,7 @@ class LucaCmd
|
|
34
34
|
def self.stats(args, params)
|
35
35
|
args = gen_range(params[:n]) if args.empty?
|
36
36
|
if params['code']
|
37
|
-
render(LucaBook::State.by_code(params['code'], *args), params)
|
37
|
+
render(LucaBook::State.by_code(params['code'], *args, recursive: params[:recursive]), params)
|
38
38
|
else
|
39
39
|
render(LucaBook::State.range(*args).stats(params[:level]), params)
|
40
40
|
end
|
@@ -124,9 +124,11 @@ when /journals?/, 'j'
|
|
124
124
|
LucaCmd::Journal.import(args, params)
|
125
125
|
end
|
126
126
|
when 'list'
|
127
|
+
params[:recursive] = false
|
127
128
|
OptionParser.new do |opt|
|
128
129
|
opt.banner = 'Usage: luca-book journals list [options] [YYYY M]'
|
129
130
|
opt.on('-c', '--code VAL', 'filter with code or label') { |v| params['code'] = v }
|
131
|
+
opt.on('-r', '--recursive', 'include subaccounts') { |_v| params[:recursive] = true }
|
130
132
|
opt.on('--customer', 'categorize by x-customer header') { |_v| params['headers'] = 'x-customer' }
|
131
133
|
opt.on('-n VAL', 'report count') { |v| params[:n] = v.to_i }
|
132
134
|
opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
|
@@ -146,9 +148,11 @@ when /journals?/, 'j'
|
|
146
148
|
LucaCmd::Journal.add_header(args, params)
|
147
149
|
end
|
148
150
|
when 'stats'
|
151
|
+
params[:recursive] = false
|
149
152
|
OptionParser.new do |opt|
|
150
153
|
opt.banner = 'Usage: luca-book journals stats [options] [YYYY M]'
|
151
154
|
opt.on('-c', '--code VAL', 'filter with code or label') { |v| params['code'] = v }
|
155
|
+
opt.on('-r', '--recursive', 'include subaccounts') { |_v| params[:recursive] = true }
|
152
156
|
opt.on('-n VAL', 'report count') { |v| params[:n] = v.to_i }
|
153
157
|
opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
|
154
158
|
opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
|
@@ -74,7 +74,7 @@ module LucaBook
|
|
74
74
|
|
75
75
|
# for assert purpose
|
76
76
|
#
|
77
|
-
def gross(start_year, start_month, end_year = nil, end_month = nil, code: nil, date_range: nil, rows: 4)
|
77
|
+
def gross(start_year, start_month, end_year = nil, end_month = nil, code: nil, date_range: nil, rows: 4, recursive: false)
|
78
78
|
if ! date_range.nil?
|
79
79
|
raise if date_range.class != Range
|
80
80
|
# TODO: date based range search
|
@@ -92,14 +92,14 @@ module LucaBook
|
|
92
92
|
case i
|
93
93
|
when 0
|
94
94
|
idx_memo = row.map(&:to_s)
|
95
|
-
next if code &&
|
95
|
+
next if code && idx_memo.select { |idx| /^#{code}/.match(idx) }.empty?
|
96
96
|
|
97
97
|
idx_memo.each do |r|
|
98
98
|
sum[:debit][r] ||= BigDecimal('0')
|
99
99
|
sum[:debit_count][r] ||= 0
|
100
100
|
end
|
101
101
|
when 1
|
102
|
-
next if code &&
|
102
|
+
next if code && idx_memo.select { |idx| /^#{code}/.match(idx) }.empty?
|
103
103
|
|
104
104
|
row.each_with_index do |r, j|
|
105
105
|
sum[:debit][idx_memo[j]] += BigDecimal(r.to_s)
|
@@ -107,7 +107,7 @@ module LucaBook
|
|
107
107
|
end
|
108
108
|
when 2
|
109
109
|
idx_memo = row.map(&:to_s)
|
110
|
-
break if code &&
|
110
|
+
break if code && idx_memo.select { |idx| /^#{code}/.match(idx) }.empty?
|
111
111
|
|
112
112
|
idx_memo.each do |r|
|
113
113
|
sum[:credit][r] ||= BigDecimal('0')
|
@@ -123,13 +123,21 @@ module LucaBook
|
|
123
123
|
end
|
124
124
|
end
|
125
125
|
end
|
126
|
-
if code
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
126
|
+
return sum if code.nil?
|
127
|
+
|
128
|
+
codes = if recursive
|
129
|
+
sum[:debit].keys.concat(sum[:credit].keys).uniq.select { |k| /^#{code}/.match(k) }
|
130
|
+
else
|
131
|
+
Array(code)
|
132
|
+
end
|
133
|
+
res = { debit: 0, credit: 0, debit_count: 0, credit_count: 0 }
|
134
|
+
codes.each do |code|
|
135
|
+
res[:debit] += sum[:debit][code] || BigDecimal('0')
|
136
|
+
res[:credit] += sum[:credit][code] || BigDecimal('0')
|
137
|
+
res[:debit_count] += sum[:debit_count][code] || 0
|
138
|
+
res[:credit_count] += sum[:credit_count][code] || 0
|
131
139
|
end
|
132
|
-
|
140
|
+
res
|
133
141
|
end
|
134
142
|
|
135
143
|
# netting vouchers in specified term
|
data/lib/luca_book/list.rb
CHANGED
@@ -21,13 +21,17 @@ module LucaBook #:nodoc:
|
|
21
21
|
@start = start_date
|
22
22
|
end
|
23
23
|
|
24
|
-
def self.term(from_year, from_month, to_year = from_year, to_month = from_month, code: nil, basedir: @dirname)
|
24
|
+
def self.term(from_year, from_month, to_year = from_year, to_month = from_month, code: nil, basedir: @dirname, recursive: false)
|
25
25
|
code = search_code(code) if code
|
26
26
|
data = LucaBook::Journal.term(from_year, from_month, to_year, to_month, code).select do |dat|
|
27
27
|
if code.nil?
|
28
28
|
true
|
29
29
|
else
|
30
|
-
|
30
|
+
if recursive
|
31
|
+
! [:debit, :credit].map { |key| serialize_on_key(dat[key], :code) }.flatten.select { |idx| /^#{code}/.match(idx) }.empty?
|
32
|
+
else
|
33
|
+
[:debit, :credit].map { |key| serialize_on_key(dat[key], :code) }.flatten.include?(code)
|
34
|
+
end
|
31
35
|
end
|
32
36
|
end
|
33
37
|
new data, Date.new(from_year.to_i, from_month.to_i, 1), code
|
@@ -43,13 +47,13 @@ module LucaBook #:nodoc:
|
|
43
47
|
end
|
44
48
|
end
|
45
49
|
|
46
|
-
def list_by_code
|
47
|
-
calc_code
|
50
|
+
def list_by_code(recursive = false)
|
51
|
+
calc_code(recursive: recursive)
|
48
52
|
convert_label
|
49
53
|
@data = [code_header] + @data.map do |dat|
|
50
54
|
date, txid = LucaSupport::Code.decode_id(dat[:id])
|
51
55
|
{}.tap do |res|
|
52
|
-
res['code'] = dat[:code]
|
56
|
+
res['code'] = dat[:code].length == 1 ? dat[:code].first : dat[:code]
|
53
57
|
res['date'] = date
|
54
58
|
res['no'] = txid
|
55
59
|
res['id'] = dat[:id]
|
@@ -99,30 +103,22 @@ module LucaBook #:nodoc:
|
|
99
103
|
|
100
104
|
private
|
101
105
|
|
102
|
-
def set_balance
|
106
|
+
def set_balance(recursive = false)
|
103
107
|
return BigDecimal('0') if @code.nil? || /^[A-H]/.match(@code)
|
104
108
|
|
105
|
-
|
106
|
-
start_balance = BigDecimal(balance_dict.dig(@code.to_s, :balance) || '0')
|
107
|
-
start = Dict.issue_date(balance_dict)&.next_month
|
108
|
-
last = @start.prev_month
|
109
|
-
if last.year >= start.year && last.month >= start.month
|
110
|
-
start_balance + self.class.term(start.year, start.month, last.year, last.month, code: @code).accumulate_code
|
111
|
-
else
|
112
|
-
start_balance
|
113
|
-
end
|
109
|
+
LucaBook::State.start_balance(@start.year, @start.month, recursive: recursive)
|
114
110
|
end
|
115
111
|
|
116
|
-
def calc_code
|
117
|
-
@balance = set_balance
|
112
|
+
def calc_code(recursive: false)
|
113
|
+
@balance = set_balance(recursive)[@code] || BigDecimal('0')
|
118
114
|
if @code
|
119
115
|
balance = @balance
|
120
116
|
@data.each do |dat|
|
121
117
|
dat[:diff] = Util.diff_by_code(dat[:debit], @code) - Util.diff_by_code(dat[:credit], @code)
|
122
118
|
balance += dat[:diff]
|
123
119
|
dat[:balance] = balance
|
124
|
-
dat[:
|
125
|
-
|
120
|
+
target, counter = dat[:diff] * Util.pn_debit(@code) > 0 ? [:debit, :credit] : [:credit, :debit]
|
121
|
+
dat[:code] = dat[target].map { |d| d[:code] }
|
126
122
|
dat[:counter_code] = dat[counter].map { |d| d[:code] }
|
127
123
|
end
|
128
124
|
end
|
@@ -132,7 +128,7 @@ module LucaBook #:nodoc:
|
|
132
128
|
def convert_label
|
133
129
|
@data.each do |dat|
|
134
130
|
if @code
|
135
|
-
dat[:code] =
|
131
|
+
dat[:code] = dat[:code].map { |target| "#{target} #{@@dict.dig(target, :label)}" }
|
136
132
|
dat[:counter_code] = dat[:counter_code].map { |counter| "#{counter} #{@@dict.dig(counter, :label)}" }
|
137
133
|
else
|
138
134
|
dat[:debit].each { |debit| debit[:code] = "#{debit[:code]} #{@@dict.dig(debit[:code], :label)}" }
|
data/lib/luca_book/state.rb
CHANGED
@@ -27,7 +27,7 @@ module LucaBook
|
|
27
27
|
@count = count
|
28
28
|
@start_date = start_d
|
29
29
|
@end_date = end_d
|
30
|
-
|
30
|
+
set_balance
|
31
31
|
end
|
32
32
|
|
33
33
|
def self.range(from_year, from_month, to_year = from_year, to_month = from_month)
|
@@ -50,25 +50,29 @@ module LucaBook
|
|
50
50
|
)
|
51
51
|
end
|
52
52
|
|
53
|
-
def self.by_code(code, from_year, from_month, to_year = from_year, to_month = from_month)
|
53
|
+
def self.by_code(code, from_year, from_month, to_year = from_year, to_month = from_month, recursive: false)
|
54
54
|
code = search_code(code) if code
|
55
55
|
date = Date.new(from_year.to_i, from_month.to_i, -1)
|
56
56
|
last_date = Date.new(to_year.to_i, to_month.to_i, -1)
|
57
57
|
raise 'invalid term specified' if date > last_date
|
58
58
|
|
59
|
-
|
59
|
+
balance = start_balance(date.year, date.month, recursive: recursive)[code] || 0
|
60
|
+
first_line = { 'code' => nil, 'label' => nil, 'debit_amount' => nil, 'debit_count' => nil, 'credit_amount' => nil, 'credit_count' => nil, 'net' => nil, 'balance' => balance, '_d' => nil }
|
61
|
+
reports = [first_line].tap do |r|
|
60
62
|
while date <= last_date do
|
61
63
|
diff = {}.tap do |h|
|
62
|
-
g = gross(date.year, date.month, code: code)
|
64
|
+
g = gross(date.year, date.month, code: code, recursive: recursive)
|
63
65
|
sum = g.dig(:debit).nil? ? BigDecimal('0') : Util.calc_diff(g[:debit], code)
|
64
66
|
sum -= g.dig(:credit).nil? ? BigDecimal('0') : Util.calc_diff(g[:credit], code)
|
67
|
+
balance += sum
|
65
68
|
h['code'] = code
|
66
|
-
h['label'] =
|
67
|
-
h['net'] = sum
|
69
|
+
h['label'] = @@dict.dig(code, :label)
|
68
70
|
h['debit_amount'] = g[:debit]
|
69
71
|
h['debit_count'] = g[:debit_count]
|
70
72
|
h['credit_amount'] = g[:credit]
|
71
73
|
h['credit_count'] = g[:credit_count]
|
74
|
+
h['net'] = sum
|
75
|
+
h['balance'] = balance
|
72
76
|
h['_d'] = date.to_s
|
73
77
|
end
|
74
78
|
r << diff
|
@@ -205,25 +209,28 @@ module LucaBook
|
|
205
209
|
end
|
206
210
|
|
207
211
|
def set_balance
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
pre = self.class.accumulate_term(start_year, CONFIG['fy_start'], pre_last.year, pre_last.month)
|
215
|
-
|
216
|
-
base = Dict.latest_balance(@start_date).each_with_object({}) do |(k, v), h|
|
212
|
+
@start_balance = self.class.start_balance(@start_date.year, @start_date.month)
|
213
|
+
end
|
214
|
+
|
215
|
+
def self.start_balance(year, month, recursive: true)
|
216
|
+
start_date = Date.new(year, month, 1)
|
217
|
+
base = Dict.latest_balance(start_date).each_with_object({}) do |(k, v), h|
|
217
218
|
h[k] = BigDecimal(v[:balance].to_s) if v[:balance]
|
218
219
|
h[k] ||= BigDecimal('0') if k.length == 2
|
219
220
|
end
|
220
|
-
if
|
221
|
-
|
222
|
-
|
223
|
-
|
221
|
+
if month == CONFIG['fy_start'].to_i
|
222
|
+
return recursive ? total_subaccount(base) : base
|
223
|
+
end
|
224
|
+
|
225
|
+
pre_last = start_date.prev_month
|
226
|
+
year -= 1 if month <= CONFIG['fy_start'].to_i
|
227
|
+
pre = accumulate_term(year, CONFIG['fy_start'], pre_last.year, pre_last.month)
|
228
|
+
total = {}.tap do |h|
|
229
|
+
(pre.keys + base.keys).uniq.each do |k|
|
230
|
+
h[k] = (base[k] || BigDecimal('0')) + (pre[k] || BigDecimal('0'))
|
224
231
|
end
|
225
232
|
end
|
226
|
-
|
233
|
+
recursive ? total_subaccount(total) : total
|
227
234
|
end
|
228
235
|
|
229
236
|
def render_xbrl(filename = nil)
|
data/lib/luca_book/util.rb
CHANGED
data/lib/luca_book/version.rb
CHANGED