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)]
86 bank_name: Option<String>,
87 #[arg(long)]
88 bank_iban: Option<String>,
89 #[arg(long)]
90 bank_bic: Option<String>,
91 #[arg(long, default_value = "vienna")]
92 template: String,
93 #[arg(long)]
95 logo: Option<String>,
96 },
97 Edit {
99 slug: String,
100 #[arg(long)]
101 name: Option<String>,
102 #[arg(long)]
103 legal_name: Option<String>,
104 #[arg(long)]
105 jurisdiction: Option<String>,
106 #[arg(long)]
107 tax_registered: Option<bool>,
108 #[arg(long)]
109 tax_id: Option<String>,
110 #[arg(long)]
111 company_no: Option<String>,
112 #[arg(long)]
113 tagline: Option<String>,
114 #[arg(long)]
115 address: Option<String>,
116 #[arg(long)]
117 email: Option<String>,
118 #[arg(long)]
119 phone: Option<String>,
120 #[arg(long)]
121 bank_name: Option<String>,
122 #[arg(long)]
123 bank_iban: Option<String>,
124 #[arg(long)]
125 bank_bic: Option<String>,
126 #[arg(long)]
127 template: Option<String>,
128 #[arg(long)]
129 currency: Option<String>,
130 #[arg(long)]
131 symbol: Option<String>,
132 #[arg(long)]
133 number_format: Option<String>,
134 #[arg(long)]
135 logo: Option<String>,
136 },
137 SetTemplate {
139 slug: String,
140 template: String,
141 },
142 #[command(alias = "ls")]
143 List,
144 #[command(alias = "get")]
145 Show { slug: String },
146 #[command(alias = "rm")]
147 Delete { slug: String },
148}
149
150#[derive(Subcommand, Debug)]
151pub enum ClientCmd {
152 #[command(alias = "new")]
153 Add {
154 slug: String,
155 #[arg(long)]
156 name: String,
157 #[arg(long)]
158 attn: Option<String>,
159 #[arg(long)]
160 country: Option<String>,
161 #[arg(long)]
162 tax_id: Option<String>,
163 #[arg(long)]
164 address: String,
165 #[arg(long)]
166 email: Option<String>,
167 #[arg(long)]
168 notes: Option<String>,
169 #[arg(long)]
171 default_issuer: Option<String>,
172 #[arg(long)]
174 default_template: Option<String>,
175 },
176 Edit {
178 slug: String,
179 #[arg(long)]
180 name: Option<String>,
181 #[arg(long)]
182 attn: Option<String>,
183 #[arg(long)]
184 country: Option<String>,
185 #[arg(long)]
186 tax_id: Option<String>,
187 #[arg(long)]
188 address: Option<String>,
189 #[arg(long)]
190 email: Option<String>,
191 #[arg(long)]
192 notes: Option<String>,
193 #[arg(long)]
194 default_issuer: Option<String>,
195 #[arg(long)]
196 default_template: Option<String>,
197 },
198 SetIssuer {
200 slug: String,
201 issuer_slug: String,
202 },
203 SetTemplate {
205 slug: String,
206 template: String,
207 },
208 #[command(alias = "ls")]
209 List,
210 #[command(alias = "get")]
211 Show { slug: String },
212 #[command(alias = "rm")]
213 Delete { slug: String },
214}
215
216#[derive(Subcommand, Debug)]
217pub enum ProductCmd {
218 #[command(alias = "new")]
219 Add {
220 slug: String,
221 #[arg(long)]
222 description: String,
223 #[arg(long)]
224 subtitle: Option<String>,
225 #[arg(long, default_value = "unit")]
226 unit: String,
227 #[arg(long)]
229 price: String,
230 #[arg(long)]
231 currency: String,
232 #[arg(long, default_value = "0")]
233 tax_rate: String,
234 },
235 Edit {
237 slug: String,
238 #[arg(long)]
239 description: Option<String>,
240 #[arg(long)]
241 subtitle: Option<String>,
242 #[arg(long)]
243 unit: Option<String>,
244 #[arg(long)]
245 price: Option<String>,
246 #[arg(long)]
247 currency: Option<String>,
248 #[arg(long)]
249 tax_rate: Option<String>,
250 },
251 #[command(alias = "ls")]
252 List,
253 #[command(alias = "get")]
254 Show { slug: String },
255 #[command(alias = "rm")]
256 Delete { slug: String },
257}
258
259#[derive(Subcommand, Debug)]
260pub enum InvoiceCmd {
261 #[command(alias = "new")]
263 New {
264 #[arg(long)]
267 r#as: Option<String>,
268 #[arg(long)]
270 client: String,
271 #[arg(long = "item")]
273 items: Vec<String>,
274 #[arg(long, default_value = "30d")]
276 due: String,
277 #[arg(long, default_value = "Net 30")]
279 terms: String,
280 #[arg(long)]
281 notes: Option<String>,
282 #[arg(long)]
284 currency: Option<String>,
285 #[arg(long)]
287 reverse_charge: bool,
288 #[arg(long)]
290 pay_link: Option<String>,
291 #[arg(long)]
293 discount_rate: Option<String>,
294 #[arg(long)]
296 discount_fixed: Option<String>,
297 },
298 Edit {
301 number: String,
302 #[arg(long)]
303 client: Option<String>,
304 #[arg(long)]
305 due: Option<String>,
306 #[arg(long)]
307 terms: Option<String>,
308 #[arg(long)]
309 notes: Option<String>,
310 #[arg(long)]
311 currency: Option<String>,
312 #[arg(long)]
313 pay_link: Option<String>,
314 #[arg(long)]
315 reverse_charge: Option<bool>,
316 #[arg(long)]
317 discount_rate: Option<String>,
318 #[arg(long)]
319 discount_fixed: Option<String>,
320 },
321 #[command(subcommand)]
323 Items(InvoiceItemCmd),
324 CreditNote {
326 number: String,
328 #[arg(long, conflicts_with = "items")]
331 full: bool,
332 #[arg(long = "item")]
335 items: Vec<String>,
336 #[arg(long)]
337 notes: Option<String>,
338 #[arg(long)]
339 pay_link: Option<String>,
340 },
341 Aging {
343 #[arg(long = "as")]
344 issuer: Option<String>,
345 },
346 Export {
348 #[arg(long)]
350 from: Option<String>,
351 #[arg(long)]
353 to: Option<String>,
354 #[arg(long, default_value = "csv")]
356 format: String,
357 #[arg(long, short)]
359 out: Option<String>,
360 #[arg(long = "as")]
361 issuer: Option<String>,
362 },
363 Duplicate {
366 number: String,
367 #[arg(long)]
369 client: Option<String>,
370 #[arg(long = "as")]
372 r#as: Option<String>,
373 #[arg(long, default_value = "30d")]
375 due: String,
376 },
377 #[command(alias = "ls")]
378 List {
379 #[arg(long)]
380 status: Option<String>,
381 #[arg(long = "as")]
382 issuer: Option<String>,
383 #[arg(long)]
385 overdue: bool,
386 },
387 #[command(alias = "get")]
388 Show { number: String },
389 Render {
391 number: String,
392 #[arg(long)]
394 template: Option<String>,
395 #[arg(long, short)]
397 out: Option<String>,
398 #[arg(long)]
400 open: bool,
401 },
402 Mark {
404 number: String,
405 status: String,
406 },
407 #[command(alias = "rm")]
408 Delete {
409 number: String,
410 #[arg(long)]
413 force: bool,
414 },
415}
416
417#[derive(Subcommand, Debug)]
418pub enum InvoiceItemCmd {
419 Add {
421 number: String,
422 spec: String,
424 #[arg(long)]
425 subtitle: Option<String>,
426 #[arg(long)]
427 discount_rate: Option<String>,
428 #[arg(long)]
429 discount_fixed: Option<String>,
430 },
431 #[command(alias = "rm")]
433 Remove { number: String, position: i64 },
434 Edit {
436 number: String,
437 position: i64,
438 #[arg(long)]
439 description: Option<String>,
440 #[arg(long)]
441 subtitle: Option<String>,
442 #[arg(long)]
443 qty: Option<String>,
444 #[arg(long)]
445 unit: Option<String>,
446 #[arg(long)]
447 price: Option<String>,
448 #[arg(long)]
449 tax_rate: Option<String>,
450 #[arg(long)]
451 discount_rate: Option<String>,
452 #[arg(long)]
453 discount_fixed: Option<String>,
454 },
455}
456
457#[derive(Subcommand, Debug)]
458pub enum TemplateCmd {
459 #[command(alias = "ls")]
460 List,
461 Preview {
463 name: String,
464 #[arg(long, short)]
465 out: Option<String>,
466 },
467}
468
469#[derive(Subcommand, Debug)]
470pub enum ConfigCmd {
471 Show,
472 Path,
473 Set { key: String, value: String },
474}
475
476#[derive(Subcommand, Debug)]
477pub enum SkillCmd {
478 Install,
479}