|
@@ -0,0 +1,124 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace App\Http\Controllers\API;
|
|
|
+
|
|
|
+use App\Http\Controllers\Controller;
|
|
|
+use App\Http\Requests\API\ApprovalFlow\CreateOrUpdateRequest;
|
|
|
+use App\Http\Resources\API\ApprovalFlowDetailResource;
|
|
|
+use App\Http\Resources\API\ApprovalFlowResource;
|
|
|
+use App\Models\ApprovalFlow;
|
|
|
+use App\Models\User;
|
|
|
+use Illuminate\Http\Request;
|
|
|
+use Illuminate\Support\Facades\Auth;
|
|
|
+
|
|
|
+class ApprovalFlowController extends Controller
|
|
|
+{
|
|
|
+ public function index()
|
|
|
+ {
|
|
|
+ $approvalFlows = ApprovalFlow::query()->with(['createdBy'])->orderByDesc("id")->paginate();
|
|
|
+
|
|
|
+ return ApprovalFlowResource::collection($approvalFlows);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function store(CreateOrUpdateRequest $request)
|
|
|
+ {
|
|
|
+ $nodes = $this->getApprovalNodes($request);
|
|
|
+
|
|
|
+ $approvalFlow = new ApprovalFlow();
|
|
|
+ $approvalFlow->mergeFillable([
|
|
|
+ 'company_id'
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $approvalFlow->fill([
|
|
|
+ ...$request->all(),
|
|
|
+ 'company_id' => Auth::user()->company_id,
|
|
|
+ 'created_by' => Auth::id(),
|
|
|
+ 'nodes' => $nodes,
|
|
|
+ ]);
|
|
|
+ $approvalFlow->save();
|
|
|
+
|
|
|
+ return $this->created();
|
|
|
+ }
|
|
|
+
|
|
|
+ protected function getApprovalNodes(Request $request)
|
|
|
+ {
|
|
|
+ $nodes = [];
|
|
|
+ foreach ($request->nodes as $node) {
|
|
|
+ $userCount = User::query()->whereIn("id", $node['approval_users'])->count();
|
|
|
+
|
|
|
+ throw_validation_if($userCount != count($node['approval_users']), "The selected approver does not exist");
|
|
|
+
|
|
|
+ $nodes[$node['level']] = $node;
|
|
|
+ }
|
|
|
+
|
|
|
+ throw_validation_if(max(array_keys($nodes)) != count($nodes), "The level field is incorrect");
|
|
|
+
|
|
|
+ return $nodes;
|
|
|
+ }
|
|
|
+
|
|
|
+ public function update(CreateOrUpdateRequest $request, string $id)
|
|
|
+ {
|
|
|
+ $approvalFlow = ApprovalFlow::query()->findOrFail($id);
|
|
|
+
|
|
|
+ $nodes = $this->getApprovalNodes($request);
|
|
|
+
|
|
|
+ $nodeIsChange = false;
|
|
|
+ if (count($nodes) != count($approvalFlow->nodes)) {
|
|
|
+ $nodeIsChange = true;
|
|
|
+ } else {
|
|
|
+ foreach ($approvalFlow->nodes as $node) {
|
|
|
+ $oldNodeUsers = $node['approval_users'];
|
|
|
+ $nowNodeUsers = $nodes[$node['level']]['approval_users'];
|
|
|
+
|
|
|
+ sort($oldNodeUsers);
|
|
|
+ sort($nowNodeUsers);
|
|
|
+
|
|
|
+ if (implode(',', $oldNodeUsers) != implode(',', $nowNodeUsers)) {
|
|
|
+ $nodeIsChange = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($nodeIsChange) {
|
|
|
+ $newApprovalFlow = new ApprovalFlow();
|
|
|
+ $newApprovalFlow->mergeFillable([
|
|
|
+ 'company_id'
|
|
|
+ ]);
|
|
|
+
|
|
|
+ $newApprovalFlow->fill([
|
|
|
+ 'name' => $request->name,
|
|
|
+ 'object_type' => $approvalFlow->object_type,
|
|
|
+ 'object_id' => $approvalFlow->object_id,
|
|
|
+ 'company_id' => Auth::user()->company_id,
|
|
|
+ 'created_by' => Auth::id(),
|
|
|
+ 'nodes' => $nodes,
|
|
|
+ ]);
|
|
|
+ $newApprovalFlow->save();
|
|
|
+
|
|
|
+ $approvalFlow->delete();
|
|
|
+ } else {
|
|
|
+ $approvalFlow->name = $request->name;
|
|
|
+ $approvalFlow->nodes = $nodes;
|
|
|
+ $approvalFlow->save();
|
|
|
+ }
|
|
|
+
|
|
|
+ return $this->noContent();
|
|
|
+ }
|
|
|
+
|
|
|
+ public function show(string $id)
|
|
|
+ {
|
|
|
+ $approvalFlow = ApprovalFlow::query()->findOrFail($id);
|
|
|
+
|
|
|
+ return new ApprovalFlowDetailResource($approvalFlow);
|
|
|
+ }
|
|
|
+
|
|
|
+ public function destroy(string $id)
|
|
|
+ {
|
|
|
+ $approvalFlow = ApprovalFlow::query()->findOrFail($id);
|
|
|
+
|
|
|
+ $approvalFlow->delete();
|
|
|
+
|
|
|
+ return $this->noContent();
|
|
|
+ }
|
|
|
+}
|