lucabook 0.5.2 → 0.5.4

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: 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