1use clap::{Parser, Subcommand};
2
3#[derive(Parser, Debug)]
4#[command(name = "invoice", version, about = "Beautiful invoices from the CLI")]
5pub struct Cli {
6 #[arg(long, global = true)]
8 pub json: bool,
9 #[arg(long, global = true)]
11 pub quiet: bool,
12 #[command(subcommand)]
13 pub command: Commands,
14}
15
16#[derive(Subcommand, Debug)]
17pub enum Commands {
18 #[command(visible_alias = "issuer", subcommand)]
20 Issuers(IssuerCmd),
21
22 #[command(subcommand)]
24 Clients(ClientCmd),
25
26 #[command(subcommand)]
28 Products(ProductCmd),
29
30 #[command(subcommand)]
32 Invoices(InvoiceCmd),
33
34 #[command(subcommand)]
36 Template(TemplateCmd),
37
38 #[command(subcommand)]
40 Config(ConfigCmd),
41
42 #[command(alias = "info")]
44 AgentInfo,
45
46 #[command(subcommand)]
48 Skill(SkillCmd),
49
50 Doctor,
52
53 Update {
55 #[arg(long)]
57 check: bool,
58 },
59}
60
61#[derive(Subcommand, Debug)]
62pub enum IssuerCmd {
63 #[command(alias = "new")]
65 Add {
66 slug: String,
67 #[arg(long)]
68 name: String,
69 #[arg(long)]
70 legal_name: Option<String>,
71 #[arg(long, default_value = "sg")]
72 jurisdiction: String,
73 #[arg(long)]
74 tax_registered: bool,
75 #[arg(long)]
76 tax_id: Option<String>,
77 #[arg(long)]
78 company_no: Option<String>,
79 #[arg(long)]
80 address: String,
81 #[arg(long)]
82 email: Option<String>,
83 #[arg(long)]
84 phone: Option<String>,
85 #[arg(long = "bank-line")]
91 bank_line: Vec<String>,
92 #[arg(long, default_value = "vienna")]
93 template: String,
94 #[arg(long)]
96 logo: Option<String>,
97 #[arg(long)]
101 output_dir: Option<String>,
102 #[arg(long)]
106 notes: Option<String>,
107 },
108 Edit {
110 slug: String,
111 #[arg(long)]
112 name: Option<String>,
113 #[arg(long)]
114 legal_name: Option<String>,
115 #[arg(long)]
116 jurisdiction: Option<String>,
117 #[arg(long)]
118 tax_registered: Option<bool>,
119 #[arg(long)]
120 tax_id: Option<String>,
121 #[arg(long)]
122 company_no: Option<String>,
123 #[arg(long)]
124 tagline: Option<String>,
125 #[arg(long)]
126 address: Option<String>,
127 #[arg(long)]
128 email: Option<String>,
129 #[arg(long)]
130 phone: Option<String>,
131 #[arg(long = "bank-line")]
135 bank_line: Vec<String>,
136 #[arg(long)]
138 bank_clear: bool,
139 #[arg(long)]
140 template: Option<String>,
141 #[arg(long)]
142 currency: Option<String>,
143 #[arg(long)]
144 symbol: Option<String>,
145 #[arg(long)]
146 number_format: Option<String>,
147 #[arg(long)]
148 logo: Option<String>,
149 #[arg(long)]
151 logo_clear: bool,
152 #[arg(long)]
155 output_dir: Option<String>,
156 #[arg(long)]
158 notes: Option<String>,
159 },
160 SetTemplate { slug: String, template: String },
162 #[command(alias = "ls")]
163 List,
164 #[command(alias = "get")]
165 Show { slug: String },
166 #[command(alias = "rm")]
167 Delete { slug: String },
168}
169
170#[derive(Subcommand, Debug)]
171pub enum ClientCmd {
172 #[command(alias = "new")]
173 Add {
174 slug: String,
175 #[arg(long)]
176 name: String,
177 #[arg(long)]
178 attn: Option<String>,
179 #[arg(long)]
180 country: Option<String>,
181 #[arg(long)]
182 tax_id: Option<String>,
183 #[arg(long)]
184 address: String,
185 #[arg(long)]
186 email: Option<String>,
187 #[arg(long)]
188 notes: Option<String>,
189 #[arg(long)]
191 default_issuer: Option<String>,
192 #[arg(long)]
194 default_template: Option<String>,
195 },
196 Edit {
198 slug: String,
199 #[arg(long)]
200 name: Option<String>,
201 #[arg(long)]
202 attn: Option<String>,
203 #[arg(long)]
204 country: Option<String>,
205 #[arg(long)]
206 tax_id: Option<String>,
207 #[arg(long)]
208 address: Option<String>,
209 #[arg(long)]
210 email: Option<String>,
211 #[arg(long)]
212 notes: Option<String>,
213 #[arg(long)]
214 default_issuer: Option<String>,
215 #[arg(long)]
216 default_template: Option<String>,
217 },
218 SetIssuer { slug: String, issuer_slug: String },
220 SetTemplate { slug: String, template: String },
222 #[command(alias = "ls")]
223 List,
224 #[command(alias = "get")]
225 Show { slug: String },
226 #[command(alias = "rm")]
227 Delete { slug: String },
228}
229
230#[derive(Subcommand, Debug)]
231pub enum ProductCmd {
232 #[command(alias = "new")]
233 Add {
234 slug: String,
235 #[arg(long)]
236 description: String,
237 #[arg(long)]
238 subtitle: Option<String>,
239 #[arg(long, default_value = "unit")]
240 unit: String,
241 #[arg(long)]
243 price: String,
244 #[arg(long)]
245 currency: String,
246 #[arg(long, default_value = "0")]
247 tax_rate: String,
248 },
249 Edit {
251 slug: String,
252 #[arg(long)]
253 description: Option<String>,
254 #[arg(long)]
255 subtitle: Option<String>,
256 #[arg(long)]
257 unit: Option<String>,
258 #[arg(long)]
259 price: Option<String>,
260 #[arg(long)]
261 currency: Option<String>,
262 #[arg(long)]
263 tax_rate: Option<String>,
264 },
265 #[command(alias = "ls")]
266 List,
267 #[command(alias = "get")]
268 Show { slug: String },
269 #[command(alias = "rm")]
270 Delete { slug: String },
271}
272
273#[derive(Subcommand, Debug)]
274pub enum InvoiceCmd {
275 New {
277 #[arg(long)]
280 r#as: Option<String>,
281 #[arg(long)]
283 client: String,
284 #[arg(long = "item")]
286 items: Vec<String>,
287 #[arg(long, default_value = "7d")]
290 due: String,
291 #[arg(long, default_value = "Pay in full")]
293 terms: String,
294 #[arg(long)]
295 notes: Option<String>,
296 #[arg(long)]
298 currency: Option<String>,
299 #[arg(long)]
301 reverse_charge: bool,
302 #[arg(long)]
304 pay_link: Option<String>,
305 #[arg(long)]
307 discount_rate: Option<String>,
308 #[arg(long)]
310 discount_fixed: Option<String>,
311 },
312 Edit {
315 number: String,
316 #[arg(long)]
317 client: Option<String>,
318 #[arg(long)]
319 due: Option<String>,
320 #[arg(long)]
321 terms: Option<String>,
322 #[arg(long)]
323 notes: Option<String>,
324 #[arg(long)]
325 currency: Option<String>,
326 #[arg(long)]
327 pay_link: Option<String>,
328 #[arg(long)]
329 reverse_charge: Option<bool>,
330 #[arg(long)]
331 discount_rate: Option<String>,
332 #[arg(long)]
333 discount_fixed: Option<String>,
334 },
335 #[command(subcommand)]
337 Items(InvoiceItemCmd),
338 CreditNote {
340 number: String,
342 #[arg(long, conflicts_with = "items")]
345 full: bool,
346 #[arg(long = "item")]
350 items: Vec<String>,
351 #[arg(long)]
352 notes: Option<String>,
353 #[arg(long)]
354 pay_link: Option<String>,
355 },
356 Aging {
358 #[arg(long = "as")]
359 issuer: Option<String>,
360 },
361 Export {
363 #[arg(long)]
365 from: Option<String>,
366 #[arg(long)]
368 to: Option<String>,
369 #[arg(long, default_value = "csv")]
371 format: String,
372 #[arg(long, short)]
374 out: Option<String>,
375 #[arg(long = "as")]
376 issuer: Option<String>,
377 },
378 Duplicate {
381 number: String,
382 #[arg(long)]
384 client: Option<String>,
385 #[arg(long = "as")]
387 r#as: Option<String>,
388 #[arg(long, default_value = "7d")]
390 due: String,
391 },
392 #[command(alias = "ls")]
393 List {
394 #[arg(long)]
395 status: Option<String>,
396 #[arg(long = "as")]
397 issuer: Option<String>,
398 #[arg(long)]
400 overdue: bool,
401 },
402 #[command(alias = "get")]
403 Show { number: String },
404 Render {
406 number: String,
407 #[arg(long)]
409 template: Option<String>,
410 #[arg(long, short)]
412 out: Option<String>,
413 #[arg(long)]
415 open: bool,
416 },
417 Mark { number: String, status: String },
419 #[command(alias = "rm")]
420 Delete {
421 number: String,
422 #[arg(long)]
425 force: bool,
426 },
427}
428
429#[derive(Subcommand, Debug)]
430pub enum InvoiceItemCmd {
431 Add {
433 number: String,
434 spec: String,
436 #[arg(long)]
437 subtitle: Option<String>,
438 #[arg(long)]
439 discount_rate: Option<String>,
440 #[arg(long)]
441 discount_fixed: Option<String>,
442 },
443 #[command(alias = "rm")]
445 Remove { number: String, position: i64 },
446 Edit {
448 number: String,
449 position: i64,
450 #[arg(long)]
451 description: Option<String>,
452 #[arg(long)]
453 subtitle: Option<String>,
454 #[arg(long)]
455 qty: Option<String>,
456 #[arg(long)]
457 unit: Option<String>,
458 #[arg(long)]
459 price: Option<String>,
460 #[arg(long)]
461 tax_rate: Option<String>,
462 #[arg(long)]
463 discount_rate: Option<String>,
464 #[arg(long)]
465 discount_fixed: Option<String>,
466 },
467}
468
469#[derive(Subcommand, Debug)]
470pub enum TemplateCmd {
471 #[command(alias = "ls")]
472 List,
473 Preview {
475 name: String,
476 #[arg(long, short)]
477 out: Option<String>,
478 },
479}
480
481#[derive(Subcommand, Debug)]
482pub enum ConfigCmd {
483 Show,
484 Path,
485 Set { key: String, value: String },
486}
487
488#[derive(Subcommand, Debug)]
489pub enum SkillCmd {
490 Install,
491}