## MODIFIED Requirements ### Requirement: Delete Operations Tracking 系統 SHALL 追蹤所有刪除操作,支援軟刪除與追溯。 #### Scenario: 任務刪除記錄 - **GIVEN** 使用者刪除任務 - **WHEN** 刪除操作執行 - **THEN** 系統執行軟刪除(設定 is_deleted = true, deleted_at, deleted_by) - **AND** 記錄刪除操作至 audit_logs - **AND** 子任務同步軟刪除 #### Scenario: 附件刪除記錄 - **GIVEN** 使用者刪除附件 - **WHEN** 刪除操作執行 - **THEN** 系統保留檔案於存檔區 - **AND** 記錄刪除操作詳情 #### Scenario: 任務還原 - **GIVEN** 管理員需要還原已刪除任務 - **WHEN** 執行還原操作 - **THEN** 系統設定 is_deleted = false - **AND** 記錄還原操作 ### Requirement: Change Logging 系統 SHALL 記錄所有關鍵變更操作,包含誰在何時改了什麼。 #### Scenario: 任務欄位變更記錄 - **GIVEN** 使用者修改任務的任何欄位(如截止日期、狀態、指派者) - **WHEN** 變更儲存成功 - **THEN** 系統記錄變更前後的值 - **AND** 記錄操作者、時間、IP 位址 #### Scenario: 專案設定變更記錄 - **GIVEN** 管理者修改專案設定 - **WHEN** 設定變更儲存 - **THEN** 系統記錄所有變更的設定項目 - **AND** 記錄操作者與時間 #### Scenario: 權限變更記錄 - **GIVEN** 管理者修改使用者權限或角色 - **WHEN** 權限變更生效 - **THEN** 系統記錄權限變更詳情 - **AND** 標記為高敏感度操作 #### Scenario: 角色指派變更記錄 - **GIVEN** 管理者變更使用者角色 - **WHEN** role_id 變更儲存 - **THEN** 系統記錄 user.role_change 事件 - **AND** 標記 sensitivity_level = high #### Scenario: 系統管理員變更記錄 - **GIVEN** 管理者變更使用者 is_system_admin - **WHEN** 變更生效 - **THEN** 系統記錄 user.admin_change 事件 - **AND** 標記 sensitivity_level = critical - **AND** 觸發即時警示 ### Requirement: Audit Log Immutability 系統 SHALL 確保稽核日誌不可竄改。 #### Scenario: 日誌寫入 - **GIVEN** 需要記錄稽核事件 - **WHEN** 日誌寫入 - **THEN** 日誌記錄不可被修改或刪除 - **AND** 包含校驗碼確保完整性 #### Scenario: 日誌完整性驗證 - **GIVEN** 稽核人員需要驗證日誌完整性 - **WHEN** 執行完整性檢查 - **THEN** 系統驗證所有日誌記錄的校驗碼 - **AND** 報告任何異常 #### Scenario: 防止日誌修改 - **GIVEN** 任何對 audit_logs 表的 UPDATE 操作 - **WHEN** 操作執行 - **THEN** 資料庫 trigger 拒絕操作並拋出錯誤 #### Scenario: 防止日誌刪除 - **GIVEN** 任何對 audit_logs 表的 DELETE 操作 - **WHEN** 操作執行 - **THEN** 資料庫 trigger 拒絕操作並拋出錯誤 ## MODIFIED Data Model ``` pjctrl_tasks (新增欄位) ├── is_deleted: BOOLEAN DEFAULT false ├── deleted_at: DATETIME (nullable) ├── deleted_by: UUID (FK -> users, nullable) └── INDEX idx_task_deleted (is_deleted) ``` ## MODIFIED Technical Notes - 任務刪除改為軟刪除,保留 is_deleted, deleted_at, deleted_by - 資料庫使用 BEFORE UPDATE/DELETE trigger 強制 append-only - 查詢 API 預設過濾 is_deleted = true,管理員可用 include_deleted 參數