ProviderCalendarService.php 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. class ProviderCalendarService
  8. {
  9. public function __construct() {}
  10. public function getCalendar(): array
  11. {
  12. $user = Auth::user();
  13. $provider = Provider::where('user_id', $user->id)->first();
  14. $selectFields = [
  15. 'schedules.id',
  16. 'schedules.client_id',
  17. 'client_user.name as client_name',
  18. 'schedules.date',
  19. 'schedules.start_time',
  20. 'schedules.end_time',
  21. 'schedules.total_amount',
  22. 'schedules.period_type',
  23. 'schedules.schedule_type',
  24. 'schedules.address_id',
  25. 'schedules.status',
  26. 'custom_schedules.offers_meal',
  27. DB::raw("EXISTS(
  28. SELECT 1 FROM reviews
  29. WHERE reviews.schedule_id = schedules.id
  30. AND reviews.origin = 'provider'
  31. AND reviews.origin_id = {$provider->id}
  32. AND reviews.deleted_at IS NULL
  33. ) as provider_reviewed"),
  34. DB::raw("(
  35. SELECT reviews.stars FROM reviews
  36. WHERE reviews.schedule_id = schedules.id
  37. AND reviews.origin = 'provider'
  38. AND reviews.origin_id = {$provider->id}
  39. AND reviews.deleted_at IS NULL
  40. LIMIT 1
  41. ) as provider_stars"),
  42. ];
  43. $upcomingSchedules = Schedule::with('address:district,address,number,source_id,source,id')
  44. ->where('schedules.provider_id', $provider->id)
  45. ->whereIn('schedules.status', ['pending', 'accepted', 'paid', 'started'])
  46. ->whereDate('schedules.date', '>=', now()->toDateString())
  47. ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
  48. ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
  49. ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
  50. ->select($selectFields)
  51. ->orderBy('schedules.date', 'asc')
  52. ->orderBy('schedules.start_time', 'asc')
  53. ->get();
  54. $completedSchedules = Schedule::with('address:district,address,number,source_id,source,id')
  55. ->where('schedules.provider_id', $provider->id)
  56. ->whereIn('schedules.status', ['finished', 'cancelled'])
  57. ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
  58. ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
  59. ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
  60. ->select($selectFields)
  61. ->orderBy('schedules.date', 'desc')
  62. ->orderBy('schedules.start_time', 'desc')
  63. ->get();
  64. return [
  65. 'upcomingSchedules' => $upcomingSchedules,
  66. 'completedSchedules' => $completedSchedules,
  67. ];
  68. }
  69. }