Project, Task and Time management
-- name: ScheduledTasks :many
WITH RECURSIVE rec_project_name(id, name, level) AS (
  SELECT id, name, 1 AS level FROM projects WHERE parent_id IS NULL
  UNION ALL
  SELECT
    projects.id,
    rec_project_name.name||' > '||projects.name,
    rec_project_name.level + 1
  FROM projects
  JOIN rec_project_name ON projects.parent_id = rec_project_name.id
)
SELECT tasks.id, tasks.name, project_id, planned_for, start_at, due_at, rec_project_name.name AS project_name, rec_project_name.level AS project_level
FROM tasks
JOIN rec_project_name ON tasks.project_id = rec_project_name.id
WHERE planned_for <= DATE() AND completed_at IS NULL ORDER BY planned_for, start_at NULLS LAST, due_at NULLS LAST;

-- name: StartTask :exec
UPDATE tasks SET start_at = IIF(start_at IS NULL, DATE(), start_at) WHERE id = ?;

-- name: GetTask :one
SELECT * FROM tasks WHERE id = ?;