Files
accounting/cmd/invoicer/request.go
2025-11-04 19:17:50 +01:00

80 lines
2.6 KiB
Go

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 request(arguments []string, _ any) {
if len(arguments) < 1 {
fmt.Println("please specify output file")
return
}
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(arguments[0])
if err != nil {
fmt.Printf("can't open file: %s %v", arguments[0], err)
return
}
defer file.Close()
json.NewEncoder(file).Encode(&q)
}