<?php
namespace App\AtechNet\CoreBundle\Entity;
use App\AtechNet\CoreBundle\Helper\GraphSortableEntityInterface;
use App\AtechNet\CoreBundle\Repository\AttributeOptionRepository;
use App\AtechNet\CoreBundle\Translation\TranslationHelper;
use App\AtechNet\CoreBundle\Translation\TranslatorInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\HasLifecycleCallbacks;
use Doctrine\ORM\Mapping\JoinColumn;
use Doctrine\ORM\Mapping\ManyToOne;
use Doctrine\ORM\Mapping\OneToMany;
use Doctrine\ORM\Mapping\OrderBy;
use Doctrine\ORM\Mapping\Table as Table;
use Symfony\Component\Validator\Constraints as Assert;
/**
* AttributeOption
*
* @Table(name="attribute_options")
* @Entity(repositoryClass=AttributeOptionRepository::class)
* @HasLifecycleCallbacks
*/
class AttributeOption extends AbstractSignedEntity implements GraphSortableEntityInterface
{
public const Color_None = '';
public const Color_Blue = 'blue';
public const Color_Green = 'green';
public const Color_Grey = 'grey';
/**
* ATTRIBUTE_OPTION_ID_HDD_25 => HDD 2,5"
* ATTRIBUTE_OPTION_ID_HDD_18 => HDD 1.8"
* ...
**/
public const int ATTRIBUTE_OPTION_ID_HDD_25 = 32;
public const int ATTRIBUTE_OPTION_ID_HDD_35 = 33;
public const int ATTRIBUTE_OPTION_ID_SSD = 85;
public const int ATTRIBUTE_OPTION_ID_SSHD_25 = 86;
public const int ATTRIBUTE_OPTION_ID_SSD_512 = 528;
public const int ATTRIBUTE_OPTION_ID_SSD_25_1TB = 2047;
public const int ATTRIBUTE_OPTION_ID_SSD_25_2TB = 5780;
public const int ATTRIBUTE_OPTION_ID_SSD_480GB = 123;
public const int ATTRIBUTE_OPTION_ID_SSD_500GB = 124;
public const int ATTRIBUTE_OPTION_ID_SSD_512GB = 125;
public const int ATTRIBUTE_OPTION_ID_SSD_M2_480GB = 4685;
public const int ATTRIBUTE_OPTION_ID_SSD_M2_500GB = 4886;
public const int ATTRIBUTE_OPTION_ID_SSD_M2_510GB = 5632;
public const int ATTRIBUTE_OPTION_ID_SSD_M2_512GB = 1448;
public const int ATTRIBUTE_OPTION_ID_SSD_NVME_512GB = 3384;
public const int ATTRIBUTE_OPTION_ID_SSHD_35 = 87;
public const int ATTRIBUTE_OPTION_ID_HDD_18 = 125;
public const int ATTRIBUTE_OPTION_ID_HDD_EXTERNAL = 34;
public const int ATTRIBUTE_OPTION_ID_USB_FLASH = 99;
public const int ATTRIBUTE_OPTION_ID_WINDOWS_10 = 538;
public const int ATTRIBUTE_OPTION_ID_WINDOWS_11 = 4325;
public const int ATTRIBUTE_OPTION_ID_MAC_OS = 4873;
public const int ATTRIBUTE_OPTION_ID_UK_CABEL = 5903;
public const int ATTRIBUTE_OPTION_1_YEAR_WARRANTY = 2226;
public const int ATTRIBUTE_OPTION_2_YEAR_WARRANTY = 2227;
public const int ATTRIBUTE_OPTION_3_YEAR_WARRANTY = 2228;
public const int ATTRIBUTE_OPTION_I_NEED_OFFICE_1_YEAR = 240;
public const int ATTRIBUTE_OPTION_I_NEED_PACKAGE_INSTALL = 236;
public const int ATTRIBUTE_OPTION_TOUCHSCREEN = 1295;
public const int ATTRIBUTE_OPTION_NO_TOUCHSCREEN = 5964;
public const int ATTRIBUTE_OPTION_NO_WEBCAM = 1773;
public const int ATTRIBUTE_OPTION_NO_OOD = 183;
public const int ATTRIBUTE_OPTION_IPS_PANEL = 926;
public const int ATTRIBUTE_OPTION_OLED_PANEL = 6007;
public const int ATTRIBUTE_OPTION_QLED_PANEL = 6083;
public const int ATTRIBUTE_OPTION_NUMPAD = 555;
public const int ATTRIBUTE_OPTION_NO_NUMPAD = 554;
//years for YEAR_OF_PRODUCTION attribute
public const int ATTRIBUTE_YEAR_2005 = 6122;
public const int ATTRIBUTE_YEAR_2006 = 6123;
public const int ATTRIBUTE_YEAR_2007 = 6124;
public const int ATTRIBUTE_YEAR_2008 = 6125;
public const int ATTRIBUTE_YEAR_2009 = 6126;
public const int ATTRIBUTE_YEAR_2010 = 6127;
public const int ATTRIBUTE_YEAR_2011 = 6128;
public const int ATTRIBUTE_YEAR_2012 = 6129;
public const int ATTRIBUTE_YEAR_2013 = 6130;
public const int ATTRIBUTE_YEAR_2014 = 6131;
public const int ATTRIBUTE_YEAR_2015 = 6132;
public const int ATTRIBUTE_YEAR_2016 = 6133;
public const int ATTRIBUTE_YEAR_2017 = 6134;
public const int ATTRIBUTE_YEAR_2018 = 6135;
public const int ATTRIBUTE_YEAR_2019 = 6136;
public const int ATTRIBUTE_YEAR_2020 = 6137;
public const int ATTRIBUTE_YEAR_2021 = 6138;
public const int ATTRIBUTE_YEAR_2022 = 6139;
public const int ATTRIBUTE_YEAR_2023 = 6140;
public const int ATTRIBUTE_YEAR_2024 = 6141;
public const int ATTRIBUTE_YEAR_2025 = 6142;
public const int ATTRIBUTE_YEAR_2026 = 6540;
public const int ATTRIBUTE_OPTION_CPU_MARK_A = 6181;
public const int ATTRIBUTE_OPTION_CPU_MARK_B = 6182;
public const int ATTRIBUTE_OPTION_CPU_MARK_C = 6183;
public const int ATTRIBUTE_OPTION_CPU_MARK_D = 6184;
public const int ATTRIBUTE_OPTION_CPU_MARK_E = 6185;
public const array WARRIANTIES = [
self::ATTRIBUTE_OPTION_1_YEAR_WARRANTY,
self::ATTRIBUTE_OPTION_2_YEAR_WARRANTY,
self::ATTRIBUTE_OPTION_3_YEAR_WARRANTY,
];
public const int ATTRIBUTE_OPTION_QUALITY_BAZAAR = 2419;
public const int ATTRIBUTE_OPTION_QUALITY_BRONZ = 745;
public const int ATTRIBUTE_OPTION_QUALITY_SILVER = 744;
public const int ATTRIBUTE_OPTION_QUALITY_GOLD = 743;
public const int ATTRIBUTE_OPTION_QUALITY_NEW = 746;
public const int ATTRIBUTE_OPTION_QUALITY_PLATINUM = 747;
public const int ATTRIBUTE_OPTION_ID_NB_RAM_UPGRADED_8GB = 1707;
public const int ATTRIBUTE_OPTION_ID_NB_RAM_UPGRADED_16GB = 6073;
public const int ATTRIBUTE_OPTION_ID_NORTON_ANTIVIRUS = 6222;
public const int ATTRIBUTE_OPTION_ID_NORTON_ANTIVIRUS_FREE = 6256;
public const int ATTRIBUTE_OPTION_ID_GDATA_ANTIVIRUS = 5194;
public const int ATTRIBUTE_OPTION_ID_MACBOOK_FREE_MOUSE = 6328;
public const int ATTRIBUTE_OPTION_ID_NO_WEBCAM_FREE_WEBCAM = 6473;
public const int ATTRIBUTE_OPTION_ID_DISPLAY_PORT_CABLE = 1887;
public const int ATTRIBUTE_OPTION_ID_HDMI_CABLE = 1118;
public const int ATTRIBUTE_OPTION_ID_VGA_CABLE = 1004;
public const int ATTRIBUTE_OPTION_ID_DVI_CABLE = 1005;
public const int ATTRIBUTE_OPTION_ID_NEW_BATTERY = 730;
public const array SSD_TYPE_LIST = [
'M.2, NVMe',
'NVMe, M.2',
'eMMC',
'M.2',
'mSATA',
'uSATA',
'uSATA MLC',
'M.2 NVMe',
'NVMe',
'Sata',
];
// Base Windows
public const int ATTRIBUTE_OPTION_ID_WINDOWS_10_PRO = 2128;
public const int ATTRIBUTE_OPTION_ID_WINDOWS_10_HOME = 2130;
public const int ATTRIBUTE_OPTION_ID_WINDOWS_11_PRO = 3508;
public const int ATTRIBUTE_OPTION_ID_WINDOWS_11_HOME = 5224;
public const int ATTRIBUTE_OPTION_ID_LINUX_MINT = 6368;
// Localised Windows
public const int ATTRIBUTE_OPTION_ID_WIN11_PRO_HU = 6102;
public const int ATTRIBUTE_OPTION_ID_WIN11_HOME_HU = 5707;
public const int ATTRIBUTE_OPTION_ID_WIN10_PRO_HU = 5588;
public const int ATTRIBUTE_OPTION_ID_WIN10_HOME_HU = 5688;
public const int ATTRIBUTE_OPTION_ID_WIN11_PRO_SK = 6100;
public const int ATTRIBUTE_OPTION_ID_WIN11_HOME_SK = 5706;
public const int ATTRIBUTE_OPTION_ID_WIN10_PRO_SK = 5587;
public const int ATTRIBUTE_OPTION_ID_WIN10_HOME_SK = 5687;
public const int ATTRIBUTE_OPTION_ID_WIN11_PRO_CZ = 6242;
public const int ATTRIBUTE_OPTION_ID_WIN11_HOME_CZ = 0;
public const int ATTRIBUTE_OPTION_ID_WIN10_PRO_CZ = 6241;
public const int ATTRIBUTE_OPTION_ID_WIN10_HOME_CZ = 0;
public const int ATTRIBUTE_OPTION_ID_WIN10_ES = 5541;
public const int ATTRIBUTE_OPTION_ID_POWER_CABLE_3_PIN = 5091;
public const int ATTRIBUTE_OPTION_ID_POWER_CABLE_CH_COMPUTER = 6875;
public const int ATTRIBUTE_OPTION_ID_POWER_CABLE_CH_NOTEBOOK = 6876;
public const int ATTRIBUTE_OPTION_ID_OFFICE = 698;
public const int ATTRIBUTE_OPTION_ID_BACKLIT = 4722;
public const int ATTRIBUTE_OPTION_ID_FINGERPRINT_READER = 564;
public const int ATTRIBUTE_OPTION_ID_FULL_HD_RESOLUTION = 632;
/**
* @return array
*/
public static function getColorChoices()
{
return [
self::Color_None => self::Color_None,
self::Color_Blue => self::Color_Blue,
self::Color_Green => self::Color_Green,
self::Color_Grey => self::Color_Grey,
];
}
/**
* Get attribute option groups
*
* Attribute option groups for merging rows. The order of the arrays determines the primary option.
*
* @return array
*/
public static function getAttributeOptionGroups(): array
{
return [
Attribute::ATTRIBUTE_ID_SSD => [
[
self::ATTRIBUTE_OPTION_ID_SSD_500GB,
self::ATTRIBUTE_OPTION_ID_SSD_512GB,
self::ATTRIBUTE_OPTION_ID_SSD_480GB,
], [
self::ATTRIBUTE_OPTION_ID_SSD_M2_500GB,
self::ATTRIBUTE_OPTION_ID_SSD_M2_512GB,
self::ATTRIBUTE_OPTION_ID_SSD_M2_480GB,
self::ATTRIBUTE_OPTION_ID_SSD_M2_510GB,
self::ATTRIBUTE_OPTION_ID_SSD_NVME_512GB,
],
],
];
}
public static function getYearAttributeOptionIds(): array
{
return [
2005 => self::ATTRIBUTE_YEAR_2005,
2006 => self::ATTRIBUTE_YEAR_2006,
2007 => self::ATTRIBUTE_YEAR_2007,
2008 => self::ATTRIBUTE_YEAR_2008,
2009 => self::ATTRIBUTE_YEAR_2009,
2010 => self::ATTRIBUTE_YEAR_2010,
2011 => self::ATTRIBUTE_YEAR_2011,
2012 => self::ATTRIBUTE_YEAR_2012,
2013 => self::ATTRIBUTE_YEAR_2013,
2014 => self::ATTRIBUTE_YEAR_2014,
2015 => self::ATTRIBUTE_YEAR_2015,
2016 => self::ATTRIBUTE_YEAR_2016,
2017 => self::ATTRIBUTE_YEAR_2017,
2018 => self::ATTRIBUTE_YEAR_2018,
2019 => self::ATTRIBUTE_YEAR_2019,
2020 => self::ATTRIBUTE_YEAR_2020,
2021 => self::ATTRIBUTE_YEAR_2021,
2022 => self::ATTRIBUTE_YEAR_2022,
2023 => self::ATTRIBUTE_YEAR_2023,
2024 => self::ATTRIBUTE_YEAR_2024,
2025 => self::ATTRIBUTE_YEAR_2025,
2026 => self::ATTRIBUTE_YEAR_2026,
];
}
/**
* @var Attribute
*
* @Assert\NotNull
*
* @ManyToOne(targetEntity="Attribute", inversedBy="options")
* @JoinColumn(name="attribute_id", referencedColumnName="id")
*/
private $attribute;
/**
* @var ArrayCollection
*
* @OneToMany(targetEntity="AttributeOption", mappedBy="parent")
* @OrderBy({"sortIndex" = "ASC"})
**/
private $children;
/**
* @ManyToOne(targetEntity="AttributeOption", inversedBy="children")
* @JoinColumn(name="parent_id", referencedColumnName="id")
**/
private $parent;
/**
* @var string
*
* @Assert\NotNull
*
* @Column(name="title", type="text")
*/
private $title;
/**
* @var string
*
* @Column(name="long_title", type="text", nullable=true)
*/
private $longTitle;
/**
* @var bool
*
* @Assert\NotNull
*
* @Column(name="private", type="boolean")
*/
private $private = false;
/**
* @var bool
*
* @Assert\NotNull
*
* @Column(name="in_short_desc", type="boolean")
*/
private $inShortDesc = true;
/**
* @var bool
*
* @Assert\NotNull
*
* @Column(name="archived", type="boolean")
*/
private $archived = false;
/**
* @var integer
*
* @Assert\NotNull
*
* @Column(name="sort_index", type="integer")
*/
private $sortIndex = -1;
/**
* @var ArrayCollection
*
* @OneToMany(targetEntity="AttributeOptionMeta", mappedBy="attributeOption", cascade={"persist", "remove"})
**/
private $metas;
/**
* @var ArrayCollection
*
* @Assert\Valid
*
* @OneToMany(targetEntity="ProductAttribute", mappedBy="option")
**/
private $productAttributes;
/**
* @ManyToOne(targetEntity="Product")
* @JoinColumn(name="product_id", referencedColumnName="id")
**/
private $product;
public function __construct()
{
parent::__construct();
$this->children = new ArrayCollection();
$this->metas = new ArrayCollection();
}
/**
* @param TranslatorInterface $translator
* @return string
*/
public function getTitle(TranslatorInterface $translator = null)
{
return $translator !== null ? $translator->trans($this->title) : $this->title;
}
/**
* @param TranslatorInterface $translator
* @return string
*/
public function getLongTitle(TranslatorInterface $translator = null)
{
return $translator !== null ? $translator->trans($this->longTitle) : $this->longTitle;
}
/**
* @param string $longTitle
*/
public function setLongTitle($longTitle)
{
$this->longTitle = $longTitle;
}
/**
* @param TranslatorInterface $translator
* @return string which contains the attribute and the attribute option too.
*/
public function getFullTitle(TranslatorInterface $translator = null)
{
return $this->attribute->getTitle($translator) . ': ' . $this->getTitle($translator);
}
//for debugging the order
// public function getFullTitle(TranslatorInterface $translator = null){
// return $this->attribute->getSortIndex().','.(is_null($this->parent)?$this->getSortIndex():($this->getParent()->getSortIndex().','.$this->getSortIndex()));
// }
/**
* @param string $title
*/
public function setTitle($title)
{
$this->title = $title;
}
/**
* @return Attribute
*/
public function getAttribute()
{
return $this->attribute;
}
/**
* @param Attribute $attribute
*/
public function setAttribute($attribute)
{
$this->attribute = $attribute;
$attribute->addOption($this);
}
/**
* @param Domain $domain
* @return float
*/
public function getDomainPrice($domain)
{
return round($this->getDomainVatPrice($domain) / (1 + $domain->getVat() / 100.), $domain->getPricePrecision(), PHP_ROUND_HALF_UP);
}
/**
* @param Domain $domain
* @return float
*/
public function getDomainVatPrice($domain)
{
$attributeOptionMeta = $this->getDomainMeta($domain);
if ($attributeOptionMeta == null) {
return 0;
}
return $domain->createVatPrice($attributeOptionMeta->getPrice());
}
/**
* @return boolean
*/
public function hasParent()
{
return $this->parent != null;
}
/**
* @return AttributeOption
*/
public function getParent()
{
return $this->parent;
}
/**
* @param AttributeOption $parent
*/
public function setParent($parent)
{
$this->parent = $parent;
if (!is_null($this->parent)) {
$parent->addChildren($this);
}
}
/**
* @return boolean
*/
public function hasChildren()
{
return count($this->children) > 0;
}
/**
* @return mixed
*/
public function getChildren()
{
return $this->children;
}
/**
* Add AttributeOption
*
* @param AttributeOption $option
* @return AttributeOption
*/
public function addChildren($option)
{
if (!$this->children->contains($option)) {
$this->children->add($option);
$option->setParent($this);
}
return $this;
}
/**
* Remove AttributeOption
*
* @param AttributeOption $option
* @return AttributeOption
*/
public function removeProductAttribute($option)
{
if ($this->children->contains($option)) {
$this->children->remove($option);
}
return $this;
}
/**
* @param TranslatorInterface $translator
* @param string $ext
* @return string without php
* @internal param array $translationArray
*/
public function getPageFileName(TranslatorInterface $translator = null, $ext = '.php')
{
$name = preg_replace('/^\W+|\W+$/', '', TranslationHelper::ascii_convert($this->getTitle($translator)));
$name = preg_replace('/\W+/', '-', $name);
return strtolower($name) . $ext;
}
/**
* @return boolean
*/
public function isPrivate()
{
return $this->private;
}
/**
* @param boolean $private
*/
public function setPrivate($private)
{
$this->private = $private;
}
/**
* @return boolean
*/
public function isInShortDesc()
{
return $this->inShortDesc;
}
/**
* @param boolean $inShortDesc
*/
public function setInShortDesc($inShortDesc)
{
$this->inShortDesc = $inShortDesc;
}
/**
* @return int
*/
public function getSortIndex()
{
return $this->sortIndex;
}
/**
* @param int $sortIndex
*/
public function setSortIndex($sortIndex)
{
$this->sortIndex = $sortIndex;
}
/**
* @return ArrayCollection
*/
public function getMetas()
{
return $this->metas;
}
/**
* @param ArrayCollection $metas
*/
public function setMetas($metas)
{
$this->metas = $metas;
}
/**
* Add AttributeOptionMeta
*
* @param AttributeOptionMeta $meta
* @return AttributeOption
*/
public function addMeta($meta)
{
if (!$this->metas->contains($meta)) {
$this->metas->add($meta);
$meta->setAttributeOption($this);
}
return $this;
}
/**
* @param Domain $domain
* @return AttributeOptionMeta|null
*/
public function getDomainMeta(Domain $domain)
{
if ($this->getMetas()->count() > 0) {
foreach ($this->getMetas() as $meta) {
if ($meta->getDomain()->getId() == $domain->getId()) {
return $meta;
}
}
}
return null;
}
/**
* @return ArrayCollection
*/
public function getProductAttributes()
{
return $this->productAttributes;
}
/**
* @param ArrayCollection $productAttributes
*/
public function setProductAttributes($productAttributes)
{
$this->productAttributes = $productAttributes;
}
/**
* @return boolean
*/
public function isArchived()
{
return $this->archived;
}
/**
* @param boolean $archived
*/
public function setArchived($archived)
{
$this->archived = $archived;
}
/**
* @return Product
*/
public function getProduct()
{
return $this->product;
}
/**
* @param Product $product
*/
public function setProduct($product)
{
$this->product = $product;
}
/**
* @return bool
*/
public function isBacklit(): bool
{
return str_ends_with($this->title, 'backlit');
}
/**
* @return string|null
*/
public function getReprintLanguageCode(): ?string
{
if ($this->attribute->getId() !== Attribute::ATTRIBUTE_ID_ACCESSORY_KEYBOARD_REPRINT) {
return null;
}
if ($this->getId() == 2443) { // Don't need
return null;
}
$title = str_ireplace(['Keyboard reprint', 'backlit'], '', $this->longTitle);
$languageCode = mb_strtoupper(trim($title));
if (mb_strlen($languageCode) == 3) {
return $languageCode;
}
if ($languageCode === 'SK-CZ') {
return $languageCode;
}
return StockItem::KEYBOARD_LANGUAGE_VALID_VALUE_LIST[$languageCode] ?? null;
}
}