ReviewService.php 4.3 KB

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