UserDependentService.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. namespace App\Services;
  3. use App\Enums\UserDependentStatusEnum;
  4. use App\Models\UserDependent;
  5. use Illuminate\Database\Eloquent\Builder;
  6. use Illuminate\Database\Eloquent\Collection;
  7. use Illuminate\Http\UploadedFile;
  8. use Illuminate\Pagination\LengthAwarePaginator;
  9. use Illuminate\Support\Facades\DB;
  10. use Illuminate\Support\Facades\Storage;
  11. class UserDependentService
  12. {
  13. public function getAllByUser(int $userId): Collection
  14. {
  15. return UserDependent::where('responsible_user_id', $userId)
  16. ->orderBy('name')
  17. ->get();
  18. }
  19. public function getAllPaginated(array $filters = [], int $perPage = 10): LengthAwarePaginator
  20. {
  21. $query = $this->baseQuery($filters)
  22. ->with(['responsibleUser.position', 'responsibleUser.sector'])
  23. ->orderBy('created_at', 'asc');
  24. if (!empty($filters['status'])) {
  25. $query->where('status', $filters['status']);
  26. }
  27. return $query->paginate($perPage);
  28. }
  29. /**
  30. * Status existentes no conjunto filtrado, desconsiderando o próprio filtro de status.
  31. *
  32. * @return array<int, string>
  33. */
  34. public function getStatusOptions(array $filters = []): array
  35. {
  36. return $this->baseQuery($filters)
  37. ->toBase()
  38. ->distinct()
  39. ->pluck('status')
  40. ->filter()
  41. ->values()
  42. ->all();
  43. }
  44. private function baseQuery(array $filters): Builder
  45. {
  46. $query = UserDependent::query();
  47. if (!empty($filters['search'])) {
  48. $term = '%' . mb_strtolower($filters['search']) . '%';
  49. $query->where(function ($q) use ($term) {
  50. $q->whereRaw('UNACCENT(LOWER(user_dependents.name)) LIKE UNACCENT(?)', [$term])
  51. ->orWhereRaw("TO_CHAR(user_dependents.created_at, 'DD/MM/YYYY HH24:MI:SS') LIKE ?", [$term])
  52. ->orWhereHas('responsibleUser', function ($u) use ($term) {
  53. $u->whereRaw('UNACCENT(LOWER(users.name)) LIKE UNACCENT(?)', [$term]);
  54. });
  55. });
  56. }
  57. return $query;
  58. }
  59. public function findById(int $id): ?UserDependent
  60. {
  61. return UserDependent::find($id);
  62. }
  63. public function create(array $data, ?UploadedFile $document = null): UserDependent
  64. {
  65. unset($data['document']);
  66. $data['status'] = UserDependentStatusEnum::PENDING->value;
  67. return DB::transaction(function () use ($data, $document): UserDependent {
  68. $dependent = UserDependent::create($data);
  69. if ($document) {
  70. $dependent->update([
  71. 'document_path' => $document->store($this->documentDirectory($dependent), 's3'),
  72. 'document_name' => $document->getClientOriginalName(),
  73. ]);
  74. }
  75. return $dependent->fresh();
  76. });
  77. }
  78. private function documentDirectory(UserDependent $dependent): string
  79. {
  80. return "dependents/{$dependent->responsible_user_id}/dependent/{$dependent->id}";
  81. }
  82. public function approve(int $id): ?UserDependent
  83. {
  84. $model = $this->findById($id);
  85. if (!$model) {
  86. return null;
  87. }
  88. $model->update(['status' => UserDependentStatusEnum::APPROVED]);
  89. return $model->fresh();
  90. }
  91. public function refuse(int $id): ?UserDependent
  92. {
  93. $model = $this->findById($id);
  94. if (!$model) {
  95. return null;
  96. }
  97. $model->update(['status' => UserDependentStatusEnum::REFUSED]);
  98. return $model->fresh();
  99. }
  100. public function update(int $id, array $data): ?UserDependent
  101. {
  102. $model = $this->findById($id);
  103. if (!$model) {
  104. return null;
  105. }
  106. unset($data['status'], $data['document'], $data['document_path'], $data['document_name']);
  107. $model->update($data);
  108. return $model->fresh();
  109. }
  110. public function delete(int $id): bool
  111. {
  112. $model = $this->findById($id);
  113. if (!$model) {
  114. return false;
  115. }
  116. if ($model->document_path) {
  117. Storage::disk('s3')->deleteDirectory($this->documentDirectory($model));
  118. }
  119. return $model->delete();
  120. }
  121. }