feat: [daily-logs] 일일 스크럼 테이블 마이그레이션 추가

테이블:
- admin_pm_daily_logs: 일일 로그 (날짜, 프로젝트, 요약)
- admin_pm_daily_log_entries: 로그 항목 (담당자, 내용, 상태)

관계:
- tenant_id → tenants (multi-tenant)
- project_id → admin_pm_projects (선택적)
- created_by, updated_by, deleted_by → users
This commit is contained in:
2025-12-01 14:22:04 +09:00
parent 47a6facb6b
commit aa93c19da1

View File

@@ -0,0 +1,60 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
// 일일 로그 헤더 테이블
Schema::create('admin_pm_daily_logs', function (Blueprint $table) {
$table->id();
$table->foreignId('tenant_id')->constrained()->onDelete('cascade')->comment('테넌트 ID');
$table->foreignId('project_id')->nullable()->constrained('admin_pm_projects')->onDelete('set null')->comment('프로젝트 ID (선택)');
$table->date('log_date')->comment('로그 날짜');
$table->text('summary')->nullable()->comment('일일 요약');
$table->foreignId('created_by')->constrained('users')->comment('작성자');
$table->foreignId('updated_by')->nullable()->constrained('users')->comment('수정자');
$table->foreignId('deleted_by')->nullable()->constrained('users')->comment('삭제자');
$table->timestamps();
$table->softDeletes();
// 인덱스: 테넌트별 날짜 검색 최적화
$table->index(['tenant_id', 'log_date']);
// 유니크: 테넌트+날짜+프로젝트 조합 (프로젝트가 없는 경우 날짜당 하나)
$table->unique(['tenant_id', 'log_date', 'project_id'], 'unique_tenant_date_project');
});
// 일일 로그 개별 항목 테이블
Schema::create('admin_pm_daily_log_entries', function (Blueprint $table) {
$table->id();
$table->foreignId('daily_log_id')->constrained('admin_pm_daily_logs')->onDelete('cascade')->comment('일일 로그 ID');
$table->enum('assignee_type', ['team', 'user'])->default('user')->comment('담당자 유형');
$table->unsignedBigInteger('assignee_id')->nullable()->comment('담당자 ID (팀 또는 사용자)');
$table->string('assignee_name')->comment('담당자 이름 (직접 입력 또는 선택)');
$table->text('content')->comment('업무 내용');
$table->enum('status', ['todo', 'in_progress', 'done'])->default('todo')->comment('상태');
$table->unsignedInteger('sort_order')->default(0)->comment('정렬 순서');
$table->timestamps();
// 인덱스: 로그별 정렬 순서
$table->index(['daily_log_id', 'sort_order']);
// 인덱스: 담당자별 검색
$table->index(['assignee_type', 'assignee_id']);
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('admin_pm_daily_log_entries');
Schema::dropIfExists('admin_pm_daily_logs');
}
};