added feiertage to database + endpoint to insert every year

This commit is contained in:
2025-12-23 12:21:03 +01:00
parent f562ef2a33
commit 3439fff841
11 changed files with 245 additions and 88 deletions

View File

@@ -45,6 +45,10 @@ func (a *Absence) Date() time.Time {
return a.Day.Truncate(24 * time.Hour)
}
func (a *Absence) Type() DayType {
return DayTypeAbsence
}
func (a *Absence) IsMultiDay() bool {
return !a.DateFrom.Equal(a.DateTo)
}

View File

@@ -3,12 +3,14 @@ package models
import (
"arbeitszeitmessung/helper"
"log"
"log/slog"
"time"
)
type IWorkDay interface {
Date() time.Time
ToString() string
Type() DayType
IsWorkDay() bool
IsKurzArbeit() bool
GetDayProgress(User) int8
@@ -19,6 +21,14 @@ type IWorkDay interface {
GetOvertime(User, WorktimeBase, bool) time.Duration
}
type DayType int
const (
DayTypeWorkday DayType = 1
DayTypeAbsence DayType = 2
DayTypeHoliday DayType = 3
)
func GetDays(user User, tsFrom, tsTo time.Time, orderedForward bool) []IWorkDay {
var allDays map[string]IWorkDay = make(map[string]IWorkDay)
@@ -30,6 +40,10 @@ func GetDays(user User, tsFrom, tsTo time.Time, orderedForward bool) []IWorkDay
log.Println("Error gettings absences for all Days!", err)
return nil
}
holidays, err := GetHolidaysFromTo(tsFrom, tsTo)
if err != nil {
slog.Warn("Error getting holidays from DB!", slog.Any("Error", err))
}
for _, day := range absences {
if helper.IsWeekend(day.Date()) {
continue
@@ -50,6 +64,14 @@ func GetDays(user User, tsFrom, tsTo time.Time, orderedForward bool) []IWorkDay
}
}
for _, day := range holidays {
if helper.IsWeekend(day.Date()) {
continue
}
allDays[day.Date().Format(time.DateOnly)] = &day
slog.Debug("Logging Holiday: ", slog.String("HolidayName", allDays[day.Date().Format(time.DateOnly)].ToString()), slog.Any("Overtime", day.GetOvertime(user, WorktimeBaseDay, false).String()), "wokrtie", float32(day.worktime)/100)
}
sortedDays := sortDays(allDays, orderedForward)
return sortedDays
}

View File

@@ -1,23 +1,90 @@
package models
import "time"
import (
"time"
"github.com/wlbr/feiertage"
)
// type PublicHoliday feiertage.Feiertag
type PublicHoliday struct {
name string
date time.Time
feiertage.Feiertag
repeat int8
worktime int8
}
func NewHolidayFromFeiertag(f feiertage.Feiertag) PublicHoliday {
return PublicHoliday{
Feiertag: f,
repeat: 0,
worktime: 100,
}
}
func GetHolidaysFromTo(tsFrom, tsTo time.Time) ([]PublicHoliday, error) {
return make([]PublicHoliday, 0), nil
var publicHolidays []PublicHoliday
qStr, err := DB.Prepare(`SELECT datum, name, wiederholen, arbeitszeit_equivalent FROM s_feiertage WHERE datum::DATE >= $1::DATE AND datum::DATE <= $2::DATE;`)
if err != nil {
return publicHolidays, err
}
rows, err := qStr.Query(tsFrom, tsTo)
if err != nil {
return publicHolidays, err
}
defer rows.Close()
for rows.Next() {
var publicHoliday PublicHoliday
if err := rows.Scan(&publicHoliday.Time, &publicHoliday.Text, &publicHoliday.repeat, &publicHoliday.worktime); err != nil {
return publicHolidays, err
}
publicHolidays = append(publicHolidays, publicHoliday)
}
return publicHolidays, nil
}
func GetRepeatingHolidays(tsFrom, tsTo time.Time) ([]PublicHoliday, error) {
var publicHolidays []PublicHoliday
qStr, err := DB.Prepare(`SELECT datum, name, wiederholen, arbeitszeit_equivalent FROM s_feiertage WHERE wiederholen = 1 AND datum::DATE >= $1::DATE AND datum::DATE <= $2::DATE;`)
if err != nil {
return publicHolidays, err
}
rows, err := qStr.Query(tsFrom, tsTo)
if err != nil {
return publicHolidays, err
}
defer rows.Close()
for rows.Next() {
var publicHoliday PublicHoliday
if err := rows.Scan(&publicHoliday.Time, &publicHoliday.Text, &publicHoliday.repeat, &publicHoliday.worktime); err != nil {
return publicHolidays, err
}
publicHolidays = append(publicHolidays, publicHoliday)
}
return publicHolidays, nil
}
func (p *PublicHoliday) Insert() error {
qStr, err := DB.Prepare(`INSERT INTO s_feiertage(name, datum, wiederholen, arbeitszeit_equivalent) VALUES ($1, $2, $3, $4) ON CONFLICT DO NOTHING;`)
if err != nil {
return err
}
_, err = qStr.Exec(p.Text, p.Time, p.repeat, p.worktime)
return err
}
func (p *PublicHoliday) Type() DayType {
return DayTypeHoliday
}
// Interface implementation
func (p *PublicHoliday) Date() time.Time {
return time.Now()
return p.Time
}
func (p *PublicHoliday) ToString() string {
return ""
return p.Text
}
func (p *PublicHoliday) IsWorkDay() bool {
@@ -29,14 +96,20 @@ func (p *PublicHoliday) IsKurzArbeit() bool {
}
func (p *PublicHoliday) GetDayProgress(User) int8 {
return 0
return p.worktime
}
func (p *PublicHoliday) RequiresAction() bool {
return false
}
func (p *PublicHoliday) GetWorktime(User, WorktimeBase, bool) time.Duration {
func (p *PublicHoliday) GetWorktime(u User, base WorktimeBase, includeKurzarbeit bool) time.Duration {
switch base {
case WorktimeBaseDay:
return u.ArbeitszeitProTagFrac(float32(p.worktime / 100))
case WorktimeBaseWeek:
return u.ArbeitszeitProWocheFrac(float32(p.worktime/100) * 0.2)
}
return 0
}
@@ -44,10 +117,16 @@ func (p *PublicHoliday) GetPausetime(User, WorktimeBase, bool) time.Duration {
return 0
}
func (p *PublicHoliday) GetTimes(User, WorktimeBase, bool) (work, pause, overtime time.Duration) {
return 0, 0, 0
}
func (p *PublicHoliday) GetOvertime(User, WorktimeBase, bool) time.Duration {
func (p *PublicHoliday) GetOvertime(u User, base WorktimeBase, includeKurzarbeit bool) time.Duration {
switch base {
case WorktimeBaseDay:
return u.ArbeitszeitProTagFrac(float32(p.worktime)/100) - u.ArbeitszeitProTagFrac(1)
case WorktimeBaseWeek:
return u.ArbeitszeitProWocheFrac(float32(p.worktime)/500) - u.ArbeitszeitProWocheFrac(0.2)
}
return 0
}
func (p *PublicHoliday) GetTimes(u User, base WorktimeBase, includeKurzarbeit bool) (work, pause, overtime time.Duration) {
return p.GetWorktime(u, base, includeKurzarbeit), 0, 0
}

View File

@@ -23,11 +23,11 @@ type WorkDay struct {
worktimeAbsece Absence
}
type WorktimeBase string
type WorktimeBase int
const (
WorktimeBaseWeek WorktimeBase = "week"
WorktimeBaseDay WorktimeBase = "day"
WorktimeBaseWeek WorktimeBase = 5
WorktimeBaseDay WorktimeBase = 1
)
func (d *WorkDay) GetWorktimeAbsence() Absence {
@@ -126,6 +126,10 @@ func (d *WorkDay) Date() time.Time {
return d.Day
}
func (d *WorkDay) Type() DayType {
return DayTypeWorkday
}
func (d *WorkDay) GenerateKurzArbeitBookings(u User) (time.Time, time.Time) {
var timeFrom, timeTo time.Time
if d.GetWorktime(u, WorktimeBaseDay, false) >= u.ArbeitszeitProTag() {