<?php
/**
* Copyright (c) 2011-present Qualiteam software Ltd. All rights reserved.
* See https://www.x-cart.com/license-agreement.html for license details.
*/
namespace XC\ProductVariations\Model;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Ramsey\Uuid\Uuid;
use XLite\Core\Database;
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
* @ORM\Table (name="product_variation_base")
*/
class VariationBase extends \XLite\Model\AEntity
{
/**
* @ORM\Id
* @ORM\GeneratedValue (strategy="AUTO")
* @ORM\Column (type="integer", options={ "unsigned": true })
*/
protected ?int $id;
/**
* @ORM\Column (type="string")
*/
protected string $name = '';
/**
* @var Collection
*
* @ORM\OneToMany (targetEntity="\XC\ProductVariations\Model\Variation", mappedBy="base", cascade={"all"})
*/
protected Collection $variations;
public function __construct(array $data = [])
{
parent::__construct($data);
$this->variations = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function isOrphaned(): bool
{
return $this->isEmpty() || $this->getVariations()->count() < 2;
}
public function isEmpty(): bool
{
return $this->getVariations()->isEmpty();
}
/**
* @return Collection|iterable<Variation>
*/
public function getVariations(): Collection
{
return $this->variations;
}
public function setVariations(Collection $variations): VariationBase
{
$this->variations = $variations;
return $this;
}
public function addVariation(Variation $newVariation): VariationBase
{
$newVariation->setBase($this);
$this->getVariations()->add($newVariation);
return $this;
}
/**
* @param array $variations
*
* @return VariationBase
*/
public function setVariationsByArray(array $variations): VariationBase
{
$this->variations = new ArrayCollection($variations);
return $this;
}
/**
* @param Variation[] $variations
*
* @return void
*/
public function addVariations(array $variations): void
{
foreach ($variations as $variation) {
$this->addVariation($variation);
}
}
public function getProductIds(): Collection
{
return $this->getVariations()
->map(static fn (Variation $variation) => $variation->getProduct()->getProductId());
}
public function getProducts(): Collection
{
return $this->getVariations()
->map(static fn (Variation $variation) => $variation->getProduct());
}
public function buildVariationsForSiblingIds(array $productIds): void
{
foreach ($productIds as $siblingIdToAdd) {
$variation = $this->buildVariationForSiblingId($siblingIdToAdd);
$this->addVariation($variation);
Database::getEM()->persist($variation);
}
}
public function buildVariationForSiblingId(int $siblingIdToAdd): Variation
{
$product = Database::getEM()->getReference(\XLite\Model\Product::class, $siblingIdToAdd);
$variation = new Variation();
$variation->setProduct($product);
return $variation;
}
public function getName(): string
{
return $this->name;
}
public function setName(string $name): void
{
$this->name = $name;
}
/**
* @ORM\PrePersist
*/
public function setDefaultVariationBaseName(): void
{
if (empty($this->name)) {
$this->name = substr(Uuid::uuid4(), 0, 8);
}
}
}