src/App/Entity/Core/OrderItem.php line 18

Open in your IDE?
  1. <?php
  2. declare (strict_types 1);
  3. namespace App\Entity\Core;
  4. use App\Entity\OrderItemEstimation;
  5. use App\Entity\ProductAttributeItem;
  6. use Doctrine\Common\Collections\ArrayCollection;
  7. use Doctrine\ORM\Mapping as ORM;
  8. use Sylius\Component\Core\Model\OrderItem as BaseOrderItem;
  9. use Sylius\Component\Core\Model\OrderItemInterface;
  10. /**
  11.  * @ORM\MappedSuperclass
  12.  * @ORM\Table(name="sylius_order_item")
  13.  */
  14. class OrderItem extends BaseOrderItem implements OrderItemInterface
  15. {
  16.     /**
  17.      * @var int
  18.      *
  19.      * @ORM\Column(name="metres", type="integer", nullable=true)
  20.      */
  21.     private $metres 0;
  22.     /**
  23.      * @ORM\ManyToMany(targetEntity="App\Entity\ProductAttributeItem")
  24.      * @ORM\JoinTable(name="order_items_product_attribute_items",
  25.      *      joinColumns={@ORM\JoinColumn(name="order_item_id", referencedColumnName="id")},
  26.      *      inverseJoinColumns={@ORM\JoinColumn(name="product_attribute_item_id", referencedColumnName="id")}
  27.      *      )
  28.      */
  29.     private $productAttributeItems;
  30.     /**
  31.      * @ORM\OneToOne(targetEntity="App\Entity\OrderItemEstimation", mappedBy="orderItem", cascade={"persist", "remove"}, orphanRemoval=true)
  32.      */
  33.     private $estimation;
  34.     public function __construct()
  35.     {
  36.         parent::__construct();
  37.         $this->productAttributeItems = new ArrayCollection();
  38.     }
  39.     public function getMetres(): int
  40.     {
  41.         return $this->metres;
  42.     }
  43.     public function setMetres(int $metres): void
  44.     {
  45.         $this->metres $metres;
  46.     }
  47.     protected function recalculateTotal(): void
  48.     {
  49.         if ($this->getProduct()->usesMetres()) {
  50.             $this->total = ($this->unitsTotal $this->adjustmentsTotal) * $this->metres;
  51.         } else {
  52.             $this->total $this->unitsTotal $this->adjustmentsTotal;
  53.         }
  54.         if ($this->total 0) {
  55.             $this->total 0;
  56.         }
  57.         if (null !== $this->order) {
  58.             $this->order->recalculateItemsTotal();
  59.         }
  60.     }
  61.     public function getSubtotal(): int
  62.     {
  63.         if ($this->getProduct()->usesMetres()) {
  64.             $subTotal = ($this->getDiscountedUnitPrice() * $this->quantity) * $this->metres;
  65.         } else {
  66.             $subTotal $this->getDiscountedUnitPrice() * $this->quantity;
  67.         }
  68.         return $subTotal;
  69.     }
  70.     public function addProductAttributeItem(ProductAttributeItem $productAttributeItem)
  71.     {
  72.         $this->productAttributeItems[] = $productAttributeItem;
  73.         return $this;
  74.     }
  75.     public function removeProductAttributeItem(ProductAttributeItem $productAttributeItem)
  76.     {
  77.         return $this->productAttributeItems->removeElement($productAttributeItem);
  78.     }
  79.     public function getProductAttributeItems()
  80.     {
  81.         return $this->productAttributeItems;
  82.     }
  83.     public function getPrioritizedProductAttributeItems(): array
  84.     {
  85.         $productAttributeItems $this->productAttributeItems->toArray();
  86.         $sortByPriority = function ($a$b) {
  87.             return $a->getProductAttribute()->getPriority() - $b->getProductAttribute()->getPriority();
  88.         };
  89.         usort($productAttributeItems$sortByPriority);
  90.         return $productAttributeItems;
  91.     }
  92.     public function getProductAttributes(): array
  93.     {
  94.         $productAttributeItems $this->getProductAttributeItems() ?? [];
  95.         $productAttributes = [];
  96.         foreach ($productAttributeItems as $productAttributeItem) {
  97.             $productAttributes[] = $productAttributeItem->getProductAttribute();
  98.         }
  99.         return $productAttributes;
  100.     }
  101.     public function getProductAttributeItemsCode(): string
  102.     {
  103.         $productAttributeItems $this->getPrioritizedProductAttributeItems();
  104.         $code '';
  105.         foreach ($productAttributeItems as $productAttributeItem) {
  106.             $code .= $productAttributeItem->getCode();
  107.         }
  108.         return $code;
  109.     }
  110.     public function replaceProductAttributeOption(ProductAttributeItem $productAttributeItem) {
  111.         $productAttributes $this->getProductAttributes();
  112.         if (in_array($productAttributeItem->getProductAttribute(), $productAttributes)) {
  113.             $this->removeProductAttributeItem($productAttributeItem);
  114.         }
  115.         $this->addProductAttributeItem($productAttributeItem);
  116.     }
  117.     public function setQuantity(int $quantity): void
  118.     {
  119.         $this->quantity $quantity;
  120.     }
  121.     public function __toString(): string
  122.     {
  123.         return $this->getVariant()->getCode() ?? '';
  124.     }
  125.     public function setTotal(int $total): self
  126.     {
  127.         $this->total $total;
  128.         return $this;
  129.     }
  130.     public function getEstimation(): ?OrderItemEstimation
  131.     {
  132.         return $this->estimation;
  133.     }
  134.     public function setEstimation(OrderItemEstimation $estimation): self
  135.     {
  136.         $estimation->setOrderItem($this);
  137.         $this->estimation $estimation;
  138.         
  139.         return $this;
  140.     }
  141. }