ActionService.php 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <?php
  2. namespace App\Services\Approval;
  3. use App\Models\Approval;
  4. use App\Models\Enums\ApprovalObjectType;
  5. use App\Models\Enums\ObjectAction;
  6. use App\Models\Enums\ObjectApprovalStatus;
  7. use App\Repositories\ActionRepository;
  8. class ActionService
  9. {
  10. protected ?Approval $approval = null;
  11. public function action(Approval $approval, int $status, string $comment = null): void
  12. {
  13. $this->approval = $approval;
  14. match($status) {
  15. 1 => $this->approved(),
  16. default => $this->rejected(),
  17. };
  18. $this->triggerAction($comment);
  19. $this->changeApprovalObjectStatus();
  20. $this->changeApprovalStatus();
  21. }
  22. protected function changeApprovalStatus(): void
  23. {
  24. $this->approval->save();
  25. }
  26. protected function changeApprovalObjectStatus(): void
  27. {
  28. $object = ApprovalObjectType::from($this->approval->object_type)
  29. ->modelBuilder()
  30. ->findOrFail($this->approval->object_id);
  31. $object->approval_status = $this->approval->status;
  32. $object->save();
  33. }
  34. protected function triggerAction (string $comment = null): void
  35. {
  36. $objectAction = match ($this->approval->status) {
  37. ObjectApprovalStatus::APPROVED->value => ObjectAction::APPROVAL_APPROVED,
  38. ObjectApprovalStatus::DOING->value => ObjectAction::APPROVED_TO_NEXT_NODE,
  39. ObjectApprovalStatus::REJECTED->value => ObjectAction::APPROVAL_REJECTED,
  40. };
  41. ActionRepository::createByApproval(
  42. $this->approval,
  43. $objectAction,
  44. $comment
  45. );
  46. }
  47. protected function approved(): void
  48. {
  49. $approvalFlowNodes = $this->approval->approvalFlow?->nodes;
  50. $nextNodeIndex = $this->approval->node_level + 1;
  51. $nextNodes = $approvalFlowNodes[$nextNodeIndex] ?? [];
  52. if (! $nextNodes) {
  53. $this->approval->status = ObjectApprovalStatus::APPROVED->value;
  54. return;
  55. }
  56. $this->approval->node_level = $nextNodeIndex;
  57. $this->approval->users = sprintf(",%s,", implode(',', $nextNodes['approval_users']));
  58. }
  59. protected function rejected(): void
  60. {
  61. $this->approval->status = ObjectApprovalStatus::REJECTED->value;
  62. }
  63. }