lucabook 0.2.28 → 0.2.29

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: 0b2cc0f6aefd92521a518af25010f4fcb125e32aff9b71c9a18304b606451556
4
- data.tar.gz: 6689918d842fca5a64060f998ea419aeb2f8db4350c7b0073e39b6a07b0dbb43
3
+ metadata.gz: b6e3ddc43f78a55be0357756cc617efd9fc798836cd771e4814a058e62abc6eb
4
+ data.tar.gz: b5b6d3419d2dbfcee9f859744c7513830a6576868a6a51241ea0ee04633c0c5f
5
5
  SHA512:
6
- metadata.gz: 192298f7a6cd006f5699ec02a109c6f4e10f9240ebc7fc228af277265eab5b467e90bcbd58063f8381b61f258d99732d69155c90af4fac619d9c94da43a2fb27
7
- data.tar.gz: 1231261012e602b438469cbcd357dc64a58c14357b8a0c63c4b5fa7dbe398f2b5080a3d53c404c63f543ff87f681f7fc38cb183ea35d5528ccbc905cdcebfaa1
6
+ metadata.gz: f2c7c3b7043a60f39379be1c6e36b02367e2ec31261b0268768934c2f258cba62d3fc042f6286c5ac62b15289a89d1ac6e05143dcb9f2ecc04b5aa8d37bb9a89
7
+ data.tar.gz: 653e43c3f11785dabf83e8997810ae3316b8549b8370854e42bcc170ba54729dc50762e11e0733fbff2994fc15a37d6ac1eeb60c2581885f451acafeb57f5cdc
data/exe/luca-book CHANGED
@@ -26,6 +26,8 @@ class LucaCmd
26
26
  else
27
27
  render(LucaBook::List.term(*args, code: params['code'], recursive: params[:recursive]).list_by_code(params[:recursive]), params)
28
28
  end
29
+ elsif params['render']
30
+ puts LucaBook::List.term(*args).render_html(params['render'])
29
31
  else
30
32
  render(LucaBook::List.term(*args).list_journals, params)
31
33
  end
@@ -141,6 +143,8 @@ when /journals?/, 'j'
141
143
  opt.on('-n VAL', 'report count') { |v| params[:n] = v.to_i }
142
144
  opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
143
145
  opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
146
+ opt.on('--html', 'output journals html') { |_v| params['render'] = :html }
147
+ opt.on('--pdf', 'output journals PDF') { |_v| params['render'] = :pdf }
144
148
  opt.on_tail('List records. If you specify code and/or month, search on each criteria.')
145
149
  args = opt.parse!(ARGV)
146
150
  LucaCmd::Journal.list(args, params)
@@ -101,10 +101,120 @@ module LucaBook #:nodoc:
101
101
  end
102
102
  end
103
103
 
104
+ def render_html(file_type = :html)
105
+ start_balance = set_balance(true)
106
+ @journals = group_by_code.map do |account|
107
+ balance = start_balance[account[:code]] || BigDecimal('0')
108
+ table = []
109
+ table << %Q(<h2 class="title">#{@@dict.dig(account[:code], :label)}</h2>)
110
+
111
+ account[:vouchers].map { |voucher| filter_by_code(voucher, account[:code]) }.flatten
112
+ .unshift({ balance: readable(balance) })
113
+ .map { |row|
114
+ balance += Util.pn_debit(account[:code]) * ((row.dig(:amount, :debit) || 0) - (row.dig(:amount, :credit) || 0))
115
+ row[:balance] = readable(balance)
116
+ row
117
+ }
118
+ .map { |row| render_line(row) }
119
+ .each_slice(28) do |rows|
120
+ table << table_header
121
+ table << rows.join("\n")
122
+ table << table_footer
123
+ table << %Q(<hr class='pgbr' />)
124
+ end
125
+ table[0..-2].join("\n")
126
+ end
127
+
128
+ case file_type
129
+ when :html
130
+ render_erb(search_template('journals.html.erb'))
131
+ when :pdf
132
+ erb2pdf(search_template('journals.html.erb'))
133
+ else
134
+ raise 'This filetype is not supported.'
135
+ end
136
+ end
137
+
138
+ def table_header
139
+ %Q(<table>
140
+ <thead>
141
+ <th>Date<br />No</th>
142
+ <th>Counter account</th>
143
+ <th>Sub account<br />Note</th>
144
+ <th>Debit</th>
145
+ <th>Credit</th>
146
+ <th>Balance</th>
147
+ </thead>
148
+ <tbody>)
149
+ end
150
+
151
+ def table_footer
152
+ %Q(</tbody>
153
+ </table>)
154
+ end
155
+
156
+ def filter_by_code(voucher, code)
157
+ [:debit, :credit].each_with_object([]) do |balance, lines|
158
+ voucher[balance].each do |record|
159
+ next unless /^#{code}/.match(record[:code])
160
+
161
+ counter_balance = (balance == :debit) ? :credit : :debit
162
+ view = { code: record[:code], amount: {} }
163
+ view[:date], view[:txid] = decode_id(voucher[:id])
164
+ view[:label] = @@dict.dig(record[:code], :label) if record[:code].length >= 4
165
+ view[:amount][balance] = readable(record[:amount])
166
+ view[:counter_code] = voucher.dig(counter_balance, 0, :code)
167
+ view[:counter_label] = @@dict.dig(view[:counter_code], :label) || ''
168
+ view[:counter_label] += ' sundry a/c' if voucher[counter_balance].length > 1
169
+ view[:note] = voucher[:note]
170
+ lines << view
171
+ end
172
+ end
173
+ end
174
+
175
+ def render_line(view)
176
+ %Q(<tr>
177
+ <td class="date">#{view[:date]}<br /><div>#{view[:txid]}</div></td>
178
+ <td class="counter">#{view[:counter_label]}</td>
179
+ <td class="note">#{view[:label]}<br /><div class="note">#{view[:note]}</div></td>
180
+ <td class="debit amount">#{view.dig(:amount, :debit)}</td>
181
+ <td class="credit amount">#{view.dig(:amount, :credit)}</td>
182
+ <td class="balance">#{view[:balance]}</td>
183
+ </tr>)
184
+ end
185
+
186
+ def group_by_code(level = 3)
187
+ list_accounts.map do |code|
188
+ vouchers = @data.filter do |voucher|
189
+ codes = [:debit, :credit].map do |balance|
190
+ voucher[balance].map { |record| record[:code][0, level] }
191
+ end
192
+ codes.flatten.include?(code)
193
+ end
194
+ { code: code, vouchers: vouchers }
195
+ end
196
+ end
197
+
198
+ def list_accounts(level = 3)
199
+ return nil if level < 3
200
+
201
+ list = @data.each_with_object([]) do |voucher, codes|
202
+ [:debit, :credit].each do |balance|
203
+ voucher[balance].each do |record|
204
+ next if record[:code].length < level
205
+
206
+ codes << record[:code][0, level]
207
+ end
208
+ end
209
+ end
210
+ list.uniq.sort
211
+ end
212
+
104
213
  private
105
214
 
106
215
  def set_balance(recursive = false)
107
- return BigDecimal('0') if @code.nil? || /^[A-H]/.match(@code)
216
+ return LucaBook::State.start_balance(@start.year, @start.month, recursive: recursive) if @code.nil?
217
+ return BigDecimal('0') if /^[A-H]/.match(@code)
108
218
 
109
219
  LucaBook::State.start_balance(@start.year, @start.month, recursive: recursive)[@code] || BigDecimal('0')
110
220
  end
@@ -145,5 +255,9 @@ module LucaBook #:nodoc:
145
255
  end
146
256
  end
147
257
  end
258
+
259
+ def lib_path
260
+ __dir__
261
+ end
148
262
  end
149
263
  end
@@ -0,0 +1,23 @@
1
+ <html>
2
+ <head>
3
+ <meta charset="utf-8">
4
+ <style>
5
+ body { size: A4 }
6
+ .pgbr { page-break-after: always; visibility: hidden }
7
+ .title { margin-bottom: 1.5rem; text-align: center }
8
+ div.note { font-size: .8em }
9
+ table { border-collapse: collapse; max-width: 92%; margin: 1em auto }
10
+ th, td { border-bottom: solid 1px #555; }
11
+ td div { break-before: avoid-page; break-after: avoid-page; break-inside: avoid-page }
12
+ td { padding-top: .3em; padding-bottom: .3em; break-inside: avoid-page }
13
+ td.date { min-width: 7em; text-align: right; padding-right: 1em }
14
+ td.counter { min-width: 8.5em; padding-right: .5em }
15
+ td.note { min-width: 12em }
16
+ td.amount { text-align: right; min-width: 7em }
17
+ td.balance { text-align: right; min-width: 10em; padding-right: 1em }
18
+ </style>
19
+ </head>
20
+ <body>
21
+ <%= @journals.join("<hr class='pgbr' />\n") %>
22
+ </body>
23
+ </html>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LucaBook
4
- VERSION = '0.2.28'
4
+ VERSION = '0.2.29'
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.28
4
+ version: 0.2.29
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chuma Takahiro
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-03-17 00:00:00.000000000 Z
11
+ date: 2021-03-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lucarecord
@@ -95,6 +95,7 @@ files:
95
95
  - lib/luca_book/templates/dict-en.tsv
96
96
  - lib/luca_book/templates/dict-jp-edinet.tsv
97
97
  - lib/luca_book/templates/dict-jp.tsv
98
+ - lib/luca_book/templates/journals.html.erb
98
99
  - lib/luca_book/templates/monthly-report.html.erb
99
100
  - lib/luca_book/test.rb
100
101
  - lib/luca_book/util.rb