feat: reastructure and create commands
All checks were successful
Go / build (push) Successful in 57s

This commit is contained in:
2025-09-16 21:11:14 +02:00
parent 8180b38225
commit 7d160d5f59
15 changed files with 388 additions and 5 deletions

78
cmd/invoicer/config.go Normal file
View File

@@ -0,0 +1,78 @@
package main
import (
"encoding/json"
"fmt"
"os"
"strings"
"time"
"git.schreifuchs.ch/lou-taylor/accounting/internal/ask"
"git.schreifuchs.ch/lou-taylor/accounting/pkg/invoice"
"git.schreifuchs.ch/lou-taylor/accounting/pkg/invoice/model"
)
type invoiceRequest struct {
Repos []string
Creditor model.Entity
Debtor *model.Entity
MailTo string
DurationThreshold time.Duration
HourlyRate float64
}
func (i invoiceRequest) GetRepos() (repos []invoice.Repo, err error) {
for i, repo := range i.Repos {
parts := strings.Split(repo, "/")
if len(parts) != 2 {
err = fmt.Errorf("cannot read body: repo with index %d does not split into 2 parts", i)
return repos, err
}
repos = append(repos, invoice.Repo{
Owner: parts[0],
Repo: parts[1],
})
}
return repos, err
}
func config(_ any) {
if len(os.Args) < 3 {
fmt.Println("please specify output file")
}
q := invoiceRequest{}
q.Repos = ask.StringSlice("Please list your repositories", 1, -1, 1, -1)
q.Creditor.Name = ask.String("Creditor Name (first & last name or company)", 1, -1)
q.Creditor.Contact = ask.String("Creditor Contact (if for company: Contact person)", 1, -1)
q.Creditor.Address.Country = ask.String("Creditor Country", 1, -1)
q.Creditor.Address.Place = ask.String("Creditor City", 1, -1)
q.Creditor.Address.ZIPCode = ask.String("Creditor postcode", 1, -1)
q.Creditor.Address.Street = ask.String("Creditor Street", 1, -1)
q.Creditor.Address.Number = ask.String("Creditor house number", 1, -1)
q.Creditor.IBAN = ask.String("Creditor IBAN like: CH93 0076 2011 6238 5295 7", 26, 26)
if ask.Boolean("Do you want to specify a debtor", true) {
q.Debtor = &model.Entity{}
q.Debtor.Name = ask.String("Debtor Name (first & last name or company)", 1, -1)
q.Debtor.Contact = ask.String("Debtor Contact (if for company: Contact person)", 1, -1)
q.Debtor.Address.Country = ask.String("Debtor Country", 1, -1)
q.Debtor.Address.Place = ask.String("Debtor City", 1, -1)
q.Debtor.Address.ZIPCode = ask.String("Debtor postcode", 1, -1)
q.Debtor.Address.Street = ask.String("Debtor Street", 1, -1)
q.Debtor.Address.Number = ask.String("Debtor Number", 1, -1)
q.MailTo = ask.String("Debtor mail address (leave empty to omit)", 0, -1)
}
q.DurationThreshold = ask.Duration("Minimum duration for a issue to be billed", time.Duration(0), time.Duration(-1))
q.HourlyRate = ask.Float64("Price per hour in CHF", 0, -1)
file, err := os.Create(os.Args[2])
if err != nil {
fmt.Printf("can't open file: %s %v", os.Args[2], err)
return
}
defer file.Close()
json.NewEncoder(file).Encode(&q)
}