<?php
namespace App\Entity;
use App\Service\Helper\DateTimeHelper;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Exception;
/**
* Class OrderElement
*
* @ORM\Table(name="orders__elements")
* @ORM\Entity(repositoryClass="App\Repository\OrderElementRepository")
*/
class OrderElement
{
use IdTrait;
/**
* @ORM\Column(name="created_at", type="datetime", nullable=false)
*/
private DateTime $createdAt;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Order", cascade={"persist"})
* @ORM\JoinColumn(name="order_id", referencedColumnName="id", onDelete="CASCADE")
*/
private Order $order;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Item")
* @ORM\JoinColumn(name="item_id", referencedColumnName="id", onDelete="CASCADE", nullable=true)
*/
private ?Item $item;
/**
* @ORM\ManyToOne(targetEntity="User")
* @ORM\JoinColumn(name="searcher_user_id", referencedColumnName="id", onDelete="SET NULL", nullable=true)
*/
private ?User $searcherUser = null;
/**
* @ORM\ManyToOne(targetEntity="SupplierWarehouseItem")
* @ORM\JoinColumn(name="supplier_item_id", referencedColumnName="id", onDelete="CASCADE", nullable=true)
*/
private ?SupplierWarehouseItem $supplierItem;
/**
* @var ArrayCollection|ItemTransaction[]
* @ORM\OneToMany(targetEntity="ItemTransaction", mappedBy="orderElement")
*/
private $itemTransactions;
/**
* @var ArrayCollection|PaymentOrderElement[]
* @ORM\OneToMany(targetEntity="PaymentOrderElement", mappedBy="orderElement")
*/
private $payments;
/**
* @ORM\Column(name="quantity", type="integer")
*/
private int $quantity;
/**
* @ORM\Column(name="price", type="integer")
*/
private int $price;
/**
* @ORM\Column(name="crm_spare_id", type="integer", nullable=true)
*/
private ?int $crmSpareId = null;
/**
* @throws Exception
*/
public function __construct(Order $order, ?Item $item, ?SupplierWarehouseItem $supplierItem, int $quantity, int $price)
{
$this->order = $order;
$this->item = $item;
$this->supplierItem = $supplierItem;
$this->quantity = $quantity;
$this->price = $price;
$this->createdAt = DateTimeHelper::getNowDateTime();
$this->itemTransactions = new ArrayCollection();
$this->payments = new ArrayCollection();
}
public function getCreatedAt(): DateTime
{
return $this->createdAt;
}
public function getOrder(): Order
{
return $this->order;
}
public function getItem(): ?Item
{
return $this->item;
}
public function getItemProduct(): ?Product
{
if($this->item) return $this->item->getProduct();
return $this->supplierItem?->getProduct();
}
public function getItemWarehouse(): ?Warehouse
{
return $this->getItem()?->getWarehouse();
}
public function getQuantity(): int
{
return $this->quantity;
}
public function getPrice(): int
{
return $this->price;
}
public function setQuantity(int $quantity): OrderElement
{
$this->quantity = $quantity;
return $this;
}
public function getSearcherUser(): ?User
{
return $this->searcherUser;
}
public function setSearcherUser(?User $searcherUser): OrderElement
{
$this->searcherUser = $searcherUser;
return $this;
}
public function addPaymentOrder(PaymentOrderElement $paymentOrderElement): OrderElement
{
if(!$this->payments->contains($paymentOrderElement)) $this->payments->add($paymentOrderElement);
return $this;
}
/**
* @return PaymentOrderElement[]|ArrayCollection
*/
public function getPayments()
{
return $this->payments;
}
public function getCrmSpareId(): ?int
{
return $this->crmSpareId;
}
public function setCrmSpareId(?int $crmSpareId): OrderElement
{
$this->crmSpareId = $crmSpareId;
return $this;
}
public function getConfirmItemTransaction(): ?ItemTransaction
{
foreach ($this->itemTransactions as $itemTransaction) {
if($itemTransaction->getReason() === ItemTransaction::REASON_CONFIRM_ORDER) return $itemTransaction;
}
return null;
}
public function getRefundItemTransaction(): ?ItemTransaction
{
foreach ($this->itemTransactions as $itemTransaction) {
if($itemTransaction->getReason() === ItemTransaction::REASON_REFUND_ORDER_ELEMENT) return $itemTransaction;
}
return null;
}
public function getStringInfo(): string
{
return $this->getItemProduct()
? $this->getItemProduct()->getDescription()
. ' ' . $this->getItemProduct()->getBrandName()
. ' / ' . mb_strtoupper($this->getItemProduct()->getArticleSearch())
: ''
;
}
}