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
-
-
-
-
-
-
-
-
- | FID |
- Name |
- Aufwand |
- Preis |
-
-
-
-
-
- | API-6 |
- Multilingual |
- 2.50 h |
- 40.00 CHF |
-
-
-
- | ACC-7 |
- asdfasdf |
- 1.72 h |
- 27.45 CHF |
-
-
-
- | ACC-6 |
- ss |
- 1.72 h |
- 27.45 CHF |
-
-
-
- | ACC-5 |
- a |
- 1.72 h |
- 27.45 CHF |
-
-
-
- | ACC-4 |
- Hello ```info duration: 1h 43min ``` # adökfjaösldkjflaa ## ASDFADS ### adllglggl |
- 1.72 h |
- 27.45 CHF |
-
-
-
- | ACC-3 |
- ss |
- 1.72 h |
- 27.45 CHF |
-
-
-
-
-
- | Summe: |
-
- 11.08 h |
- 177.35 |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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
-
-
-
-
-
-
-
-
-
-
-
Zahlteil
-
-
-
-
-
-
-
-
-
-
-
-
-
Währung
-
Betrag
-
CHF
-
177.35
-
-
-
-
-
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 {