ReviewService.php 3.8 KB

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