ActionService.php 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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. protected array $actionExtraFields = [];
  12. public function action(Approval $approval, int $status, string $comment = null): void
  13. {
  14. $this->approval = $approval;
  15. match($status) {
  16. 1 => $this->approved(),
  17. default => $this->rejected(),
  18. };
  19. $this->triggerAction($comment);
  20. $this->changeApprovalObjectStatus();
  21. $this->changeApprovalStatus();
  22. }
  23. protected function changeApprovalStatus(): void
  24. {
  25. $this->approval->save();
  26. }
  27. protected function changeApprovalObjectStatus(): void
  28. {
  29. $object = ApprovalObjectType::from($this->approval->object_type)
  30. ->modelBuilder()
  31. ->findOrFail($this->approval->object_id);
  32. $object->approval_status = $this->approval->status;
  33. $object->save();
  34. }
  35. protected function triggerAction (string $comment = null): void
  36. {
  37. $objectAction = match ($this->approval->status) {
  38. ObjectApprovalStatus::APPROVED->value => ObjectAction::APPROVAL_APPROVED,
  39. ObjectApprovalStatus::DOING->value => ObjectAction::APPROVED_TO_NEXT_NODE,
  40. ObjectApprovalStatus::REJECTED->value => ObjectAction::APPROVAL_REJECTED,
  41. };
  42. ActionRepository::createByApproval(
  43. $this->approval,
  44. $objectAction,
  45. $comment,
  46. extraFields: $this->actionExtraFields
  47. );
  48. }
  49. protected function approved(): void
  50. {
  51. $approvalFlowNodes = $this->approval->approvalFlow?->nodes;
  52. $nextNodeIndex = $this->approval->node_level + 1;
  53. $nextNodes = $approvalFlowNodes[$nextNodeIndex] ?? [];
  54. if (! $nextNodes) {
  55. $this->approval->status = ObjectApprovalStatus::APPROVED->value;
  56. return;
  57. }
  58. $this->actionExtraFields = [
  59. 'now' => $this->approval->node_level,
  60. 'next' => $nextNodeIndex,
  61. ];
  62. $this->approval->node_level = $nextNodeIndex;
  63. $this->approval->users = sprintf(",%s,", implode(',', $nextNodes['approval_users']));
  64. }
  65. protected function rejected(): void
  66. {
  67. $this->approval->status = ObjectApprovalStatus::REJECTED->value;
  68. }
  69. }