lucabook 0.2.29 → 0.3.0

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: b6e3ddc43f78a55be0357756cc617efd9fc798836cd771e4814a058e62abc6eb
4
- data.tar.gz: b5b6d3419d2dbfcee9f859744c7513830a6576868a6a51241ea0ee04633c0c5f
3
+ metadata.gz: b14674db9c7c07b4e523d4603f98e745ab680951822041666e7d957409aabfaf
4
+ data.tar.gz: 1a62eb8f39388727ab65bfa1f5242ac84a8c482a051715e944215d126b7bf93f
5
5
  SHA512:
6
- metadata.gz: f2c7c3b7043a60f39379be1c6e36b02367e2ec31261b0268768934c2f258cba62d3fc042f6286c5ac62b15289a89d1ac6e05143dcb9f2ecc04b5aa8d37bb9a89
7
- data.tar.gz: 653e43c3f11785dabf83e8997810ae3316b8549b8370854e42bcc170ba54729dc50762e11e0733fbff2994fc15a37d6ac1eeb60c2581885f451acafeb57f5cdc
6
+ metadata.gz: 6f5005cc3efbc02170c73418e760a5ac39b87480fbdc78caf5cc5f2604ab009ea8cf6437a90473a675c8716e77de2d6eefeb77b0a7ee0de3337016ee78d7e83d
7
+ data.tar.gz: ed2ef276ea1e82f8c074fcde7ab2a9ee7fe29ea952098e58ac486f65b8ddc22a1e87218f0ecc6cee19e56832fd1acd14f7945adfefa6931bf93db7ec0532adc4
data/exe/luca-book CHANGED
@@ -56,8 +56,23 @@ class LucaCmd
56
56
  def self.xbrl(args, params)
57
57
  level = params[:level] || 3
58
58
  legal = params[:legal] || false
59
- args = gen_range(params[:n] || 1) if args.empty?
60
- LucaBook::State.range(*args).render_xbrl(params[:output])
59
+ range = case args.length
60
+ when 4
61
+ args
62
+ when 2
63
+ date = Date.new(args[0].to_i, args[1].to_i)
64
+ r = LucaBook::Util.current_fy(date, to: date)
65
+ [r[0].year, r[0].month, r[1].year, r[1].month]
66
+ when 0
67
+ if params[:n]
68
+ gen_range(params[:n])
69
+ else
70
+ date = params[:lastyear] ? Date.today.prev_year : Date.today
71
+ r = LucaBook::Util.current_fy(date)
72
+ [r[0].year, r[0].month, r[1].year, r[1].month]
73
+ end
74
+ end
75
+ LucaBook::State.range(*range).render_xbrl(params[:output])
61
76
  end
62
77
 
63
78
  def self.balancesheet(args, params)
@@ -110,6 +125,11 @@ class LucaCmd
110
125
  def self.update_balance(args, params)
111
126
  LucaBook::Dict.generate_balance(*args)
112
127
  end
128
+
129
+ def self.export_balance(args, params)
130
+ date = Date.new(args[0].to_i, args[1].to_i, args[2].to_i)
131
+ LucaBook::Dict.export_balance(date)
132
+ end
113
133
  end
114
134
  end
115
135
 
@@ -192,14 +212,16 @@ when /reports?/, 'r'
192
212
  case subcmd
193
213
  when 'xbrl'
194
214
  OptionParser.new do |opt|
195
- opt.banner = 'Usage: luca-book reports bs [options] [YYYY M]'
196
- opt.on('-o', '--output VAL', 'output filename') { |v| params[:output] = v }
215
+ opt.banner = 'Usage: luca-book r[eports] xbrl [options] [YYYY M]'
216
+ opt.on('-n VAL', 'report count') { |v| params[:n] = v.to_i }
217
+ opt.on('-o VAL', '--output VAL', 'specify file name') { |v| params[:output] = v }
218
+ opt.on('--lastyear', 'report last Financial Year') { |_v| params[:lastyear] = true }
197
219
  args = opt.parse!(ARGV)
198
220
  LucaCmd::Report.xbrl(args, params)
199
221
  end
200
222
  when 'bs'
201
223
  OptionParser.new do |opt|
202
- opt.banner = 'Usage: luca-book reports bs [options] [YYYY M]'
224
+ opt.banner = 'Usage: luca-book r[eports] bs [options] [YYYY M]'
203
225
  opt.on('-l', '--level VAL', 'account level') { |v| params[:level] = v.to_i }
204
226
  opt.on('--legal', 'show legal mandatory account') { |_v| params[:legal] = true }
205
227
  opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
@@ -209,7 +231,7 @@ when /reports?/, 'r'
209
231
  end
210
232
  when 'pl'
211
233
  OptionParser.new do |opt|
212
- opt.banner = 'Usage: luca-book reports pl [options] [YYYY M YYYY M]'
234
+ opt.banner = 'Usage: luca-book r[eports] pl [options] [YYYY M YYYY M]'
213
235
  opt.on('-l', '--level VAL', 'account level') { |v| params[:level] = v.to_i }
214
236
  opt.on('-n VAL', 'report count') { |v| params[:n] = v.to_i }
215
237
  opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
@@ -219,7 +241,7 @@ when /reports?/, 'r'
219
241
  end
220
242
  when 'mail'
221
243
  OptionParser.new do |opt|
222
- opt.banner = 'Usage: luca-book reports mail [options] [YYYY M YYYY M]'
244
+ opt.banner = 'Usage: luca-book r[eports] mail [options] [YYYY M YYYY M]'
223
245
  opt.on('-l', '--level VAL', 'account level') { |v| params[:level] = v.to_i }
224
246
  opt.on('-n VAL', 'report count') { |v| params[:n] = v.to_i }
225
247
  args = opt.parse!(ARGV)
@@ -228,9 +250,11 @@ when /reports?/, 'r'
228
250
  else
229
251
  puts 'Proper subcommand needed.'
230
252
  puts
231
- puts 'Usage: luca-book (r|report[s]) (bs|pl) [options] YYYY M'
253
+ puts 'Usage: luca-book (r|report[s]) (bs|pl|mail|xbrl) [options] YYYY M'
232
254
  puts ' bs: show balance sheet'
233
255
  puts ' pl: show statement of income'
256
+ puts ' mail: send BS/PL via email'
257
+ puts ' xbrl: render XBRL report'
234
258
  exit 1
235
259
  end
236
260
  when /balance/
@@ -242,6 +266,12 @@ when /balance/
242
266
  args = opt.parse!(ARGV)
243
267
  LucaCmd::Dict.update_balance(args, params)
244
268
  end
269
+ when 'export'
270
+ OptionParser.new do |opt|
271
+ opt.banner = 'Usage: luca-book balance export YYYY M d'
272
+ args = opt.parse!(ARGV)
273
+ LucaCmd::Dict.export_balance(args, params)
274
+ end
245
275
  end
246
276
  else
247
277
  puts 'Proper subcommand needed.'
@@ -249,5 +279,6 @@ else
249
279
  puts 'Usage: luca-book (j[ournals]|r[eports]) subcommand'
250
280
  puts ' journals: operate journal records'
251
281
  puts ' reports: show reports'
282
+ puts ' balance update: generate accumulated balance'
252
283
  exit 1
253
284
  end
@@ -5,7 +5,7 @@ require 'luca_support/config'
5
5
 
6
6
  module LucaBook
7
7
  module Accumulator
8
- def self.included(klass) # :nodoc:
8
+ def self.included(klass) #:nodoc:
9
9
  klass.extend ClassMethods
10
10
  end
11
11
 
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module LucaBook # :nodoc:
4
+ module Code
5
+ module_function
6
+
7
+ def currency_code(country)
8
+ {
9
+ 'de' => 'EUR',
10
+ 'ee' => 'EUR',
11
+ 'fr' => 'EUR',
12
+ 'gb' => 'GBP',
13
+ 'in' => 'INR',
14
+ 'it' => 'EUR',
15
+ 'nl' => 'EUR',
16
+ 'jp' => 'JPY',
17
+ 'uk' => 'GBP',
18
+ 'us' => 'USD'
19
+ }[country]
20
+ end
21
+ end
22
+ end
@@ -139,6 +139,31 @@ module LucaBook
139
139
  File.open(filepath, 'w') { |f| f.write csv }
140
140
  end
141
141
 
142
+ # TODO: support date in the middle of month.
143
+ def self.export_balance(date)
144
+ start_date, end_date = Util.current_fy(date, to: date)
145
+ labels = load('base.tsv')
146
+ bs = load_balance(start_date, end_date)
147
+ dat = [].tap do |res|
148
+ item = {}
149
+ item['date'] = date.to_s
150
+ item['debit'] = []
151
+ item['credit'] = []
152
+ bs.each do |code, balance|
153
+ next if balance.zero?
154
+
155
+ if /^[1-4]/.match(code)
156
+ item['debit'] << { 'label' => labels.dig(code, :label), 'amount' => LucaSupport::Code.readable(balance) }
157
+ elsif /^[5-9]/.match(code)
158
+ item['credit'] << { 'label' => labels.dig(code, :label), 'amount' => LucaSupport::Code.readable(balance) }
159
+ end
160
+ end
161
+ item['x-editor'] = 'LucaBook'
162
+ res << item
163
+ end
164
+ puts JSON.dump(dat)
165
+ end
166
+
142
167
  def self.load_balance(start_date, end_date)
143
168
  base = latest_balance(start_date).each_with_object({}) do |(k, v), h|
144
169
  h[k] = BigDecimal(v[:balance].to_s) if v[:balance]
@@ -81,7 +81,7 @@ module LucaBook
81
81
  else
82
82
  amount = BigDecimal(row[@config[:credit_amount]])
83
83
  end
84
- default_label = debit ? @config.dig(:default_debit) : @config.dig(:default_credit)
84
+ default_label = debit ? @config[:default_debit] : @config[:default_credit]
85
85
  code, options = search_code(row[@config[:label]], default_label, amount)
86
86
  counter_code = @code_map.dig(@config[:counter_label])
87
87
  if options
@@ -94,10 +94,12 @@ module LucaBook
94
94
  d['date'] = parse_date(row)
95
95
  if debit
96
96
  d['debit'] = data
97
+ d['debit'][0]['code'] ||= DEBIT_DEFAULT
97
98
  d['credit'] = data_c
98
99
  else
99
100
  d['debit'] = data_c
100
101
  d['credit'] = data
102
+ d['credit'][0]['code'] ||= CREDIT_DEFAULT
101
103
  end
102
104
  d['note'] = Array(@config[:note]).map{ |col| row[col] }.join(' ')
103
105
  d['headers'] = { 'x-editor' => "LucaBook::Import/#{@dict_name}" }
@@ -162,5 +162,36 @@ module LucaBook #:nodoc:
162
162
  record[:note] = record[:note]&.join('\n')
163
163
  end
164
164
  end
165
+
166
+ # Load data based on account code.
167
+ #
168
+ def self.filter_by_code(start_year, start_month, end_year, end_month, code, recursive = true, basedir = @dirname)
169
+ return enum_for(:filter_by_code, start_year, start_month, end_year, end_month, code, basedir) unless block_given?
170
+
171
+ re = recursive ? "^#{code}" : "^#{code}$"
172
+ LucaSupport::Code.encode_term(start_year, start_month, end_year, end_month).each do |subdir|
173
+ open_records(basedir, subdir, nil, nil) do |f, path|
174
+ CSV.new(f, headers: false, col_sep: "\t", encoding: 'UTF-8')
175
+ .each.with_index(0) do |line, i|
176
+ case i
177
+ when 0
178
+ if line.find { |cd| /#{re}/.match(cd) }
179
+ f.rewind
180
+ yield load_data(f, path), path
181
+ break
182
+ end
183
+ when 2
184
+ if line.find { |cd| /#{re}/.match(cd) }
185
+ f.rewind
186
+ yield load_data(f, path), path
187
+ end
188
+ when 3
189
+ break
190
+ else # skip
191
+ end
192
+ end
193
+ end
194
+ end
195
+ end
165
196
  end
166
197
  end
@@ -162,6 +162,7 @@ module LucaBook #:nodoc:
162
162
  view = { code: record[:code], amount: {} }
163
163
  view[:date], view[:txid] = decode_id(voucher[:id])
164
164
  view[:label] = @@dict.dig(record[:code], :label) if record[:code].length >= 4
165
+ view[:label] = voucher.dig(:headers, 'x-customer') if view[:label].nil?
165
166
  view[:amount][balance] = readable(record[:amount])
166
167
  view[:counter_code] = voucher.dig(counter_balance, 0, :code)
167
168
  view[:counter_label] = @@dict.dig(view[:counter_code], :label) || ''
@@ -49,7 +49,7 @@ module LucaBook #:nodoc:
49
49
  res['note'] = dat[:note]
50
50
  end
51
51
  end
52
- a << { 'code' => v.last[:code], 'header' => k, 'balance' => v.last[:balance], 'count' => v.count, 'jounals' => journals }
52
+ a << { 'code' => v.last[:code], 'header' => k, 'balance' => v.last[:balance], 'count' => v.count, 'journals' => journals }
53
53
  end
54
54
  readable(@data)
55
55
  end
@@ -67,16 +67,8 @@ module LucaBook #:nodoc:
67
67
  def set_balance
68
68
  return BigDecimal('0') if @code.nil? || /^[A-H]/.match(@code)
69
69
 
70
- balance_dict = Dict.latest_balance(@start)
71
- start_balance = BigDecimal(balance_dict.dig(@code.to_s, :balance) || '0')
72
- start = Dict.issue_date(balance_dict)&.next_month
73
- last = @start.prev_month
74
- if last.year >= start.year && last.month >= start.month
75
- #TODO: start_balance to be implemented by header
76
- self.class.term(start.year, start.month, last.year, last.month, code: @code).accumulate_code
77
- else
78
- #start_balance
79
- end
70
+ #TODO: start_balance to be implemented by header
71
+ LucaBook::State.start_balance(@start.year, @start.month)
80
72
  end
81
73
 
82
74
  def calc_code
@@ -19,6 +19,12 @@ module LucaBook
19
19
  end
20
20
  FileUtils.cp("#{__dir__}/templates/#{dict}", 'dict/base.tsv') unless File.exist?('dict/base.tsv')
21
21
  FileUtils.cp("#{__dir__}/templates/config.yml", 'config.yml') unless File.exist?('config.yml')
22
+ exdict = if File.exist?("#{__dir__}/templates/dictex-#{country}.tsv")
23
+ "dict-#{country}.tsv"
24
+ else
25
+ nil
26
+ end
27
+ FileUtils.cp("#{__dir__}/templates/#{exdict}", 'dict/ext.tsv') unless (File.exist?('dict/ext.tsv') || exdict.nil?)
22
28
  prepare_starttsv(dict) unless File.exist? 'data/balance/start.tsv'
23
29
  end
24
30
  end
@@ -146,7 +146,7 @@ module LucaBook
146
146
  res['debit_label'] = base[:debit][i] ? @@dict.dig(base[:debit][i].keys[0], :label) : ''
147
147
  #res['debit_balance'] = base[:debit][i] ? (@start_balance.dig(base[:debit][i].keys[0]) || 0) + base[:debit][i].values[0] : ''
148
148
  res['debit_balance'] = base[:debit][i] ? base[:debit][i].values[0] : ''
149
- res['credit_label'] = base[:credit][i] ? @dict.dig(base[:credit][i].keys[0], :label) : ''
149
+ res['credit_label'] = base[:credit][i] ? @@dict.dig(base[:credit][i].keys[0], :label) : ''
150
150
  #res['credit_balance'] = base[:credit][i] ? (@start_balance.dig(base[:credit][i].keys[0]) || 0) + base[:credit][i].values[0] : ''
151
151
  res['credit_balance'] = base[:credit][i] ? base[:credit][i].values[0] : ''
152
152
  a << res
@@ -245,12 +245,14 @@ module LucaBook
245
245
  prior_bs = @start_balance.filter { |k, _v| /^[9]/.match(k) }
246
246
  @xbrl_entries = @bs_data.map{ |k, v| xbrl_line(k, v, prior_bs[k]) }.compact.join("\n")
247
247
  @xbrl_entries += @pl_data.map{ |k, v| xbrl_line(k, v) }.compact.join("\n")
248
+ @xbrl_entries += equity_change.join("\n")
248
249
  @filename = filename || @issue_date.to_s
249
250
 
250
251
  File.open("#{@filename}.xbrl", 'w') { |f| f.write render_erb(search_template("base-#{country_suffix}.xbrl.erb")) }
251
252
  File.open("#{@filename}.xsd", 'w') { |f| f.write render_erb(search_template("base-#{country_suffix}.xsd.erb")) }
252
253
  end
253
254
 
255
+ # TODO: proper decimals attr for each currency
254
256
  def xbrl_line(code, amount, prior_amount = nil)
255
257
  return nil if /^_/.match(code)
256
258
 
@@ -260,8 +262,12 @@ module LucaBook
260
262
  return nil if tag.nil?
261
263
  return nil if readable(amount).zero? && prior_amount.nil?
262
264
 
263
- prior = prior_amount.nil? ? '' : "<#{tag} decimals=\"0\" unitRef=\"JPY\" contextRef=\"Prior1YearNonConsolidatedInstant\">#{readable(prior_amount)}</#{tag}>\n"
264
- current = "<#{tag} decimals=\"0\" unitRef=\"JPY\" contextRef=\"#{context}\">#{readable(amount)}</#{tag}>"
265
+ prior = if prior_amount.nil?
266
+ /^[9]/.match(code) ? "<#{tag} decimals=\"0\" unitRef=\"#{Code.currency_code(CONFIG['country'])}\" contextRef=\"Prior1YearNonConsolidatedInstant\">0</#{tag}>\n" : ''
267
+ else
268
+ "<#{tag} decimals=\"0\" unitRef=\"#{Code.currency_code(CONFIG['country'])}\" contextRef=\"Prior1YearNonConsolidatedInstant\">#{readable(prior_amount)}</#{tag}>\n"
269
+ end
270
+ current = "<#{tag} decimals=\"0\" unitRef=\"#{Code.currency_code(CONFIG['country'])}\" contextRef=\"#{context}\">#{readable(amount)}</#{tag}>"
265
271
 
266
272
  prior + current
267
273
  end
@@ -280,9 +286,12 @@ module LucaBook
280
286
  private
281
287
 
282
288
  def set_bs(level = 3, legal: false)
283
- @start_balance.each do |k, v|
284
- next if /^_/.match(k)
285
- @monthly.first[k] = (v || 0) + (@monthly.first[k] || 0)
289
+ unless @monthly.first['_setup']
290
+ @start_balance.each do |k, v|
291
+ next if /^_/.match(k)
292
+ @monthly.first[k] = (v || 0) + (@monthly.first[k] || 0)
293
+ end
294
+ @monthly.first['_setup'] = 'done'
286
295
  end
287
296
  list = @monthly.map { |data| data.select { |k, _v| k.length <= level } }
288
297
  list.map! { |data| code_sum(data).merge(data) } if legal
@@ -317,6 +326,59 @@ module LucaBook
317
326
  end
318
327
  end
319
328
 
329
+ def equity_change
330
+ begin
331
+ ex_dict = LucaRecord::Dict.new('ext.tsv')
332
+ rescue
333
+ return nil
334
+ end
335
+
336
+ changes = []
337
+ LucaBook::Journal.filter_by_code(@start_date.year, @start_date.month, @end_date.year, @end_date.month, '9').each do |dat|
338
+ debit_str = 'ASET' if dat[:debit].find { |e| /^[124]/.match(e[:code]) }
339
+ debit_str ||= '33' if dat[:debit].find { |e| /^[33]/.match(e[:code]) }
340
+ debit_str ||= 'ASET' if dat[:debit].find { |e| /^[3]/.match(e[:code]) }
341
+ credit_str = 'DEBT' if dat[:credit].find { |e| /^[57]/.match(e[:code]) }
342
+ credit_str ||= 'ASET' if dat[:credit].find { |e| /^[12]/.match(e[:code]) }
343
+ dat[:credit].each do |entry|
344
+ case entry[:code]
345
+ when /^(91[0-9a-zA-Z]+)/
346
+ code = $1
347
+ debit_str ||= dat[:debit].find { |e| /^[9]/.match(e[:code]) }.dig(:code)
348
+ debit_str = '914' if /^914[0-9a-zA-Z]+/.match(debit_str)
349
+ tag = ex_dict.dig("#{debit_str}:c#{code}#{credit_str}")&.dig(:xbrl_id)
350
+ changes << [tag, readable(entry[:amount])] if tag
351
+ end
352
+ end
353
+ dat[:debit].each do |entry|
354
+ case entry[:code]
355
+ when /^(916[0-9a-zA-Z]*)/
356
+ tag = ex_dict.dig("d#{$1}:_")&.dig(:xbrl_id)
357
+ changes << [tag, readable(entry[:amount] * -1)] if tag
358
+ when /^(91[0-57-9a-zA-Z]+)/
359
+ code = $1
360
+ credit_str ||= dat[:credit].find { |e| /^[9]/.match(e[:code]) }.dig(:code)
361
+ credit_str = '914' if /^914[0-9a-zA-Z]+/.match(credit_str)
362
+ tag = ex_dict.dig("#{debit_str}:c#{code}#{credit_str}")&.dig(:xbrl_id)
363
+ changes << [tag, readable(entry[:amount])] if tag
364
+ end
365
+ end
366
+ end
367
+ set_bs(4) # require level 4 accounts
368
+ @bs_data.each do |code, amount|
369
+ next if /^[^9]/.match(code)
370
+
371
+ diff = amount - (@start_balance[code]||0)
372
+ next if diff == 0
373
+
374
+ tag = ex_dict.dig("#{code}:#{code}")&.dig(:xbrl_id)
375
+ changes << [tag, readable(diff)] if tag
376
+ end
377
+ currency = %Q(unitRef="#{Code.currency_code(CONFIG['country'])}")
378
+ context = 'contextRef="CurrentYearNonConsolidatedDuration"'
379
+ changes.map { |tag, amount| %Q(<#{tag} decimals="0" #{currency} #{context}>#{amount}</#{tag}>) }
380
+ end
381
+
320
382
  def lib_path
321
383
  __dir__
322
384
  end
@@ -16,6 +16,10 @@ code label xbrl_id consumption_tax income_tax
16
16
  140 短期貸付金 jppfs_cor:ShortTermLoansReceivable
17
17
  150 未収入金 jppfs_cor:AccountsReceivableOther
18
18
  1501 未収消費税等
19
+ 1502 未収法人税
20
+ 1503 未収都道府県住民税
21
+ 1504 未収地方事業税
22
+ 1505 未収市民税
19
23
  160 棚卸資産 jppfs_cor:Inventories
20
24
  161 商品 jppfs_cor:Merchandize
21
25
  162 製品 jppfs_cor:FinishedGoods
@@ -27,6 +31,18 @@ code label xbrl_id consumption_tax income_tax
27
31
  183 立替金 jppfs_cor:AdvancesPaid
28
32
  184 仮払金 jppfs_cor:SuspensePayments
29
33
  1841 仮払消費税等
34
+ 185 仮払税金
35
+ 1851 仮払法人税
36
+ 1852 仮払法人税(地方)
37
+ 1854 仮払地方税特別法人事業税
38
+ 1855 仮払地方税所得割
39
+ 1856 仮払地方税収入割
40
+ 1857 仮払地方税資本割
41
+ 1858 仮払地方税付加価値割
42
+ 1859 仮払地方税法人税割
43
+ 185A 仮払地方税均等割
44
+ 185B 仮払消費税
45
+ 185C 仮払地方消費税
30
46
  30 固定資産 jppfs_cor:NonCurrentAssetsAbstract
31
47
  31 有形固定資産 jppfs_cor:PropertyPlantAndEquipmentAbstract
32
48
  311 建物 jppfs_cor:Buildings
@@ -67,10 +83,18 @@ code label xbrl_id consumption_tax income_tax
67
83
  513 コマーシャルペーパー jppfs_cor:CommercialPapersLiabilities
68
84
  514 未払金 jppfs_cor:AccountsPayableOther
69
85
  515 未払法人税等 jppfs_cor:IncomeTaxesPayable
86
+ 5151 未払法人税
87
+ 5152 未払地方事業税
88
+ 5153 未払都道府県民税
89
+ 5154 未払市民税
70
90
  516 未払消費税等 jppfs_cor:AccruedConsumptionTaxes
71
91
  517 未払費用 jppfs_cor:AccruedExpenses
72
92
  518 前受金 jppfs_cor:AdvancesReceived
73
93
  519 預り金 jppfs_cor:DepositsReceived
94
+ 5191 所得税源泉給与
95
+ 5192 住民税
96
+ 5193 所得税源泉士業
97
+ 5194 所得税源泉報酬
74
98
  51A 仮受金 jppfs_cor:SuspenseReceipt
75
99
  51A1 仮受消費税等 jppfs_cor:SuspenseReceiptOfConsumptionTaxes
76
100
  70 固定負債 jppfs_cor:NoncurrentLiabilitiesAbstract
@@ -82,14 +106,15 @@ code label xbrl_id consumption_tax income_tax
82
106
  91 株主資本 jppfs_cor:ShareholdersAbstract
83
107
  911 資本金 jppfs_cor:CapitalStock
84
108
  912 新株式申込証拠金 jppfs_cor:DepositForSubscriptionsToShares
85
- 913 資本剰余金 jppfs_cor:LegalCapitalSurplus
109
+ 913 資本剰余金 jppfs_cor:CapitalSurplus
86
110
  9131 資本準備金 jppfs_cor:LegalCapitalSurplus
87
111
  9132 その他資本剰余金 jppfs_cor:OtherCapitalSurplus
88
112
  914 利益剰余金 jppfs_cor:RetainedEarnings
89
113
  9141 利益準備金 jppfs_cor:LegalRetainedEarnings
90
114
  9142 その他利益剰余金 jppfs_cor:OtherRetainedEarningsAbstract
91
- 915 自己株式 jppfs_cor:TreasuryStock
92
- 916 自己株式申込証拠金 jppfs_cor:DepositForSubscriptionsToTreasuryStock
115
+ 915 利益準備金
116
+ 916 自己株式 jppfs_cor:TreasuryStock
117
+ 917 自己株式申込証拠金 jppfs_cor:DepositForSubscriptionsToTreasuryStock
93
118
  92 評価換算差額等 jppfs_cor:ValuationAndTranslationAdjustments
94
119
  921 有価証券評価差額金 jppfs_cor:ValuationDifferenceOnAvailableForSaleSecurities
95
120
  922 為替換算調整勘定 jppfs_cor:ForeignCurrencyTranslationAdjustment
@@ -124,6 +149,8 @@ C1F 水道光熱費 jppfs_cor:UtilitiesExpensesSGA
124
149
  C1G 消耗品費 jppfs_cor:SuppliesExpensesSGA
125
150
  C1H 保険料 jppfs_cor:InsuranceExpensesSGA
126
151
  C1I 租税公課 jppfs_cor:TaxesAndDuesSGA
152
+ C1I1 消費税
153
+ C1I2 事業税
127
154
  C1J 賃借料 jppfs_cor:RentExpensesSGA
128
155
  C1K 新聞図書費 jppfs_cor:BookExpensesSGA
129
156
  C1L 貸倒損失 jppfs_cor:BadDebtsExpensesSGA
@@ -17,8 +17,9 @@ code label xbrl_id consumption_tax income_tax
17
17
  150 未収入金 jpfr-t-cte:AccruedIncome
18
18
  1501 未収消費税等 jpfr-etax-t-cte:SuspenseAccountPaymentConsumptionTaxes
19
19
  1502 未収法人税
20
- 1503 未収地方住民税
20
+ 1503 未収都道府県住民税
21
21
  1504 未収地方事業税
22
+ 1505 未収市民税
22
23
  160 棚卸資産
23
24
  161 商品 jpfr-t-cte:Merchandise
24
25
  162 製品 jpfr-t-cte:FinishedGoods
@@ -105,7 +106,7 @@ code label xbrl_id consumption_tax income_tax
105
106
  91 株主資本 jpfr-t-cte:ShareholdersEquity
106
107
  911 資本金 jpfr-t-cte:CapitalStock
107
108
  912 新株式申込証拠金 jpfr-t-cte:DepositForSubscriptionsToShares
108
- 913 資本剰余金 jpfr-t-cte:LegalCapitalSurplus
109
+ 913 資本剰余金 jpfr-t-cte:CapitalSurplus
109
110
  9131 資本準備金 jpfr-t-cte:LegalCapitalSurplus
110
111
  9132 その他資本剰余金 jpfr-t-cte:OtherCapitalSurplus
111
112
  914 繰越利益剰余金 jpfr-t-cte:RetainedEarningsBroughtForward
@@ -0,0 +1,88 @@
1
+ code label xbrl_id
2
+ ASET:c911 新株の発行、資本金 jpfr-t-cte:IssuanceOfNewSharesCAP
3
+ 912:c911 新株の発行、資本金 jpfr-t-cte:IssuanceOfNewSharesCAP
4
+ 93:c911 新株の発行(新株予約権の行使)、資本金 jpfr-t-cte:IssuanceOfNewSharesExerciseOfSubscriptionRightsToSharesCAP
5
+ ASET:c911DEBT 合併による増加、資本金 jpfr-t-cte:IncreaseByMergerCAP
6
+ ASET:c911DEBT:split 会社分割による増加、資本金 jpfr-t-cte:IncreaseByCorporateDivisionCAP
7
+ 33:c911 株式交換による増加、資本金 jpfr-t-cte:IncreaseByShareTransfersCAP
8
+ 33:c911:transfer 株式移転による増加、資本金 jpfr-t-cte:IncreaseByShareExchangesCAP
9
+ d911ASET:DEBT 分割型の会社分割による減少、資本金 jpfr-t-cte:DecreaseByCorporateDivisionSplitOffTypeCAP
10
+ d911:9131 資本金から準備金への振替、資本金 jpfr-t-cte:TransferToLegalCapitalSurplusFromCapitalStockCAP
11
+ d911:9132 資本金から剰余金への振替、資本金 jpfr-t-cte:TransferToOtherCapitalSurplusFromCapitalStockCAP
12
+ 9131:c911 準備金から資本金への振替、資本金 jpfr-t-cte:TransferToCapitalStockFromLegalCapitalSurplusCAP
13
+ d911:914 減資、資本金 jpfr-t-cte:CapitalReductionCAP
14
+ 911:911 当期変動額合計、資本金 jpfr-t-cte:TotalChangesOfItemsDuringThePeriodCAP
15
+ ASET:c9131 新株の発行、資本準備金 jpfr-t-cte:IssuanceOfNewSharesLCS
16
+ 912:c9131 新株の発行、資本準備金 jpfr-t-cte:IssuanceOfNewSharesLCS
17
+ 93:c9131 新株の発行(新株予約権の行使)、資本準備金 jpfr-t-cte:IssuanceOfNewSharesExerciseOfSubscriptionRightsToSharesLCS
18
+ ASET:c9131DEBT 合併による増加、資本準備金 jpfr-t-cte:IncreaseByMergerLCS
19
+ ASET:c9131DEBT:split 会社分割による増加、資本準備金 jpfr-t-cte:IncreaseByCorporateDivisionLCS
20
+ 33:c9131 株式交換による増加、資本準備金 jpfr-t-cte:IncreaseByShareExchangesLCS
21
+ 33:c9131:transfer 株式移転による増加、資本準備金 jpfr-t-cte:IncreaseByShareTransfersLCS
22
+ d9131ASET:DEBT 分割型の会社分割による減少、資本準備金 jpfr-t-cte:DecreaseByCorporateDivisionSplitOffTypeLCS
23
+ 911:c9131 資本金から準備金への振替、資本準備金 jpfr-t-cte:TransferToLegalCapitalSurplusFromCapitalStockLCS
24
+ d9131:911 準備金から資本金への振替、資本準備金 jpfr-t-cte:TransferToCapitalStockFromLegalCapitalSurplusLCS
25
+ d9131:9132 準備金から剰余金への振替、資本準備金 jpfr-t-cte:TransferToOtherCapitalSurplusFromLegalCapitalSurplusLCS
26
+ d9131:_914 欠損填補、資本準備金 jpfr-t-cte:DeficitDispositionLCS
27
+ d9131:914 資本準備金の取崩、資本準備金 jpfr-t-cte:ReversalOfLegalCapitalSurplusLCS
28
+ 9131:9131 当期変動額合計、資本準備金 jpfr-t-cte:TotalChangesOfItemsDuringThePeriodLCS
29
+ d9132:ASET 剰余金(その他資本剰余金)の配当、その他資本剰余金 jpfr-t-cte:DividendsFromSurplusOtherCapitalSurplusOCS
30
+ d9132:DEBT 剰余金(その他資本剰余金)の配当、その他資本剰余金 jpfr-t-cte:DividendsFromSurplusOtherCapitalSurplusOCS
31
+ d9132:916 自己株式の処分、その他資本剰余金 jpfr-t-cte:DisposalOfTreasuryStockOCS
32
+ ASET:c9132DEBT 合併による増加、その他資本剰余金 jpfr-t-cte:IncreaseByMergerOCS
33
+ ASET:c9132DEBT:split 会社分割による増加、その他資本剰余金 jpfr-t-cte:IncreaseByCorporateDivisionOCS
34
+ 33:c9132 株式交換による増加、その他資本剰余金 jpfr-t-cte:IncreaseByShareExchangesOCS
35
+ 33:c9132:transfer 株式移転による増加、その他資本剰余金 jpfr-t-cte:IncreaseByShareTransfersOCS
36
+ d9132ASET:DEBT 分割型の会社分割による減少、その他資本剰余金 jpfr-t-cte:DecreaseByCorporateDivisionSplitOffTypeOCS
37
+ 911:c9132 資本金から剰余金への振替、その他資本剰余金 jpfr-t-cte:TransferToOtherCapitalSurplusFromCapitalStockOCS
38
+ 9131:c9132 準備金から剰余金への振替、その他資本剰余金 jpfr-t-cte:TransferToCapitalSurplusFromRetainedEarningsOCS
39
+ 914:c9132 利益剰余金から資本剰余金への振替、その他資本剰余金 jpfr-t-cte:TransferToOtherCapitalSurplusFromLegalCapitalSurplusOCS
40
+ d9132:916 自己株式の消却、その他資本剰余金 jpfr-t-cte:RetirementOfTreasuryStockOCS
41
+ d9132:_914 欠損填補、その他資本剰余金 jpfr-t-cte:DeficitDispositionOCS
42
+ d9132:914 資本準備金の取崩、その他資本剰余金 jpfr-t-cte:ReversalOfLegalCapitalSurplusOCS
43
+ d9132:914 減資、その他資本剰余金 jpfr-t-cte:CapitalReductionOCS
44
+ 9132:9132 当期変動額合計、その他資本剰余金 jpfr-t-cte:TotalChangesOfItemsDuringThePeriodOCS
45
+ 915:ASET 剰余金の配当、利益準備金 jpfr-t-cte:DividendsFromSurplusLRE
46
+ ASET:c915DEBT 合併による増加、利益準備金 jpfr-t-cte:IncreaseByMergerLRE
47
+ ASET:c915DEBT:split 会社分割による増加、利益準備金 jpfr-t-cte:IncreaseByCorporateDivisionLRE
48
+ 33:c915 株式交換による増加、利益準備金 jpfr-t-cte:IncreaseByShareExchangesLRE
49
+ 33:c915:transfer 株式移転による増加、利益準備金 jpfr-t-cte:IncreaseByShareTransfersLRE
50
+ d915ASET:DEBT 分割型の会社分割による減少、利益準備金 jpfr-t-cte:DecreaseByCorporateDivisionSplitOffTypeLRE
51
+ 914:c915 利益準備金の積立、利益準備金 jpfr-t-cte:ProvisionOfLegalRetainedEarningsLRE
52
+ d915:914 利益準備金の取崩、利益準備金 jpfr-t-cte:ReversalOfLegalRetainedEarningsLRE
53
+ 915:915 当期変動額合計、利益準備金 jpfr-t-cte:TotalChangesOfItemsDuringThePeriodLRE
54
+ d9141:ASET 剰余金の配当、その他利益剰余金 jpfr-t-cte:DividendsFromSurplusORE
55
+ d9141:DEBT 剰余金の配当、その他利益剰余金 jpfr-t-cte:DividendsFromSurplusORE
56
+ ASET:c9141DEBT 合併による増加、その他利益剰余金 jpfr-t-cte:IncreaseByMergerORE
57
+ ASET:c9141DEBT:split 会社分割による増加、その他利益剰余金 jpfr-t-cte:IncreaseByCorporateDivisionORE
58
+ 33:c9141 株式交換による増加、その他利益剰余金 jpfr-t-cte:IncreaseByShareExchangesORE
59
+ 33:c9141:transfer 株式移転による増加、その他利益剰余金 jpfr-t-cte:IncreaseByShareTransfersORE
60
+ d9141ASET:DEBT 分割型の会社分割による減少、その他利益剰余金 jpfr-t-cte:DecreaseByCorporateDivisionSplitOffTypeORE
61
+ d9141:916 自己株式の処分、その他利益剰余金 jpfr-t-cte:DisposalOfTreasuryStockORE
62
+ d9141:916 自己株式の消却、その他利益剰余金 jpfr-t-cte:RetirementOfTreasuryStockORE
63
+ d9141:_DEBT 利益処分、その他利益剰余金 jpfr-t-cte:ProfitAppropriationORE
64
+ d9141:915 利益準備金の積立、その他利益剰余金 jpfr-t-cte:ProvisionOfLegalRetainedEarningsORE
65
+ 915:c9141 利益準備金の取崩、その他利益剰余金 jpfr-t-cte:ReversalOfLegalRetainedEarningsORE
66
+ 911:c9141 減資、その他利益剰余金 jpfr-t-cte:CapitalReductionORE
67
+ d9141:9132 利益剰余金から資本剰余金への振替、その他利益剰余金 jpfr-t-cte:TransferToCapitalSurplusFromRetainedEarningsORE
68
+ 9141:9141 当期変動額合計、その他利益剰余金 jpfr-t-cte:TotalChangesOfItemsDuringThePeriodORE
69
+ d9142:ASET 剰余金の配当、繰越利益剰余金 jpfr-t-cte:DividendsFromSurplusREBF
70
+ ASET:c9142DEBT 合併による増加、繰越利益剰余金 jpfr-t-cte:IncreaseByMergerREBF
71
+ ASET:c9142DEBT:split 会社分割による増加、繰越利益剰余金 jpfr-t-cte:IncreaseByCorporateDivisionREBF
72
+ 33:c9142 株式交換による増加、繰越利益剰余金 jpfr-t-cte:IncreaseByShareExchangesREBF
73
+ 33:c9142:transfer 株式移転による増加、繰越利益剰余金 jpfr-t-cte:IncreaseByShareTransfersREBF
74
+ d9142ASET:DEBT 分割型の会社分割による減少、繰越利益剰余金 jpfr-t-cte:DecreaseByCorporateDivisionSplitOffTypeREBF
75
+ d9142:916 自己株式の処分、繰越利益剰余金 jpfr-t-cte:DisposalOfTreasuryStockREBF
76
+ d9142:916 自己株式の消却、繰越利益剰余金 jpfr-t-cte:RetirementOfTreasuryStockREBF
77
+ d9142:_DEBT 利益処分、繰越利益剰余金 jpfr-t-cte:ProfitAppropriationREBF
78
+ d9142:915 利益準備金の積立、繰越利益剰余金 jpfr-t-cte:ProvisionOfLegalRetainedEarningsREBF
79
+ 915:c9142 利益準備金の取崩、繰越利益剰余金 jpfr-t-cte:ReversalOfLegalRetainedEarningsREBF
80
+ _913:c9142 欠損填補、繰越利益剰余金 jpfr-t-cte:DeficitDispositionREBF
81
+ 911:c9142 減資、繰越利益剰余金 jpfr-t-cte:CapitalReductionREBF
82
+ d9142:9132 利益剰余金から資本剰余金への振替、繰越利益剰余金 jpfr-t-cte:TransferToCapitalSurplusFromRetainedEarningsREBF
83
+ 9142:9142 当期変動額合計、繰越利益剰余金 jpfr-t-cte:TotalChangesOfItemsDuringThePeriodREBF
84
+ d916:_ 自己株式の取得、自己株式 jpfr-t-cte:PurchaseOfTreasuryStockTS
85
+ _:c916 自己株式の処分、自己株式 jpfr-t-cte:DisposalOfTreasuryStockTS
86
+ _:c916 自己株式の消却、自己株式 jpfr-t-cte:RetirementOfTreasuryStockTS
87
+ _916:916 持分法適用会社に対する持分変動に伴う自己株式の増減、自己株式 jpfr-t-cte:ChangeInEquityInAffiliatesAccountedForByEquityMethodTreasuryStockTS
88
+ 916:916 当期変動額合計、自己株式 jpfr-t-cte:TotalChangesOfItemsDuringThePeriodTS
@@ -2,7 +2,7 @@
2
2
  <head>
3
3
  <meta charset="utf-8">
4
4
  <style>
5
- body { size: A4 }
5
+ body { size: A4; padding-top: 2em; padding-bottom: 2em }
6
6
  .pgbr { page-break-after: always; visibility: hidden }
7
7
  .title { margin-bottom: 1.5rem; text-align: center }
8
8
  div.note { font-size: .8em }
@@ -5,7 +5,7 @@ require 'luca_book'
5
5
  require 'luca_record/io'
6
6
  require 'luca_support/range'
7
7
 
8
- module LucaBook # :nodoc:
8
+ module LucaBook #:nodoc:
9
9
  # Provide data testing framework utilizing minitest.
10
10
  #
11
11
  class Test < MiniTest::Test
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LucaBook
4
- VERSION = '0.2.29'
4
+ VERSION = '0.3.0'
5
5
  end
data/lib/luca_book.rb CHANGED
@@ -6,6 +6,7 @@ require 'luca_book/version'
6
6
 
7
7
  module LucaBook
8
8
  autoload :Accumulator, 'luca_book/accumulator'
9
+ autoload :Code, 'luca_book/code'
9
10
  autoload :Dict, 'luca_book/dict'
10
11
  autoload :Import, 'luca_book/import'
11
12
  autoload :Journal, 'luca_book/journal'
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.29
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chuma Takahiro
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-24 00:00:00.000000000 Z
11
+ date: 2022-03-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lucarecord
@@ -68,7 +68,7 @@ dependencies:
68
68
  version: 12.3.3
69
69
  description: 'Book keep
70
70
 
71
- '
71
+ '
72
72
  email:
73
73
  - co.chuma@gmail.com
74
74
  executables:
@@ -80,6 +80,7 @@ files:
80
80
  - exe/luca-book
81
81
  - lib/luca_book.rb
82
82
  - lib/luca_book/accumulator.rb
83
+ - lib/luca_book/code.rb
83
84
  - lib/luca_book/console.rb
84
85
  - lib/luca_book/dict.rb
85
86
  - lib/luca_book/import.rb
@@ -95,6 +96,7 @@ files:
95
96
  - lib/luca_book/templates/dict-en.tsv
96
97
  - lib/luca_book/templates/dict-jp-edinet.tsv
97
98
  - lib/luca_book/templates/dict-jp.tsv
99
+ - lib/luca_book/templates/dictex-jp.tsv
98
100
  - lib/luca_book/templates/journals.html.erb
99
101
  - lib/luca_book/templates/monthly-report.html.erb
100
102
  - lib/luca_book/test.rb
@@ -106,7 +108,7 @@ licenses:
106
108
  metadata:
107
109
  homepage_uri: https://github.com/chumaltd/luca/tree/master/lucabook
108
110
  source_code_uri: https://github.com/chumaltd/luca/tree/master/lucabook
109
- post_install_message:
111
+ post_install_message:
110
112
  rdoc_options: []
111
113
  require_paths:
112
114
  - lib
@@ -121,8 +123,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
123
  - !ruby/object:Gem::Version
122
124
  version: '0'
123
125
  requirements: []
124
- rubygems_version: 3.2.3
125
- signing_key:
126
+ rubygems_version: 3.2.5
127
+ signing_key:
126
128
  specification_version: 4
127
129
  summary: Book keep
128
130
  test_files: []