001_init.sql 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. -- Phase 2/3 initial schema.
  2. --
  3. -- Users = people who sign in via Entra ID.
  4. -- Workers = entities that get work assigned (may or may not also be users).
  5. -- Never conflate the two.
  6. CREATE TABLE users (
  7. id INTEGER PRIMARY KEY,
  8. entra_oid TEXT NOT NULL UNIQUE,
  9. email TEXT NOT NULL,
  10. display_name TEXT NOT NULL,
  11. is_admin INTEGER NOT NULL DEFAULT 0,
  12. created_at TEXT NOT NULL,
  13. last_login_at TEXT
  14. );
  15. CREATE TABLE workers (
  16. id INTEGER PRIMARY KEY,
  17. name TEXT NOT NULL UNIQUE,
  18. is_active INTEGER NOT NULL DEFAULT 1,
  19. default_rtb REAL NOT NULL DEFAULT 0.0,
  20. created_at TEXT NOT NULL,
  21. updated_at TEXT NOT NULL
  22. );
  23. CREATE TABLE sprints (
  24. id INTEGER PRIMARY KEY,
  25. name TEXT NOT NULL,
  26. start_date TEXT NOT NULL,
  27. end_date TEXT NOT NULL,
  28. reserve_fraction REAL NOT NULL DEFAULT 0.2,
  29. is_archived INTEGER NOT NULL DEFAULT 0,
  30. created_at TEXT NOT NULL,
  31. updated_at TEXT NOT NULL
  32. );
  33. CREATE TABLE sprint_weeks (
  34. id INTEGER PRIMARY KEY,
  35. sprint_id INTEGER NOT NULL REFERENCES sprints(id) ON DELETE CASCADE,
  36. sort_order INTEGER NOT NULL,
  37. iso_week INTEGER NOT NULL,
  38. start_date TEXT NOT NULL,
  39. max_working_days REAL NOT NULL,
  40. UNIQUE (sprint_id, sort_order)
  41. );
  42. CREATE TABLE sprint_workers (
  43. id INTEGER PRIMARY KEY,
  44. sprint_id INTEGER NOT NULL REFERENCES sprints(id) ON DELETE CASCADE,
  45. worker_id INTEGER NOT NULL REFERENCES workers(id) ON DELETE RESTRICT,
  46. rtb REAL NOT NULL DEFAULT 0.0,
  47. sort_order INTEGER NOT NULL,
  48. UNIQUE (sprint_id, worker_id)
  49. );
  50. CREATE TABLE sprint_worker_days (
  51. id INTEGER PRIMARY KEY,
  52. sprint_worker_id INTEGER NOT NULL REFERENCES sprint_workers(id) ON DELETE CASCADE,
  53. sprint_week_id INTEGER NOT NULL REFERENCES sprint_weeks(id) ON DELETE CASCADE,
  54. days REAL NOT NULL DEFAULT 0,
  55. UNIQUE (sprint_worker_id, sprint_week_id)
  56. );
  57. CREATE TABLE tasks (
  58. id INTEGER PRIMARY KEY,
  59. sprint_id INTEGER NOT NULL REFERENCES sprints(id) ON DELETE CASCADE,
  60. title TEXT NOT NULL,
  61. owner_worker_id INTEGER REFERENCES workers(id) ON DELETE SET NULL,
  62. priority INTEGER NOT NULL CHECK (priority IN (1, 2)),
  63. sort_order INTEGER NOT NULL,
  64. created_at TEXT NOT NULL,
  65. updated_at TEXT NOT NULL
  66. );
  67. CREATE TABLE task_assignments (
  68. id INTEGER PRIMARY KEY,
  69. task_id INTEGER NOT NULL REFERENCES tasks(id) ON DELETE CASCADE,
  70. sprint_worker_id INTEGER NOT NULL REFERENCES sprint_workers(id) ON DELETE CASCADE,
  71. days REAL NOT NULL DEFAULT 0,
  72. UNIQUE (task_id, sprint_worker_id)
  73. );
  74. CREATE TABLE audit_log (
  75. id INTEGER PRIMARY KEY,
  76. occurred_at TEXT NOT NULL,
  77. user_id INTEGER,
  78. user_email TEXT,
  79. action TEXT NOT NULL,
  80. entity_type TEXT NOT NULL,
  81. entity_id INTEGER,
  82. before_json TEXT,
  83. after_json TEXT,
  84. ip_address TEXT,
  85. user_agent TEXT
  86. );
  87. CREATE INDEX idx_audit_occurred_at ON audit_log(occurred_at DESC);
  88. CREATE INDEX idx_audit_entity ON audit_log(entity_type, entity_id);
  89. CREATE INDEX idx_tasks_sprint ON tasks(sprint_id, sort_order);
  90. CREATE INDEX idx_sw_sprint ON sprint_workers(sprint_id, sort_order);