UserDependentService.php 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <?php
  2. namespace App\Services;
  3. use App\Enums\UserDependentStatusEnum;
  4. use App\Models\UserDependent;
  5. use Illuminate\Database\Eloquent\Collection;
  6. use Illuminate\Http\UploadedFile;
  7. use Illuminate\Pagination\LengthAwarePaginator;
  8. use Illuminate\Support\Facades\DB;
  9. use Illuminate\Support\Facades\Storage;
  10. class UserDependentService
  11. {
  12. public function getAllByUser(int $userId): Collection
  13. {
  14. return UserDependent::where('responsible_user_id', $userId)
  15. ->orderBy('name')
  16. ->get();
  17. }
  18. public function getAllPaginated(array $filters = [], int $perPage = 10): LengthAwarePaginator
  19. {
  20. $query = UserDependent::with(['responsibleUser.position', 'responsibleUser.sector'])
  21. ->orderBy('created_at', 'asc');
  22. if (!empty($filters['status'])) {
  23. $query->where('status', $filters['status']);
  24. }
  25. if (!empty($filters['search'])) {
  26. $term = '%' . mb_strtolower($filters['search']) . '%';
  27. $query->where(function ($q) use ($term) {
  28. $q->whereRaw('UNACCENT(LOWER(name)) LIKE UNACCENT(?)', [$term])
  29. ->orWhereHas('responsibleUser', function ($q) use ($term) {
  30. $q->whereRaw('UNACCENT(LOWER(name)) LIKE UNACCENT(?)', [$term]);
  31. });
  32. });
  33. }
  34. return $query->paginate($perPage);
  35. }
  36. public function findById(int $id): ?UserDependent
  37. {
  38. return UserDependent::find($id);
  39. }
  40. public function create(array $data, ?UploadedFile $document = null): UserDependent
  41. {
  42. unset($data['document']);
  43. $data['status'] = UserDependentStatusEnum::PENDING->value;
  44. return DB::transaction(function () use ($data, $document): UserDependent {
  45. $dependent = UserDependent::create($data);
  46. if ($document) {
  47. $dependent->update([
  48. 'document_path' => $document->store($this->documentDirectory($dependent), 's3'),
  49. 'document_name' => $document->getClientOriginalName(),
  50. ]);
  51. }
  52. return $dependent->fresh();
  53. });
  54. }
  55. private function documentDirectory(UserDependent $dependent): string
  56. {
  57. return "dependents/{$dependent->responsible_user_id}/dependent/{$dependent->id}";
  58. }
  59. public function approve(int $id): ?UserDependent
  60. {
  61. $model = $this->findById($id);
  62. if (!$model) {
  63. return null;
  64. }
  65. $model->update(['status' => UserDependentStatusEnum::APPROVED]);
  66. return $model->fresh();
  67. }
  68. public function refuse(int $id): ?UserDependent
  69. {
  70. $model = $this->findById($id);
  71. if (!$model) {
  72. return null;
  73. }
  74. $model->update(['status' => UserDependentStatusEnum::REFUSED]);
  75. return $model->fresh();
  76. }
  77. public function update(int $id, array $data): ?UserDependent
  78. {
  79. $model = $this->findById($id);
  80. if (!$model) {
  81. return null;
  82. }
  83. unset($data['status'], $data['document'], $data['document_path'], $data['document_name']);
  84. $model->update($data);
  85. return $model->fresh();
  86. }
  87. public function delete(int $id): bool
  88. {
  89. $model = $this->findById($id);
  90. if (!$model) {
  91. return false;
  92. }
  93. if ($model->document_path) {
  94. Storage::disk('s3')->deleteDirectory($this->documentDirectory($model));
  95. }
  96. return $model->delete();
  97. }
  98. }