<?php
namespace App\Entity;
use App\Entity\Tag\HasAuthToken;
use App\Entity\Tag\IsBlameable;
use App\Entity\Traits\AuthTokenTrait;
use App\Entity\Traits\DefaultOrderFields;
use App\Entity\Traits\SerializableIdTrait;
use App\Repository\OrderRequestRepository;
use App\Service\OrderRequestStateHandler;
use DateTimeImmutable;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Blameable\Traits\BlameableEntity;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\SoftDeleteable\SoftDeleteable;
use Gedmo\SoftDeleteable\Traits\SoftDeleteableEntity;
use Gedmo\Timestampable\Traits\TimestampableEntity;
/**
* @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=true, hardDelete=true)
* @Gedmo\Loggable()
*/
#[ORM\Table]
#[ORM\Index(name: 'created_by', columns: ['created_by'])]
#[ORM\Index(name: 'updated_by', columns: ['updated_by'])]
#[ORM\Entity(repositoryClass: OrderRequestRepository::class)]
class OrderRequest implements IsBlameable, SoftDeleteable, HasAuthToken
{
use BlameableEntity;
use TimestampableEntity;
use DefaultOrderFields;
use SoftDeleteableEntity;
use AuthTokenTrait;
use SerializableIdTrait;
#[ORM\Column(type: 'string', length: 255)]
private $articleNumber;
/**
* @Gedmo\Versioned
*/
#[ORM\Column(type: 'string', length: 255)]
private $state;
#[ORM\OneToMany(mappedBy: 'orderRequest', targetEntity: OrderRequestCustomFieldData::class, orphanRemoval: true)]
private iterable $orderRequestCustomFieldData;
#[ORM\OneToMany(mappedBy: 'order', targetEntity: OrderRequestLineItem::class, cascade: ['all'], orphanRemoval: true)]
private iterable $lineItems;
/**
* @Gedmo\Versioned
*/
#[ORM\Column(type: 'datetime', nullable: true)]
private $stateUpdatedAt;
#[ORM\OneToMany(targetEntity: CertificateUpload::class, mappedBy: 'orderRequest')]
private $certificates;
#[ORM\Column(type: 'boolean', nullable: false, options: ['default' => false])]
private bool $organic = false;
#[ORM\Column(type: 'date_immutable', nullable: true, options: ['default' => null])]
private ?DateTimeImmutable $estimatedCompletionDate = null;
public function __construct()
{
$this->orderRequestCustomFieldData = new ArrayCollection();
$this->state = OrderRequestStateHandler::STATE_INCOMPLETE;
$this->lineItems = new ArrayCollection();
$this->certificates = new ArrayCollection();
}
public function isOrganic(): bool
{
return $this->organic;
}
public function setOrganic(bool $organic): OrderRequest
{
$this->organic = $organic;
return $this;
}
public function getEstimatedCompletionDate(): ?\DateTimeInterface
{
return $this->estimatedCompletionDate;
}
public function setEstimatedCompletionDate(?\DateTimeInterface $estimatedCompletionDate): OrderRequest
{
$this->estimatedCompletionDate = DateTimeImmutable::createFromInterface($estimatedCompletionDate);
return $this;
}
public function getState(): ?string
{
return $this->state;
}
public function setState(string $state): self
{
$this->state = $state;
return $this;
}
public function getOrderRequestCustomFieldData(): Collection
{
return $this->orderRequestCustomFieldData;
}
public function setOrderRequestCustomFieldData(iterable $collection): self
{
$this->orderRequestCustomFieldData = $collection;
return $this;
}
public function addOrderRequestCustomFieldData(OrderRequestCustomFieldData $orderRequestCustomFieldData): self
{
if (!$this->orderRequestCustomFieldData->contains($orderRequestCustomFieldData)) {
$this->orderRequestCustomFieldData[] = $orderRequestCustomFieldData;
$orderRequestCustomFieldData->setOrderRequest($this);
}
return $this;
}
public function removeOrderRequestCustomFieldData(OrderRequestCustomFieldData $orderRequestCustomFieldData): self
{
if ($this->orderRequestCustomFieldData->contains($orderRequestCustomFieldData)) {
$this->orderRequestCustomFieldData->removeElement($orderRequestCustomFieldData);
// set the owning side to null (unless already changed)
if ($orderRequestCustomFieldData->getOrderRequest() === $this) {
$orderRequestCustomFieldData->setOrderRequest(null);
}
}
return $this;
}
/**
* @return mixed
*/
public function getArticleNumber()
{
return $this->articleNumber;
}
/**
* @param mixed $articleNumber
*
* @return OrderRequest
*/
public function setArticleNumber($articleNumber)
{
$this->articleNumber = $articleNumber;
return $this;
}
public function getLineItems(): Collection
{
return $this->lineItems;
}
public function getStateUpdatedAt(): ?\DateTimeInterface
{
return $this->stateUpdatedAt;
}
public function setStateUpdatedAt(?\DateTimeInterface $stateUpdatedAt): self
{
$this->stateUpdatedAt = $stateUpdatedAt;
return $this;
}
/**
* @return Collection|CertificateUpload[]
*/
public function getCertificates(): Collection
{
return $this->certificates;
}
public function addCertificate(CertificateUpload $certificate): self
{
if (!$this->certificates->contains($certificate)) {
$this->certificates[] = $certificate;
$certificate->setOrderRequest($this);
}
return $this;
}
public function removeCertificate(CertificateUpload $certificate): self
{
if ($this->certificates->removeElement($certificate)) {
// set the owning side to null (unless already changed)
if ($certificate->getOrderRequest() === $this) {
$certificate->setOrderRequest(null);
}
}
return $this;
}
}