lucadeal 0.4.2 → 0.5.0

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: bccbeee521150eecf98d76d7a6ee89af35378d3d38b23074003be4efb003cb7a
4
- data.tar.gz: 3d358fda0bef02a3b25e362d977f14d49b2f5a05641c7195b4b714929f11e665
3
+ metadata.gz: fa7bf6bd03335ca54d5bf0a1bf2b3e525677ef21e0ea20b009530ba73b310fc9
4
+ data.tar.gz: 7791dbb5b32566b52ae2bc4209382ca59f1eb95b3f284990f16bd0427f7302ae
5
5
  SHA512:
6
- metadata.gz: a6bacf4bbb7e4ef9343693a4bec91a5a4617a969fb40dd5f6cd9755434da6bce560f2cd1788c83f9dfd1810cc212b3a1a0325866bea9b903e86853ccbdf84118
7
- data.tar.gz: 281a5b540e9746cd84b265e38537584cd2fb1b09372e5e443db4c269ec591bd92db9ab274b33cffaa3dd5b5c22bb65cc30520e56fe3febd19a0e8dfd84f19ada
6
+ metadata.gz: a1b16a74bfdb56bdbda22f1f5003e24f9f5361d361b38c0875a6d8289607328f670a0f10756dc41af7df92b12c1d3b162f15bf9fa68069d175815e13af70bd74
7
+ data.tar.gz: fce3bf80a9cf60ac5b904e7c51bd7fa83911cd1b5d59377cfb5cdfcaa49adc63fef2d6fdc2fbb8c8d6f0443cd9434ce0dd9eddd8012694439bc0554c818771f2
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## LucaDeal 0.5.0
2
+
3
+ * `luca-deal` command now searches valid sub directory.
4
+ * `luca-deal invoices list` has `--full` option with additional settlement info.
5
+ * `--mail --full` lists unsettled table.
6
+
1
7
  ## LucaDeal 0.4.2
2
8
 
3
9
  * `luca-deal custoer|invoice|fee list`, `luca-deal reports balance` supports interactive `--explore` w/nushell.
data/exe/luca-deal CHANGED
@@ -1,6 +1,16 @@
1
1
  #!/usr/bin/ruby
2
2
  # frozen_string_literal: true
3
3
 
4
+ unless Dir.exist?('data') || ARGV[0] == 'new'
5
+ target = 'customers'
6
+ Dir.glob('*').reject { |f| File.symlink?(f) }
7
+ .find { |f| File.directory?("#{f}/data/#{target}") }.tap do |d|
8
+ abort "No valid data directory, exit..." if d.nil?
9
+
10
+ Dir.chdir(d)
11
+ end
12
+ end
13
+
4
14
  require 'date'
5
15
  require 'optparse'
6
16
  require 'luca_deal'
@@ -131,7 +141,7 @@ class LucaCmd
131
141
  LucaDeal::NoInvoice.new(date).monthly_invoice
132
142
  LucaDeal::Fee.new(date).monthly_fee if params[:fee]
133
143
  if params[:mail]
134
- LucaDeal::Invoice.new(date).stats_email
144
+ LucaDeal::Invoice.new(date).stats_email(3, mode: 'full')
135
145
  end
136
146
  else
137
147
  date = "#{args[1]}-#{args[2]}-#{args[3] || '1'}" if !args.empty?
@@ -178,9 +188,9 @@ class LucaCmd
178
188
  count = 3
179
189
  end
180
190
  if params[:mail]
181
- LucaDeal::Invoice.new(date).stats_email
191
+ LucaDeal::Invoice.new(date).stats_email(3, mode: params[:mode])
182
192
  else
183
- render(LucaDeal::Invoice.new(date).stats(count || 1), params)
193
+ render(LucaDeal::Invoice.new(date).stats(count || 1, mode: params[:mode]), params)
184
194
  end
185
195
  end
186
196
 
@@ -390,6 +400,7 @@ when /invoices?/, 'i'
390
400
  opt.on('--explore', 'explore table in nushell') { |_v| params[:output] = 'explore' }
391
401
  opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
392
402
  opt.on('--mail', 'send payment list by email') { |_v| params[:mail] = true }
403
+ opt.on('--full', 'add settlement info') { |_v| params[:mode] = 'full' }
393
404
  args = opt.parse(ARGV)
394
405
  LucaCmd::Invoice.list(args, params)
395
406
  end
@@ -221,7 +221,7 @@ module LucaDeal
221
221
  # total: 100000
222
222
  # tax: 10000
223
223
  #
224
- def stats(count = 1)
224
+ def stats(count = 1, mode: nil)
225
225
  [].tap do |collection|
226
226
  scan_date = @date.next_month
227
227
  count.times do
@@ -235,8 +235,13 @@ module LucaDeal
235
235
  'subtotal' => amount,
236
236
  'tax' => tax,
237
237
  'due' => invoice.dig('due_date'),
238
- 'mail' => invoice.dig('status')&.select { |a| a.keys.include?('mail_delivered') }&.first
239
- }
238
+ 'mail' => invoice.dig('status')&.select { |a| a.keys.include?('mail_delivered') }&.first,
239
+ }.tap do |r|
240
+ if mode == 'full'
241
+ r['settled'] = invoice.dig('settled', 'amount')
242
+ r['settle_date'] = invoice.dig('settled', 'date')
243
+ end
244
+ end
240
245
  end
241
246
  stat['issue_date'] = scan_date.to_s
242
247
  stat['count'] = stat['records'].count
@@ -250,14 +255,25 @@ module LucaDeal
250
255
 
251
256
  # send payment list to preview address or from address.
252
257
  #
253
- def stats_email
258
+ def stats_email(count = 3, mode: nil)
254
259
  {}.tap do |res|
255
- stats(3).each.with_index(1) do |stat, i|
260
+ stats(count, mode: mode).each.with_index(1) do |stat, i|
256
261
  stat['records'].each do |record|
257
262
  res[record['customer']] ||= {}
258
263
  res[record['customer']]['customer_name'] ||= record['customer']
259
- res[record['customer']]["amount#{i}"] ||= record['subtotal']
264
+ res[record['customer']]["amount#{i}"] ||= record['subtotal'].to_s
260
265
  res[record['customer']]["tax#{i}"] ||= record['tax']
266
+ next if mode != 'full' || ! record['settled']
267
+
268
+ diff = ['subtotal', 'tax', 'settled'].map { |k| record[k] }.compact.sum
269
+ mark = if diff == 0
270
+ '[S]'
271
+ elsif diff > 0
272
+ '[P]'
273
+ else
274
+ '[O]'
275
+ end
276
+ res[record['customer']]["amount#{i}"].insert(0, mark)
261
277
  end
262
278
  if i == 1
263
279
  @issue_date = stat['issue_date']
@@ -269,6 +285,16 @@ module LucaDeal
269
285
  @invoices = res.values
270
286
  end
271
287
  @company = CONFIG.dig('company', 'name')
288
+ @legend = if mode == 'full'
289
+ '[S] Settled, [P] Partially settled, [O] Overpaid'
290
+ else
291
+ ''
292
+ end
293
+ @unsettled = if mode == 'full'
294
+ self.class.report(@date)
295
+ else
296
+ []
297
+ end
272
298
 
273
299
  mail = Mail.new
274
300
  mail.to = CONFIG.dig('mail', 'preview') || CONFIG.dig('mail', 'from')
@@ -50,5 +50,28 @@
50
50
  </tr>
51
51
  </tbody>
52
52
  </table>
53
+ <div style="margin: 1em 0"><%= @legend %></div>
54
+
55
+ <% if ! @unsettled.empty? %>
56
+ <h3 style="margin: 1em 0">Unsettled</h3>
57
+ <table>
58
+ <thead>
59
+ <tr>
60
+ <th>#</th>
61
+ <th>Customer</th>
62
+ <th>Balance</th>
63
+ </tr>
64
+ </thead>
65
+ <tbody>
66
+ <% @unsettled.each.with_index(1) do |record, i| %>
67
+ <tr>
68
+ <th><%= i %></th>
69
+ <td><%= record['customer'] %></td>
70
+ <td><%= record['unsettled'] %></td>
71
+ </tr>
72
+ <% end %>
73
+ </tbody>
74
+ </table>
75
+ <% end %>
53
76
  </body>
54
77
  </html>
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module LucaDeal
4
- VERSION = '0.4.2'
4
+ VERSION = '0.5.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lucadeal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chuma Takahiro
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-04-18 00:00:00.000000000 Z
11
+ date: 2023-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: lucarecord
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.5.4
19
+ version: 0.6.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 0.5.4
26
+ version: 0.6.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -111,14 +111,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
111
111
  requirements:
112
112
  - - ">="
113
113
  - !ruby/object:Gem::Version
114
- version: 2.6.0
114
+ version: 3.0.0
115
115
  required_rubygems_version: !ruby/object:Gem::Requirement
116
116
  requirements:
117
117
  - - ">="
118
118
  - !ruby/object:Gem::Version
119
119
  version: '0'
120
120
  requirements: []
121
- rubygems_version: 3.3.5
121
+ rubygems_version: 3.4.10
122
122
  signing_key:
123
123
  specification_version: 4
124
124
  summary: Deal with contracts