CREATE TABLE IF NOT EXISTS work_groups ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE ); CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, class TEXT NOT NULL, name TEXT NOT NULL, volunteer_no TEXT, group_id INTEGER, FOREIGN KEY (group_id) REFERENCES work_groups(id) ON DELETE SET NULL, UNIQUE(class, name) ); CREATE TABLE IF NOT EXISTS user_groups ( user_id INTEGER NOT NULL, group_id INTEGER NOT NULL, PRIMARY KEY (user_id, group_id), FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE, FOREIGN KEY (group_id) REFERENCES work_groups(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS activities ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT, start_time TEXT NOT NULL, end_time TEXT NOT NULL, created_at TEXT NOT NULL DEFAULT (datetime('now','+8 hours')) ); CREATE TABLE IF NOT EXISTS activity_groups ( activity_id INTEGER NOT NULL, group_id INTEGER NOT NULL, PRIMARY KEY (activity_id, group_id), FOREIGN KEY (activity_id) REFERENCES activities(id) ON DELETE CASCADE, FOREIGN KEY (group_id) REFERENCES work_groups(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS hours ( id INTEGER PRIMARY KEY AUTOINCREMENT, activity_id INTEGER NOT NULL, user_id INTEGER NOT NULL, hours REAL NOT NULL DEFAULT 0, exported_hours REAL NOT NULL DEFAULT 0, remark TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now','+8 hours')), FOREIGN KEY (activity_id) REFERENCES activities(id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS admins ( id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, created_at TEXT NOT NULL DEFAULT (datetime('now','+8 hours')) ); CREATE TABLE IF NOT EXISTS four_hour_exports ( id INTEGER PRIMARY KEY AUTOINCREMENT, status TEXT NOT NULL DEFAULT 'active', admin_username TEXT, eligible_count INTEGER NOT NULL DEFAULT 0, eligible_hours_total REAL NOT NULL DEFAULT 0, items_updated INTEGER NOT NULL DEFAULT 0, plan_json TEXT, note TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now','+8 hours')), voided_at TEXT ); CREATE TABLE IF NOT EXISTS four_hour_export_items ( id INTEGER PRIMARY KEY AUTOINCREMENT, export_id INTEGER NOT NULL, hour_id INTEGER NOT NULL, delta REAL NOT NULL, FOREIGN KEY (export_id) REFERENCES four_hour_exports(id) ON DELETE CASCADE ); CREATE INDEX IF NOT EXISTS idx_fhe_items_export ON four_hour_export_items(export_id); CREATE INDEX IF NOT EXISTS idx_fhe_items_hour ON four_hour_export_items(hour_id);