ClientCalendarService.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. <?php
  2. namespace App\Services;
  3. use App\Enums\GenderEnum;
  4. use App\Models\Client;
  5. use App\Models\Schedule;
  6. use Illuminate\Support\Facades\Auth;
  7. use Illuminate\Support\Facades\DB;
  8. use Illuminate\Support\Facades\Storage;
  9. class ClientCalendarService
  10. {
  11. public function __construct() {}
  12. public function getCalendar(): array
  13. {
  14. $user = Auth::user();
  15. $client = Client::where('user_id', $user->id)->first();
  16. $selectFields = [
  17. 'schedules.id',
  18. 'schedules.provider_id',
  19. 'schedules.date',
  20. 'schedules.start_time',
  21. 'schedules.end_time',
  22. 'schedules.total_amount',
  23. 'schedules.period_type',
  24. 'schedules.schedule_type',
  25. 'schedules.address_id',
  26. 'schedules.status',
  27. 'custom_schedules.offers_meal',
  28. 'provider_user.name as provider_name',
  29. 'providers.gender',
  30. 'providers.average_rating',
  31. 'providers.total_services',
  32. DB::raw("
  33. (
  34. SELECT media.path
  35. FROM media
  36. WHERE media.source_id = providers.id
  37. AND media.source = 'provider'
  38. AND media.deleted_at IS NULL
  39. LIMIT 1
  40. ) AS provider_photo
  41. "),
  42. DB::raw("
  43. EXISTS (
  44. SELECT 1
  45. FROM reviews
  46. WHERE reviews.schedule_id = schedules.id
  47. AND reviews.origin = 'client'
  48. AND reviews.origin_id = {$client->id}
  49. AND reviews.deleted_at IS NULL
  50. ) AS client_reviewed
  51. "),
  52. DB::raw("
  53. (
  54. SELECT reviews.stars
  55. FROM reviews
  56. WHERE reviews.schedule_id = schedules.id
  57. AND reviews.origin = 'client'
  58. AND reviews.origin_id = {$client->id}
  59. AND reviews.deleted_at IS NULL
  60. LIMIT 1
  61. ) AS client_stars
  62. "),
  63. ];
  64. $signPhoto = fn ($item) => tap($item, function ($i) {
  65. $i->gender_label = $i->gender ? GenderEnum::tryFrom($i->gender)?->label() : null;
  66. $i->provider_photo = $i->provider_photo
  67. ? Storage::temporaryUrl($i->provider_photo, now()->addMinutes(60))
  68. : null;
  69. });
  70. $upcomingSchedules = Schedule::with('address:district,address,number,source_id,source,id')
  71. ->where('schedules.client_id', $client->id)
  72. ->whereIn('schedules.status', ['pending', 'accepted', 'paid', 'started'])
  73. ->whereDate('schedules.date', '>=', now()->toDateString())
  74. ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
  75. ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
  76. ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
  77. ->select($selectFields)
  78. ->orderBy('schedules.date', 'asc')
  79. ->orderBy('schedules.start_time', 'asc')
  80. ->get()
  81. ->map($signPhoto);
  82. $completedSchedules = Schedule::with('address:district,address,number,source_id,source,id')
  83. ->where('schedules.client_id', $client->id)
  84. ->whereIn('schedules.status', ['finished', 'cancelled'])
  85. ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
  86. ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
  87. ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
  88. ->select($selectFields)
  89. ->orderBy('schedules.date', 'desc')
  90. ->orderBy('schedules.start_time', 'desc')
  91. ->get()
  92. ->map($signPhoto);
  93. return [
  94. 'upcomingSchedules' => $upcomingSchedules,
  95. 'completedSchedules' => $completedSchedules,
  96. ];
  97. }
  98. }