ProjectKanbanService.php 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. $groupItems=[];
  23. foreach ($groupTasks as $groupId => $tasks) {
  24. $groupItems = [];
  25. foreach ($statusItems as $status) {
  26. $groupItems[$status] = [];
  27. }
  28. foreach ($tasks as $task) {
  29. $groupItems[$task->status][] = new KanbanTaskResource($task);
  30. }
  31. $items[$groupId ?: "empty"] = $groupItems;
  32. $groupIds[] = $groupId;
  33. }
  34. $kanbans=$this->getKanbanGroupData($groupIds, $group);
  35. foreach ($kanbans as $kanban){
  36. if(isset($items[$kanban->id])){
  37. $kanban->value = $items[$kanban->id];
  38. }
  39. }
  40. return [
  41. "noEmpty" =>$kanbans,
  42. "empty" => $items["empty"]??[]
  43. ];
  44. }
  45. protected function getKanbanGroupData(array $ids, string $group)
  46. {
  47. $orderBy = match ($group) {
  48. "requirement_asc" => ['id', 'asc'],
  49. "requirement_desc" => ['id', 'desc'],
  50. "requirement_priority_asc" => ['priority', 'asc'],
  51. "requirement_priority_desc" => ['priority', 'desc'],
  52. default => null
  53. };
  54. return match ($group) {
  55. "assign", "finished_by" => UserProfileResource::collection(User::query()->whereIn("id", $ids)->get()),
  56. default => Requirement::query()->whereIn("id", $ids)
  57. ->when($orderBy, fn($query) => $query->orderBy(...$orderBy))
  58. ->get([
  59. 'id', 'title', 'priority', 'status'
  60. ]),
  61. };
  62. }
  63. }