<?php
namespace App\AtechNet\CoreBundle\Entity;
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\Table as Table;
use Doctrine\ORM\PersistentCollection;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* ProductVariation
*
* @Table(name="product_variations")
* @Entity(repositoryClass="App\AtechNet\CoreBundle\Repository\ProductVariationRepository")
* @HasLifecycleCallbacks
* @UniqueEntity(fields="code", message="Code is already in use")
*/
class ProductVariation extends AbstractSignedEntity
{
public const array VARIABLE_ATTRIBUTE_IDS = [
ProductType::PRODUCT_TYPE_ID_NOTEBOOK => [
Attribute::ATTRIBUTE_ID_QUALITY,
Attribute::ATTRIBUTE_ID_RAM_NB,
Attribute::ATTRIBUTE_ID_RAM_SIZE,
Attribute::ATTRIBUTE_ID_SSD,
Attribute::ATTRIBUTE_ID_HDD_25,
Attribute::ATTRIBUTE_ID_ACCESSORY_OS,
Attribute::ATTRIBUTE_ID_CONF_NOTEBOOK_SKIN,
Attribute::ATTRIBUTE_ID_ACCESSORY_KEYBOARD_REPRINT,
Attribute::ATTRIBUTE_ID_TOUCH_SCREEN,
Attribute::ATTRIBUTE_ID_WEBCAM,
Attribute::ATTRIBUTE_ID_BATTERY
],
ProductType::PRODUCT_TYPE_ID_PC => [
Attribute::ATTRIBUTE_ID_QUALITY,
Attribute::ATTRIBUTE_ID_RAM_PC,
Attribute::ATTRIBUTE_ID_RAM_SIZE,
Attribute::ATTRIBUTE_ID_SSD,
Attribute::ATTRIBUTE_ID_HDD_35,
Attribute::ATTRIBUTE_ID_ACCESSORY_OS,
],
ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => [
Attribute::ATTRIBUTE_ID_QUALITY,
Attribute::ATTRIBUTE_ID_RAM_PC,
Attribute::ATTRIBUTE_ID_SSD,
Attribute::ATTRIBUTE_ID_HDD_35,
Attribute::ATTRIBUTE_ID_ACCESSORY_OS,
Attribute::ATTRIBUTE_ID_TOUCH_SCREEN,
],
ProductType::PRODUCT_TYPE_ID_MONITOR => [
Attribute::ATTRIBUTE_ID_QUALITY,
],
ProductType::PRODUCT_TYPE_ID_DOCKING_STATION => [
Attribute::ATTRIBUTE_ID_QUALITY,
],
ProductType::PRODUCT_TYPE_ID_SMARTPHONE => [
Attribute::ATTRIBUTE_ID_QUALITY,
],
ProductType::PRODUCT_TYPE_ID_TABLET => [
Attribute::ATTRIBUTE_ID_QUALITY,
Attribute::ATTRIBUTE_ID_RAM_NB,
Attribute::ATTRIBUTE_ID_SSD,
Attribute::ATTRIBUTE_ID_ACCESSORY_OS,
Attribute::ATTRIBUTE_ID_TOUCH_SCREEN,
],
];
public const array VARIABLE_ATTRIBUTE_OPTION_NO_IDS = [
ProductType::PRODUCT_TYPE_ID_NOTEBOOK => [
Attribute::ATTRIBUTE_ID_QUALITY => 5959,
Attribute::ATTRIBUTE_ID_RAM_NB => 5960,
Attribute::ATTRIBUTE_ID_SSD => 135,
Attribute::ATTRIBUTE_ID_HDD_25 => 141,
Attribute::ATTRIBUTE_ID_ACCESSORY_OS => 247,
Attribute::ATTRIBUTE_ID_CONF_NOTEBOOK_SKIN => 5963,
Attribute::ATTRIBUTE_ID_ACCESSORY_KEYBOARD_REPRINT => 2443,
Attribute::ATTRIBUTE_ID_TOUCH_SCREEN => 5964,
Attribute::ATTRIBUTE_ID_WEBCAM => 1773,
Attribute::ATTRIBUTE_ID_BATTERY => 1132,
],
ProductType::PRODUCT_TYPE_ID_PC => [
Attribute::ATTRIBUTE_ID_QUALITY => 5959,
Attribute::ATTRIBUTE_ID_RAM_PC => 6000,
Attribute::ATTRIBUTE_ID_SSD => 135,
Attribute::ATTRIBUTE_ID_HDD_35 => 157,
Attribute::ATTRIBUTE_ID_ACCESSORY_OS => 247,
],
ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE => [
Attribute::ATTRIBUTE_ID_QUALITY => 5959,
Attribute::ATTRIBUTE_ID_RAM_PC => 6000,
Attribute::ATTRIBUTE_ID_SSD => 135,
Attribute::ATTRIBUTE_ID_HDD_35 => 157,
Attribute::ATTRIBUTE_ID_ACCESSORY_OS => 247,
Attribute::ATTRIBUTE_ID_TOUCH_SCREEN => 5964,
],
ProductType::PRODUCT_TYPE_ID_MONITOR => [
Attribute::ATTRIBUTE_ID_QUALITY => 5959,
],
ProductType::PRODUCT_TYPE_ID_DOCKING_STATION => [
Attribute::ATTRIBUTE_ID_QUALITY => 5959,
],
ProductType::PRODUCT_TYPE_ID_SMARTPHONE => [
Attribute::ATTRIBUTE_ID_QUALITY => 5959,
],
ProductType::PRODUCT_TYPE_ID_TABLET => [
Attribute::ATTRIBUTE_ID_QUALITY => 5959,
Attribute::ATTRIBUTE_ID_RAM_NB => 5960,
Attribute::ATTRIBUTE_ID_SSD => 135,
Attribute::ATTRIBUTE_ID_ACCESSORY_OS => 247,
Attribute::ATTRIBUTE_ID_TOUCH_SCREEN => 5964,
],
];
public const array KEYBOARD_REPRINT_ATTRIBUTE_ID_LIST_BY_LANGUAGE_TITLE = [
//Backmarket
'French' => 5499,
'Italian' => 5497,
'Spanish' => 5496,
'English' => 5504,
'German' => 2487,
'Portuguese' => 5494,
'Belgian' => 5510,
'Russian' => 5515,
'Polish' => 5512,
'Swedish' => 5505,
'Irish' => 5504,
'Czech' => 2444,
// Backmarket - DE
'Französisch' => 5499,
'Italienisch' => 5497,
'Spanisch' => 5496,
'Englisch' => 5504,
'Deutsch' => 2487,
'Portugiesisch' => 5494,
'Belgisch' => 5510,
'Russisch' => 5515,
'Polnisch' => 5512,
'Schwedisch' => 5505,
// Refurbed
'FR' => 5499,
'IT' => 5497,
'ES' => 5496,
'US' => 5495,
'International English' => 5504,
'UK' => 5504,
'DE' => 2487,
'PT' => 5494,
'BE' => 5510,
'PO' => 5512,
'SE' => 5505,
'SWE' => 5505,
'SK' => 2444,
'NL' => 5501,
'DK' => 5493,
'FI' => 5511,
'IE' => 5504,
'CZ' => 2444,
];
// If new country added, Update the StockItem::KEYBOARD_LANGUAGE_VALID_VALUE_LIST constant!
public const array LANGUAGE_CODE_LIST_BY_NAME = [
'French' => "FR",
'Italian' => "IT",
'Spanish' => "ES",
'English' => "EN",
'German' => "DE",
'Portuguese' => "PT",
'Belgian' => "BE",
'Russian' => "RU",
'Polish' => "PL",
'Swedish' => "SE",
'Irish' => "IE",
'Französisch' => "FR",
'Italienisch' => "IT",
'Spanisch' => "ES",
'Englisch' => "EN",
'Deutsch' => "DE",
'Portugiesisch' => "PT",
'Belgisch' => "BE",
'Russisch' => "RU",
'Polnisch' => "PL",
'Schwedisch' => "SE",
'Denmark' => "DN",
'Czech' => "CZ",
'United Kingdom' => "UK",
'Finland' => "FI",
'USA' => "US"
];
/**
* @var Product
*
* @ManyToOne(targetEntity="Product", inversedBy="productVariations")
* @JoinColumn(name="product_id", referencedColumnName="id")
*/
private Product $product;
/**
* @var string
*
* @Column(name="code", type="string", unique=true)
*/
private string $code;
/**
* @var string
*
* @Column(name="code_suffix", type="string")
*/
private string $codeSuffix;
/**
* @var string
*
* @Column(name="attribute_options", type="text")
*/
private string $attributeOptions;
/**
* @var string
*
* @Column(name="config", type="text")
*/
private string $config;
/**
* @var PersistentCollection
*
* @OneToMany(targetEntity="ProductMarketplaceListing", mappedBy="productVariation", cascade={"persist", "remove"})
**/
private $productMarketplaceListings;
/**
* @var PersistentCollection
*
* @OneToMany(targetEntity="OrderItem", mappedBy="productVariation")
**/
private $orderItems;
/**
* @var bool
*
* @Column(name="archived", type="boolean", nullable=true)
*/
private $archived;
public function __construct()
{
$this->productMarketplaceListings = new ArrayCollection();
$this->orderItems = new ArrayCollection();
}
/**
* @param ProductType $productType
*
* @return array
*/
public function getAvailableAttributesForProductType(ProductType $productType): array
{
return $this->getAvailableAttributesForProductTypeId($productType->getId());
}
/**
* @param int $productTypeId
*
* @return array
*/
public function getAvailableAttributesForProductTypeId(int $productTypeId): array
{
return self::VARIABLE_ATTRIBUTE_IDS[$productTypeId] ?? [];
}
/**
* @return string
*/
public function getCode(): string
{
return $this->code;
}
/**
* @param string $code
*
* @return void
*/
public function setCode(string $code): void
{
$this->code = $code;
}
/**
* @return PersistentCollection
*/
public function getProductMarketplaceListings(): PersistentCollection
{
return $this->productMarketplaceListings;
}
/**
* @param ProductMarketplaceListing $productMarketplaceListing
*
* @return $this
*/
public function addProductMarketPlaceListing(ProductMarketplaceListing $productMarketplaceListing): self
{
if (!$this->productMarketplaceListings->contains($productMarketplaceListing)) {
$this->productMarketplaceListings[] = $productMarketplaceListing;
$productMarketplaceListing->setProductVariation($this);
}
return $this;
}
/**
* @return PersistentCollection
*/
public function getOrderItems(): PersistentCollection
{
return $this->orderItems;
}
/**
* @return string
*/
public function getAttributeOptions(): string
{
return $this->attributeOptions;
}
/**
* @param string $attributeOptions
*
* @return void
*/
public function setAttributeOptions(string $attributeOptions): void
{
$this->attributeOptions = $attributeOptions;
}
/**
* @return Product
*/
public function getProduct(): Product
{
return $this->product;
}
/**
* @param Product $product
*
* @return void
*/
public function setProduct(Product $product): void
{
$this->product = $product;
}
/**
* @return string
*/
public function getCodeSuffix(): string
{
return $this->codeSuffix;
}
/**
* @param string $codeSuffix
*
* @return void
*/
public function setCodeSuffix(string $codeSuffix): void
{
$this->codeSuffix = $codeSuffix;
}
/**
* @param array $attributeOptionIds
*
* @return string
*/
public static function getSuffixFromAttributeOptionIdsArray(array $attributeOptionIds): string
{
return self::getSuffixFromAttributeOptionIdsText(implode($attributeOptionIds));
}
/**
* @param string $attributeOptionIds
*
* @return string
*/
public static function getSuffixFromAttributeOptionIdsText(string $attributeOptionIds): string
{
return strtoupper(substr(md5($attributeOptionIds), 0, 8));
}
/**
* @param Product $product
* @param array $attributeOptionIds
*
* @return string
*/
public static function createProductVariationCode(Product $product, array $attributeOptionIds): string
{
$suffix = self::getSuffixFromAttributeOptionIdsArray($attributeOptionIds);
return $product->getCode() . '-' . $suffix;
}
/**
* @return string
*/
public function getConfig(): string
{
return $this->config;
}
/**
* @param string $config
*
* @return void
*/
public function setConfig(string $config): void
{
$this->config = $config;
}
/**
* @return array
*/
public function getAttributeOptionIdsAsArray(): array
{
return explode(',', $this->attributeOptions);
}
/**
* @return boolean
*/
public function isArchived()
{
return $this->archived;
}
/**
* @param boolean $archived
*/
public function setArchived($archived)
{
$this->archived = $archived;
}
}