143 lines
3.7 KiB
Go
143 lines
3.7 KiB
Go
package models
|
|
|
|
// the public holiday is used the describe all holidays
|
|
// the publicholiday implements the IWorkDay interface
|
|
//
|
|
// the PublicHoliday data is based on the entries in the "s_feiertage" database table
|
|
|
|
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
|
|
}
|