lucadeal 0.2.18 → 0.2.24
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/README.md +23 -1
- data/exe/luca-deal +265 -30
- data/lib/luca_deal.rb +1 -0
- data/lib/luca_deal/contract.rb +11 -1
- data/lib/luca_deal/customer.rb +17 -4
- data/lib/luca_deal/fee.rb +165 -32
- data/lib/luca_deal/invoice.rb +107 -52
- data/lib/luca_deal/no_invoice.rb +20 -0
- data/lib/luca_deal/setup.rb +1 -1
- data/lib/luca_deal/templates/fee-report-mail.txt.erb +6 -0
- data/lib/luca_deal/templates/fee-report.html.erb +54 -0
- data/lib/luca_deal/templates/invoice-mail.txt.erb +6 -0
- data/lib/luca_deal/templates/invoice.html.erb +52 -0
- data/lib/luca_deal/templates/monthly-payment-list.html.erb +54 -0
- data/lib/luca_deal/version.rb +1 -1
- metadata +9 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0e4fa52c476838906c3ad849ab1bc4a9bf58926a526034553a90d6c6299d7945
|
4
|
+
data.tar.gz: c3e434b8677a0b502cfbef70dc8d936bbc2dd3d7f0be0b6b1e2edea8294baa2c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae66f02ef1861eeb9bf217dc5547b05bdd384a9d25bddd8d12dfd62ab2fea63e3f051c699dc267620488949659c98e772799d027dd27101b2d214b8517b55ba2
|
7
|
+
data.tar.gz: 5ec46b9f38cb9bfda178896e2319d728cd41df86d6fb389342a4e9759351e64608abe33980a7cf35e5a8f25459223521c9a69bf356dc61fad55d8cb83588cdda
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,33 @@
|
|
1
|
+
## LucaDeal 0.2.24
|
2
|
+
|
3
|
+
* add `luca-deal invoices create --monthly --mail`, send payment list after monthly invoice creation.
|
4
|
+
* add 'other_payments' tracking with no invoices.
|
5
|
+
* can have limit on fee calculation.
|
6
|
+
* initial implment of `luca-deal fee list`
|
7
|
+
|
8
|
+
## LucaDeal 0.2.23
|
9
|
+
|
10
|
+
* implement `luca-deal invoices list --mail`: payment list via HTML mail
|
11
|
+
|
12
|
+
## LucaDeal 0.2.22
|
13
|
+
|
14
|
+
* Breaking change: export key 'value' -> 'amount'
|
15
|
+
|
16
|
+
## LucaDeal 0.2.21
|
17
|
+
|
18
|
+
* Implement `luca-deal fee` subcommands.
|
19
|
+
* single invoice creation with contract id fragment.
|
20
|
+
|
21
|
+
## LucaDeal 0.2.20
|
22
|
+
|
23
|
+
* CLI provides `--nu` option. Add JSON output.
|
24
|
+
* `luca-deal invoices list --html`, rendering HTML to stdout.
|
25
|
+
|
26
|
+
## LucaDeal 0.2.19
|
27
|
+
|
28
|
+
* CLI id completion on Customer delete, Contract create/delete
|
29
|
+
* add `describe` to Customer / Contract
|
30
|
+
|
1
31
|
## LucaDeal 0.2.18
|
2
32
|
|
3
33
|
* Breaking change: restructure CLI in sub-sub command format.
|
data/README.md
CHANGED
@@ -61,9 +61,30 @@ Monthly invoices are generated with `invoice create --monthly` sub command. Targ
|
|
61
61
|
$ luca-deal invoice create --monthly [yyyy m]
|
62
62
|
```
|
63
63
|
|
64
|
+
Or, any invoice can be created with contract ID. Contract ID is just unique fragment of uuid, listed with `luca-deal invoice create` with no args.
|
65
|
+
|
66
|
+
```
|
67
|
+
$ luca-deal invoice create 1d3 yyyy m
|
68
|
+
```
|
69
|
+
|
64
70
|
Invoice conditions are defined by contracts.
|
65
71
|
|
66
72
|
|
73
|
+
### Send Invoice
|
74
|
+
|
75
|
+
Invoice is implemented with HTML & ERB. Copy [default template](lib/luca_deal/templates/invoice.html.erb) to `templates/` in the data directory, and customize.
|
76
|
+
If you want to send invoices in PDF, you need to install `wkhtmltopdf command separately. Send mail command is as bellows:`
|
77
|
+
|
78
|
+
```
|
79
|
+
$ luca-deal invoice mail yyyy m
|
80
|
+
```
|
81
|
+
|
82
|
+
|
83
|
+
### Sales Fee
|
84
|
+
|
85
|
+
You can also manage revenue share program with Fee object. Setup proper contract structure.
|
86
|
+
|
87
|
+
|
67
88
|
## Data Structure
|
68
89
|
|
69
90
|
Records are stored in YAML format. On historical records, see [LucaRecord](../lucarecord/README.md#historical-field).
|
@@ -114,7 +135,7 @@ Fields for subscription customers are as bellows:
|
|
114
135
|
| Top level | Second level | | historical | Description |
|
115
136
|
|-----------|---------------|----------|------------|------------------------------------------------------------------------------------------------------|
|
116
137
|
| terms | | | | |
|
117
|
-
| | billing_cycle | optional | | If 'monthly', invoices are generated on each month.
|
138
|
+
| | billing_cycle | optional | | If 'monthly', invoices are generated on each month. If 'other_payments', no_invoices are generated on each month. `no_invoices` are mostly same as invoices, but not sending email. |
|
118
139
|
| | category | optional | | Default: 'subscription' |
|
119
140
|
| products | | | | Array of products. |
|
120
141
|
| | id | | | reference for Product |
|
@@ -133,6 +154,7 @@ Fields for sales fee are as bellows:
|
|
133
154
|
|-----------|--------------|----------|------------|-------------------------------------------------------------------------------------|
|
134
155
|
| terms | | | | |
|
135
156
|
| | category | | | If 'sales_fee', contract is treated as selling commission. |
|
157
|
+
| | limit | | | If set, fees are calculated as mas as `limit` months. |
|
136
158
|
| rate | | optional | | |
|
137
159
|
| | default | | | sales fee rate. |
|
138
160
|
| | initial | | | sales fee rate for items of type=initial. |
|
data/exe/luca-deal
CHANGED
@@ -5,8 +5,8 @@ require 'date'
|
|
5
5
|
require 'optparse'
|
6
6
|
require 'luca_deal'
|
7
7
|
|
8
|
-
|
9
|
-
class Customer
|
8
|
+
class LucaCmd
|
9
|
+
class Customer < LucaCmd
|
10
10
|
def self.create(args = nil, params = {})
|
11
11
|
if args
|
12
12
|
id = LucaDeal::Customer.create(name: args[0])
|
@@ -18,50 +18,137 @@ module LucaCmd
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
def self.
|
22
|
-
if args
|
23
|
-
|
21
|
+
def self.describe(args = nil, params = {})
|
22
|
+
if args.empty?
|
23
|
+
list = LucaDeal::Customer.id_completion('')
|
24
|
+
puts 'requires customer\'s id. exit'
|
25
|
+
list.each { |item| puts " #{item[:id]} #{item[:label]}" }
|
26
|
+
exit 1
|
24
27
|
else
|
28
|
+
list = LucaDeal::Customer.id_completion(args[0])
|
29
|
+
case list.length
|
30
|
+
when 1
|
31
|
+
render(LucaDeal::Customer.new.describe(list.first), params)
|
32
|
+
else
|
33
|
+
puts 'found multiple contract id. exit'
|
34
|
+
list.each { |item| puts " #{item[:id]} #{item[:label]}" }
|
35
|
+
exit 1
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.delete(args = nil, params = {})
|
41
|
+
if args.empty?
|
42
|
+
list = LucaDeal::Customer.id_completion('')
|
25
43
|
puts 'requires customer\'s id. exit'
|
44
|
+
list.each { |item| puts " #{item[:id]} #{item[:label]}" }
|
26
45
|
exit 1
|
46
|
+
else
|
47
|
+
list = LucaDeal::Customer.id_completion(args[0])
|
48
|
+
case list.length
|
49
|
+
when 1
|
50
|
+
id = LucaDeal::Customer.delete(list.first)
|
51
|
+
else
|
52
|
+
puts 'found multiple customer\'s id. exit'
|
53
|
+
list.each { |item| puts " #{item[:id]} #{item[:label]}" }
|
54
|
+
exit 1
|
55
|
+
end
|
27
56
|
end
|
28
57
|
end
|
29
58
|
|
30
59
|
def self.list(args = nil, params = {})
|
31
|
-
LucaDeal::Customer.new.list_name
|
60
|
+
render(LucaDeal::Customer.new.list_name, params)
|
32
61
|
end
|
33
62
|
end
|
34
63
|
|
35
|
-
class Contract
|
64
|
+
class Contract < LucaCmd
|
36
65
|
def self.create(args = nil, params = {})
|
37
|
-
if args
|
38
|
-
|
39
|
-
puts "Successfully generated Contract #{id}" if id
|
40
|
-
puts 'Conditions are tentative. Edit contract detail.' if id
|
41
|
-
else
|
66
|
+
if args.empty?
|
67
|
+
list = LucaDeal::Customer.id_completion('')
|
42
68
|
puts 'requires customer\'s id. exit'
|
69
|
+
list.each { |item| puts " #{item[:id]} #{item[:label]}" }
|
43
70
|
exit 1
|
71
|
+
else
|
72
|
+
list = LucaDeal::Customer.id_completion(args[0])
|
73
|
+
case list.length
|
74
|
+
when 1
|
75
|
+
id = LucaDeal::Contract.new.generate!(list.first, params['category'])
|
76
|
+
puts "Successfully generated Contract #{id}" if id
|
77
|
+
puts 'Conditions are tentative. Edit contract detail.' if id
|
78
|
+
else
|
79
|
+
puts 'found multiple customer\'s id. exit'
|
80
|
+
list.each { |item| puts " #{item[:id]} #{item[:label]}" }
|
81
|
+
exit 1
|
82
|
+
end
|
44
83
|
end
|
45
84
|
end
|
46
85
|
|
47
|
-
def self.
|
48
|
-
if args
|
49
|
-
|
86
|
+
def self.describe(args = nil, params = {})
|
87
|
+
if args.empty?
|
88
|
+
list = LucaDeal::Contract.id_completion('', label: 'customer_name')
|
89
|
+
puts 'requires contract id. exit'
|
90
|
+
list.each { |item| puts " #{item[:id]} #{item[:label]}" }
|
91
|
+
exit 1
|
50
92
|
else
|
93
|
+
list = LucaDeal::Contract.id_completion(args[0])
|
94
|
+
case list.length
|
95
|
+
when 1
|
96
|
+
render(LucaDeal::Contract.new.describe(list.first), params)
|
97
|
+
else
|
98
|
+
puts 'found multiple contract id. exit'
|
99
|
+
list.each { |item| puts " #{item[:id]} #{item[:label]}" }
|
100
|
+
exit 1
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def self.delete(args = nil, params = {})
|
106
|
+
if args.empty?
|
107
|
+
list = LucaDeal::Contract.id_completion('', label: 'customer_name')
|
51
108
|
puts 'requires contract id. exit'
|
109
|
+
list.each { |item| puts " #{item[:id]} #{item[:label]}" }
|
52
110
|
exit 1
|
111
|
+
else
|
112
|
+
list = LucaDeal::Contract.id_completion(args[0])
|
113
|
+
case list.length
|
114
|
+
when 1
|
115
|
+
id = LucaDeal::Contract.delete(list.first)
|
116
|
+
else
|
117
|
+
puts 'found multiple contract id. exit'
|
118
|
+
list.each { |item| puts " #{item[:id]} #{item[:label]}" }
|
119
|
+
exit 1
|
120
|
+
end
|
53
121
|
end
|
54
122
|
end
|
55
123
|
end
|
56
124
|
|
57
|
-
class Invoice
|
125
|
+
class Invoice < LucaCmd
|
58
126
|
def self.create(args = nil, params = {})
|
59
|
-
date = "#{args[0]}-#{args[1]}-#{args[2] || '1'}" if !args.empty?
|
60
127
|
case params['mode']
|
61
128
|
when 'monthly'
|
129
|
+
date = "#{args[0]}-#{args[1]}-#{args[2] || '1'}" if !args.empty?
|
62
130
|
LucaDeal::Invoice.new(date).monthly_invoice
|
131
|
+
LucaDeal::NoInvoice.new(date).monthly_invoice
|
132
|
+
if params[:mail]
|
133
|
+
LucaDeal::Invoice.new(date).stats_email
|
134
|
+
end
|
63
135
|
else
|
64
|
-
|
136
|
+
date = "#{args[1]}-#{args[2]}-#{args[3] || '1'}" if !args.empty?
|
137
|
+
list = LucaDeal::Contract.id_completion(args[0] || '', label: 'customer_name')
|
138
|
+
if args.length != 3
|
139
|
+
puts 'requires contract id & year month. exit'
|
140
|
+
list.each { |item| puts " #{item[:id]} #{item[:label]}" }
|
141
|
+
exit 1
|
142
|
+
else
|
143
|
+
case list.length
|
144
|
+
when 1
|
145
|
+
id = LucaDeal::Invoice.new(date).single_invoice(list.first)
|
146
|
+
else
|
147
|
+
puts 'found multiple contract id. exit'
|
148
|
+
list.each { |item| puts " #{item[:id]} #{item[:label]}" }
|
149
|
+
exit 1
|
150
|
+
end
|
151
|
+
end
|
65
152
|
end
|
66
153
|
end
|
67
154
|
|
@@ -89,7 +176,13 @@ module LucaCmd
|
|
89
176
|
date = "#{Date.today.year}-#{Date.today.month}-1"
|
90
177
|
count = 3
|
91
178
|
end
|
92
|
-
|
179
|
+
if params[:html]
|
180
|
+
LucaDeal::Invoice.new(date).preview_stdout
|
181
|
+
elsif params[:mail]
|
182
|
+
LucaDeal::Invoice.new(date).stats_email
|
183
|
+
else
|
184
|
+
render(LucaDeal::Invoice.new(date).stats(count || 1), params)
|
185
|
+
end
|
93
186
|
end
|
94
187
|
|
95
188
|
def self.mail(args = nil, params = {})
|
@@ -102,6 +195,62 @@ module LucaCmd
|
|
102
195
|
end
|
103
196
|
end
|
104
197
|
end
|
198
|
+
|
199
|
+
class Fee < LucaCmd
|
200
|
+
def self.create(args = nil, params = {})
|
201
|
+
case params['mode']
|
202
|
+
when 'monthly'
|
203
|
+
date = "#{args[0]}-#{args[1]}-#{args[2] || '1'}" if !args.empty?
|
204
|
+
LucaDeal::Fee.new(date).monthly_fee
|
205
|
+
else
|
206
|
+
puts "not implemented yet"
|
207
|
+
exit 1
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def self.delete(args = nil, params = {})
|
212
|
+
if args
|
213
|
+
id = LucaDeal::Fee.delete(args[0])
|
214
|
+
else
|
215
|
+
puts 'requires contract id. exit'
|
216
|
+
exit 1
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
def self.list(args = nil, params = {})
|
221
|
+
date = "#{args[0]}-#{args[1]}-#{args[2] || '1'}" if !args.empty?
|
222
|
+
if args.empty?
|
223
|
+
date = "#{Date.today.year}-#{Date.today.month}-1"
|
224
|
+
count = 3
|
225
|
+
end
|
226
|
+
if params[:html]
|
227
|
+
LucaDeal::Fee.new(date).preview_stdout
|
228
|
+
else
|
229
|
+
render(LucaDeal::Fee.new(date).stats(count || 1), params)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
def self.mail(args = nil, params = {})
|
234
|
+
date = "#{args[0]}-#{args[1]}-#{args[2] || '1'}" if !args.empty?
|
235
|
+
case params['mode']
|
236
|
+
when 'preview'
|
237
|
+
LucaDeal::Fee.new(date).preview_mail
|
238
|
+
else
|
239
|
+
LucaDeal::Fee.new(date).deliver_mail
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
def self.render(dat, params)
|
245
|
+
case params[:output]
|
246
|
+
when 'json'
|
247
|
+
puts JSON.dump(dat)
|
248
|
+
when 'nu'
|
249
|
+
LucaSupport::View.nushell(YAML.dump(dat))
|
250
|
+
else
|
251
|
+
puts YAML.dump(dat)
|
252
|
+
end
|
253
|
+
end
|
105
254
|
end
|
106
255
|
|
107
256
|
def new_pj(args = nil, params = {})
|
@@ -116,22 +265,39 @@ case cmd
|
|
116
265
|
when /customers?/
|
117
266
|
subcmd = ARGV.shift
|
118
267
|
case subcmd
|
268
|
+
when 'create'
|
269
|
+
OptionParser.new do |opt|
|
270
|
+
opt.banner = 'Usage: luca-deal customers create CustomerName'
|
271
|
+
args = opt.parse(ARGV)
|
272
|
+
LucaCmd::Customer.create(args, params)
|
273
|
+
end
|
119
274
|
when 'list'
|
120
275
|
OptionParser.new do |opt|
|
121
276
|
opt.banner = 'Usage: luca-deal customers list [options]'
|
277
|
+
opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
|
278
|
+
opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
|
122
279
|
args = opt.parse(ARGV)
|
123
280
|
LucaCmd::Customer.list(args, params)
|
124
281
|
end
|
125
|
-
when '
|
282
|
+
when 'describe'
|
126
283
|
OptionParser.new do |opt|
|
127
|
-
opt.banner = 'Usage: luca-deal customers
|
284
|
+
opt.banner = 'Usage: luca-deal customers describe [options] customer_id'
|
285
|
+
opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
|
286
|
+
opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
|
128
287
|
args = opt.parse(ARGV)
|
129
|
-
LucaCmd::Customer.
|
288
|
+
LucaCmd::Customer.describe(args, params)
|
130
289
|
end
|
131
290
|
when 'delete'
|
132
291
|
LucaCmd::Customer.delete(ARGV)
|
133
292
|
else
|
134
|
-
puts '
|
293
|
+
puts 'Proper subcommand needed.'
|
294
|
+
puts
|
295
|
+
puts 'Usage: luca-deal customer[s] subcommands [--help|options]'
|
296
|
+
puts ' create'
|
297
|
+
puts ' list'
|
298
|
+
puts ' describe: show customer with contracts info'
|
299
|
+
puts ' delete'
|
300
|
+
exit 1
|
135
301
|
end
|
136
302
|
when /contracts?/
|
137
303
|
subcmd = ARGV.shift
|
@@ -145,10 +311,24 @@ when /contracts?/
|
|
145
311
|
args = opt.parse(ARGV)
|
146
312
|
LucaCmd::Contract.create(args, params)
|
147
313
|
end
|
314
|
+
when 'describe'
|
315
|
+
OptionParser.new do |opt|
|
316
|
+
opt.banner = 'Usage: luca-deal contracts describe [options] customer_id'
|
317
|
+
opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
|
318
|
+
opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
|
319
|
+
args = opt.parse(ARGV)
|
320
|
+
LucaCmd::Contract.describe(args, params)
|
321
|
+
end
|
148
322
|
when 'delete'
|
149
323
|
LucaCmd::Contract.delete(ARGV)
|
150
324
|
else
|
151
|
-
puts '
|
325
|
+
puts 'Proper subcommand needed.'
|
326
|
+
puts
|
327
|
+
puts 'Usage: luca-deal contract[s] subcommand [--help|options]'
|
328
|
+
puts ' create'
|
329
|
+
puts ' describe: show contract with puroducts or items info'
|
330
|
+
puts ' delete'
|
331
|
+
exit 1
|
152
332
|
end
|
153
333
|
when 'export'
|
154
334
|
LucaCmd::Invoice.export(ARGV)
|
@@ -157,8 +337,9 @@ when /invoices?/, 'i'
|
|
157
337
|
case subcmd
|
158
338
|
when 'create'
|
159
339
|
OptionParser.new do |opt|
|
160
|
-
opt.banner = 'Usage: luca-deal invoices create [options] year month [date]'
|
161
|
-
opt.on('--monthly', 'generate monthly data') { |
|
340
|
+
opt.banner = 'Usage: luca-deal invoices create [options] --monthly|contract_id year month [date]'
|
341
|
+
opt.on('--monthly', 'generate monthly data') { |_v| params['mode'] = 'monthly' }
|
342
|
+
opt.on('--mail', 'send payment list by email. Only works with --monthly') { |_v| params[:mail] = true }
|
162
343
|
args = opt.parse(ARGV)
|
163
344
|
LucaCmd::Invoice.create(args, params)
|
164
345
|
end
|
@@ -167,29 +348,83 @@ when /invoices?/, 'i'
|
|
167
348
|
when 'list'
|
168
349
|
OptionParser.new do |opt|
|
169
350
|
opt.banner = 'Usage: luca-deal invoices list [options] year month [date]'
|
351
|
+
opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
|
352
|
+
opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
|
353
|
+
opt.on('--html', 'output html invoices') { |_v| params[:html] = 'monthly' }
|
354
|
+
opt.on('--mail', 'send payment list by email') { |_v| params[:mail] = true }
|
170
355
|
args = opt.parse(ARGV)
|
171
356
|
LucaCmd::Invoice.list(args, params)
|
172
357
|
end
|
173
358
|
when 'mail'
|
174
359
|
OptionParser.new do |opt|
|
175
360
|
opt.banner = 'Usage: luca-deal invoices mail [options] year month [date]'
|
176
|
-
opt.on('--preview', 'send to preview user') { |
|
361
|
+
opt.on('--preview', 'send to preview user') { |_v| params['mode'] = 'preview' }
|
177
362
|
args = opt.parse(ARGV)
|
178
363
|
LucaCmd::Invoice.mail(args, params)
|
179
364
|
end
|
180
365
|
else
|
181
|
-
puts '
|
366
|
+
puts 'Proper subcommand needed.'
|
367
|
+
puts
|
368
|
+
puts 'Usage: luca-deal invoices subcommand [--help|options]'
|
369
|
+
puts ' create'
|
370
|
+
puts ' delete'
|
371
|
+
puts ' list'
|
372
|
+
puts ' mail: send mail with invoice'
|
373
|
+
exit 1
|
182
374
|
end
|
183
375
|
when 'new'
|
184
376
|
params = {}
|
185
377
|
OptionParser.new do |opt|
|
378
|
+
opt.banner = 'Usage: luca-deal new DIR'
|
186
379
|
args = opt.parse(ARGV)
|
187
380
|
new_pj(args, params)
|
188
381
|
end
|
382
|
+
when /fee/
|
383
|
+
subcmd = ARGV.shift
|
384
|
+
case subcmd
|
385
|
+
when 'create'
|
386
|
+
OptionParser.new do |opt|
|
387
|
+
opt.banner = 'Usage: luca-deal fee create [options] year month [date]'
|
388
|
+
opt.on('--monthly', 'generate monthly data') { |_v| params['mode'] = 'monthly' }
|
389
|
+
args = opt.parse(ARGV)
|
390
|
+
LucaCmd::Fee.create(args, params)
|
391
|
+
end
|
392
|
+
when 'delete'
|
393
|
+
LucaCmd::Fee.delete(ARGV)
|
394
|
+
when 'list'
|
395
|
+
OptionParser.new do |opt|
|
396
|
+
opt.banner = 'Usage: luca-deal fee list [options] year month [date]'
|
397
|
+
opt.on('--nu', 'show table in nushell') { |_v| params[:output] = 'nu' }
|
398
|
+
opt.on('-o', '--output VAL', 'output serialized data') { |v| params[:output] = v }
|
399
|
+
opt.on('--html', 'output html invoices') { |_v| params[:html] = 'monthly' }
|
400
|
+
args = opt.parse(ARGV)
|
401
|
+
LucaCmd::Fee.list(args, params)
|
402
|
+
end
|
403
|
+
when 'mail'
|
404
|
+
OptionParser.new do |opt|
|
405
|
+
opt.banner = 'Usage: luca-deal fee mail [options] year month [date]'
|
406
|
+
opt.on('--preview', 'send to preview user') { |_v| params['mode'] = 'preview' }
|
407
|
+
args = opt.parse(ARGV)
|
408
|
+
LucaCmd::Fee.mail(args, params)
|
409
|
+
end
|
410
|
+
else
|
411
|
+
puts 'Proper subcommand needed.'
|
412
|
+
puts
|
413
|
+
puts 'Usage: luca-deal fee subcommand [--help|options]'
|
414
|
+
puts ' create'
|
415
|
+
puts ' delete'
|
416
|
+
puts ' list'
|
417
|
+
puts ' mail: send mail with report'
|
418
|
+
exit 1
|
419
|
+
end
|
189
420
|
else
|
190
|
-
puts '
|
421
|
+
puts 'Proper subcommand needed.'
|
422
|
+
puts
|
423
|
+
puts 'Usage: luca-deal subcommand [options]'
|
191
424
|
puts ' customers'
|
192
425
|
puts ' contracts'
|
193
426
|
puts ' invoices'
|
194
|
-
puts '
|
427
|
+
puts ' new: initialize project dir'
|
428
|
+
puts ' export: puts invoice data for LucaBook import'
|
429
|
+
exit 1
|
195
430
|
end
|