Kaynağa Gözat

View projects grouped according to each dimension

moell 1 yıl önce
ebeveyn
işleme
e3cd50e420

+ 20 - 0
app/Http/Controllers/API/ProjectController.php

@@ -12,6 +12,7 @@ use App\Http\Requests\API\Project\UpdateLinkAssetsRequest;
 use App\Http\Resources\API\AssetRequirementResource;
 use App\Http\Resources\API\ProjectAssetResource;
 use App\Http\Resources\API\ProjectDetailResource;
+use App\Http\Resources\API\ProjectGroupViewTaskResource;
 use App\Http\Resources\API\SimplePlanResource;
 use App\Http\Resources\API\ProjectRequirementResource;
 use App\Http\Resources\API\ProjectResource;
@@ -23,8 +24,11 @@ use App\Models\ProjectAsset;
 use App\Models\ProjectPlan;
 use App\Models\ProjectRequirement;
 use App\Models\Requirement;
+use App\Models\Task;
+use App\Models\User;
 use App\Repositories\ActionRepository;
 use App\Services\Project\ProjectKanbanService;
+use App\Services\Project\ProjectTaskGroupViewService;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\DB;
@@ -342,4 +346,20 @@ class ProjectController extends Controller
             'data' => $service->kanban($project, $request->get("group", "requirement_asc"))
         ]);
     }
+
+    public function groupView(Request $request, string $id)
+    {
+        $project = Project::findOrFail($id);
+
+        $group = in_array(
+            $request->get("group"),
+            ['requirement_id','status','assign','finished_by','closed_by','task_type']
+        ) ? $request->get("group") : "requirement_id";
+
+
+
+        return $this->success([
+            'data' => (new ProjectTaskGroupViewService())->groupView($project, $group, $request->all())
+        ]);
+    }
 }

+ 27 - 0
app/Http/Resources/API/ProjectGroupViewTaskResource.php

@@ -0,0 +1,27 @@
+<?php
+
+namespace App\Http\Resources\API;
+
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class ProjectGroupViewTaskResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return [
+            "id" => $this->id,
+            "name" => $this->name,
+            "task_type" => $this->task_type,
+            "status" => $this->status,
+            "assign" => new UserProfileResource($this->assignTo),
+            "end" => $this->end,
+            "finished_by" =>  new UserProfileResource($this->finishedBy),
+        ];
+    }
+}

+ 9 - 0
app/ModelFilters/TaskFilter.php

@@ -24,4 +24,13 @@ class TaskFilter extends ModelFilter
     {
         return $my == "yes" ? $this->where("assign", Auth::id()) : $this;
     }
+
+    public function linkRequirement($link): TaskFilter
+    {
+        return match($link) {
+            "yes" => $this->where("requirement_id", ">", 0),
+            "no" => $this->where("requirement_id", "=", 0),
+            default => $this,
+        };
+    }
 }

+ 95 - 0
app/Services/Project/ProjectTaskGroupViewService.php

@@ -0,0 +1,95 @@
+<?php
+
+namespace App\Services\Project;
+
+use App\Http\Resources\API\ProjectGroupViewTaskResource;
+use App\Models\Enums\ProjectStatus;
+use App\Models\Project;
+use App\Models\Requirement;
+use App\Models\Task;
+use App\Models\User;
+use Illuminate\Support\Collection;
+
+class ProjectTaskGroupViewService
+{
+    public function groupView(Project $project, string $group, array $filter = []): array
+    {
+        $groupTasks = $this->getGroupTask($project, $group, $filter);
+
+        $countItems = $this->countItems($project, $group, $filter);
+
+        $groups = $groupTasks->keys()->filter();
+
+        $groupNamesKeyBy = $this->getGroupNamesKeyBy($groups, $group);
+
+        $items = [];
+        foreach(["", ...$groups] as $groupKey) {
+            if (! isset($groupTasks[$groupKey])) {
+                continue;
+            }
+
+            $items[] = [
+                'group' => $group,
+                'group_label' => $groupKey == "" ? ['id' => "", "name" => ""] : $groupNamesKeyBy[$groupKey],
+                'count' => $countItems[$groupKey],
+                'tasks' => ProjectGroupViewTaskResource::collection($groupTasks[$groupKey]),
+            ];
+        }
+
+        return [
+            'total' => $countItems->sum("all_count"),
+            'items' => $items,
+        ];
+    }
+
+    protected function getGroupNamesKeyBy(Collection $groups, string $group): array
+    {
+        $groupsFormat = $groups->map(fn($group) => ['id' => $group, 'name' => $group]);
+        $groupNames = match ($group) {
+            "requirement_id" => Requirement::query()->whereIn("id", $groups)->selectRaw("id,title as name")->get(),
+            "status", "task_type" => $groupsFormat,
+            "assign", "finished_by", "closed_by" => User::query()->whereIn("id", $groups)->get(['id', 'name']),
+        };
+
+        return $groupNames->keyBy("id")->toArray();
+    }
+
+    protected function countItems(
+        Project $project,
+        string $group,
+        array $filter
+    ): \Illuminate\Database\Eloquent\Collection|\Illuminate\Support\Collection|array
+    {
+        return Task::query()
+            ->where("project_id", $project->id)
+            ->filter($filter)
+            ->selectRaw(
+                sprintf("
+                    %s,
+                    count(*) as all_count,
+                    count(case when status = '%s' then 1 else null end) as wait_count,
+                    count(case when status = '%s' then 1 else null end) as doing_count",
+                    $group,
+                    ProjectStatus::WAIT->value,
+                    ProjectStatus::DOING->value
+                )
+            )
+            ->groupBy($group)
+            ->get()
+            ->keyBy($group);
+    }
+
+    protected function getGroupTask(
+        Project $project,
+        string $group,
+        array $filter
+    ): \Illuminate\Database\Eloquent\Collection|\Illuminate\Support\Collection|array
+    {
+        return Task::query()
+            ->filter($filter)
+            ->with(['assignTo', 'finishedBy'])
+            ->where("project_id", $project->id)
+            ->get()
+            ->groupBy($group);
+    }
+}

+ 1 - 1
config/database.php

@@ -56,7 +56,7 @@ return [
             'collation' => 'utf8mb4_unicode_ci',
             'prefix' => '',
             'prefix_indexes' => true,
-            'strict' => true,
+            'strict' => false,
             'engine' => null,
             'options' => extension_loaded('pdo_mysql') ? array_filter([
                 PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),

+ 1 - 0
routes/api.php

@@ -46,6 +46,7 @@ Route::middleware(['auth:sanctum'])->group(function () {
 
         Route::get("project/{project}/dynamic", [API\ProjectController::class, "dynamic"])->name("project.dynamic");
         Route::get("project/{project}/kanban", [API\ProjectController::class, "kanban"])->name("project.kanban");
+        Route::get("project/{project}/group-view", [API\ProjectController::class, "groupView"])->name("project.group-view");
         Route::patch("project/{project}/closed", [API\ProjectController::class, "closed"])->name("project.closed");
         Route::patch("project/{project}/start", [API\ProjectController::class, "start"])->name("project.start");
         Route::patch("project/{project}/pause", [API\ProjectController::class, "pause"])->name("project.pause");