12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- <?php
- namespace App\Services\Approval;
- use App\Models\Approval;
- use App\Models\Enums\ApprovalObjectType;
- use App\Models\Enums\ObjectAction;
- use App\Models\Enums\ObjectApprovalStatus;
- use App\Repositories\ActionRepository;
- class ActionService
- {
- protected ?Approval $approval = null;
- protected array $actionExtraFields = [];
- public function action(Approval $approval, int $status, string $comment = null): void
- {
- $this->approval = $approval;
- match($status) {
- 1 => $this->approved(),
- default => $this->rejected(),
- };
- $this->triggerAction($comment);
- $this->changeApprovalObjectStatus();
- $this->changeApprovalStatus();
- }
- protected function changeApprovalStatus(): void
- {
- $this->approval->save();
- }
- protected function changeApprovalObjectStatus(): void
- {
- $object = ApprovalObjectType::from($this->approval->object_type)
- ->modelBuilder()
- ->findOrFail($this->approval->object_id);
- $object->approval_status = $this->approval->status;
- $object->save();
- }
- protected function triggerAction (string $comment = null): void
- {
- $objectAction = match ($this->approval->status) {
- ObjectApprovalStatus::APPROVED->value => ObjectAction::APPROVAL_APPROVED,
- ObjectApprovalStatus::DOING->value => ObjectAction::APPROVED_TO_NEXT_NODE,
- ObjectApprovalStatus::REJECTED->value => ObjectAction::APPROVAL_REJECTED,
- };
- ActionRepository::createByApproval(
- $this->approval,
- $objectAction,
- $comment,
- extraFields: $this->actionExtraFields
- );
- }
- protected function approved(): void
- {
- $approvalFlowNodes = $this->approval->approvalFlow?->nodes;
- $nextNodeIndex = $this->approval->node_level + 1;
- $nextNodes = $approvalFlowNodes[$nextNodeIndex] ?? [];
- if (! $nextNodes) {
- $this->approval->status = ObjectApprovalStatus::APPROVED->value;
- return;
- }
- $this->actionExtraFields = [
- 'now' => $this->approval->node_level,
- 'next' => $nextNodeIndex,
- ];
- $this->approval->node_level = $nextNodeIndex;
- $this->approval->users = sprintf(",%s,", implode(',', $nextNodes['approval_users']));
- }
- protected function rejected(): void
- {
- $this->approval->status = ObjectApprovalStatus::REJECTED->value;
- }
- }
|