PartnerAgreementService.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?php
  2. namespace App\Services;
  3. use App\Enums\PartnerAgreementStatusEnum;
  4. use App\Enums\UserStatusEnum;
  5. use App\Enums\UserTypeEnum;
  6. use App\Models\PartnerAgreement;
  7. use App\Models\User;
  8. use Illuminate\Database\Eloquent\Collection;
  9. use Illuminate\Pagination\LengthAwarePaginator;
  10. use Illuminate\Support\Facades\DB;
  11. use Illuminate\Support\Facades\Hash;
  12. class PartnerAgreementService
  13. {
  14. public function getAll(array $filters = []): Collection
  15. {
  16. $query = PartnerAgreement::with(['category', 'city', 'logo'])
  17. ->orderBy('company_name');
  18. if (!empty($filters['type'])) {
  19. $query->where('type', $filters['type']);
  20. }
  21. return $query->get();
  22. }
  23. public function getAllPaginated(array $filters = [], int $perPage = 10): LengthAwarePaginator
  24. {
  25. $query = PartnerAgreement::with(['category', 'city', 'logo'])
  26. ->orderBy('company_name');
  27. if (!empty($filters['type'])) {
  28. $query->where('type', $filters['type']);
  29. }
  30. if (!empty($filters['search'])) {
  31. $search = $filters['search'];
  32. $query->where(function ($q) use ($search) {
  33. $q->where('company_name', 'like', "%{$search}%")
  34. ->orWhere('responsible', 'like', "%{$search}%")
  35. ->orWhere('cnpj', 'like', "%{$search}%");
  36. });
  37. }
  38. if (!empty($filters['expires_in_days'])) {
  39. $days = (int) $filters['expires_in_days'];
  40. $query->whereBetween('contract_end', [now()->startOfDay(), now()->addDays($days)->endOfDay()]);
  41. }
  42. if (!empty($filters['created_month']) && $filters['created_month'] === 'current') {
  43. $query->whereMonth('created_at', now()->month)
  44. ->whereYear('created_at', now()->year);
  45. }
  46. return $query->paginate($perPage);
  47. }
  48. public function getExpiringPaginated(int $days = 30, int $perPage = 10): LengthAwarePaginator
  49. {
  50. return PartnerAgreement::with(['category', 'city', 'logo'])
  51. ->whereNotNull('contract_end')
  52. ->whereBetween('contract_end', [now()->startOfDay(), now()->addDays($days)->endOfDay()])
  53. ->orderBy('contract_end')
  54. ->paginate($perPage);
  55. }
  56. public function findById(int $id): ?PartnerAgreement
  57. {
  58. return PartnerAgreement::with(['category', 'city', 'state', 'services', 'logo', 'media', 'user'])->find($id);
  59. }
  60. public function findByUserId(int $userId): ?PartnerAgreement
  61. {
  62. $partner = PartnerAgreement::with(['category', 'city', 'state', 'services', 'logo', 'media'])
  63. ->where('user_id', $userId)
  64. ->first();
  65. if (!$partner) {
  66. if (PartnerAgreement::onlyTrashed()->where('user_id', $userId)->exists()) {
  67. return null;
  68. }
  69. $partner = new PartnerAgreement();
  70. $partner->company_name = 'Novo Parceiro';
  71. $partner->user_id = $userId;
  72. $partner->save();
  73. $partner->fresh(['category', 'city', 'state', 'services', 'logo', 'media']);
  74. }
  75. return $partner;
  76. }
  77. public function findDados(int $id): ?PartnerAgreement
  78. {
  79. return PartnerAgreement::with(['category', 'logo'])->find($id);
  80. }
  81. public function findContato(int $id): ?PartnerAgreement
  82. {
  83. return PartnerAgreement::find($id);
  84. }
  85. public function findEndereco(int $id): ?PartnerAgreement
  86. {
  87. return PartnerAgreement::with(['city', 'state'])->find($id);
  88. }
  89. public function findContrato(int $id): ?PartnerAgreement
  90. {
  91. return PartnerAgreement::with(['media'])->find($id);
  92. }
  93. public function create(array $data): PartnerAgreement
  94. {
  95. $user = User::create([
  96. 'name' => $data['user_name'],
  97. 'email' => $data['user_email'],
  98. 'password' => Hash::make($data['user_password']),
  99. 'type' => UserTypeEnum::PARCEIRO,
  100. ]);
  101. $partnerData = collect($data)
  102. ->except(['user_name', 'user_email', 'user_password'])
  103. ->put('user_id', $user->id)
  104. ->all();
  105. $model = PartnerAgreement::create($partnerData);
  106. return $model->fresh(['category', 'logo', 'user']);
  107. }
  108. public function update(int $id, array $data): ?PartnerAgreement
  109. {
  110. $model = PartnerAgreement::find($id);
  111. if (!$model) {
  112. return null;
  113. }
  114. $model->update($data);
  115. return $model->fresh(['category', 'city', 'state', 'logo', 'media']);
  116. }
  117. public function getTrashed(array $filters = []): Collection
  118. {
  119. $query = PartnerAgreement::onlyTrashed()->orderByDesc('deleted_at');
  120. if (!empty($filters['type'])) {
  121. $query->where('type', $filters['type']);
  122. }
  123. return $query->get(['id', 'company_name', 'type', 'deleted_at']);
  124. }
  125. public function restore(int $id): ?PartnerAgreement
  126. {
  127. $model = PartnerAgreement::onlyTrashed()->find($id);
  128. if (!$model) {
  129. return null;
  130. }
  131. return DB::transaction(function () use ($model): PartnerAgreement {
  132. $model->restore();
  133. $model->update(['status' => PartnerAgreementStatusEnum::ACTIVE]);
  134. $model->user?->update(['status' => UserStatusEnum::ACTIVE]);
  135. return $model->fresh();
  136. });
  137. }
  138. public function delete(int $id): bool
  139. {
  140. $model = PartnerAgreement::find($id);
  141. if (!$model) {
  142. return false;
  143. }
  144. return DB::transaction(function () use ($model): bool {
  145. $model->services()->delete();
  146. $model->user?->update(['status' => UserStatusEnum::INACTIVE]);
  147. $model->update(['status' => PartnerAgreementStatusEnum::INACTIVE]);
  148. return (bool) $model->delete();
  149. });
  150. }
  151. }