236 lines
5.8 KiB
Go
236 lines
5.8 KiB
Go
// main.go
|
|
package main
|
|
|
|
import (
|
|
"context"
|
|
"embed"
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"github.com/jung-kurt/gofpdf"
|
|
"github.com/wailsapp/wails/v2"
|
|
"github.com/wailsapp/wails/v2/pkg/options"
|
|
"github.com/wailsapp/wails/v2/pkg/options/assetserver"
|
|
"github.com/wailsapp/wails/v2/pkg/runtime"
|
|
)
|
|
|
|
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
|
|
|
|
func main() {
|
|
app := NewApp()
|
|
|
|
err := wails.Run(&options.App{
|
|
Title: "Bewertungen",
|
|
Width: 1024,
|
|
Height: 768,
|
|
MinWidth: 1024,
|
|
MinHeight: 768,
|
|
AssetServer: &assetserver.Options{
|
|
Assets: assets,
|
|
},
|
|
BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1},
|
|
OnStartup: app.startup,
|
|
Bind: []interface{}{
|
|
app,
|
|
},
|
|
})
|
|
if err != nil {
|
|
fmt.Println("Error:", err)
|
|
}
|
|
}
|