moell 1 рік тому
батько
коміт
fae972f3c6

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

@@ -3,15 +3,19 @@
 namespace App\Http\Controllers\API;
 
 use App\Http\Controllers\Controller;
+use App\Http\Requests\API\Task\BatchCreateItemRules;
+use App\Http\Requests\API\Task\BatchCreateRequest;
 use App\Http\Requests\API\Task\CreateOrUpdateRequest;
 use App\Http\Resources\API\TaskDetailResource;
 use App\Http\Resources\API\TaskResource;
 use App\Models\CustomField;
 use App\Models\NamingRule;
+use App\Models\Project;
 use App\Models\Task;
 use App\Repositories\CustomFieldRepository;
 use Illuminate\Http\Request;
 use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\Validator;
 
 class TaskController extends Controller
 {
@@ -93,4 +97,57 @@ class TaskController extends Controller
 
         return $this->noContent();
     }
+
+    public function batchStore(BatchCreateRequest $request, CustomFieldRepository $customFieldRepo)
+    {
+        $project = Project::query()->find($request->project_id);
+
+        $parsedItems = [];
+        $previousItem = [];
+        foreach ($request->items as $index => $item) {
+            if ($index == 0) {
+                $newItem = $item;
+            } else {
+                $newItem = [];
+                foreach ($item as $k => $v) {
+                    $newItem[$k] = $v == "ditto" ? data_get($previousItem, $k) : $v;
+                }
+            }
+
+            $previousItem = $newItem;
+            $parsedItems[] = $newItem;
+        }
+
+        $itemRules = new BatchCreateItemRules();
+        foreach ($parsedItems as $index => $item) {
+            $rules = $itemRules->rules($item);
+
+            try {
+                $validator = Validator::make($item, $rules);
+                if ($validator->fails()) {
+                    return $this->badRequest(sprintf("line: %d, %s", $index + 1, $validator->errors()->first()));
+                }
+            } catch (\Exception $e) {
+                return $this->badRequest(sprintf("line: %d, %s", $index + 1, $e->getMessage()));
+            }
+        }
+
+        foreach ($parsedItems as $item) {
+            $namingRuleId = data_get($item, "naming_rule_id", 0);
+            if ($namingRuleId > 0) {
+                $keys = $customFieldRepo->keysByGroup($namingRuleId);
+                $item['naming_rules'] = collect($item)->only($keys)->toArray();
+            }
+
+            Task::query()->create([
+                ...$item,
+                'project_id' => $project->id,
+                'parent_id' => 0,
+                'company_id' => Auth::user()->company_id,
+                'created_by' => Auth::id(),
+            ]);
+        }
+
+        return $this->noContent();
+    }
 }

+ 49 - 0
app/Http/Requests/API/Task/BatchCreateItemRules.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace App\Http\Requests\API\Task;
+
+use App\Http\Requests\CustomFieldRuleHelper;
+use App\Http\Requests\NamingRuleHelper;
+use App\Http\Requests\RuleHelper;
+use App\Models\Enums\TaskACL;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Validation\Rule;
+use Illuminate\Validation\Rules\Enum;
+
+class BatchCreateItemRules
+{
+    use RuleHelper, CustomFieldRuleHelper, NamingRuleHelper;
+
+    public function rules(array $data): array
+    {
+        $rules =  [
+            'requirement_id' => [
+                'required',
+                Rule::exists('requirements', 'id')->where($this->userCompanyWhere()),
+            ],
+            'asset_group_id' => [
+                Rule::exists('asset_groups', 'id')->where($this->userCompanyWhere()),
+            ],
+            'assign' => [
+                Rule::exists('users', 'id')->where($this->userCompanyWhere()),
+            ],
+            'name' => 'required|max:255',
+            'begin' => 'date',
+            'end' => 'date',
+            'mailto' => $this->usersCompanyRules(),
+        ];
+
+        $taskRules = $this->customFieldRuleByGroup("task", ['doc_type', 'task_type', 'doc_stage', "state", "suitability"]);
+
+        $namingRuleId = data_get($data, 'naming_rule_id');
+        if ($namingRuleId > 0) {
+            $this->namingRuleCheck($namingRuleId);
+
+            $namingRules = $this->customFieldRuleByGroup($namingRuleId);
+
+            $rules = [...$rules, ... $namingRules];
+        }
+
+        return [...$rules, ...$taskRules];
+    }
+}

+ 38 - 0
app/Http/Requests/API/Task/BatchCreateRequest.php

@@ -0,0 +1,38 @@
+<?php
+
+namespace App\Http\Requests\API\Task;
+
+use App\Http\Requests\RuleHelper;
+use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Validation\Rule;
+
+class BatchCreateRequest extends FormRequest
+{
+    use RuleHelper;
+
+    /**
+     * Determine if the user is authorized to make this request.
+     */
+    public function authorize(): bool
+    {
+        return true;
+    }
+
+    /**
+     * Get the validation rules that apply to the request.
+     *
+     * @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
+     */
+    public function rules(): array
+    {
+        return [
+            'project_id' => [
+                'required',
+                Rule::exists('projects', 'id')->where($this->userCompanyWhere()),
+            ],
+            'items' => [
+                'required', 'array'
+            ]
+        ];
+    }
+}

+ 1 - 1
app/Http/Requests/API/Task/CreateOrUpdateRequest.php

@@ -64,7 +64,7 @@ class CreateOrUpdateRequest extends FormRequest
             'mailto' => $this->usersCompanyRules(),
         ];
 
-        $taskRules = $this->customFieldRuleByGroup("task", ['doc_type', 'task_type', 'doc_stage']);
+        $taskRules = $this->customFieldRuleByGroup("task", ['doc_type', 'task_type', 'doc_stage', "state", "suitability"]);
 
         if ($this->has("naming_rule_id") && $this->get("naming_rule_id") > 0) {
             $this->namingRuleCheck($this->get("naming_rule_id"));

+ 30 - 0
database/migrations/2024_03_09_134113_add_suitability_to_tasks_table.php

@@ -0,0 +1,30 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::table('tasks', function (Blueprint $table) {
+            $table->string("suitability", 45)->nullable();
+            $table->string("state", 45)->nullable();
+            $table->integer("asset_group_id")->nullable();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('tasks', function (Blueprint $table) {
+            $table->dropColumn(['suitability', "asset_group_id", "state"]);
+        });
+    }
+};

+ 2 - 0
routes/api.php

@@ -92,5 +92,7 @@ Route::middleware(['auth:sanctum'])->group(function () {
 
         Route::post("upload", [API\FileController::class, "upload"])->name("fileUpload");
         Route::post("download", [API\FileController::class, "download"])->name("fileDownload");
+
+        Route::post("task-batch-create", [API\TaskController::class, "batchStore"])->name("task.batch-store");
     });
 });