|
|
|
@@ -56,6 +56,8 @@ func run(args []string, out io.Writer) error {
|
|
|
|
|
flags.SetOutput(out)
|
|
|
|
|
|
|
|
|
|
var days dayList
|
|
|
|
|
askInput := flags.Bool("a", false, "Werte interaktiv abfragen")
|
|
|
|
|
flags.BoolVar(askInput, "ask", false, "Werte interaktiv abfragen")
|
|
|
|
|
webInput := flags.Bool("web", false, "Optionales Webinterface lokal starten")
|
|
|
|
|
addrInput := flags.String("addr", "127.0.0.1:8080", "Adresse fuer das Webinterface")
|
|
|
|
|
nettoInput := flags.String("netto", "", "Netto-Zeit, z.B. 06:01 oder 06:01:14")
|
|
|
|
@@ -72,6 +74,7 @@ func run(args []string, out io.Writer) error {
|
|
|
|
|
flags.Usage = func() {
|
|
|
|
|
fmt.Fprintln(out, "Nutzung:")
|
|
|
|
|
fmt.Fprintln(out, " goTimecalc 06:01:14 01:51:46")
|
|
|
|
|
fmt.Fprintln(out, " goTimecalc -a")
|
|
|
|
|
fmt.Fprintln(out, " goTimecalc --netto 08:56:12 --saldo +01:03:12")
|
|
|
|
|
fmt.Fprintln(out, " goTimecalc --brutto 09:26:12 --pause 00:30 --soll 07:53")
|
|
|
|
|
fmt.Fprintln(out, " goTimecalc --start 08:00 --ende 16:30 --pause 00:30 --soll 07:53")
|
|
|
|
@@ -82,6 +85,11 @@ func run(args []string, out io.Writer) error {
|
|
|
|
|
flags.PrintDefaults()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if len(args) == 0 {
|
|
|
|
|
flags.Usage()
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := flags.Parse(args); err != nil {
|
|
|
|
|
if errors.Is(err, flag.ErrHelp) {
|
|
|
|
|
return nil
|
|
|
|
@@ -93,6 +101,10 @@ func run(args []string, out io.Writer) error {
|
|
|
|
|
return errors.New("unbekannte Argumente. Hilfe mit: goTimecalc --help")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if *askInput {
|
|
|
|
|
return runAsk(os.Stdin, out)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if *webInput {
|
|
|
|
|
return startWebServer(*addrInput, out)
|
|
|
|
|
}
|
|
|
|
@@ -125,7 +137,25 @@ func run(args []string, out io.Writer) error {
|
|
|
|
|
return runNettoSaldo(out, *nettoInput, *saldoInput, *minusInput)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return runInteractive(out)
|
|
|
|
|
flags.Usage()
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func runAsk(input io.Reader, out io.Writer) error {
|
|
|
|
|
reader := bufio.NewReader(input)
|
|
|
|
|
|
|
|
|
|
netto, err := promptDuration(reader, out, "Netto-Zeit: ")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
saldo, err := promptSaldo(reader, out, "Tagesaldo (+/-): ")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
printSollzeitFromSaldo(out, netto, saldo)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func runNettoSaldo(out io.Writer, nettoInput string, saldoInput string, minusInput string) error {
|
|
|
|
@@ -220,29 +250,44 @@ func runDays(out io.Writer, days dayList, sollInput string) error {
|
|
|
|
|
return printBalance(out, total, sollInput)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func runInteractive(out io.Writer) error {
|
|
|
|
|
reader := bufio.NewReader(os.Stdin)
|
|
|
|
|
|
|
|
|
|
netto, err := promptDuration(reader, "Netto-Zeit: ")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
saldo, err := promptSaldo(reader, "Tagesaldo (+/-): ")
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
printSollzeitFromSaldo(out, netto, saldo)
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func printSollzeitFromSaldo(out io.Writer, netto int, saldo int) {
|
|
|
|
|
fmt.Fprintf(out, "Netto-Zeit %8s\n", formatDuration(netto))
|
|
|
|
|
fmt.Fprintf(out, "Tagesaldo %s\n", formatSignedDuration(saldo))
|
|
|
|
|
fmt.Fprintf(out, "= Sollzeit %8s\n", formatDuration(netto-saldo))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func promptDuration(reader *bufio.Reader, out io.Writer, label string) (int, error) {
|
|
|
|
|
fmt.Fprint(out, label)
|
|
|
|
|
|
|
|
|
|
input, err := reader.ReadString('\n')
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
value, err := parseDuration(strings.TrimSpace(input))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, fmt.Errorf("%s%w", strings.TrimSuffix(label, ": "), err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return value, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func promptSaldo(reader *bufio.Reader, out io.Writer, label string) (int, error) {
|
|
|
|
|
fmt.Fprint(out, label)
|
|
|
|
|
|
|
|
|
|
input, err := reader.ReadString('\n')
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
value, err := parseSaldoInput(strings.TrimSpace(input))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, fmt.Errorf("%s%w", strings.TrimSuffix(label, ": "), err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return value, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func printBruttoNetto(out io.Writer, brutto int, pause int, sollInput string) error {
|
|
|
|
|
netto := brutto - pause
|
|
|
|
|
if netto < 0 {
|
|
|
|
@@ -296,38 +341,6 @@ func wantedSoll(input string) (int, bool, error) {
|
|
|
|
|
return value, true, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func promptDuration(reader *bufio.Reader, label string) (int, error) {
|
|
|
|
|
fmt.Print(label)
|
|
|
|
|
|
|
|
|
|
input, err := reader.ReadString('\n')
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
value, err := parseDuration(strings.TrimSpace(input))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, fmt.Errorf("%s%w", strings.TrimSuffix(label, ": "), err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return value, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func promptSaldo(reader *bufio.Reader, label string) (int, error) {
|
|
|
|
|
fmt.Print(label)
|
|
|
|
|
|
|
|
|
|
input, err := reader.ReadString('\n')
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
value, err := parseSaldoInput(strings.TrimSpace(input))
|
|
|
|
|
if err != nil {
|
|
|
|
|
return 0, fmt.Errorf("%s%w", strings.TrimSuffix(label, ": "), err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return value, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func parseDuration(input string) (int, error) {
|
|
|
|
|
parts := strings.Split(strings.TrimSpace(input), ":")
|
|
|
|
|
if len(parts) < 2 || len(parts) > 3 {
|
|
|
|
|