<?php
namespace App\Entity;
use App\Repository\WorksPlanRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* WorksPlan — bir order'a bind edilebilen ya da bağımsız çalışan iş planı.
*
* Plan otorite olduğunda task/job strüktürünü taşır, dependency DAG'ı yönetir,
* cascade hesabını yapar. Order'a bind edilince ProjectOrderTasks/ProjectOrderTaskJobs
* satırları Plan'ın aynası haline gelir (MaterializationListener). Order'daki end_at
* Plan'a is_end_at olarak geri akar (OrderEndAtBackSyncListener).
*
* @ORM\Entity(repositoryClass=WorksPlanRepository::class)
* @ORM\Table(name="works_plan")
* @ORM\HasLifecycleCallbacks
*/
class WorksPlan
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({
* "works_plan@ref",
* "works_plan@base",
* "works_plan@core",
* "works_plan@list"
* })
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Groups({
* "works_plan@base",
* "works_plan@core",
* "works_plan@list"
* })
*/
private $title;
/**
* @ORM\Column(type="text", nullable=true)
* @Groups({
* "works_plan@core",
* "works_plan@list"
* })
*/
private $description;
/**
* Bağlı order — UNIQUE OneToOne (tek yönlü). ProjectOrders.works_plan ile çift bağ
* BindService tarafından synchronize edilir.
*
* @ORM\OneToOne(targetEntity=ProjectOrders::class)
* @ORM\JoinColumn(name="project_order_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
* @Groups({
* "works_plan@core",
* "works_plan@list"
* })
*/
private $project_order;
/**
* @ORM\ManyToOne(targetEntity=WorkerActivities::class)
* @ORM\JoinColumn(name="owner_id", referencedColumnName="id", nullable=false)
* @Groups({
* "works_plan@core",
* "works_plan@list"
* })
*/
private $owner;
/**
* @ORM\Column(type="datetime_immutable")
* @Groups({
* "works_plan@core",
* "works_plan@list"
* })
*/
private $created_at;
/**
* @ORM\Column(type="datetime_immutable", nullable=true)
* @Groups({
* "works_plan@core",
* "works_plan@list"
* })
*/
private $updated_at;
/**
* @ORM\OneToMany(targetEntity=WorksPlanTask::class, mappedBy="works_plan", cascade={"persist"}, orphanRemoval=true)
* @ORM\OrderBy({"task_index" = "ASC"})
* @Groups({
* "works_plan@tasks"
* })
*/
private $tasks;
public function __construct()
{
$this->tasks = new ArrayCollection();
}
/**
* @ORM\PrePersist
*/
public function onPrePersist(): void
{
if ($this->created_at === null) {
$this->created_at = new \DateTimeImmutable();
}
}
/**
* @ORM\PreUpdate
*/
public function onPreUpdate(): void
{
$this->updated_at = new \DateTimeImmutable();
}
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
public function getProjectOrder(): ?ProjectOrders
{
return $this->project_order;
}
public function setProjectOrder(?ProjectOrders $project_order): self
{
$this->project_order = $project_order;
return $this;
}
public function getOwner(): ?WorkerActivities
{
return $this->owner;
}
public function setOwner(?WorkerActivities $owner): self
{
$this->owner = $owner;
return $this;
}
public function getCreatedAt(): ?\DateTimeImmutable
{
return $this->created_at;
}
public function setCreatedAt(\DateTimeImmutable $created_at): self
{
$this->created_at = $created_at;
return $this;
}
public function getUpdatedAt(): ?\DateTimeImmutable
{
return $this->updated_at;
}
public function setUpdatedAt(?\DateTimeImmutable $updated_at): self
{
$this->updated_at = $updated_at;
return $this;
}
/**
* Reindex edilmiş tasks collection — Serializer'ın associative object çıkarmasını
* engeller (bkz. ProjectOrderTasks::getTaskJobs() yorumu).
*
* @return Collection<int, WorksPlanTask>
*/
public function getTasks(): Collection
{
return new ArrayCollection(array_values($this->tasks->toArray()));
}
public function addTask(WorksPlanTask $task): self
{
if (!$this->tasks->contains($task)) {
$this->tasks[] = $task;
$task->setWorksPlan($this);
}
return $this;
}
public function removeTask(WorksPlanTask $task): self
{
if ($this->tasks->removeElement($task)) {
if ($task->getWorksPlan() === $this) {
$task->setWorksPlan(null);
}
}
return $this;
}
}