. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Core\Job; use Espo\Core\Job\Job\Jobs\ProcessJobQueueE0; use Espo\Core\Job\Job\Jobs\ProcessJobQueueQ0; use Espo\Core\Job\Job\Jobs\ProcessJobQueueQ1; use Espo\Core\Job\ScheduleProcessor\Params; use Espo\Core\Name\Field; use Espo\Core\Utils\DateTime as DateTimeUtil; use Espo\Core\ORM\Repository\Option\SaveOption; use Espo\ORM\Collection; use Espo\ORM\EntityManager; use Espo\Entities\ScheduledJob; use Espo\Entities\ScheduledJobLogRecord as ScheduledJobLogRecordEntity; use Espo\ORM\Name\Attribute; /** * @internal */ class ScheduleUtil { public function __construct(private EntityManager $entityManager) {} /** * Get active scheduled job list. * * @return Collection */ public function getActiveScheduledJobs(Params $params): Collection { $collection = $this->entityManager ->getRDBRepositoryByClass(ScheduledJob::class) ->select([ Attribute::ID, ScheduledJob::FIELD_SCHEDULING, ScheduledJob::FIELD_JOB, Field::NAME, ]) ->where([ ScheduledJob::FIELD_STATUS => ScheduledJob::STATUS_ACTIVE, ]) ->find(); if ($params->skipQueues) { $collection = $collection->filter(function (ScheduledJob $entity) { return !in_array($entity->getJob(), [ ProcessJobQueueE0::NAME, ProcessJobQueueQ0::NAME, ProcessJobQueueQ1::NAME, ]); }); } return $collection; } /** * Add record to ScheduledJobLogRecord about executed job. */ public function addLogRecord( string $scheduledJobId, string $status, ?string $runTime = null, ?string $targetId = null, ?string $targetType = null ): void { if (!isset($runTime)) { $runTime = date(DateTimeUtil::SYSTEM_DATE_TIME_FORMAT); } /** @var ScheduledJob|null $scheduledJob */ $scheduledJob = $this->entityManager->getEntityById(ScheduledJob::ENTITY_TYPE, $scheduledJobId); if (!$scheduledJob) { return; } $scheduledJob->set('lastRun', $runTime); $this->entityManager->saveEntity($scheduledJob, [SaveOption::SILENT => true]); $scheduledJobLog = $this->entityManager->getNewEntity(ScheduledJobLogRecordEntity::ENTITY_TYPE); $scheduledJobLog->setMultiple([ 'scheduledJobId' => $scheduledJobId, 'name' => $scheduledJob->getName(), 'status' => $status, 'executionTime' => $runTime, 'targetId' => $targetId, 'targetType' => $targetType, ]); $this->entityManager->saveEntity($scheduledJobLog); } }