From 997cc11a89bca3bbdd658166cf2615aee6dfdf6e Mon Sep 17 00:00:00 2001 From: Patryk Hegenberg Date: Thu, 28 Nov 2024 19:12:37 +0100 Subject: [PATCH] refactor: seperate code into different files --- Icon.png | Bin 0 -> 28603 bytes app.go | 188 +++++++++++++++++++ frontend/index.html | 23 ++- frontend/src/App.svelte | 265 +++++++++++---------------- frontend/src/BewertungForm.svelte | 45 +++++ frontend/src/BewertungRow.svelte | 25 +++ frontend/src/BewertungenTable.svelte | 39 ++++ frontend/src/ExportSection.svelte | 16 ++ frontend/src/MaxPunkteForm.svelte | 52 ++++++ frontend/src/Notenspiegel.svelte | 23 +++ frontend/src/ThemeSwitcher.svelte | 48 +++++ main.go | 263 ++++++-------------------- models.go | 23 +++ package-lock.json | 171 +++++++++++++++++ package.json | 5 + utils.go | 23 +++ 16 files changed, 845 insertions(+), 364 deletions(-) create mode 100644 Icon.png create mode 100644 app.go create mode 100644 frontend/src/BewertungForm.svelte create mode 100644 frontend/src/BewertungRow.svelte create mode 100644 frontend/src/BewertungenTable.svelte create mode 100644 frontend/src/ExportSection.svelte create mode 100644 frontend/src/MaxPunkteForm.svelte create mode 100644 frontend/src/Notenspiegel.svelte create mode 100644 frontend/src/ThemeSwitcher.svelte create mode 100644 models.go create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 utils.go diff --git a/Icon.png b/Icon.png new file mode 100644 index 0000000000000000000000000000000000000000..5f8dc839d3473393cb1cb7413122459ce04252b7 GIT binary patch literal 28603 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 + + - - + + Noten + + + + + -

- + +
+ + + diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index 1bbfda4..54aa36f 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -1,19 +1,32 @@ -
-
-
-

Arbeit

-
+
+ +
+
+
+

Klassenarbeit-Bewertungssystem

+ +
+ + + -
-
-

Bewertungen

+
+

Bewertungen

- {#if maxPunkte.hvMax === 0} -
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
- {/if} -
-
-
- -
-
- -
-
- -
-
- -
-
- -
-
-
+ -
- - - - - - - - - - - - - - - - - - {#each bewertungen as bewertung} - - - - - - - - - - - - - - {/each} - -
GewertetVornameNachnameHV-PunkteHV-ProzentHV-NoteLV-PunkteLV-ProzentLV-NoteGesamt-ProzentGesamt-Note
handleToggleWertung(bewertung.id)}>{bewertung.vorname}{bewertung.nachname}{bewertung.hvPunkte.toFixed(2)}{bewertung.hvProzent.toFixed(2)}{bewertung.hvNote}{bewertung.lvPunkte.toFixed(2)}{bewertung.lvProzent.toFixed(2)}{bewertung.lvNote}{bewertung.gesamtProzent.toFixed(2)}{bewertung.gesamtNote}
-
-

Notenspiegel

- - - - {#each [1,2,3,4,5,6] as note} - - {/each} - - - - - {#each [1,2,3,4,5,6] as note} - {#if notenspiegel[note]} - - {:else} - - {/if} - {/each} - - -
{note}
{notenspiegel[note]}0
+ -
-
- -
-
- -
-
- -
-
-
-
- -
-
+ + + + + +
+
+
diff --git a/frontend/src/BewertungForm.svelte b/frontend/src/BewertungForm.svelte new file mode 100644 index 0000000..74432ac --- /dev/null +++ b/frontend/src/BewertungForm.svelte @@ -0,0 +1,45 @@ + + +
+
+ + + + + +
+
+ diff --git a/frontend/src/BewertungRow.svelte b/frontend/src/BewertungRow.svelte new file mode 100644 index 0000000..d5b11d9 --- /dev/null +++ b/frontend/src/BewertungRow.svelte @@ -0,0 +1,25 @@ + + + + + onToggleWertung(bewertung.id)} + /> + + {bewertung.vorname} + {bewertung.nachname} + {bewertung.hvPunkte.toFixed(2)} + {bewertung.hvProzent.toFixed(2)} + {bewertung.hvNote} + {bewertung.lvPunkte.toFixed(2)} + {bewertung.lvProzent.toFixed(2)} + {bewertung.lvNote} + {bewertung.gesamtProzent.toFixed(2)} + {bewertung.gesamtNote} + diff --git a/frontend/src/BewertungenTable.svelte b/frontend/src/BewertungenTable.svelte new file mode 100644 index 0000000..dc8cfef --- /dev/null +++ b/frontend/src/BewertungenTable.svelte @@ -0,0 +1,39 @@ + + +
+ + + + + + + + + + + + + + + + + + + + {#each bewertungen as bewertung (bewertung.id)} + + {/each} + +
GewertetVornameNachnameHV-PunkteHV-ProzentHV-NoteLV-PunkteLV-ProzentLV-NoteGesamt-ProzentGesamt-Note
+
+ + + + + + + diff --git a/frontend/src/ExportSection.svelte b/frontend/src/ExportSection.svelte new file mode 100644 index 0000000..485222e --- /dev/null +++ b/frontend/src/ExportSection.svelte @@ -0,0 +1,16 @@ + + +
+ + + +
diff --git a/frontend/src/MaxPunkteForm.svelte b/frontend/src/MaxPunkteForm.svelte new file mode 100644 index 0000000..4c10be6 --- /dev/null +++ b/frontend/src/MaxPunkteForm.svelte @@ -0,0 +1,52 @@ + + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
diff --git a/frontend/src/Notenspiegel.svelte b/frontend/src/Notenspiegel.svelte new file mode 100644 index 0000000..d495f85 --- /dev/null +++ b/frontend/src/Notenspiegel.svelte @@ -0,0 +1,23 @@ + + +

Notenspiegel

+
+ + + + {#each [1, 2, 3, 4, 5, 6] as note} + + {/each} + + + + + {#each [1, 2, 3, 4, 5, 6] as note} + + {/each} + + +
{note}
{notenspiegel[note] || 0}
+
diff --git a/frontend/src/ThemeSwitcher.svelte b/frontend/src/ThemeSwitcher.svelte new file mode 100644 index 0000000..2b114c7 --- /dev/null +++ b/frontend/src/ThemeSwitcher.svelte @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/main.go b/main.go index 657205a..cf08bc5 100644 --- a/main.go +++ b/main.go @@ -2,213 +2,18 @@ package main import ( - "context" "embed" "fmt" - "strconv" - "github.com/jung-kurt/gofpdf" "github.com/wailsapp/wails/v2" + "github.com/wailsapp/wails/v2/pkg/logger" "github.com/wailsapp/wails/v2/pkg/options" "github.com/wailsapp/wails/v2/pkg/options/assetserver" - "github.com/wailsapp/wails/v2/pkg/runtime" + "github.com/wailsapp/wails/v2/pkg/options/linux" + "github.com/wailsapp/wails/v2/pkg/options/mac" + "github.com/wailsapp/wails/v2/pkg/options/windows" ) -type Bewertung struct { - Vorname string `json:"vorname"` - Nachname string `json:"nachname"` - ID int `json:"id"` - HvPunkte float64 `json:"hvPunkte"` - HvProzent float64 `json:"hvProzent"` - HvNote int `json:"hvNote"` - LvPunkte float64 `json:"lvPunkte"` - LvProzent float64 `json:"lvProzent"` - LvNote int `json:"lvNote"` - GesamtProzent float64 `json:"gesamtProzent"` - GesamtNote int `json:"gesamtNote"` - Gewertet bool `json:"gewertet"` -} - -type MaxPunkte struct { - HvMax float64 `json:"hvMax"` - LvMax float64 `json:"lvMax"` - HvGewichtung float64 `json:"hvGewichtung"` - LvGewichtung float64 `json:"lvGewichtung"` -} - -type App struct { - ctx context.Context - bewertungen []Bewertung - maxPunkte MaxPunkte -} - -func NewApp() *App { - return &App{ - bewertungen: make([]Bewertung, 0), - maxPunkte: MaxPunkte{ - HvMax: 0.00, - HvGewichtung: 0.00, - LvMax: 0.00, - LvGewichtung: 0.00, - }, - } -} - -func (a *App) startup(ctx context.Context) { - a.ctx = ctx -} - -func (a *App) GetBewertungen() []Bewertung { - return a.bewertungen -} - -func (a *App) GetMaxPunkte() MaxPunkte { - return a.maxPunkte -} - -func (a *App) ToggleWertung(id int) Bewertung { - var updatedBewertung Bewertung - for i, bewertung := range a.bewertungen { - if bewertung.ID == id { - a.bewertungen[i].Gewertet = !bewertung.Gewertet - updatedBewertung = a.bewertungen[i] - break - } - } - return updatedBewertung -} - -func (a *App) AddBewertung(vorname, nachname string, hvPunkte, lvPunkte float64) bool { - if !a.validateName(vorname, nachname) { - return false - } - - hvProzent := 100.00 / a.maxPunkte.HvMax * hvPunkte - lvProzent := 100.00 / a.maxPunkte.LvMax * lvPunkte - hvNote := setNote(hvProzent) - lvNote := setNote(lvProzent) - gesamtProzent := hvProzent*a.maxPunkte.HvGewichtung/100 + lvProzent*a.maxPunkte.LvGewichtung/100 - gesamtNote := setNote(gesamtProzent) - - bewertung := Bewertung{ - ID: len(a.bewertungen) + 1, - Vorname: vorname, - Nachname: nachname, - HvPunkte: hvPunkte, - HvProzent: hvProzent, - HvNote: int(hvNote), - LvPunkte: lvPunkte, - LvProzent: lvProzent, - LvNote: int(lvNote), - GesamtProzent: gesamtProzent, - GesamtNote: int(gesamtNote), - Gewertet: true, - } - - a.bewertungen = append(a.bewertungen, bewertung) - return true -} - -func (a *App) SetMaxPunkte(hvMax, lvMax, hvGewichtung, lvGewichtung float64) bool { - if !checkGewichtung(lvGewichtung, hvGewichtung) { - return false - } - - a.maxPunkte = MaxPunkte{ - HvMax: hvMax, - LvMax: lvMax, - HvGewichtung: hvGewichtung, - LvGewichtung: lvGewichtung, - } - return true -} - -func (a *App) ExportBewertungen(path string) error { - pdf := gofpdf.New("P", "mm", "A4", "") - pdf.AddPage() - - pdf.SetFont("Arial", "B", 12) - pdf.CellFormat(27, 10, "Vorname", "1", 0, "", false, 0, "") - pdf.CellFormat(27, 10, "Nachname", "1", 0, "", false, 0, "") - pdf.CellFormat(27, 10, "HV-Punkte", "1", 0, "", false, 0, "") - pdf.CellFormat(27, 10, "HV-Note", "1", 0, "", false, 0, "") - pdf.CellFormat(27, 10, "LV-Punkte", "1", 0, "", false, 0, "") - pdf.CellFormat(27, 10, "LV-Note", "1", 0, "", false, 0, "") - pdf.CellFormat(27, 10, "Gesamtnote", "1", 0, "", false, 0, "") - pdf.Ln(-1) - - pdf.SetFont("Arial", "", 11) - for _, bewertung := range a.bewertungen { - pdf.CellFormat(27, 10, bewertung.Vorname, "1", 0, "", false, 0, "") - pdf.CellFormat(27, 10, bewertung.Nachname, "1", 0, "", false, 0, "") - pdf.CellFormat(27, 10, strconv.FormatFloat(bewertung.HvPunkte, 'f', 2, 64), "1", 0, "", false, 0, "") - pdf.CellFormat(27, 10, strconv.FormatInt(int64(bewertung.HvNote), 10), "1", 0, "", false, 0, "") - pdf.CellFormat(27, 10, strconv.FormatFloat(bewertung.LvPunkte, 'f', 2, 64), "1", 0, "", false, 0, "") - pdf.CellFormat(27, 10, strconv.FormatInt(int64(bewertung.LvNote), 10), "1", 0, "", false, 0, "") - pdf.CellFormat(27, 10, strconv.FormatInt(int64(bewertung.GesamtNote), 10), "1", 0, "", false, 0, "") - pdf.Ln(-1) - } - - err := pdf.OutputFileAndClose(path) - if err != nil { - fmt.Println("Fehler beim Exportieren der Bewertungen:", err) - return err - } - - runtime.EventsEmit(a.ctx, "export-complete") - return nil -} - -func (a *App) GetNotenspiegel() map[int]int { - notenspiegel := make(map[int]int) - - for _, bewertung := range a.bewertungen { - notenspiegel[bewertung.GesamtNote]++ - } - - return notenspiegel -} - -func (a *App) validateName(vorname, nachname string) bool { - for _, bewertung := range a.bewertungen { - if bewertung.Nachname == nachname && bewertung.Vorname == vorname { - return false - } - } - return true -} - -func setNote(prozent float64) float64 { - switch { - case prozent <= 22: - return 6.00 - case prozent <= 49: - return 5.00 - case prozent <= 64: - return 4.00 - case prozent <= 79: - return 3.00 - case prozent <= 94: - return 2.00 - default: - return 1.00 - } -} - -func checkGewichtung(lv, hv float64) bool { - sum := hv/100 + lv/100 - return sum == 1 -} - -func (a *App) OpenSaveDialog() (string, error) { - return runtime.SaveFileDialog(a.ctx, runtime.SaveDialogOptions{ - DefaultFilename: "bewertungen.pdf", - Filters: []runtime.FileFilter{ - {DisplayName: "PDF Files (*.pdf)", Pattern: "*.pdf"}, - }, - }) -} - //go:embed all:frontend/dist var assets embed.FS @@ -216,19 +21,65 @@ func main() { app := NewApp() err := wails.Run(&options.App{ - Title: "Bewertungen", - Width: 1024, - Height: 768, - MinWidth: 1024, - MinHeight: 768, + Title: "Notenverwaltung", + Width: 1400, + Height: 1000, + MinWidth: 1200, + MinHeight: 1000, + DisableResize: false, + Fullscreen: false, + WindowStartState: options.Maximised, + StartHidden: false, + HideWindowOnClose: false, AssetServer: &assetserver.Options{ Assets: assets, }, - BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1}, - OnStartup: app.startup, + Logger: nil, + LogLevel: logger.DEBUG, + LogLevelProduction: logger.ERROR, + BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1}, + OnStartup: app.startup, Bind: []interface{}{ app, }, + EnableDefaultContextMenu: false, + EnableFraudulentWebsiteDetection: false, + Windows: &windows.Options{ + WebviewIsTransparent: false, + WindowIsTranslucent: false, + BackdropType: windows.Mica, + DisablePinchZoom: false, + DisableWindowIcon: false, + DisableFramelessWindowDecorations: false, + WebviewUserDataPath: "", + WebviewBrowserPath: "", + Theme: windows.SystemDefault, + }, + Mac: &mac.Options{ + TitleBar: &mac.TitleBar{ + TitlebarAppearsTransparent: true, + HideTitle: false, + HideTitleBar: false, + FullSizeContent: false, + UseToolbar: false, + HideToolbarSeparator: true, + }, + Appearance: mac.NSAppearanceNameDarkAqua, + WebviewIsTransparent: true, + WindowIsTranslucent: false, + About: &mac.AboutInfo{ + Title: "Notenverwaltung", + Message: "© 2024 Pata1704", + }, + }, + Linux: &linux.Options{ + WindowIsTranslucent: false, + WebviewGpuPolicy: linux.WebviewGpuPolicyAlways, + ProgramName: "Notenverwaltung", + }, + Debug: options.Debug{ + OpenInspectorOnStartup: false, + }, }) if err != nil { fmt.Println("Error:", err) diff --git a/models.go b/models.go new file mode 100644 index 0000000..feca993 --- /dev/null +++ b/models.go @@ -0,0 +1,23 @@ +package main + +type Bewertung struct { + Vorname string `json:"vorname"` + Nachname string `json:"nachname"` + ID int `json:"id"` + HvPunkte float64 `json:"hvPunkte"` + HvProzent float64 `json:"hvProzent"` + HvNote int `json:"hvNote"` + LvPunkte float64 `json:"lvPunkte"` + LvProzent float64 `json:"lvProzent"` + LvNote int `json:"lvNote"` + GesamtProzent float64 `json:"gesamtProzent"` + GesamtNote int `json:"gesamtNote"` + Gewertet bool `json:"gewertet"` +} + +type MaxPunkte struct { + HvMax float64 `json:"hvMax"` + LvMax float64 `json:"lvMax"` + HvGewichtung float64 `json:"hvGewichtung"` + LvGewichtung float64 `json:"lvGewichtung"` +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..aefeaf6 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,171 @@ +{ + "name": "Noten", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "daisyui": "^4.12.14" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/css-selector-tokenizer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", + "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/culori": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz", + "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/daisyui": { + "version": "4.12.14", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.12.14.tgz", + "integrity": "sha512-hA27cdBasdwd4/iEjn+aidoCrRroDuo3G5W9NDKaVCJI437Mm/3eSL/2u7MkZ0pt8a+TrYF3aT2pFVemTS3how==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-selector-tokenizer": "^0.8", + "culori": "^3", + "picocolors": "^1", + "postcss-js": "^4" + }, + "engines": { + "node": ">=16.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/daisyui" + } + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..9ca9ff7 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "daisyui": "^4.12.14" + } +} diff --git a/utils.go b/utils.go new file mode 100644 index 0000000..e4cc620 --- /dev/null +++ b/utils.go @@ -0,0 +1,23 @@ +package main + +func setNote(prozent float64) float64 { + switch { + case prozent <= 22: + return 6.00 + case prozent <= 49: + return 5.00 + case prozent <= 64: + return 4.00 + case prozent <= 79: + return 3.00 + case prozent <= 94: + return 2.00 + default: + return 1.00 + } +} + +func checkGewichtung(lv, hv float64) bool { + sum := hv/100 + lv/100 + return sum == 1 +}