*/ #[ORM\ManyToMany(targetEntity: Client::class)] private Collection $clients; #[ORM\Column(type: Types::ARRAY, nullable: true)] private ?array $parameters = null; #[ORM\ManyToOne] private ?OrganizationalUnit $organizationalUnit = null; /** * @var Collection */ #[ORM\OneToMany(mappedBy: 'commandTask', targetEntity: CommandTaskSchedule::class, cascade: ['persist'], orphanRemoval: true)] private Collection $commandTaskSchedules; /** * @var Collection */ #[ORM\OneToMany(mappedBy: 'commandTask', targetEntity: CommandTaskScript::class, cascade: ['persist'], orphanRemoval: true)] private Collection $commandTaskScripts; #[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: true)] private ?\DateTimeInterface $lastExecution = null; #[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: true)] private ?\DateTimeInterface $nextExecution = null; #[ORM\Column(length: 255)] private ?string $scope = null; public function __construct() { parent::__construct(); $this->clients = new ArrayCollection(); $this->commandTaskSchedules = new ArrayCollection(); $this->commandTaskScripts = new ArrayCollection(); } public function getNotes(): ?string { return $this->notes; } public function setNotes(?string $notes): static { $this->notes = $notes; return $this; } /** * @return Collection */ public function getClients(): Collection { return $this->clients; } public function addClient(Client $client): static { if (!$this->clients->contains($client)) { $this->clients->add($client); } return $this; } public function removeClient(Client $client): static { $this->clients->removeElement($client); return $this; } public function setClients(array $clients): static { $this->clients->clear(); foreach ($clients as $client){ $this->addClient($client); } return $this; } public function getParameters(): ?array { return $this->parameters; } public function setParameters(?array $parameters): static { $this->parameters = $parameters; return $this; } public function getOrganizationalUnit(): ?OrganizationalUnit { return $this->organizationalUnit; } public function setOrganizationalUnit(?OrganizationalUnit $organizationalUnit): static { $this->organizationalUnit = $organizationalUnit; return $this; } /** * @return Collection */ public function getCommandTaskSchedules(): Collection { return $this->commandTaskSchedules; } public function addCommandTaskSchedule(CommandTaskSchedule $commandTaskSchedule): static { if (!$this->commandTaskSchedules->contains($commandTaskSchedule)) { $this->commandTaskSchedules->add($commandTaskSchedule); $commandTaskSchedule->setCommandTask($this); } return $this; } public function removeCommandTaskSchedule(CommandTaskSchedule $commandTaskSchedule): static { if ($this->commandTaskSchedules->removeElement($commandTaskSchedule)) { // set the owning side to null (unless already changed) if ($commandTaskSchedule->getCommandTask() === $this) { $commandTaskSchedule->setCommandTask(null); } } return $this; } /** * @return Collection */ public function getCommandTaskScripts(): Collection { return $this->commandTaskScripts; } public function addCommandTaskScript(CommandTaskScript $commandTaskScript): static { if (!$this->commandTaskScripts->contains($commandTaskScript)) { $this->commandTaskScripts->add($commandTaskScript); $commandTaskScript->setCommandTask($this); } return $this; } public function removeCommandTaskScript(CommandTaskScript $commandTaskScript): static { if ($this->commandTaskScripts->removeElement($commandTaskScript)) { // set the owning side to null (unless already changed) if ($commandTaskScript->getCommandTask() === $this) { $commandTaskScript->setCommandTask(null); } } return $this; } public function getLastExecution(): ?\DateTimeInterface { return $this->lastExecution; } public function setLastExecution(?\DateTimeInterface $lastExecution): static { $this->lastExecution = $lastExecution; return $this; } public function getNextExecution(): ?\DateTimeInterface { return $this->nextExecution; } public function setNextExecution(?\DateTimeInterface $nextExecution): static { $this->nextExecution = $nextExecution; return $this; } /** * @throws \Exception */ public function calculateNextExecutionDate(): ?\DateTimeInterface { $now = new \DateTime(); $closestDateTime = null; foreach ($this->getCommandTaskSchedules() as $schedule) { $type = $schedule->getRecurrenceType(); $executionTime = $schedule->getExecutionTime(); if ($type === 'none') { $execDate = $schedule->getExecutionDate(); if ($executionTime !== null) { $execDateTime = \DateTime::createFromFormat( 'Y-m-d H:i:s', $execDate->format('Y-m-d') . ' ' . $executionTime->format('H:i:s') ); } else { $execDateTime = $execDate; } if ($closestDateTime === null || $execDateTime < $closestDateTime) { $closestDateTime = $execDateTime; } } else { $details = $schedule->getRecurrenceDetails(); if ($details === null) { continue; } $init = (new \DateTime($details['initDate'] ?? 'now'))->setTime(0, 0); $end = (new \DateTime($details['endDate'] ?? '+1 year'))->setTime(0, 0); $validDays = array_map('mb_strtolower', $details['daysOfWeek'] ?? []); $validMonths = array_map('mb_strtolower', $details['months'] ?? []); $current = (new \DateTime())->setTime(0, 0); while ($current <= $end) { if ($current < $init) { $current->modify('+1 day'); continue; } $translatedDay = mb_strtolower($current->format('l')); $translatedMonth = mb_strtolower($current->format('F')); if (in_array($translatedDay, $validDays, true) && in_array($translatedMonth, $validMonths, true)) { if ($executionTime !== null) { $execDateTime = \DateTime::createFromFormat( 'Y-m-d H:i:s', $current->format('Y-m-d') . ' ' . $executionTime->format('H:i:s') ); } else { $execDateTime = clone $current; } if ($execDateTime > $now && ($closestDateTime === null || $execDateTime < $closestDateTime)) { $closestDateTime = $execDateTime; } break; } $current->modify('+1 day'); } } } return $closestDateTime; } public function getScope(): ?string { return $this->scope; } public function setScope(string $scope): static { $this->scope = $scope; return $this; } }