toDateString(); $now = Carbon::now($tz); $ids = $this->stalePendingReservationIds($today, $now); if ($ids->isEmpty()) { return 0; } return Reservation::query()->whereIn('id', $ids)->update([ 'status' => 'expired', 'updated_at' => now(), ]); } /** * @return Collection */ private function stalePendingReservationIds(string $today, Carbon $now): Collection { $idsActivity = Reservation::query() ->join('activity_days', 'activity_days.id', '=', 'reservations.activity_day_id') ->where('reservations.status', 'pending') ->whereNull('reservations.verified_at') ->whereNotNull('reservations.activity_day_id') ->where(function ($q) use ($today, $now) { $q->where(function ($q2) use ($now) { $q2->whereNotNull('activity_days.session_start_at') ->whereNotNull('activity_days.session_end_at') ->whereNotNull('activity_days.booking_deadline_at') ->where('activity_days.session_end_at', '<', $now); })->orWhere(function ($q2) use ($today) { $q2->where(function ($q3) { $q3->whereNull('activity_days.session_start_at') ->orWhereNull('activity_days.session_end_at') ->orWhereNull('activity_days.booking_deadline_at'); })->whereDate('activity_days.activity_date', '<', $today); }); }) ->where(function ($q) { $q->whereNull('reservations.reservation_kind') ->orWhere('reservations.reservation_kind', Reservation::KIND_ACTIVITY); }) ->pluck('reservations.id'); $idsTicketGrab = Reservation::query() ->where('reservation_kind', Reservation::KIND_TICKET_GRAB) ->where('status', 'pending') ->whereNull('verified_at') ->whereNotNull('entry_date') ->whereDate('entry_date', '<', $today) ->pluck('id'); return $idsActivity->merge($idsTicketGrab)->unique()->values(); } }