diff --git a/application/Espo/Core/Job/JobPreperable.php b/application/Espo/Core/Job/JobPreperable.php index 93d655a3dc..60fa3d2a78 100644 --- a/application/Espo/Core/Job/JobPreperable.php +++ b/application/Espo/Core/Job/JobPreperable.php @@ -31,6 +31,8 @@ namespace Espo\Core\Job; use Espo\Entities\ScheduledJob; +use DateTimeImmutable; + /** * Can create multiple jobs for different targets according scheduling. */ @@ -39,5 +41,5 @@ interface JobPreperable extends Job /** * Create multiple job records for a scheduled job. */ - public function prepare(ScheduledJob $scheduledJob, string $executeTime): void; + public function prepare(ScheduledJob $scheduledJob, DateTimeImmutable $executeTime): void; } diff --git a/application/Espo/Core/Job/ScheduleProcessor.php b/application/Espo/Core/Job/ScheduleProcessor.php index d6a81e4235..dec2c61441 100644 --- a/application/Espo/Core/Job/ScheduleProcessor.php +++ b/application/Espo/Core/Job/ScheduleProcessor.php @@ -44,6 +44,7 @@ use Cron\CronExpression; use Throwable; use Exception; +use DateTimeImmutable; /** * Creates jobs from scheduled jobs according scheduling. @@ -151,7 +152,10 @@ class ScheduleProcessor if ($this->jobFactory->isPreparable($jobName)) { $jobObj = $this->jobFactory->create($jobName); - $jobObj->prepare($scheduledJob, $executeTime); + $executeAtDt = DateTimeImmutable + ::createFromFormat(DateTimeUtil::SYSTEM_DATE_TIME_FORMAT, $executeTime); + + $jobObj->prepare($scheduledJob, $executeAtDt); return; } diff --git a/application/Espo/Jobs/CheckEmailAccounts.php b/application/Espo/Jobs/CheckEmailAccounts.php index e02359786a..7ec14f9259 100644 --- a/application/Espo/Jobs/CheckEmailAccounts.php +++ b/application/Espo/Jobs/CheckEmailAccounts.php @@ -37,11 +37,13 @@ use Espo\Core\{ Job\Data, ServiceFactory, ORM\EntityManager, + Utils\DateTime, }; use Espo\Entities\ScheduledJob; use Throwable; +use DateTimeImmutable; class CheckEmailAccounts implements JobPreperable { @@ -68,24 +70,27 @@ class CheckEmailAccounts implements JobPreperable $entity = $this->entityManager->getEntity('EmailAccount', $targetId); if (!$entity) { - throw new Error("Job CheckEmailAccounts '".$targetId."': EmailAccount does not exist.", -1); + throw new Error("Job CheckEmailAccounts '{$targetId}': EmailAccount does not exist.", -1); } if ($entity->get('status') !== 'Active') { - throw new Error("Job CheckEmailAccounts '".$targetId."': EmailAccount is not active.", -1); + throw new Error("Job CheckEmailAccounts '{$targetId}': EmailAccount is not active.", -1); } try { $service->fetchFromMailServer($entity); } catch (Throwable $e) { - throw new Error('Job CheckEmailAccounts '.$entity->id.': [' . $e->getCode() . '] ' .$e->getMessage()); + throw new Error( + 'Job CheckEmailAccounts ' . $entity->getId() . ': [' . $e->getCode() . '] ' .$e->getMessage() + ); } } - public function prepare(ScheduledJob $scheduledJob, string $executeTime): void + public function prepare(ScheduledJob $scheduledJob, DateTimeImmutable $executeTime): void { - $collection = $this->entityManager->getRepository('EmailAccount') + $collection = $this->entityManager + ->getRDBRepository('EmailAccount') ->join('assignedUser', 'assignedUserAdditional') ->where([ 'status' => 'Active', @@ -96,12 +101,15 @@ class CheckEmailAccounts implements JobPreperable foreach ($collection as $entity) { $running = $this->entityManager - ->getRepository('Job') + ->getRDBRepository('Job') ->where([ - 'scheduledJobId' => $scheduledJob->id, - 'status' => [JobStatus::RUNNING, JobStatus::READY], + 'scheduledJobId' => $scheduledJob->getId(), + 'status' => [ + JobStatus::RUNNING, + JobStatus::READY, + ], 'targetType' => 'EmailAccount', - 'targetId' => $entity->id, + 'targetId' => $entity->getId(), ]) ->findOne(); @@ -110,12 +118,12 @@ class CheckEmailAccounts implements JobPreperable } $countPending = $this->entityManager - ->getRepository('Job') + ->getRDBRepository('Job') ->where([ - 'scheduledJobId' => $scheduledJob->id, + 'scheduledJobId' => $scheduledJob->getId(), 'status' => JobStatus::PENDING, 'targetType' => 'EmailAccount', - 'targetId' => $entity->id, + 'targetId' => $entity->getId(), ]) ->count(); @@ -126,11 +134,11 @@ class CheckEmailAccounts implements JobPreperable $jobEntity = $this->entityManager->getEntity('Job'); $jobEntity->set([ - 'name' => $scheduledJob->get('name'), - 'scheduledJobId' => $scheduledJob->id, - 'executeTime' => $executeTime, + 'name' => $scheduledJob->getName(), + 'scheduledJobId' => $scheduledJob->getId(), + 'executeTime' => $executeTime->format(DateTime::SYSTEM_DATE_TIME_FORMAT), 'targetType' => 'EmailAccount', - 'targetId' => $entity->id, + 'targetId' => $entity->getId(), ]); $this->entityManager->saveEntity($jobEntity); diff --git a/application/Espo/Jobs/CheckInboundEmails.php b/application/Espo/Jobs/CheckInboundEmails.php index d8f787730d..e665fe3d30 100644 --- a/application/Espo/Jobs/CheckInboundEmails.php +++ b/application/Espo/Jobs/CheckInboundEmails.php @@ -37,11 +37,13 @@ use Espo\Core\{ Job\Data, ServiceFactory, ORM\EntityManager, + Utils\DateTime, }; use Espo\Entities\ScheduledJob; use Throwable; +use DateTimeImmutable; class CheckInboundEmails implements JobPreperable { @@ -68,25 +70,27 @@ class CheckInboundEmails implements JobPreperable $entity = $this->entityManager->getEntity('InboundEmail', $targetId); if (!$entity) { - throw new Error("Job CheckInboundEmails '".$targetId."': InboundEmail does not exist.", -1); + throw new Error("Job CheckInboundEmails '{$targetId}': InboundEmail does not exist.", -1); } if ($entity->get('status') !== 'Active') { - throw new Error("Job CheckInboundEmails '".$targetId."': InboundEmail is not active.", -1); + throw new Error("Job CheckInboundEmails '{$targetId}': InboundEmail is not active.", -1); } try { $service->fetchFromMailServer($entity); } catch (Throwable $e) { - throw new Error('Job CheckInboundEmails '.$entity->id.': [' . $e->getCode() . '] ' .$e->getMessage()); + throw new Error( + 'Job CheckInboundEmails ' . $entity->getId() . ': [' . $e->getCode() . '] ' .$e->getMessage() + ); } } - public function prepare(ScheduledJob $scheduledJob, string $executeTime): void + public function prepare(ScheduledJob $scheduledJob, DateTimeImmutable $executeTime): void { $collection = $this->entityManager - ->getRepository('InboundEmail') + ->getRDBRepository('InboundEmail') ->where([ 'status' => 'Active', 'useImap' => true, @@ -95,12 +99,15 @@ class CheckInboundEmails implements JobPreperable foreach ($collection as $entity) { $running = $this->entityManager - ->getRepository('Job') + ->getRDBRepository('Job') ->where([ - 'scheduledJobId' => $scheduledJob->id, - 'status' => [JobStatus::RUNNING, JobStatus::READY], + 'scheduledJobId' => $scheduledJob->getId(), + 'status' => [ + JobStatus::RUNNING, + JobStatus::READY, + ], 'targetType' => 'InboundEmail', - 'targetId' => $entity->id, + 'targetId' => $entity->getId(), ]) ->findOne(); @@ -109,12 +116,12 @@ class CheckInboundEmails implements JobPreperable } $countPending = $this->entityManager - ->getRepository('Job') + ->getRDBRepository('Job') ->where([ - 'scheduledJobId' => $scheduledJob->id, + 'scheduledJobId' => $scheduledJob->getId(), 'status' => JobStatus::PENDING, 'targetType' => 'InboundEmail', - 'targetId' => $entity->id, + 'targetId' => $entity->getId(), ]) ->count(); @@ -125,11 +132,11 @@ class CheckInboundEmails implements JobPreperable $jobEntity = $this->entityManager->getEntity('Job'); $jobEntity->set([ - 'name' => $scheduledJob->get('name'), - 'scheduledJobId' => $scheduledJob->id, - 'executeTime' => $executeTime, + 'name' => $scheduledJob->getName(), + 'scheduledJobId' => $scheduledJob->getId(), + 'executeTime' => $executeTime->format(DateTime::SYSTEM_DATE_TIME_FORMAT), 'targetType' => 'InboundEmail', - 'targetId' => $entity->id, + 'targetId' => $entity->getId(), ]); $this->entityManager->saveEntity($jobEntity);