概要
PR #327(Issue #150)で確定した S-03 ダッシュボード「当日対応 + 振り返り」リスト (4) 今日やったこと セクション、および §3.3.3 数値カード「本日完了件数」の判定基盤として、tasks テーブルに completed_at TIMESTAMP NULL を新設する。
スコープ
DDL / マイグレーション
tasks.completed_at TIMESTAMP NULL を追加(基本設計書 §4.2 タスクテーブル定義 / §4.4 CREATE TABLE 抜粋に反映)
- 複合インデックス
(tenant_id, completed_at) を追加(振り返りクエリ + 数値カード集計の用途)
- Flyway マイグレーションスクリプト(
V*_add_completed_at_to_tasks.sql)
Domain / Entity
xyz.dgz48.tasks.webapi.task.domain.Task モデルに completed_at: OffsetDateTime? を追加(JST 全層統一方針に従う)
- JPA Entity(adapter.persistence)に対応カラムマッピング追加
UseCase / 業務ロジック
ChangeTaskStatusUseCase(A-16):ステータス遷移時に completed_at を制御
- 未完了 → 完了:
completed_at = now() セット
- 完了 → 未完了(再オープン):
completed_at = NULL クリア
- 完了 → 完了(同状態の再保存): 既存値維持(冪等性)
UpdateTaskUseCase(A-14):completed_at は API リクエストから受け付けず、サーバ側で制御する(クライアントから書き換え不可)
DTO / API
- Task レスポンス DTO に
completed_at を追加(OpenAPI スキーマ更新)
- リクエスト DTO には含めない(read-only)
集計 SQL
- リスト (4) 今日やったこと抽出条件:
status = '完了' AND DATE(completed_at) = CURRENT_DATE AND (owner_id = :userId OR assignee_id = :userId)
- 数値カード「本日完了件数」:
COUNT(*) WHERE status = '完了' AND DATE(completed_at) = CURRENT_DATE + 認可フィルタ通過
議論ポイント(本 Issue 本文で結論を出す。ADR は起票しない)
- completed_at 操作の SSOT 配置: 案 (A)
@PrePersist / @PreUpdate でステータス変更を検知して隠蔽 vs 案 (B) UseCase で明示的にセットする
- 推奨は 案 (B) UseCase 明示セット:
- ステートマシンの遷移ロジック(
ChangeTaskStatusUseCase)に SSOT を集約する方が認可・監査ログとの整合が取りやすい
- JPA ライフサイクルコールバックに業務ロジックを置くと、テストとデバッグが難しくなる
- 既存設計規約と整合(Domain にロジック集約)
- 議論完了後、Issue 本文に結論を追記し、実装に進む
完了の定義(DoD)
前提・依存
関連
概要
PR #327(Issue #150)で確定した S-03 ダッシュボード「当日対応 + 振り返り」リスト (4) 今日やったこと セクション、および §3.3.3 数値カード「本日完了件数」の判定基盤として、
tasksテーブルにcompleted_at TIMESTAMP NULLを新設する。スコープ
DDL / マイグレーション
tasks.completed_at TIMESTAMP NULLを追加(基本設計書 §4.2 タスクテーブル定義 / §4.4 CREATE TABLE 抜粋に反映)(tenant_id, completed_at)を追加(振り返りクエリ + 数値カード集計の用途)V*_add_completed_at_to_tasks.sql)Domain / Entity
xyz.dgz48.tasks.webapi.task.domain.Taskモデルにcompleted_at: OffsetDateTime?を追加(JST 全層統一方針に従う)UseCase / 業務ロジック
ChangeTaskStatusUseCase(A-16):ステータス遷移時に completed_at を制御completed_at = now()セットcompleted_at = NULLクリアUpdateTaskUseCase(A-14):completed_at は API リクエストから受け付けず、サーバ側で制御する(クライアントから書き換え不可)DTO / API
completed_atを追加(OpenAPI スキーマ更新)集計 SQL
status = '完了' AND DATE(completed_at) = CURRENT_DATE AND (owner_id = :userId OR assignee_id = :userId)COUNT(*) WHERE status = '完了' AND DATE(completed_at) = CURRENT_DATE+ 認可フィルタ通過議論ポイント(本 Issue 本文で結論を出す。ADR は起票しない)
@PrePersist/@PreUpdateでステータス変更を検知して隠蔽 vs 案 (B) UseCase で明示的にセットするChangeTaskStatusUseCase)に SSOT を集約する方が認可・監査ログとの整合が取りやすい完了の定義(DoD)
前提・依存
関連
project_jst_full_stack_unification、TIMESTAMP は Asia/Tokyo)