Skip to content

Commit

Permalink
Erste Version von Schnegge
Browse files Browse the repository at this point in the history
  • Loading branch information
florian-hbt committed Jul 28, 2022
0 parents commit 47a0a9b
Show file tree
Hide file tree
Showing 25 changed files with 2,353 additions and 0 deletions.
49 changes: 49 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
name: release
on:
push:
tags:
- v*.*.*

jobs:
release:
name: Build
runs-on: ubuntu-latest
steps:

- name: Set up Go 1.18
uses: actions/setup-go@v1
with:
go-version: 1.18
id: go

- name: Check out code into the Go module directory
uses: actions/checkout@master

- name: Build
env:
GO111MODULE: on
GOPATH: /home/runner/work/
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
export TAGNAME=$(jq --raw-output .ref "$GITHUB_EVENT_PATH" | sed -e "s/refs\/tags\///")
echo "========================================================="
echo "DEBUG:" $TAGNAME
echo "========================================================="
make cross
echo "========================================================="
echo "DEBUG: ls pkg/"
ls pkg/
echo "========================================================="
echo "go get -u github.com/tcnksm/ghr"
go install github.com/tcnksm/ghr@latest
echo "========================================================="
echo "DEBUG: ls $GOPATH"
ls $GOPATH
echo "========================================================="
echo "DEBUG: ls $GOPATH/bin"
ls $GOPATH/bin
echo "========================================================="
echo "DEBUG: ls $GOPATHbin"
ls $GOPATHbin
echo "========================================================="
$GOPATH/bin/ghr -n ${TAGNAME} -b "ʕ◔ϖ◔ʔ Release ${TAGNAME}" -draft ${TAGNAME} pkg/
28 changes: 28 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: test
on:
pull_request:
branches:
- master
push:
branches:
- master

jobs:
test:
name: Test
runs-on: ubuntu-latest

steps:
- name: Set up Go 1.18
uses: actions/setup-go@v1
with:
go-version: 1.18
id: go

- name: Check out code into the Go module directory
uses: actions/checkout@master

- name: Running go tests
env:
GO111MODULE: on
run: make test
23 changes: 23 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# IDE
.idea
*.iml

# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
/schnegge

# Test binary, built with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# build
pkg

# Dependency directories (remove the comment below to include it)
# vendor/
42 changes: 42 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
NAME := schnegge
VERSION := $(shell git describe --tags --abbrev=0)
REVISION := $(shell git rev-parse --short HEAD)
LDFLAGS := -X 'main.version=$(VERSION)' \
-X 'main.revision=$(REVISION)'
GOIMPORTS ?= goimports
GOCILINT ?= golangci-lint
GO ?= GO111MODULE=on go
.DEFAULT_GOAL := help

.PHONY: test
test: ## Run the tests.
@$(GO) test ./...

.PHONY: build
build: cmd/schnegge/main.go ## Build a binary.
$(GO) build -ldflags "$(LDFLAGS)" -o ${NAME} cmd/schnegge/main.go

.PHONY: cross
cross: cmd/schnegge/main.go ## Build binaries for cross platform.
mkdir -p pkg
@# darwin
@for arch in "amd64" "arm64"; do \
GOOS=darwin GOARCH=$${arch} make build; \
zip pkg/$(NAME)_$(VERSION)_darwin_$${arch}.zip $(NAME); \
done;
@# linux
@for arch in "amd64"; do \
GOOS=linux GOARCH=$${arch} make build; \
zip pkg/$(NAME)_$(VERSION)_linux_$${arch}.zip $(NAME); \
done;
@# windows
@for arch in "amd64"; do \
GOOS=windows GOARCH=$${arch} make build; \
zip pkg/$(NAME)_$(VERSION)_windows_$${arch}.zip $(NAME); \
done;


.PHONY: help
help: ## Show help text
@echo "Commands:"
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-20s\033[0m %s\n", $$1, $$2}'
171 changes: 171 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
# SCHNEGGE
**SCHnell Noch Etwas Gutes Geld Erarbeiten**

Schnegge ermöglicht es die wichtigsten Funktionen (Buchungen anlegen und anschauen)
von Salat über ein CLI aufzurufen.

Einerseits kann Schnegge direkt vom Terminal bedient werden, andererseits kann
Schnegge aber auch ohne Kommando aufgerufen werden und verfügt dann über eine interaktive
Shell die bei der Eingabe hilft.

## Vorbereitung in Salat
Damit Schnegge Salat für dich aufrufen kann musst du zuerst in Salat ein Token generiert werden:
1. Im [Salat](https://salat.hbt.de) einloggen
2. `Verwaltung`-> `Einstellungen`
3. `Neuen Token Erzeugen`
4. Einen Kommentar und eine Gültigkeitsdauer eingeben und `Speichern` anklicken
5. Die TokenID und das TokenSecret muss jetzt schnegge bekannt gemacht werden.
Diese werden dann unter `~/.schnegge` gespeichert:

```schnegge set -tokenID #### -tokenSecret ####```
6. Testen mit `schnegge list`

## Bedienung

Wenn `schnegge` ohne Parameter aufgerufen wird startet es mit einer interaktiven Shell.
Diese unterstützt den Nutzer bei der Eingabe.
**Schnegge** kann aber auch bereits auf der Console direkt mir den Commands und
zugehörigen Parametern aufgerufen werden. **Schnegge** unterstützt aktuell die
Befehle set, list und add.

Auch bei einem Aufruf ohne ein Command können bereits Parameter angegeben werden.
Diese bilden dann für diesen Aufruf eine Art Default-Werte. Ein Beispiel wäre z.B.
der Aufruf `schnegge -server http://localhost`. Hier werden dann alle weiteren Commands
gegen diesen Server aufgerufen, auch wenn dieser nicht per set gesetzt wurde.

### set
Setzt konfigurative Werte in der Datei `~/.schnegge`

Im Grunde können alle diese Parameter auch bei einem einzelnen Aufruf von *add* oder *list*
angegeben werden - dies macht nur meistens wenig Sinn (Ausnahme *-auftrag* für das Command *add*).

#### -tokenID
Die TokenID aus Salat.

#### -tokenSecret
Das Secret des Tokens aus Salat.

#### -auftrag
Der Auftrag, der zukünftig von schnegge als Default-Auftrag angenommen wird.
Hier reicht ein Substring, dieser muss nur eindeutig sein.

Innerhalb der interaktiven Shell gibt es hier eine Unterstützung.

#### -server
Ein alternativer Server statt https://salat.hbt.de (für die Entwicklung).

#### -noSplash
(kein Parameter notwendig)

Der Splashscreen wird nicht mehr angezeigt.

### list
Zeigt deine Buchungen an.

#### -datum
Für welches Datum / Zeitbereich sollen die Buchungen angezeigt werden, default ist "heute".
Typische Werte sind:
- heute (default value)
- gestern
- vorgestern
- morgen
- woche / vorwoche (die aktuelle Woche, die vorherige Woche)
- monat (der aktuelle Monat)
- Montag, Dienstag ... der entspreche Wochentag innerhalb der letzten 7 Tage
- Januar, Februar ... der entsprechende Monat innerhalb der letzten 12 Monate
- 25.06.2022
- 2006-01-02
- -2 (von vor 2 Tagen bis heute)

#### -nachAuftrag
(kein Parameter notwendig)

Die Ausgabe erfolgt nicht nach Datum sortiert, sondern nach Aufträgen.

### add
Fügt eine Buchung in Salat hinzu. Es ist allerdings nur möglich eine Buchung
für einen Tag anzulegen, Serienbuchen werden bisher nicht unterstützt.

Alle Strings nach den Parametern werden als Kommentar für die Buchung angenommen.

#### -datum
Siehe `-datum` im Abschnitt `list`, allerdings wird hier der erste Tag innerhalb des Zeitraums für
die Buchung genommen, wenn der Parameter mehrere Tage beschreibt.

So wird z.B. eine Buchung `schnegge add -datum -2` für Vorgestern vorgenommen.

#### -auftrag
Der Auftrag/Subauftrag auf den Gebucht werden soll.
Hier reicht ein Substring, dieser muss nur eindeutig sein.

Innerhalb der interaktiven Shell gibt es hier eine Unterstützung.

#### -stunden
Die Anzahl Stunden, default ist 0.

#### -minuten
Die Anzahl Minuten, default ist 0.

#### -fortbildung
(kein Parameter notwendig)

Gibt an, ob die Buchung Fortbildungscharakter hat (vergl. Haken in Salat)


## Anwendungsbeispiele

### Den aktuellen Tag anzeigen
```schnegge list```

oder

```schnegge list -datum heute```

### Die letzten 5 Tage anzeigen
```schnegge list -datum -5```

### Den aktuellen Monat nach Projekten sortiert anzeigen
```schnegger list -datum monat -nachAuftrag```

### Den default Auftrag setzen
```schnegger set -auftrag HBT-Zeit```

### Auf HBT Zeit 2 Stunden 15 Minuten buchen
```schnegge add -auftrag HBT-Zeit -stunden 2 -minuten 15 Ich bin der Kommentar```

### Auf Projekt_X 8 Stunden mit Fortbildungsanteil buchen
```schnegge add -auftrag Projekt_X -stunden 8 -fortbildung Das war ein toller Workshop beim Kunden```

## ToDos
- Retry einbauen, falls es wegen Überlast zu falschen Antworten kommt (z.B. bei `schnegge list -datum Monat`)
- Tests schreiben

## Feature Ideen in der Zukunft
- Samstag/Sonntag und Feiertage einfärben
- Salat Rest Schnittstelle für Feiertage bereitstellen

- Buchung löschen
- Salat Rest Schnittstelle bereitstellen
- Workflow in schnegge bauen
- z.B.

```remove -datum heute -auftrag HBT-Zeit -buchung "Ich bin der Kommentar dazu" ```
- monatliche Freigabe ermöglichen
- Salat Rest Schnittstelle bereitstellen
- Workflow in schnegge bauen
- z.B. erst den aktuellen Monat darstellen und dann muss noch mal explizit bestätigt werden

```
> approv
Aktuell freigegeben bis 31.12.2014
> approv -datum Monat
...
Möchtest du bis zum 31.06.2022 freigeben (ja/nein)
> nein
> approv -datum Monat -nachAuftrag
...
Möchtest du bis zum 31.06.2022 freigeben (ja/nein)
> ja
Aktuell freigegeben bis 31.06.2022
> ...
```
69 changes: 69 additions & 0 deletions cmd/schnegge/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package main

import (
"fmt"
"os"
"schnegge/internal/base"
"schnegge/internal/cli"
"schnegge/internal/client"
"schnegge/internal/command"
"schnegge/internal/config"
)

func main() {
configCfg, err := config.ReadConfig()
if err != nil {
base.Log.Panic(err)
}
parameterCfg := config.NewHierarchyConfig(configCfg)
cmd := command.ParseCommandLine(parameterCfg, os.Args)
if b, _ := parameterCfg.GetValue(config.NoSplash); b != "true" {
cli.PrintSplashScreen()
}
checkVerbose(parameterCfg)
if cmd == "" {
for {
cmd, inputCfg := cli.Input(parameterCfg)
checkVerbose(inputCfg)
config.ReadConfig()
excecuteCommand(inputCfg, cmd)
}
}
excecuteCommand(parameterCfg, cmd)
}

func excecuteCommand(cfg config.Config, cmd string) {
switch cmd {
case "set":
if err := config.WriteConfigFile(cfg); err != nil {
fmt.Println("Fehler beim Schreiben der Konfiguration", err)
}
case "add":
order, _ := cfg.GetValue(config.Order)
record := client.NewDailyReportData(cfg, cli.GetEmployeeId(cfg, order))
base.Log.Println("DailyReportData:", record)
client.Record(cfg, record)
case "list":
cli.PrintOvertime(client.ReadOvertime(cfg))
sortByProject, _ := cfg.GetValue(config.SortByProject)
if sortByProject == "true" {
cli.PrintByProject(client.ReadDailyReports(cfg))
} else {
cli.PrintDailyReports(client.ReadDailyReports(cfg))
}
case "exit":
os.Exit(0)
default:
fmt.Println("Unknown command:", cmd)
}
}

func checkVerbose(cfg config.Config) {
if verbose, _ := cfg.GetValue(config.Verbose); verbose == "true" {
command.PrintVerboseCommand(cfg)
config.PrintVerboseConfig()
base.EnableLogs()
} else {
base.DisableLogs()
}
}
Loading

0 comments on commit 47a0a9b

Please sign in to comment.