ReviewService.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. <?php
  2. namespace App\Services;
  3. use App\Models\Client;
  4. use App\Models\ClientFavoriteProvider;
  5. use App\Models\ClientProviderBlock;
  6. use App\Models\Provider;
  7. use App\Models\ProviderClientBlock;
  8. use App\Models\Review;
  9. use App\Models\Schedule;
  10. use Exception;
  11. use Illuminate\Support\Facades\DB;
  12. use Illuminate\Support\Facades\Log;
  13. class ReviewService
  14. {
  15. public function getAll()
  16. {
  17. return Review::with(['schedule.client.user', 'schedule.provider.user', 'reviewsImprovements.improvementType'])
  18. ->orderBy('created_at', 'desc')
  19. ->get();
  20. }
  21. public function getByScheduleId(int $scheduleId)
  22. {
  23. return Review::with(['schedule.client.user', 'schedule.provider.user'])
  24. ->where('schedule_id', $scheduleId)
  25. ->orderBy('created_at', 'desc')
  26. ->get();
  27. }
  28. public function getByOrigin(string $origin, int $originId)
  29. {
  30. return Review::with(['schedule.client.user', 'schedule.provider.user'])
  31. ->where('origin', $origin)
  32. ->where('origin_id', $originId)
  33. ->orderBy('created_at', 'desc')
  34. ->get();
  35. }
  36. public function create(array $data): Review
  37. {
  38. try {
  39. DB::beginTransaction();
  40. $review = new Review();
  41. $review->fill($data);
  42. $review->save();
  43. $review->refresh();
  44. if (isset($data['origin']) && isset($data['origin_id'])) {
  45. switch ($data['origin']) {
  46. case 'client':
  47. $schedule = Schedule::find($data['schedule_id']);
  48. $provider = Provider::find($schedule->provider_id);
  49. $provider->updateAverageRating((float) $data['stars']);
  50. break;
  51. case 'provider':
  52. $schedule = Schedule::find($data['schedule_id']);
  53. $client = Client::find($schedule->client_id);
  54. $client->updateAverageRating((float) $data['stars']);
  55. break;
  56. }
  57. }
  58. if (isset($data['improvements_ids'])) {
  59. $review->improvements()->sync($data['improvements_ids']);
  60. }
  61. if (!empty($data['block_provider'])) {
  62. $schedule = Schedule::find($data['schedule_id']);
  63. $alreadyBlocked = ClientProviderBlock::where('client_id', $schedule->client_id)
  64. ->where('provider_id', $schedule->provider_id)
  65. ->whereNull('deleted_at')
  66. ->exists();
  67. if (!$alreadyBlocked) {
  68. ClientProviderBlock::create([
  69. 'client_id' => $schedule->client_id,
  70. 'provider_id' => $schedule->provider_id,
  71. ]);
  72. }
  73. }
  74. if (!empty($data['block_client'])) {
  75. $schedule = Schedule::find($data['schedule_id']);
  76. $alreadyBlocked = ProviderClientBlock::where('provider_id', $schedule->provider_id)
  77. ->where('client_id', $schedule->client_id)
  78. ->whereNull('deleted_at')
  79. ->exists();
  80. if (!$alreadyBlocked) {
  81. ProviderClientBlock::create([
  82. 'provider_id' => $schedule->provider_id,
  83. 'client_id' => $schedule->client_id,
  84. ]);
  85. }
  86. }
  87. if (!empty($data['favorite_provider'])) {
  88. $schedule = Schedule::find($data['schedule_id']);
  89. $alreadyFavorited = ClientFavoriteProvider::where('client_id', $schedule->client_id)
  90. ->where('provider_id', $schedule->provider_id)
  91. ->whereNull('deleted_at')
  92. ->exists();
  93. if (!$alreadyFavorited) {
  94. ClientFavoriteProvider::create([
  95. 'client_id' => $schedule->client_id,
  96. 'provider_id' => $schedule->provider_id,
  97. ]);
  98. }
  99. }
  100. DB::commit();
  101. return $review;
  102. } catch (Exception $e) {
  103. DB::rollBack();
  104. Log::error('Error creating review: ' . $e->getMessage());
  105. throw $e;
  106. }
  107. }
  108. private function detailEagerLoads(): array
  109. {
  110. return [
  111. 'schedule.client.user',
  112. 'schedule.provider.user',
  113. 'schedule.address.city',
  114. 'schedule.address.state',
  115. 'schedule.customSchedule.serviceType',
  116. 'schedule.customSchedule.specialities',
  117. 'improvements',
  118. ];
  119. }
  120. public function getByClientSent(int $clientId)
  121. {
  122. return Review::with($this->detailEagerLoads())
  123. ->whereIn('origin', ['client', 'clients'])
  124. ->where('origin_id', $clientId)
  125. ->orderBy('created_at', 'desc')
  126. ->get();
  127. }
  128. public function getByClientReceived(int $clientId)
  129. {
  130. return Review::with($this->detailEagerLoads())
  131. ->whereIn('origin', ['provider', 'providers'])
  132. ->whereHas('schedule', fn($q) => $q->where('client_id', $clientId))
  133. ->orderBy('created_at', 'desc')
  134. ->get();
  135. }
  136. public function getByProviderSent(int $providerId)
  137. {
  138. return Review::with($this->detailEagerLoads())
  139. ->whereIn('origin', ['provider', 'providers'])
  140. ->where('origin_id', $providerId)
  141. ->orderBy('created_at', 'desc')
  142. ->get();
  143. }
  144. public function getByProviderReceived(int $providerId)
  145. {
  146. return Review::with($this->detailEagerLoads())
  147. ->whereIn('origin', ['client', 'clients'])
  148. ->whereHas('schedule', fn($q) => $q->where('provider_id', $providerId))
  149. ->orderBy('created_at', 'desc')
  150. ->get();
  151. }
  152. public function update(int $id, array $data): Review
  153. {
  154. $review = Review::findOrFail($id);
  155. $review->update($data);
  156. return $review->fresh();
  157. }
  158. public function delete(int $id): bool
  159. {
  160. $review = Review::findOrFail($id);
  161. return $review->delete();
  162. }
  163. }