package models import ( "time" "github.com/wlbr/feiertage" ) // type PublicHoliday feiertage.Feiertag type PublicHoliday struct { feiertage.Feiertag repeat int8 worktime int8 } // IsEmpty implements [IWorkDay]. func (p *PublicHoliday) IsEmpty() bool { return false } func NewHolidayFromFeiertag(f feiertage.Feiertag) PublicHoliday { return PublicHoliday{ Feiertag: f, repeat: 0, worktime: 100, } } func GetHolidaysFromTo(tsFrom, tsTo time.Time) ([]PublicHoliday, error) { 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 p.Time } func (p *PublicHoliday) ToString() string { return p.Text } func (p *PublicHoliday) IsWorkDay() bool { return false } func (p *PublicHoliday) IsKurzArbeit() bool { return false } func (p *PublicHoliday) GetDayProgress(User) int8 { return p.worktime } func (p *PublicHoliday) RequiresAction() bool { return false } 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) / 500) } return 0 } func (p *PublicHoliday) GetPausetime(User, WorktimeBase, bool) time.Duration { return 0 } 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 }