ProviderCalendarService.php 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <?php
  2. namespace App\Services;
  3. use App\Models\Provider;
  4. use App\Models\Schedule;
  5. use Illuminate\Support\Facades\Auth;
  6. use Illuminate\Support\Facades\DB;
  7. use Illuminate\Support\Facades\Storage;
  8. class ProviderCalendarService
  9. {
  10. public function __construct() {}
  11. public function getCalendar(): array
  12. {
  13. $user = Auth::user();
  14. $provider = Provider::where('user_id', $user->id)->first();
  15. $selectFields = [
  16. 'schedules.id',
  17. 'schedules.client_id',
  18. 'client_user.name as client_name',
  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. DB::raw("(SELECT media.path FROM media WHERE media.source_id = clients.id AND media.source = 'client' AND media.deleted_at IS NULL LIMIT 1) as customer_photo"),
  29. DB::raw("EXISTS(
  30. SELECT 1 FROM reviews
  31. WHERE reviews.schedule_id = schedules.id
  32. AND reviews.origin = 'provider'
  33. AND reviews.origin_id = {$provider->id}
  34. AND reviews.deleted_at IS NULL
  35. ) as provider_reviewed"),
  36. DB::raw("(
  37. SELECT reviews.stars FROM reviews
  38. WHERE reviews.schedule_id = schedules.id
  39. AND reviews.origin = 'provider'
  40. AND reviews.origin_id = {$provider->id}
  41. AND reviews.deleted_at IS NULL
  42. LIMIT 1
  43. ) as provider_stars"),
  44. ];
  45. $signPhoto = fn ($item) => tap($item, fn ($i) => $i->customer_photo = $i->customer_photo
  46. ? Storage::temporaryUrl($i->customer_photo, now()->addMinutes(60))
  47. : null);
  48. $upcomingSchedules = Schedule::with('address:district,address,number,source_id,source,id')
  49. ->where('schedules.provider_id', $provider->id)
  50. ->whereIn('schedules.status', ['pending', 'accepted', 'paid', 'started'])
  51. ->whereDate('schedules.date', '>=', now()->toDateString())
  52. ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
  53. ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
  54. ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
  55. ->select($selectFields)
  56. ->orderBy('schedules.date', 'asc')
  57. ->orderBy('schedules.start_time', 'asc')
  58. ->get()
  59. ->map($signPhoto);
  60. $completedSchedules = Schedule::with('address:district,address,number,source_id,source,id')
  61. ->where('schedules.provider_id', $provider->id)
  62. ->whereIn('schedules.status', ['finished', 'cancelled'])
  63. ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
  64. ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
  65. ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
  66. ->select($selectFields)
  67. ->orderBy('schedules.date', 'desc')
  68. ->orderBy('schedules.start_time', 'desc')
  69. ->get()
  70. ->map($signPhoto);
  71. return [
  72. 'upcomingSchedules' => $upcomingSchedules,
  73. 'completedSchedules' => $completedSchedules,
  74. ];
  75. }
  76. }