<?php
namespace App\Admin\Entity;
use App\Admin\Enum\ApprovalStatus;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\ORM\Mapping\OneToMany;
/**
* StdPagesApprovalStatus
*/
#[ORM\Table(name: 'std_pages_approval_status')]
#[ORM\Entity(repositoryClass: 'App\Admin\Repository\StdPagesApprovalStatusRepository')]
class StdPagesApprovalStatus
{
#[ORM\Column(name: 'id', type: 'integer', nullable: false, options: ['unsigned' => true, 'comment' => 'Unique identifier'])]
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'IDENTITY')]
private $id;
/**
* @var StdPages
*/
#[ORM\OneToOne(inversedBy: 'approvalStatus', targetEntity: StdPages::class)]
#[ORM\JoinColumn(name: 'page_id', referencedColumnName: 'id', nullable: false)]
private StdPages $page;
#[ORM\ManyToMany(targetEntity: StdRoles::class)]
#[ORM\JoinTable(
name: 'std_pages_approval_status_roles',
joinColumns: [new ORM\JoinColumn(name: 'approval_status_id', referencedColumnName: 'id')],
inverseJoinColumns: [new ORM\JoinColumn(name: 'role_id', referencedColumnName: 'id')]
)]
private Collection $approvers;
#[ORM\Column(name: 'status', type: 'integer', nullable: true, enumType: ApprovalStatus::class, options: ['comment' => 'Status'])]
private ?ApprovalStatus $status = null;
#[OneToMany(mappedBy: 'approvalStatus', targetEntity: StdPagesApprovalComments::class, cascade: ['persist', 'remove'], orphanRemoval: true)]
private Collection $comments;
#[ORM\ManyToOne(targetEntity: StdUsers::class)]
#[ORM\JoinColumn(name: 'last_approver_id', referencedColumnName: 'id', nullable: true, onDelete: 'SET NULL')]
private ?StdUsers $lastApprover = null;
public function __construct()
{
$this->approvers = new ArrayCollection();
$this->comments = new ArrayCollection();
}
/**
* @return mixed
*/
public function getId()
{
return $this->id;
}
/**
* @param mixed $id
*/
public function setId($id): void
{
$this->id = $id;
}
public function getPage(): StdPages
{
return $this->page;
}
public function setPage(StdPages $page): void
{
$this->page = $page;
}
public function getStatus(): ?ApprovalStatus
{
return $this->status;
}
public function setStatus(?ApprovalStatus $status): void
{
$this->status = $status;
}
public function getApprovers(): Collection
{
return $this->approvers;
}
public function addApprover(StdRoles $role): void
{
if (!$this->approvers->contains($role)) {
$this->approvers[] = $role;
}
}
public function removeApprover(StdRoles $role): void
{
$this->approvers->removeElement($role);
}
public function getComments(): Collection
{
return $this->comments;
}
public function addComment(StdPagesApprovalComments $comment): void
{
if (!$this->comments->contains($comment)) {
$this->comments[] = $comment;
$comment->setApprovalStatus($this);
}
}
public function removeComment(StdPagesApprovalComments $comment): void
{
if ($this->comments->removeElement($comment)) {
if ($comment->getApprovalStatus() === $this) {
$comment->setApprovalStatus(null);
}
}
}
public function getLastApprover(): ?StdUsers
{
return $this->lastApprover;
}
public function setLastApprover(?StdUsers $lastApprover): void
{
$this->lastApprover = $lastApprover;
}
public function isPagePublished(): bool
{
$now = new \DateTimeImmutable();
if($this->page->getPublishDate() < $now && (empty($this->page->getExpireDate()) || $this->page->getExpireDate() > $now)
&& $this->page->getIsActive() && $this->status === ApprovalStatus::APPROVED_FOR_PUBLICATION) {
return true;
}
return false;
}
}