'required|array', 'project.name' => 'required|string|max:255', 'project.description' => 'nullable|string', 'project.status' => 'nullable|in:active,completed,on_hold', 'project.start_date' => 'nullable|date', 'project.end_date' => 'nullable|date|after_or_equal:project.start_date', // 작업 목록 'tasks' => 'nullable|array', 'tasks.*.title' => 'required|string|max:255', 'tasks.*.description' => 'nullable|string', 'tasks.*.status' => 'nullable|in:todo,in_progress,done', 'tasks.*.priority' => 'nullable|in:low,medium,high', 'tasks.*.due_date' => 'nullable|date', // 작업별 이슈 목록 'tasks.*.issues' => 'nullable|array', 'tasks.*.issues.*.title' => 'required|string|max:255', 'tasks.*.issues.*.description' => 'nullable|string', 'tasks.*.issues.*.type' => 'nullable|in:bug,feature,improvement', 'tasks.*.issues.*.status' => 'nullable|in:open,in_progress,resolved,closed', ]; } public function messages(): array { return [ 'project.required' => 'project 객체는 필수입니다.', 'project.name.required' => 'project.name은 필수입니다.', 'tasks.*.title.required' => '각 작업의 title은 필수입니다.', 'tasks.*.issues.*.title.required' => '각 이슈의 title은 필수입니다.', ]; } }