feat: [pm] 프로젝트 진행 관리 시스템 구현
- Models: AdminPmProject, AdminPmTask, AdminPmIssue
- Services: ProjectService, TaskService, IssueService, ImportService
- API Controllers: ProjectController, TaskController, IssueController, ImportController
- FormRequests: Store/Update/BulkAction 요청 검증
- Views: 대시보드, 프로젝트 CRUD, JSON Import 화면
- Routes: API 42개 + Web 6개 엔드포인트
주요 기능:
- 프로젝트/작업/이슈 계층 구조 관리
- 상태 변경, 우선순위, 마감일 추적
- 작업 순서 드래그앤드롭 (reorder API)
- JSON Import로 일괄 등록
- Soft Delete 및 복원
2025-11-28 08:49:30 +09:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Requests\ProjectManagement;
|
|
|
|
|
|
|
|
|
|
use Illuminate\Foundation\Http\FormRequest;
|
|
|
|
|
|
|
|
|
|
class ImportProjectRequest extends FormRequest
|
|
|
|
|
{
|
|
|
|
|
public function authorize(): bool
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function rules(): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
// 프로젝트
|
|
|
|
|
'project' => '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',
|
2025-12-09 16:39:52 +09:00
|
|
|
'tasks.*.is_urgent' => 'nullable|boolean',
|
|
|
|
|
'tasks.*.assignee_id' => 'nullable|integer|exists:users,id',
|
|
|
|
|
'tasks.*.assignee_name' => 'nullable|string|max:100',
|
feat: [pm] 프로젝트 진행 관리 시스템 구현
- Models: AdminPmProject, AdminPmTask, AdminPmIssue
- Services: ProjectService, TaskService, IssueService, ImportService
- API Controllers: ProjectController, TaskController, IssueController, ImportController
- FormRequests: Store/Update/BulkAction 요청 검증
- Views: 대시보드, 프로젝트 CRUD, JSON Import 화면
- Routes: API 42개 + Web 6개 엔드포인트
주요 기능:
- 프로젝트/작업/이슈 계층 구조 관리
- 상태 변경, 우선순위, 마감일 추적
- 작업 순서 드래그앤드롭 (reorder API)
- JSON Import로 일괄 등록
- Soft Delete 및 복원
2025-11-28 08:49:30 +09:00
|
|
|
|
|
|
|
|
// 작업별 이슈 목록
|
|
|
|
|
'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',
|
2025-12-02 19:10:15 +09:00
|
|
|
// 일정 관련
|
|
|
|
|
'tasks.*.issues.*.start_date' => 'nullable|date',
|
|
|
|
|
'tasks.*.issues.*.due_date' => 'nullable|date|after_or_equal:tasks.*.issues.*.start_date',
|
|
|
|
|
'tasks.*.issues.*.estimated_hours' => 'nullable|integer|min:0',
|
|
|
|
|
'tasks.*.issues.*.is_urgent' => 'nullable|boolean',
|
|
|
|
|
// 팀/담당자/고객사 (하이브리드)
|
|
|
|
|
'tasks.*.issues.*.department_id' => 'nullable|integer|exists:departments,id',
|
|
|
|
|
'tasks.*.issues.*.team' => 'nullable|string|max:100',
|
|
|
|
|
'tasks.*.issues.*.assignee_id' => 'nullable|integer|exists:users,id',
|
|
|
|
|
'tasks.*.issues.*.assignee_name' => 'nullable|string|max:100',
|
|
|
|
|
'tasks.*.issues.*.client' => 'nullable|string|max:100',
|
feat: [pm] 프로젝트 진행 관리 시스템 구현
- Models: AdminPmProject, AdminPmTask, AdminPmIssue
- Services: ProjectService, TaskService, IssueService, ImportService
- API Controllers: ProjectController, TaskController, IssueController, ImportController
- FormRequests: Store/Update/BulkAction 요청 검증
- Views: 대시보드, 프로젝트 CRUD, JSON Import 화면
- Routes: API 42개 + Web 6개 엔드포인트
주요 기능:
- 프로젝트/작업/이슈 계층 구조 관리
- 상태 변경, 우선순위, 마감일 추적
- 작업 순서 드래그앤드롭 (reorder API)
- JSON Import로 일괄 등록
- Soft Delete 및 복원
2025-11-28 08:49:30 +09:00
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function messages(): array
|
|
|
|
|
{
|
|
|
|
|
return [
|
|
|
|
|
'project.required' => 'project 객체는 필수입니다.',
|
|
|
|
|
'project.name.required' => 'project.name은 필수입니다.',
|
|
|
|
|
'tasks.*.title.required' => '각 작업의 title은 필수입니다.',
|
|
|
|
|
'tasks.*.issues.*.title.required' => '각 이슈의 title은 필수입니다.',
|
|
|
|
|
];
|
|
|
|
|
}
|
2025-12-02 19:10:15 +09:00
|
|
|
}
|