lucabook 0.5.2 → 0.5.4

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
  SHA256:
3
- metadata.gz: 0aada3e712bc8c2ecd96ea0cfe499565d7c6c036decb8b0a29f90bddaf65d9b8
4
- data.tar.gz: e7ab9a0d301a86f80b9dcd74140bbf596bfdb6ce73c11cf8aef0b4e6413e7fa7
3
+ metadata.gz: c6cc66f4a8bcc5ca7fb1e2a86c6ba57d1ff75d01dec530835ad671386ca2409a
4
+ data.tar.gz: d13133523464f63818b5acea123472f9ab736ba50c6bba4f93ec1cc3924246d7
5
5
  SHA512:
6
- metadata.gz: 2a5588460f50c3ac0613c16977c1b0849fdf279c25ca18f435d1dfa62e1ad31ef69647774e95a1e01f7255158604f445e61900fd9f992be6775299b2dd5f2d28
7
- data.tar.gz: 0a666d47c831e4f8bfa0adf5c064c544de2c2c55d45c4c407dc1e3cd62ecaa5e9f6034ba65925ac936e7375b93ef38094932f43bd99af96dbedabf3fae4a7aaa
6
+ metadata.gz: fdb7baa012b6110695687435f830eb64f930a88025284494ba509ec76d27f6f3bc906ff5cd8ea936869b4f339fa2a7854ee456534ec4e2c63eec4bfe876e794d
7
+ data.tar.gz: 5b49a82f52825781ad3c5e7db1bfcb45be9ef2e0c4f93040d3d368bfa8e6da5b4048eb97550c947c154646c277c4496d3c50e1f4ec9d23604a15f73ddf754bb5
data/exe/luca-book CHANGED
@@ -27,9 +27,9 @@ class LucaCmd
27
27
  params[:col_order] = %w(date diff balance counter_code note code id no)
28
28
  if params['code']
29
29
  if params['headers']
30
- render(LucaBook::ListByHeader.term(*args, code: params['code'], header: params['headers']).list_by_code, params)
30
+ render(LucaBook::ListByHeader.term(*parse_range_args(args, params), code: params['code'], header: params['headers']).list_by_code, params)
31
31
  else
32
- render(LucaBook::List.term(*args, code: params['code'], recursive: params[:recursive]).list_by_code(params[:recursive]), params)
32
+ render(LucaBook::List.term(*parse_range_args(args, params), code: params['code'], recursive: params[:recursive]).list_by_code(params[:recursive]), params)
33
33
  end
34
34
  elsif params['render']
35
35
  puts LucaBook::List.term(*args).render_html(params['render'])
@@ -77,7 +77,7 @@ class LucaCmd
77
77
  [r[0].year, r[0].month, r[1].year, r[1].month]
78
78
  end
79
79
  end
80
- LucaBook::State.range(*range).render_xbrl(params[:output])
80
+ LucaBook::State.range(*range).write_xbrl(params[:output])
81
81
  end
82
82
 
83
83
  def self.balancesheet(args, params)
@@ -195,6 +195,7 @@ when /journals?/, 'j'
195
195
  opt.on('-c', '--code VAL', 'filter with code or label') { |v| params['code'] = v }
196
196
  opt.on('-r', '--recursive', 'include subaccounts') { |_v| params[:recursive] = true }
197
197
  opt.on('--customer', 'categorize by x-customer header') { |_v| params['headers'] = 'x-customer' }
198
+ opt.on('--fy', 'adjust start date to Financial Year') { |_v| params[:financialyear] = true }
198
199
  opt.on('-n VAL', 'report count') { |v| params[:n] = v.to_i }
199
200
  opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
200
201
  opt.on('--explore', 'explore table in nushell') { |_v| params[:output] = 'explore' }
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'luca_book/util'
4
+ require 'luca_support/code'
4
5
  require 'luca_support/const'
5
6
 
6
7
  module LucaBook
@@ -79,7 +80,21 @@ module LucaBook
79
80
  def gross(start_year, start_month, end_year = nil, end_month = nil, code: nil, date_range: nil, rows: 4, recursive: false, header: nil)
80
81
  if ! date_range.nil?
81
82
  raise if date_range.class != Range
82
- # TODO: date based range search
83
+
84
+ start_year = date_range.first.year
85
+ start_month = date_range.first.month
86
+ end_year = date_range.last.year
87
+ end_month = date_range.last.month
88
+ date_bound = {
89
+ start: {
90
+ month: "#{start_year}#{LucaSupport::Code.encode_month(start_month)}",
91
+ day: LucaSupport::Code.encode_date(date_range.first)
92
+ },
93
+ end: {
94
+ month: "#{end_year}#{LucaSupport::Code.encode_month(end_month)}",
95
+ day: LucaSupport::Code.encode_date(date_range.last)
96
+ }
97
+ }
83
98
  end
84
99
  scan_headers = header&.map { |k, v|
85
100
  [:customer, :editor].include?(k) ? [ "x-#{k.to_s}", v ] : nil
@@ -108,7 +123,15 @@ module LucaBook
108
123
  end
109
124
  end
110
125
  end
111
- enm.each do |f, _path|
126
+ enm.each do |f, path|
127
+ if date_bound
128
+ if path[0] == date_bound[:start][:month]
129
+ next if path[1][0] < date_bound[:start][:day]
130
+ elsif path[0] == date_bound[:end][:month]
131
+ next if path[1][0] > date_bound[:end][:day]
132
+ end
133
+ end
134
+
112
135
  CSV.new(f, headers: false, col_sep: "\t", encoding: 'UTF-8')
113
136
  .each_with_index do |row, i|
114
137
  break if i >= rows
@@ -183,7 +206,7 @@ module LucaBook
183
206
  # Override LucaRecord::IO.load_data
184
207
  #
185
208
  def load_data(io, path = nil)
186
- io
209
+ [io, path]
187
210
  end
188
211
  end
189
212
 
@@ -102,12 +102,13 @@ module LucaBook
102
102
  end
103
103
 
104
104
  def self.latest_balance_path(date)
105
- start_year = date.month >= LucaSupport::CONST.config['fy_start'] ? date.year : date.year - 1
106
- latest = Date.new(start_year, LucaSupport::CONST.config['fy_start'], 1).prev_month
105
+ start_date, _ = LucaBook::Util.current_fy(date)
107
106
  dict_dir = Pathname(LucaSupport::CONST.pjdir) / 'data' / 'balance'
108
- fileglob = %Q(start-#{latest.year}-#{format("%02d", latest.month)}-*)
109
- path = Dir.glob(fileglob, base: dict_dir)[0] || 'start.tsv'
110
- dict_dir / path
107
+ paths = Dir.glob(%Q(start-*-*-*), base: dict_dir, sort: true)
108
+ .reject {|path| path > %Q(start-#{start_date.year}-#{format("%02d", start_date.month)}-) }
109
+ return dict_dir / 'start.tsv' if paths.empty?
110
+
111
+ dict_dir / paths.reverse.first
111
112
  end
112
113
 
113
114
  def self.issue_date(obj)
@@ -38,7 +38,7 @@ module LucaBook
38
38
  csv << ['code', 'label', 'balance']
39
39
  csv << ['_date', '2020-1-1']
40
40
  CSV.open("#{__dir__}/templates/#{dict}", 'r', col_sep: "\t", encoding: 'UTF-8').each do |row|
41
- csv << row if /^[1-9]/.match(row[0])
41
+ csv << row[0, 1] if /^[1-9]/.match(row[0])
42
42
  end
43
43
  end
44
44
  end
@@ -213,17 +213,18 @@ module LucaBook
213
213
 
214
214
  def self.start_balance(year, month, recursive: true)
215
215
  start_date = Date.new(year, month, 1)
216
- base = Dict.latest_balance(start_date).each_with_object({}) do |(k, v), h|
216
+ balance = Dict.latest_balance(start_date)
217
+ base = balance.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 month == LucaSupport::CONST.config['fy_start'].to_i
221
+ pre_first = Date.parse(balance.dig("_date", :label)).next_month
222
+ if start_date <= pre_first
221
223
  return recursive ? total_subaccount(base) : base
222
224
  end
223
225
 
224
226
  pre_last = start_date.prev_month
225
- year -= 1 if month <= LucaSupport::CONST.config['fy_start'].to_i
226
- pre = accumulate_term(year, LucaSupport::CONST.config['fy_start'], pre_last.year, pre_last.month)
227
+ pre = accumulate_term(pre_first.year, pre_first.month, pre_last.year, pre_last.month)
227
228
  total = {}.tap do |h|
228
229
  (pre.keys + base.keys).uniq.each do |k|
229
230
  h[k] = (base[k] || BigDecimal('0')) + (pre[k] || BigDecimal('0'))
@@ -232,6 +233,14 @@ module LucaBook
232
233
  recursive ? total_subaccount(total) : total
233
234
  end
234
235
 
236
+ def write_xbrl(filename = nil)
237
+ xbrl, xsd = render_xbrl(filename)
238
+ doctype = %Q(<?xml version="1.0" encoding="UTF-8"?>)
239
+
240
+ File.open("#{@filename}.xbrl", 'w') { |f| f.write [doctype, xbrl].join("\n") }
241
+ File.open("#{@filename}.xsd", 'w') { |f| f.write [doctype, xsd].join("\n") }
242
+ end
243
+
235
244
  def render_xbrl(filename = nil)
236
245
  set_bs(3, legal: true)
237
246
  set_pl(3)
@@ -248,8 +257,7 @@ module LucaBook
248
257
  @xbrl_entries += equity_change.join("\n")
249
258
  @filename = filename || "statement-#{@issue_date}"
250
259
 
251
- File.open("#{@filename}.xbrl", 'w') { |f| f.write render_erb(search_template("base-#{country_suffix}.xbrl.erb")) }
252
- File.open("#{@filename}.xsd", 'w') { |f| f.write render_erb(search_template("base-#{country_suffix}.xsd.erb")) }
260
+ [render_erb(search_template("base-#{country_suffix}.xbrl.erb")), render_erb(search_template("base-#{country_suffix}.xsd.erb"))]
253
261
  end
254
262
 
255
263
  # TODO: proper decimals attr for each currency
@@ -336,7 +344,7 @@ module LucaBook
336
344
  changes = []
337
345
  LucaBook::Journal.filter_by_code(@start_date.year, @start_date.month, @end_date.year, @end_date.month, '9').each do |dat|
338
346
  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]) }
347
+ debit_str ||= '33' if dat[:debit].find { |e| /^33/.match(e[:code]) }
340
348
  debit_str ||= 'ASET' if dat[:debit].find { |e| /^[3]/.match(e[:code]) }
341
349
  credit_str = 'DEBT' if dat[:credit].find { |e| /^[57]/.match(e[:code]) }
342
350
  credit_str ||= 'ASET' if dat[:credit].find { |e| /^[12]/.match(e[:code]) }
@@ -1,4 +1,3 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
1
  <xbrli:xbrl xmlns:xbrli="http://www.xbrl.org/2003/instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:link="http://www.xbrl.org/2003/linkbase" xmlns:iso4217="http://www.xbrl.org/2003/iso4217" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:jpfr-etax-di="http://xml.e-tax.nta.go.jp/jp/fr/etax/o/di/2013-03-25" xmlns:jpfr-oe="http://info.edinet-fsa.go.jp/jp/fr/gaap/o/oe/2012-01-25" xmlns:jpfr-t-cte="http://info.edinet-fsa.go.jp/jp/fr/gaap/t/cte/2012-01-25" xmlns:jppfs_cor="http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2019-11-01/jppfs_cor" xmlns:jpfr-etax-t-cte="http://xml.e-tax.nta.go.jp/jp/fr/etax/t/cte/2013-03-25">
3
2
  <link:schemaRef xmlns:link="http://www.xbrl.org/2003/linkbase" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="<%= @filename %>.xsd" />
4
3
 
@@ -1,4 +1,3 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
1
  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:link="http://www.xbrl.org/2003/linkbase" xmlns:e-tax-pks-<%= @issue_date %>="http://xbrlsoft.e-tax.nta.go.jp/XSD/e-tax-pks-<%= @issue_date %>" targetNamespace="http://xbrlsoft.e-tax.nta.go.jp/XSD/e-tax-pks-<%= @issue_date %>" elementFormDefault="qualified">
3
2
  <xsd:import namespace="http://www.xbrl.org/2003/instance" schemaLocation="http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd" />
4
3
  <xsd:import namespace="http://xml.e-tax.nta.go.jp/jp/fr/etax/o/di/2013-03-25" schemaLocation="http://xml.e-tax.nta.go.jp/jp/fr/etax/o/di/2013-03-25/jpfr-etax-di-2013-03-25.xsd" />
@@ -41,8 +41,11 @@ code label xbrl_id consumption_tax income_tax
41
41
  1858 仮払地方税付加価値割
42
42
  1859 仮払地方税法人税割
43
43
  185A 仮払地方税均等割
44
- 185B 仮払消費税
44
+ 185B 仮払消費税
45
45
  185C 仮払地方消費税
46
+ 185D 仮払市民税法人税割
47
+ 185E 仮払市民税均等割
48
+ 185F 仮払所得税
46
49
  30 固定資産 jpfr-t-cte:NoncurrentAssets
47
50
  31 有形固定資産 jpfr-t-cte:PropertyPlantAndEquipment
48
51
  311 建物 jpfr-t-cte:Buildings
@@ -164,7 +167,9 @@ C1S 支払報酬 jpfr-t-cte:CompensationsSGA
164
167
  C1T 研修費 jpfr-etax-t-cte:RecruitmentEducationExpense
165
168
  C1U 採用費
166
169
  C1V 業務委託費
167
- C1W 会議費
170
+ C1W 会議費 jpfr-etax-t-cte:ConventionExpense
171
+ C1X 寄付金 jpfr-etax-t-cte:Donation
172
+ C1X1 指定寄付金
168
173
  CA 営業利益 jpfr-t-cte:OperatingIncome
169
174
  D0 営業外収益 jpfr-t-cte:NonOperatingIncome
170
175
  D11 受取利息 jpfr-t-cte:InterestIncomeNOI
@@ -195,4 +200,6 @@ H111 法人税
195
200
  H112 都道府県住民税
196
201
  H113 市町村住民税
197
202
  H114 地方事業税
203
+ H115 所得税税額控除
204
+ H116 外国税
198
205
  HA 当期利益 jpfr-t-cte:NetIncome
@@ -15,7 +15,7 @@ module LucaBook
15
15
  [d - c, { debit: d, credit: c }]
16
16
  end
17
17
 
18
- # items assumed as bellows:
18
+ # items assumed:
19
19
  # [{ code: '113', amount: 1000 }, ... ]
20
20
  #
21
21
  def diff_by_code(items, code)
@@ -48,7 +48,7 @@ module LucaBook
48
48
  start_month = LucaSupport::CONST.config['fy_start']
49
49
  start_year = date.month >= start_month ? date.year : date.year - 1
50
50
  @start_date = Date.new(start_year, start_month, 1)
51
- @end_date = Date.new(start_year + 1, start_month - 1, -1)
51
+ @end_date = @start_date.next_year.prev_day
52
52
  @end_date = [to, @end_date].min if to
53
53
  [@start_date, @end_date]
54
54
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LucaBook
4
- VERSION = '0.5.2'
4
+ VERSION = '0.5.4'
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.5.2
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chuma Takahiro
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-05 00:00:00.000000000 Z
11
+ date: 2024-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lucarecord