id(); $table->foreignId('project_id')->nullable()->constrained()->cascadeOnDelete(); $table->foreignId('phase_id')->nullable()->constrained()->nullOnDelete(); $table->foreignId('parent_task_id')->nullable()->constrained('tasks')->nullOnDelete(); $table->string('title'); $table->text('description')->nullable(); $table->enum('status', ['pending', 'in_progress', 'completed', 'cancelled'])->default('pending'); $table->enum('priority', ['low', 'medium', 'high', 'critical'])->default('medium'); $table->foreignId('created_by')->constrained('users')->cascadeOnDelete(); $table->foreignId('assigned_to')->nullable()->constrained('users')->nullOnDelete(); $table->date('due_date')->nullable(); $table->date('start_date')->nullable(); $table->datetime('completed_at')->nullable(); $table->foreignId('completed_by')->nullable()->constrained('users')->nullOnDelete(); $table->unsignedInteger('estimated_hours')->nullable(); $table->unsignedInteger('actual_hours')->nullable(); $table->integer('order')->default(0); $table->uuid('uuid')->unique(); $table->datetime('client_updated_at')->nullable(); $table->softDeletes(); $table->timestamps(); $table->index(['project_id', 'status']); $table->index(['assigned_to', 'status']); $table->index(['due_date', 'status']); $table->index(['parent_task_id']); }); } /** * Reverse the migrations. */ public function down(): void { Schema::dropIfExists('tasks'); } };