123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- <?php
- namespace App\Http\Controllers\API;
- use App\Http\Controllers\Controller;
- use App\Http\Requests\API\Approval\ActionRequest;
- use App\Http\Requests\API\Approval\CreateOrUpdateRequest;
- use App\Http\Resources\API\ActionByApprovalLogResource;
- use App\Http\Resources\API\ApprovalFlowDetailResource;
- use App\Http\Resources\API\UserProfileResource;
- use App\Models\Action;
- use App\Models\Approval;
- use App\Models\ApprovalFlow;
- use App\Models\Enums\ApprovalFlowObjectType;
- use App\Models\Enums\ApprovalFlowType;
- use App\Models\Enums\ApprovalObjectType;
- use App\Models\Enums\ObjectAction;
- use App\Models\Enums\ObjectApprovalStatus;
- use App\Repositories\ActionRepository;
- use App\Services\Approval\ActionService;
- use App\Services\Approval\StoreService;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\Auth;
- class ApprovalController extends Controller
- {
- /**
- * Display a listing of the resource.
- */
- public function index(Request $request)
- {
- $approvals = Approval::query()->filter($request->all())->orderByDesc("created_at")->paginate();
- $items = [];
- foreach ($approvals as $approval) {
- $items[] = [
- 'id' => $approval->id,
- 'status' => $approval->status,
- 'object_type' => $approval->object_type,
- 'object_id' => $approval->object_id,
- 'node_level' => $approval->node_level,
- 'created_by' => new UserProfileResource($approval->createdBy),
- ];
- }
- return $this->success([
- 'data' => $items
- ]);
- }
- /**
- * Store a newly created resource in storage.
- */
- public function store(CreateOrUpdateRequest $request, StoreService $service)
- {
- $service->store();
- return $this->created();
- }
- /**
- * Display the specified resource.
- */
- public function show(string $id)
- {
- $approval = Approval::query()
- ->where("id", $id)
- ->where(fn($query) => $query->where("users", 'like', '%,'.Auth::id().',%')->orWhere("created_by", Auth::id()))
- ->firstOrFail();
- $approvalObjectType = ApprovalObjectType::from($approval->object_type);
- $object = $approvalObjectType
- ->modelBuilder()
- ->find($approval->object_id);
- $actions = Action::with(['createdBy'])->where([
- 'object_type' => $approvalObjectType->actionObjectType(),
- 'object_id' => $object->id,
- 'additional_id' => $approval->id,
- ])->orderByDesc("created_at")->get();
- return $this->success([
- 'data' => [
- 'id' => $approval->id,
- 'status' => $approval->status,
- 'object_type' => $approval->object_type,
- 'object_id' => $approval->object_id,
- 'object' => [
- 'id' => $object->id,
- 'name' => $object[$approvalObjectType->nameField()],
- ],
- 'remark' => $approval->remark,
- 'node_level' => $approval->node_level,
- 'created_by' => new UserProfileResource($approval->createdBy),
- 'approval_flow' => new ApprovalFlowDetailResource($approval->approvalFlow),
- 'approval_logs' => ActionByApprovalLogResource::collection($actions),
- ]
- ]);
- }
- public function action(ActionRequest $request, string $id, ActionService $actionService)
- {
- $approval = Approval::query()
- ->where("users", 'like', '%,'.Auth::id().',%')
- ->whereIn("status", [
- ObjectApprovalStatus::DOING->value,
- ])
- ->find($id);
- throw_validation_if(! $approval, "No authority for approval");
- $actionService->action($approval, $request->status, $request->get("comment"));
- return $this->noContent();
- }
- /**
- * Update the specified resource in storage.
- */
- public function update(CreateOrUpdateRequest $request, string $id)
- {
- $approval = Approval::query()->findOrFail($id);
- ApprovalObjectType::from($approval->object_type)->modelBuilderAllowed($approval->object_id)->findOrFail($approval->object_id);
- $approval->remark = $request->remark;
- $approval->save();
- return $this->noContent();
- }
- /**
- * Remove the specified resource from storage.
- */
- public function cancel(string $id)
- {
- $approval = Approval::query()
- ->whereIn("status", [
- ObjectApprovalStatus::DOING->value,
- ])
- ->findOrFail($id);
- $object = ApprovalObjectType::from($approval->object_type)->modelBuilderAllowed($approval->object_id)->findOrFail($approval->object_id);
- $approval->status = ObjectApprovalStatus::CANCELED;
- $approval->save();
- ActionRepository::createByApproval($approval, ObjectAction::APPROVED_CANCELED);
- $object->approval_status = ObjectApprovalStatus::WAIT;
- $object->save();
- return $this->noContent();
- }
- }
|