A project management app derived from Mind-Vision-Code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 line
3.9KB

  1. <?php
  2. declare(strict_types=1);
  3. use Core\Database;
  4. use Core\Migration;
  5. return new class extends Migration
  6. {
  7. public function up(Database $database): void
  8. {
  9. $database->execute('DROP TABLE IF EXISTS project_members');
  10. $database->execute('DROP TABLE IF EXISTS tasks');
  11. $database->execute('DROP TABLE IF EXISTS activity_log');
  12. $database->execute('DROP TABLE IF EXISTS projects');
  13. $database->execute(
  14. 'CREATE TABLE IF NOT EXISTS projects (
  15. id INTEGER PRIMARY KEY AUTOINCREMENT,
  16. code VARCHAR(32) NOT NULL UNIQUE,
  17. name VARCHAR(120) NOT NULL,
  18. client_name VARCHAR(120) NOT NULL,
  19. description TEXT NOT NULL,
  20. status VARCHAR(20) NOT NULL DEFAULT "planned",
  21. start_date DATE NOT NULL,
  22. due_date DATE NULL,
  23. budget_cents INTEGER NOT NULL DEFAULT 0,
  24. owner_name VARCHAR(120) NOT NULL,
  25. color_token VARCHAR(32) NOT NULL DEFAULT "teal",
  26. created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  27. updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
  28. )'
  29. );
  30. $database->execute(
  31. 'CREATE TABLE IF NOT EXISTS project_members (
  32. id INTEGER PRIMARY KEY AUTOINCREMENT,
  33. project_id INTEGER NOT NULL,
  34. full_name VARCHAR(120) NOT NULL,
  35. role VARCHAR(80) NOT NULL,
  36. allocation_percent INTEGER NOT NULL DEFAULT 0,
  37. is_primary INTEGER NOT NULL DEFAULT 0,
  38. created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  39. FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
  40. )'
  41. );
  42. $database->execute(
  43. 'CREATE TABLE IF NOT EXISTS tasks (
  44. id INTEGER PRIMARY KEY AUTOINCREMENT,
  45. project_id INTEGER NOT NULL,
  46. title VARCHAR(140) NOT NULL,
  47. description TEXT NOT NULL,
  48. status VARCHAR(20) NOT NULL DEFAULT "backlog",
  49. priority VARCHAR(20) NOT NULL DEFAULT "normal",
  50. assignee VARCHAR(100) NOT NULL,
  51. estimate_hours REAL NULL,
  52. due_date DATE NULL,
  53. position INTEGER NOT NULL DEFAULT 0,
  54. completed_at DATETIME NULL,
  55. created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  56. updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  57. FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
  58. )'
  59. );
  60. $database->execute(
  61. 'CREATE TABLE IF NOT EXISTS activity_log (
  62. id INTEGER PRIMARY KEY AUTOINCREMENT,
  63. project_id INTEGER NULL,
  64. task_id INTEGER NULL,
  65. event_type VARCHAR(40) NOT NULL,
  66. headline VARCHAR(180) NOT NULL,
  67. detail TEXT NOT NULL,
  68. created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  69. FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE,
  70. FOREIGN KEY (task_id) REFERENCES tasks(id) ON DELETE CASCADE
  71. )'
  72. );
  73. $database->execute('CREATE INDEX IF NOT EXISTS idx_tasks_project_status ON tasks (project_id, status, due_date)');
  74. $database->execute('CREATE INDEX IF NOT EXISTS idx_activity_project_created ON activity_log (project_id, created_at DESC)');
  75. $database->execute('CREATE INDEX IF NOT EXISTS idx_project_members_project_primary ON project_members (project_id, is_primary DESC)');
  76. }
  77. public function down(Database $database): void
  78. {
  79. $database->execute('DROP TABLE IF EXISTS activity_log');
  80. $database->execute('DROP TABLE IF EXISTS tasks');
  81. $database->execute('DROP TABLE IF EXISTS project_members');
  82. $database->execute('DROP TABLE IF EXISTS projects');
  83. }
  84. };

Powered by TurnKey Linux.