ProjectKanbanService.php 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <?php
  2. namespace App\Services\Project;
  3. use App\Http\Resources\API\KanbanTaskResource;
  4. use App\Http\Resources\API\UserProfileResource;
  5. use App\Models\Enums\ProjectStatus;
  6. use App\Models\Project;
  7. use App\Models\Requirement;
  8. use App\Models\User;
  9. class ProjectKanbanService
  10. {
  11. public function kanban(Project $project, $group = "requirement_asc")
  12. {
  13. $groupKey = match ($group) {
  14. "assign" => "assign",
  15. "finished_by" => "finished_by",
  16. default => "requirement_id"
  17. };
  18. $groupTasks = $project->tasks()->with(['assignTo'])->get()->groupBy($groupKey);
  19. $statusItems = array_column(ProjectStatus::cases(), 'value');
  20. $items = [];
  21. $groupIds = [];
  22. foreach ($groupTasks as $groupId => $tasks) {
  23. $groupItems = [];
  24. foreach ($statusItems as $status) {
  25. $groupItems[$status] = [];
  26. }
  27. foreach ($tasks as $task) {
  28. $groupItems[$task->status][] = new KanbanTaskResource($task);
  29. }
  30. $items[$groupId ?: "empty"] = $groupItems;
  31. $groupIds[] = $groupId;
  32. }
  33. return [
  34. 'group_data' => $this->getKanbanGroupData($groupIds, $group),
  35. 'group' => $group,
  36. 'tasks' => $items,
  37. 'status_items' => $statusItems,
  38. ];
  39. }
  40. protected function getKanbanGroupData(array $ids, string $group)
  41. {
  42. $orderBy = match ($group) {
  43. "requirement_asc" => ['id', 'asc'],
  44. "requirement_desc" => ['id', 'desc'],
  45. "requirement_priority_asc" => ['priority', 'asc'],
  46. "requirement_priority_desc" => ['priority', 'desc'],
  47. default => null
  48. };
  49. return match ($group) {
  50. "assign", "finished_by" => UserProfileResource::collection(User::query()->whereIn("id", $ids)->get()),
  51. default => Requirement::query()->whereIn("id", $ids)
  52. ->when($orderBy, fn($query) => $query->orderBy(...$orderBy))
  53. ->get([
  54. 'id', 'title', 'priority', 'status'
  55. ]),
  56. };
  57. }
  58. }