diff --git a/cmd/invoicer/cmd.go b/cmd/invoicer/cmd.go index 383b29e..0e4adce 100644 --- a/cmd/invoicer/cmd.go +++ b/cmd/invoicer/cmd.go @@ -11,29 +11,34 @@ import ( type cmd struct { cmd func([]string, any) config any + fs *flag.FlagSet } -func (c *cmd) Run() { +func (c *cmd) Register(name string) { + c.fs = flag.NewFlagSet(name, flag.ExitOnError) if c.config != nil { - flag.Parse() filler := flagsfiller.New() - err := filler.Fill(flag.CommandLine, c.config) + err := filler.Fill(c.fs, c.config) if err != nil { log.Fatal(err) } - c.cmd(flag.Args()[1:], c.config) - } else { - c.cmd(os.Args[2:], c.config) } } -var commands = map[string]cmd{ +func (c *cmd) Run(name string) { + c.fs.Parse(os.Args[2:]) + c.cmd(c.fs.Args(), c.config) +} + +var commands = map[string]*cmd{ "request": { request, nil, + nil, }, "create": { create, &createFlags{}, + nil, }, } diff --git a/cmd/invoicer/create.go b/cmd/invoicer/create.go index 6e2571c..57a60fb 100644 --- a/cmd/invoicer/create.go +++ b/cmd/invoicer/create.go @@ -8,6 +8,7 @@ import ( "os" "time" + "code.gitea.io/sdk/gitea" "git.schreifuchs.ch/lou-taylor/accounting/internal/email" "git.schreifuchs.ch/lou-taylor/accounting/pkg/invoice" ) @@ -15,6 +16,7 @@ import ( type createFlags struct { Email bool `flag:"email" help:"send invoice by email"` Output string `flag:"o" help:"output file"` + Label string `flag:"l" help:"filters for issues with the label"` } func create(arguments []string, c any) { @@ -33,6 +35,21 @@ func create(arguments []string, c any) { } opts := invoice.DefaultOptions + + if flags.Label != "" { + opts.IssueState = gitea.StateAll + opts.IssueFilter = func(i *gitea.Issue) bool { + for _, l := range i.Labels { + if l.Name == flags.Label { + return true + } + } + + return false + } + } + opts.Since = time.Now().AddDate(-1, 0, 0) + opts.Mindur = time.Duration(req.DurationThreshold) invoice, report, err := invoicer.Generate(req.Creditor, req.Debtor, req.HourlyRate, repos, &opts) if err != nil { diff --git a/cmd/invoicer/main.go b/cmd/invoicer/main.go index 332e122..1fb76c0 100644 --- a/cmd/invoicer/main.go +++ b/cmd/invoicer/main.go @@ -1,20 +1,25 @@ package main import ( - "fmt" + "flag" "os" ) func main() { + for n, c := range commands { + c.Register(n) + } if len(os.Args) < 2 { + flag.PrintDefaults() return } for n, c := range commands { if os.Args[1] == n { - c.Run() - break + c.Run(n) + return } } - fmt.Println("cmd not found") + + flag.PrintDefaults() } diff --git a/cmd/invoicer/services.go b/cmd/invoicer/services.go index c824247..96d91fe 100644 --- a/cmd/invoicer/services.go +++ b/cmd/invoicer/services.go @@ -41,7 +41,7 @@ func getServices() (invoicer *invoice.Service, mailer *email.Service) { gitea.SetToken(cfg.Gitea.Token), ) if err != nil { - log.Fatal("could not connect to gitea: %v", err) + log.Fatalf("could not connect to gitea: %v", err) return invoicer, mailer } gotenberg, err := pdf.New(cfg.PDF.Hostname) @@ -49,12 +49,12 @@ func getServices() (invoicer *invoice.Service, mailer *email.Service) { panic(err) } if err != nil { - log.Fatal("could not connect to gotenberg: %v", err) + log.Fatalf("could not connect to gotenberg: %v", err) return invoicer, mailer } mailer, err = email.New(cfg.Email) if err != nil { - log.Fatal("could not create mailer: %v", err) + log.Fatalf("could not create mailer: %v", err) return invoicer, mailer } diff --git a/index.html b/index.html deleted file mode 100644 index 3d3a366..0000000 --- a/index.html +++ /dev/null @@ -1,709 +0,0 @@ - - - - - - Rechnung vom 24.08.2025 - - - - - -
-
-

schreifuchs.ch

-

- Kilchbergerweg 1
- Zollikofen
- Niklas Breitenstein -

- -

-
-
-

- Rechnung: 20 25082 41117 00284 67114 43342
- Datum: 24.08.2025
-

-
-
-
-

Rechnung an:

-

- Lou Taylor
- Alpenstrasse 22
- Huttwil
- Loana Groux -

-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FIDNameAufwandPreis
API-6Multilingual2.50 h40.00 CHF
ACC-7asdfasdf1.72 h27.45 CHF
ACC-6ss1.72 h27.45 CHF
ACC-5a1.72 h27.45 CHF
ACC-4Hello ```info duration: 1h 43min ``` # adökfjaösldkjflaa ## ASDFADS ### adllglggl1.72 h27.45 CHF
ACC-3ss1.72 h27.45 CHF
Summe:11.08 h177.35
-
-
-
- - - - - - - - - image/svg+xml - - - - - - - - - -
-
-
-
-

Empfangsschein

-

Konto / Zahlbar an

-

- CH06 0079 0042 5877 0443 7
- schreifuchs.ch
- Kilchbergerweg 1
- Zollikofen -

-
-
-

Referenz

-

20 25082 41117 00284 67114 43342

-
-
-

Zahlbar durch

-

- Lou Taylor
- Alpenstrasse 22
- Huttwil -

-
-
-
-
- - - - - - - - - image/svg+xml - - - - - - - - - -
-
-

Zahlteil

-
- -
- - - - -image/svg+xml - - - - - - - -
- - -
-
-
-

Konto / Zahlbar an

-

- CH06 0079 0042 5877 0443 7
- schreifuchs.ch
- Kilchbergerweg 1
- Zollikofen -

-
-
-

Referenz

-

20 25082 41117 00284 67114 43342

-
-
-

Zahlbar durch

-

- Lou Taylor
- Alpenstrasse 22
- Huttwil -

-
-
-
-
- -
-
-

Details zu den Features

- - -
-
-

- API-6: Multilingual -

-

Fertiggestellt: 21.08.2025 18:05

-
-

The application must support English and German.

- -
TODO’s
- - - -
- -
-
-

- ACC-7: asdfasdf -

-

Fertiggestellt: 23.08.2025 14:56

-
-

adökfjaösldkjflaa

- -
ASDFADS
- -
adllglggl
- -
- -
-
-

- ACC-6: ss -

-

Fertiggestellt: 23.08.2025 14:56

-
-

adökfjaösldkjflaa

- -
ASDFADS
- -
adllglggl
- -
- -
-
-

- ACC-5: a -

-

Fertiggestellt: 23.08.2025 14:56

-
-

adökfjaösldkjflaa

- -
ASDFADS
- -
adllglggl
- -
- -
-
-

- ACC-4: Hello ```info duration: 1h 43min ``` # adökfjaösldkjflaa ## ASDFADS ### adllglggl -

-

Fertiggestellt: 23.08.2025 14:56

-
-

adökfjaösldkjflaa

- -
ASDFADS
- -
adllglggl
- -
- -
-
-

- ACC-3: ss -

-

Fertiggestellt: 23.08.2025 14:55

-
-

adökfjaösldkjflaa

- -
ASDFADS
- -
adllglggl
- -
- -
- - diff --git a/index.pdf b/index.pdf deleted file mode 100644 index 9e6e111..0000000 Binary files a/index.pdf and /dev/null differ diff --git a/invoice.pdf b/invoice.pdf deleted file mode 100644 index e03954d..0000000 Binary files a/invoice.pdf and /dev/null differ diff --git a/invoicer b/invoicer deleted file mode 100755 index 1a516ff..0000000 Binary files a/invoicer and /dev/null differ diff --git a/pkg/invoice/issue/issue.go b/pkg/invoice/issue/issue.go index 79f34ef..b5c837b 100644 --- a/pkg/invoice/issue/issue.go +++ b/pkg/invoice/issue/issue.go @@ -32,7 +32,11 @@ func FromGiteas(is []*gitea.Issue, mindur time.Duration) []Issue { func FromGitea(i gitea.Issue) Issue { issue := Issue{Issue: i} - issue.Duration, _ = ExtractDuration(i.Body) + var err error + issue.Duration, err = ExtractDuration(i.Body) + if err != nil { + issue.Duration = time.Second * 0 + } return issue } @@ -43,7 +47,7 @@ func ExtractDuration(text string) (duration time.Duration, err error) { block := reBlock.FindStringSubmatch(text) if len(block) < 2 { err = fmt.Errorf("no info block found") - return + return duration, err } // Now extract the duration line from inside that block @@ -51,7 +55,7 @@ func ExtractDuration(text string) (duration time.Duration, err error) { match := reDuration.FindStringSubmatch(block[1]) if len(match) < 2 { err = fmt.Errorf("no duration found inside info block") - return + return duration, err } dur := strings.TrimSpace(match[1]) dur = strings.ReplaceAll(dur, "min", "m") diff --git a/pkg/invoice/report/assets/template.html b/pkg/invoice/report/assets/template.html index 07e0b67..9a95dec 100644 --- a/pkg/invoice/report/assets/template.html +++ b/pkg/invoice/report/assets/template.html @@ -82,10 +82,14 @@

- {{ .Shorthand }}: {{ - .Title }} + {{ .Shorthand }}: {{ .Title }}

-

Fertiggestellt: {{ .Closed | time }}

+

+ {{ if .Closed }} Fertiggestellt: {{ .Closed | time }} {{else}} not + closed {{ end }} +

{{ .CleanBody | md | oh 3 }}
diff --git a/pkg/invoice/report/template.go b/pkg/invoice/report/template.go index b758e9d..7136d49 100644 --- a/pkg/invoice/report/template.go +++ b/pkg/invoice/report/template.go @@ -35,11 +35,11 @@ func (r Report) ToHTML() (html string, err error) { err = tmpl.Execute(buf, tmpler{r, style}) if err != nil { - return + return html, err } html = buf.String() - return + return html, err } func (r Report) applyRate(dur time.Duration) string {