PartnerAgreementService.php 4.4 KB

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