Browse Source

task export

moell 8 months ago
parent
commit
0cc99cc70c
4 changed files with 106 additions and 1 deletions
  1. 81 0
      app/Exports/TaskExport.php
  2. 13 0
      app/Http/Controllers/API/TaskController.php
  3. 10 0
      app/Models/Task.php
  4. 2 1
      routes/api.php

+ 81 - 0
app/Exports/TaskExport.php

@@ -0,0 +1,81 @@
+<?php
+
+namespace App\Exports;
+
+use App\Models\Task;
+use Maatwebsite\Excel\Concerns\FromCollection;
+use Maatwebsite\Excel\Concerns\WithHeadings;
+
+class TaskExport implements FromCollection, WithHeadings
+{
+    public function collection()
+    {
+        $tasks = collect([]);
+
+        Task::query()
+            ->where("parent_id", 0)
+            ->with(['children', 'assignTo', 'createdBy', 'parent', 'requirement', 'project'])
+            ->filter(request()->all())
+            ->allowed()
+            ->orderBy("id")
+            ->chunkById(200, function ($items) use (&$tasks) {
+                foreach ($items as $item) {
+                    $tasks->push($this->formatRow($item));
+
+                    if ($item->children) {
+                        foreach ($item->children as $child) {
+                            $tasks->push($this->formatRow($child));
+                        }
+                    }
+                }
+            });
+
+        return $tasks;
+    }
+
+    protected function formatRow(Task $task)
+    {
+        return [
+            $task->id,
+            $task->name,
+            $task->begin,
+            $task->end,
+            $task->parent?->name,
+            $task->project?->name,
+            $task->asset?->name,
+            $task->requirement?->name,
+            $task->status,
+            $task->task_type,
+            $task->doc_type,
+            $task->suitability,
+            $task->state,
+            $task->approval_status,
+            $task->description,
+            $task->createdBy?->name,
+            $task->created_at,
+        ];
+    }
+
+    public function headings(): array
+    {
+        return [
+            'ID',
+            'Name',
+            'Begin',
+            'End',
+            'Parent',
+            'Project Name',
+            'Asset',
+            'Requirement',
+            'Status',
+            'Task Type',
+            'Doc Type',
+            'Suitability',
+            'State',
+            'Approval Status',
+            'Description',
+            'Created By',
+            'Created Date',
+        ];
+    }
+}

+ 13 - 0
app/Http/Controllers/API/TaskController.php

@@ -2,6 +2,8 @@
 
 namespace App\Http\Controllers\API;
 
+use App\Exports\DownloadHelper;
+use App\Exports\TaskExport;
 use App\Http\Controllers\Controller;
 use App\Http\Requests\API\Task\AssignRequest;
 use App\Http\Requests\API\Task\BatchCreateItemRules;
@@ -31,6 +33,8 @@ use Illuminate\Support\Facades\Validator;
 
 class TaskController extends Controller
 {
+    use DownloadHelper;
+
     /**
      * Display a listing of the resource.
      */
@@ -49,6 +53,15 @@ class TaskController extends Controller
         return TaskResource::collection($tasks);
     }
 
+    public function export(Request $request)
+    {
+        return $this->downloadExcelHelper(
+            new TaskExport(),
+            "task",
+            $request->get("extension"),
+        );
+    }
+
     /**
      * Store a newly created resource in storage.
      */

+ 10 - 0
app/Models/Task.php

@@ -56,6 +56,11 @@ class Task extends Model
         $query->whereIn("id", $taskIds->toArray());
     }
 
+    public function parent(): \Illuminate\Database\Eloquent\Relations\BelongsTo
+    {
+        return $this->belongsTo(Task::class, "parent_id");
+    }
+
     public function requirement(): \Illuminate\Database\Eloquent\Relations\BelongsTo
     {
         return $this->belongsTo(Requirement::class);
@@ -66,6 +71,11 @@ class Task extends Model
         return $this->belongsTo(Project::class);
     }
 
+    public function asset(): \Illuminate\Database\Eloquent\Relations\BelongsTo
+    {
+        return $this->belongsTo(Asset::class);
+    }
+
     public function namingRule(): \Illuminate\Database\Eloquent\Relations\BelongsTo
     {
         return $this->belongsTo(NamingRule::class);

+ 2 - 1
routes/api.php

@@ -100,7 +100,7 @@ Route::middleware(['auth:sanctum','account.limit'])->group(function () {
         Route::get("requirement/{asset_id}/asset", [API\RequirementController::class, "byAsset"])->name("requirement.byAsset");
         Route::patch("requirement/{plan_id}/plan", [API\RequirementController::class, "linkPlan"])->name("requirement.linkPlan");
         Route::patch("requirement/plan/unlink", [API\RequirementController::class, "unlinkPlan"])->name("requirement.unlinkPlan");
-        Route::get("requirement-export", [API\RequirementController::class, "export"])->name("requirement-export");
+        Route::get("requirement-export", [API\RequirementController::class, "export"])->name("requirement.export");
 
         Route::get("project-tree",[API\ProjectController::class, 'tree'])->name('project.tree');
         Route::get("project/{project}/dynamic", [API\ProjectController::class, "dynamic"])->name("project.dynamic");
@@ -141,6 +141,7 @@ Route::middleware(['auth:sanctum','account.limit'])->group(function () {
         Route::post("task/{task}/container", [API\TaskController::class, "linkContainer"])->name("task.link-container");
         Route::delete("task-container/{task_container}", [API\TaskController::class, "unlinkContainer"])->name("task.unlink-container");
         Route::get("task/{task}/container-to-be-linked", [API\TaskController::class, "containerToBeLinked"])->name("task.container-to-be-linked");
+        Route::get("task-export", [API\TaskController::class, "export"])->name("task.export");
 
         Route::post("user/user-batch-create", [API\UserController::class, "batchStore"])->name("user.batch-create");
         Route::put("user/status/{status}", [API\UserController::class, "status"])->name("user.status");