fix: fix reset of entries when switching between weeks

This commit is contained in:
Patryk Hegenberg 2025-11-05 10:19:36 +01:00
parent c8b7666971
commit 20ba24001a
5 changed files with 184 additions and 397 deletions

View file

@ -59,7 +59,6 @@ func createTables(db *sql.DB) {
}
}
// Create default admin user (password: admin123)
hash, _ := bcrypt.GenerateFromPassword([]byte("admin123"), bcrypt.DefaultCost)
_, err := db.Exec(`
INSERT OR IGNORE INTO users (id, username, password, is_admin)
@ -140,15 +139,14 @@ func CreateTimeEntry(db *sql.DB, entry *TimeEntry) error {
return err
}
// func CreateTimeEntry(db *sql.DB, entry *TimeEntry) error {
// _, err := db.Exec("INSERT INTO time_entries (user_id, schedule_id, date, type) VALUES (?, ?, ?, ?)",
// entry.UserID, entry.ScheduleID, entry.Date, entry.Type)
// return err
// }
func GetTimeEntriesByUser(db *sql.DB, userID int) ([]TimeEntry, error) {
rows, err := db.Query("SELECT id, user_id, schedule_id, date, type, created_at FROM time_entries WHERE user_id = ? ORDER BY date DESC, created_at DESC",
userID)
rows, err := db.Query(`
SELECT te.id, te.user_id, te.schedule_id, te.date, te.type, te.start_time, te.end_time, te.created_at, u.username
FROM time_entries te
JOIN users u ON te.user_id = u.id
WHERE te.user_id = ?
ORDER BY te.date DESC, te.created_at DESC
`, userID)
if err != nil {
return nil, err
}
@ -157,7 +155,7 @@ func GetTimeEntriesByUser(db *sql.DB, userID int) ([]TimeEntry, error) {
var entries []TimeEntry
for rows.Next() {
var e TimeEntry
if err := rows.Scan(&e.ID, &e.UserID, &e.ScheduleID, &e.Date, &e.Type, &e.CreatedAt); err != nil {
if err := rows.Scan(&e.ID, &e.UserID, &e.ScheduleID, &e.Date, &e.Type, &e.StartTime, &e.EndTime, &e.CreatedAt, &e.Username); err != nil {
continue
}
entries = append(entries, e)
@ -188,30 +186,22 @@ func GetAllTimeEntries(db *sql.DB) ([]TimeEntry, error) {
return entries, nil
}
// func GetAllTimeEntries(db *sql.DB) ([]TimeEntry, error) {
// rows, err := db.Query("SELECT id, user_id, schedule_id, date, type, created_at FROM time_entries ORDER BY date DESC, created_at DESC")
// if err != nil {
// return nil, err
// }
// defer rows.Close()
// var entries []TimeEntry
// for rows.Next() {
// var e TimeEntry
// if err := rows.Scan(&e.ID, &e.UserID, &e.ScheduleID, &e.Date, &e.Type, &e.CreatedAt); err != nil {
// continue
// }
// entries = append(entries, e)
// }
// return entries, nil
// }
func GetWeeklyHours(db *sql.DB) ([]WeeklyHours, error) {
rows, err := db.Query(`
SELECT
te.user_id,
u.username,
CAST(strftime('%W', te.date) AS INTEGER) as week,
CAST(strftime('%Y', te.date) AS INTEGER) as year,
-- ISO 8601 Wochennummer berechnen
CASE
WHEN strftime('%j', date(te.date, '-' || ((strftime('%w', te.date) + 6) % 7) || ' days')) <= '3'
THEN CAST(strftime('%Y', date(te.date, '-' || ((strftime('%w', te.date) + 6) % 7) || ' days', '-4 days')) AS INTEGER)
ELSE CAST(strftime('%Y', te.date) AS INTEGER)
END as year,
CASE
WHEN strftime('%j', date(te.date, '-' || ((strftime('%w', te.date) + 6) % 7) || ' days')) <= '3'
THEN CAST((strftime('%j', date(te.date, '-' || ((strftime('%w', te.date) + 6) % 7) || ' days', '-4 days')) - 1) / 7 AS INTEGER) + 53
ELSE CAST((strftime('%j', date(te.date, '-' || ((strftime('%w', te.date) + 6) % 7) || ' days')) - 1) / 7 AS INTEGER) + 1
END as week,
SUM(
(CAST(substr(te.end_time, 1, 2) AS REAL) + CAST(substr(te.end_time, 4, 2) AS REAL) / 60.0) -
(CAST(substr(te.start_time, 1, 2) AS REAL) + CAST(substr(te.start_time, 4, 2) AS REAL) / 60.0)
@ -229,7 +219,7 @@ func GetWeeklyHours(db *sql.DB) ([]WeeklyHours, error) {
var hours []WeeklyHours
for rows.Next() {
var h WeeklyHours
if err := rows.Scan(&h.UserID, &h.Username, &h.Week, &h.Year, &h.TotalHours); err != nil {
if err := rows.Scan(&h.UserID, &h.Username, &h.Year, &h.Week, &h.TotalHours); err != nil {
continue
}
hours = append(hours, h)
@ -246,39 +236,43 @@ func DeleteUser(db *sql.DB, id int) error {
}
func DeleteTimeEntriesByUserAndWeek(db *sql.DB, userID int, year int, week int) error {
dates := calculateWeekDates(year, week)
var dateList []string
for day := 0; day <= 4; day++ {
dateList = append(dateList, dates.Dates[fmt.Sprintf("%d", day)])
}
query := `
DELETE FROM time_entries
WHERE user_id = ?
AND CAST(strftime('%W', date) AS INTEGER) = ?
AND CAST(strftime('%Y', date) AS INTEGER) = ?
`
_, err := db.Exec(query, userID, week, year)
DELETE FROM time_entries
WHERE user_id = ?
AND date IN (?, ?, ?, ?, ?)
`
_, err := db.Exec(query, userID, dateList[0], dateList[1], dateList[2], dateList[3], dateList[4])
return err
}
func CheckUserHasEntriesForWeek(db *sql.DB, userID int, year int, week int) (bool, error) {
// Berechne die Daten der Woche
dates := calculateWeekDates(year, week)
// Hole alle Daten als Liste
var dateList []string
for _, date := range dates.Dates {
dateList = append(dateList, date)
for day := 0; day <= 4; day++ {
dateList = append(dateList, dates.Dates[fmt.Sprintf("%d", day)])
}
// Prüfe ob Einträge existieren
query := `
SELECT COUNT(*)
FROM time_entries
WHERE user_id = ?
AND date IN (?, ?, ?, ?, ?)
`
SELECT COUNT(*)
FROM time_entries
WHERE user_id = ?
AND date IN (?, ?, ?, ?, ?)
`
var count int
err := db.QueryRow(query, userID,
dateList[0], dateList[1], dateList[2], dateList[3], dateList[4]).Scan(&count)
if err != nil {
log.Printf("Error checking entries: %v", err)
return false, err
}