segmentsRepository = $segmentsRepository; $this->statisticsOpensRepository = $statisticsOpensRepository; $this->subscribersRepository = $subscribersRepository; } public function processTaskStrategy(ScheduledTask $task, $timer) { $recalculatedSubscribersCount = $this->recalculateSubscribers(); if ($recalculatedSubscribersCount > 0) { $this->scheduleImmediately(); return true; } $recalculatedSegmentsCount = $this->recalculateSegments(); if ($recalculatedSegmentsCount > 0) { $this->scheduleImmediately(); return true; } $this->schedule(); return true; } private function recalculateSubscribers(): int { $subscribers = $this->subscribersRepository->findByUpdatedScoreNotInLastMonth(self::BATCH_SIZE); foreach ($subscribers as $subscriber) { $this->statisticsOpensRepository->recalculateSubscriberScore($subscriber); } return count($subscribers); } private function recalculateSegments(): int { $segments = $this->segmentsRepository->findByUpdatedScoreNotInLastDay(self::BATCH_SIZE); foreach ($segments as $segment) { $this->statisticsOpensRepository->recalculateSegmentScore($segment); } return count($segments); } public function getNextRunDate() { // random day of the next week $date = Carbon::createFromTimestamp($this->wp->currentTime('timestamp')); $date->addDay(); $date->setTime(mt_rand(0, 23), mt_rand(0, 59)); return $date; } }