ClientCalendarService.php 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. <?php
  2. namespace App\Services;
  3. use App\Models\Client;
  4. use App\Models\Schedule;
  5. use Illuminate\Support\Facades\Auth;
  6. use Illuminate\Support\Facades\DB;
  7. class ClientCalendarService
  8. {
  9. public function __construct() {}
  10. public function getCalendar(): array
  11. {
  12. $user = Auth::user();
  13. $client = Client::where('user_id', $user->id)->first();
  14. $selectFields = [
  15. 'schedules.id',
  16. 'schedules.provider_id',
  17. 'schedules.date',
  18. 'schedules.start_time',
  19. 'schedules.end_time',
  20. 'schedules.total_amount',
  21. 'schedules.period_type',
  22. 'schedules.schedule_type',
  23. 'schedules.address_id',
  24. 'schedules.status',
  25. 'custom_schedules.offers_meal',
  26. 'provider_user.name as provider_name',
  27. 'providers.average_rating',
  28. 'providers.total_services',
  29. DB::raw("(SELECT media.url FROM media WHERE media.source_id = providers.id AND media.source = 'provider' AND media.deleted_at IS NULL LIMIT 1) as provider_photo"),
  30. DB::raw("EXISTS(
  31. SELECT 1 FROM reviews
  32. WHERE reviews.schedule_id = schedules.id
  33. AND reviews.origin = 'client'
  34. AND reviews.origin_id = {$client->id}
  35. AND reviews.deleted_at IS NULL
  36. ) as client_reviewed"),
  37. DB::raw("(
  38. SELECT reviews.stars FROM reviews
  39. WHERE reviews.schedule_id = schedules.id
  40. AND reviews.origin = 'client'
  41. AND reviews.origin_id = {$client->id}
  42. AND reviews.deleted_at IS NULL
  43. LIMIT 1
  44. ) as client_stars"),
  45. ];
  46. $upcomingSchedules = Schedule::with('address:district,address,number,source_id,source,id')
  47. ->where('schedules.client_id', $client->id)
  48. ->whereIn('schedules.status', ['pending', 'accepted', 'paid', 'started'])
  49. ->whereDate('schedules.date', '>=', now()->toDateString())
  50. ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
  51. ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
  52. ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
  53. ->select($selectFields)
  54. ->orderBy('schedules.date', 'asc')
  55. ->orderBy('schedules.start_time', 'asc')
  56. ->get();
  57. $completedSchedules = Schedule::with('address:district,address,number,source_id,source,id')
  58. ->where('schedules.client_id', $client->id)
  59. ->whereIn('schedules.status', ['finished', 'cancelled'])
  60. ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
  61. ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
  62. ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
  63. ->select($selectFields)
  64. ->orderBy('schedules.date', 'desc')
  65. ->orderBy('schedules.start_time', 'desc')
  66. ->get();
  67. return [
  68. 'upcomingSchedules' => $upcomingSchedules,
  69. 'completedSchedules' => $completedSchedules,
  70. ];
  71. }
  72. }