<?php
declare (strict_types = 1);
namespace App\Entity\Core;
use App\Entity\OrderItemEstimation;
use App\Entity\ProductAttributeItem;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Sylius\Component\Core\Model\OrderItem as BaseOrderItem;
use Sylius\Component\Core\Model\OrderItemInterface;
/**
* @ORM\MappedSuperclass
* @ORM\Table(name="sylius_order_item")
*/
class OrderItem extends BaseOrderItem implements OrderItemInterface
{
/**
* @var int
*
* @ORM\Column(name="metres", type="integer", nullable=true)
*/
private $metres = 0;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\ProductAttributeItem")
* @ORM\JoinTable(name="order_items_product_attribute_items",
* joinColumns={@ORM\JoinColumn(name="order_item_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="product_attribute_item_id", referencedColumnName="id")}
* )
*/
private $productAttributeItems;
/**
* @ORM\OneToOne(targetEntity="App\Entity\OrderItemEstimation", mappedBy="orderItem", cascade={"persist", "remove"}, orphanRemoval=true)
*/
private $estimation;
public function __construct()
{
parent::__construct();
$this->productAttributeItems = new ArrayCollection();
}
public function getMetres(): int
{
return $this->metres;
}
public function setMetres(int $metres): void
{
$this->metres = $metres;
}
protected function recalculateTotal(): void
{
if ($this->getProduct()->usesMetres()) {
$this->total = ($this->unitsTotal + $this->adjustmentsTotal) * $this->metres;
} else {
$this->total = $this->unitsTotal + $this->adjustmentsTotal;
}
if ($this->total < 0) {
$this->total = 0;
}
if (null !== $this->order) {
$this->order->recalculateItemsTotal();
}
}
public function getSubtotal(): int
{
if ($this->getProduct()->usesMetres()) {
$subTotal = ($this->getDiscountedUnitPrice() * $this->quantity) * $this->metres;
} else {
$subTotal = $this->getDiscountedUnitPrice() * $this->quantity;
}
return $subTotal;
}
public function addProductAttributeItem(ProductAttributeItem $productAttributeItem)
{
$this->productAttributeItems[] = $productAttributeItem;
return $this;
}
public function removeProductAttributeItem(ProductAttributeItem $productAttributeItem)
{
return $this->productAttributeItems->removeElement($productAttributeItem);
}
public function getProductAttributeItems()
{
return $this->productAttributeItems;
}
public function getPrioritizedProductAttributeItems(): array
{
$productAttributeItems = $this->productAttributeItems->toArray();
$sortByPriority = function ($a, $b) {
return $a->getProductAttribute()->getPriority() - $b->getProductAttribute()->getPriority();
};
usort($productAttributeItems, $sortByPriority);
return $productAttributeItems;
}
public function getProductAttributes(): array
{
$productAttributeItems = $this->getProductAttributeItems() ?? [];
$productAttributes = [];
foreach ($productAttributeItems as $productAttributeItem) {
$productAttributes[] = $productAttributeItem->getProductAttribute();
}
return $productAttributes;
}
public function getProductAttributeItemsCode(): string
{
$productAttributeItems = $this->getPrioritizedProductAttributeItems();
$code = '';
foreach ($productAttributeItems as $productAttributeItem) {
$code .= $productAttributeItem->getCode();
}
return $code;
}
public function replaceProductAttributeOption(ProductAttributeItem $productAttributeItem) {
$productAttributes = $this->getProductAttributes();
if (in_array($productAttributeItem->getProductAttribute(), $productAttributes)) {
$this->removeProductAttributeItem($productAttributeItem);
}
$this->addProductAttributeItem($productAttributeItem);
}
public function setQuantity(int $quantity): void
{
$this->quantity = $quantity;
}
public function __toString(): string
{
return $this->getVariant()->getCode() ?? '';
}
public function setTotal(int $total): self
{
$this->total = $total;
return $this;
}
public function getEstimation(): ?OrderItemEstimation
{
return $this->estimation;
}
public function setEstimation(OrderItemEstimation $estimation): self
{
$estimation->setOrderItem($this);
$this->estimation = $estimation;
return $this;
}
}