12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- <?php
- namespace App\Services\Project;
- use App\Http\Resources\API\KanbanTaskResource;
- use App\Http\Resources\API\UserProfileResource;
- use App\Models\Enums\ProjectStatus;
- use App\Models\Project;
- use App\Models\Requirement;
- use App\Models\User;
- class ProjectKanbanService
- {
- public function kanban(Project $project, $group = "requirement_asc")
- {
- $groupKey = match ($group) {
- "assign" => "assign",
- "finished_by" => "finished_by",
- default => "requirement_id"
- };
- $groupTasks = $project->tasks()->with(['assignTo'])->get()->groupBy($groupKey);
- $statusItems = array_column(ProjectStatus::cases(), 'value');
- $items = [];
- $groupIds = [];
- foreach ($groupTasks as $groupId => $tasks) {
- $groupItems = [];
- foreach ($statusItems as $status) {
- $groupItems[$status] = [];
- }
- foreach ($tasks as $task) {
- $groupItems[$task->status][] = new KanbanTaskResource($task);
- }
- $items[$groupId ?: "empty"] = $groupItems;
- $groupIds[] = $groupId;
- }
- return [
- 'group_data' => $this->getKanbanGroupData($groupIds, $group),
- 'group' => $group,
- 'tasks' => $items,
- 'status_items' => $statusItems,
- ];
- }
- protected function getKanbanGroupData(array $ids, string $group)
- {
- $orderBy = match ($group) {
- "requirement_asc" => ['id', 'asc'],
- "requirement_desc" => ['id', 'desc'],
- "requirement_priority_asc" => ['priority', 'asc'],
- "requirement_priority_desc" => ['priority', 'desc'],
- default => null
- };
- return match ($group) {
- "assign", "finished_by" => UserProfileResource::collection(User::query()->whereIn("id", $ids)->get()),
- default => Requirement::query()->whereIn("id", $ids)
- ->when($orderBy, fn($query) => $query->orderBy(...$orderBy))
- ->get([
- 'id', 'title', 'priority', 'status'
- ]),
- };
- }
- }
|