|
@@ -0,0 +1,70 @@
|
|
|
+<?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'
|
|
|
+ ]),
|
|
|
+ };
|
|
|
+ }
|
|
|
+}
|