toDateString(); $ids = $this->stalePendingReservationIds($today); if ($ids->isEmpty()) { return 0; } return Reservation::query()->whereIn('id', $ids)->update([ 'status' => 'expired', 'updated_at' => now(), ]); } /** * @return Collection */ private function stalePendingReservationIds(string $today): 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') ->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(); } }