src/AtechNet/CoreBundle/Entity/ProductVariation.php line 24

Open in your IDE?
  1. <?php
  2. namespace App\AtechNet\CoreBundle\Entity;
  3. use Doctrine\Common\Collections\ArrayCollection;
  4. use Doctrine\ORM\Mapping\Column;
  5. use Doctrine\ORM\Mapping\Entity;
  6. use Doctrine\ORM\Mapping\HasLifecycleCallbacks;
  7. use Doctrine\ORM\Mapping\JoinColumn;
  8. use Doctrine\ORM\Mapping\ManyToOne;
  9. use Doctrine\ORM\Mapping\OneToMany;
  10. use Doctrine\ORM\Mapping\Table as Table;
  11. use Doctrine\ORM\PersistentCollection;
  12. use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
  13. /**
  14.  * ProductVariation
  15.  *
  16.  * @Table(name="product_variations")
  17.  * @Entity(repositoryClass="App\AtechNet\CoreBundle\Repository\ProductVariationRepository")
  18.  * @HasLifecycleCallbacks
  19.  * @UniqueEntity(fields="code", message="Code is already in use")
  20.  */
  21. class ProductVariation extends AbstractSignedEntity
  22. {
  23.     public const array VARIABLE_ATTRIBUTE_IDS = [
  24.         ProductType::PRODUCT_TYPE_ID_NOTEBOOK        => [
  25.             Attribute::ATTRIBUTE_ID_QUALITY,
  26.             Attribute::ATTRIBUTE_ID_RAM_NB,
  27.             Attribute::ATTRIBUTE_ID_RAM_SIZE,
  28.             Attribute::ATTRIBUTE_ID_SSD,
  29.             Attribute::ATTRIBUTE_ID_HDD_25,
  30.             Attribute::ATTRIBUTE_ID_ACCESSORY_OS,
  31.             Attribute::ATTRIBUTE_ID_CONF_NOTEBOOK_SKIN,
  32.             Attribute::ATTRIBUTE_ID_ACCESSORY_KEYBOARD_REPRINT,
  33.             Attribute::ATTRIBUTE_ID_TOUCH_SCREEN,
  34.             Attribute::ATTRIBUTE_ID_WEBCAM,
  35.             Attribute::ATTRIBUTE_ID_BATTERY
  36.         ],
  37.         ProductType::PRODUCT_TYPE_ID_PC              => [
  38.             Attribute::ATTRIBUTE_ID_QUALITY,
  39.             Attribute::ATTRIBUTE_ID_RAM_PC,
  40.             Attribute::ATTRIBUTE_ID_RAM_SIZE,
  41.             Attribute::ATTRIBUTE_ID_SSD,
  42.             Attribute::ATTRIBUTE_ID_HDD_35,
  43.             Attribute::ATTRIBUTE_ID_ACCESSORY_OS,
  44.         ],
  45.         ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE      => [
  46.             Attribute::ATTRIBUTE_ID_QUALITY,
  47.             Attribute::ATTRIBUTE_ID_RAM_PC,
  48.             Attribute::ATTRIBUTE_ID_SSD,
  49.             Attribute::ATTRIBUTE_ID_HDD_35,
  50.             Attribute::ATTRIBUTE_ID_ACCESSORY_OS,
  51.             Attribute::ATTRIBUTE_ID_TOUCH_SCREEN,
  52.         ],
  53.         ProductType::PRODUCT_TYPE_ID_MONITOR         => [
  54.             Attribute::ATTRIBUTE_ID_QUALITY,
  55.         ],
  56.         ProductType::PRODUCT_TYPE_ID_DOCKING_STATION => [
  57.             Attribute::ATTRIBUTE_ID_QUALITY,
  58.         ],
  59.         ProductType::PRODUCT_TYPE_ID_SMARTPHONE      => [
  60.             Attribute::ATTRIBUTE_ID_QUALITY,
  61.         ],
  62.         ProductType::PRODUCT_TYPE_ID_TABLET          => [
  63.             Attribute::ATTRIBUTE_ID_QUALITY,
  64.             Attribute::ATTRIBUTE_ID_RAM_NB,
  65.             Attribute::ATTRIBUTE_ID_SSD,
  66.             Attribute::ATTRIBUTE_ID_ACCESSORY_OS,
  67.             Attribute::ATTRIBUTE_ID_TOUCH_SCREEN,
  68.         ],
  69.     ];
  70.     public const array VARIABLE_ATTRIBUTE_OPTION_NO_IDS = [
  71.         ProductType::PRODUCT_TYPE_ID_NOTEBOOK        => [
  72.             Attribute::ATTRIBUTE_ID_QUALITY                    => 5959,
  73.             Attribute::ATTRIBUTE_ID_RAM_NB                     => 5960,
  74.             Attribute::ATTRIBUTE_ID_SSD                        => 135,
  75.             Attribute::ATTRIBUTE_ID_HDD_25                     => 141,
  76.             Attribute::ATTRIBUTE_ID_ACCESSORY_OS               => 247,
  77.             Attribute::ATTRIBUTE_ID_CONF_NOTEBOOK_SKIN         => 5963,
  78.             Attribute::ATTRIBUTE_ID_ACCESSORY_KEYBOARD_REPRINT => 2443,
  79.             Attribute::ATTRIBUTE_ID_TOUCH_SCREEN               => 5964,
  80.             Attribute::ATTRIBUTE_ID_WEBCAM                     => 1773,
  81.             Attribute::ATTRIBUTE_ID_BATTERY                    => 1132,
  82.         ],
  83.         ProductType::PRODUCT_TYPE_ID_PC              => [
  84.             Attribute::ATTRIBUTE_ID_QUALITY      => 5959,
  85.             Attribute::ATTRIBUTE_ID_RAM_PC       => 6000,
  86.             Attribute::ATTRIBUTE_ID_SSD          => 135,
  87.             Attribute::ATTRIBUTE_ID_HDD_35       => 157,
  88.             Attribute::ATTRIBUTE_ID_ACCESSORY_OS => 247,
  89.         ],
  90.         ProductType::PRODUCT_TYPE_ID_ALL_IN_ONE      => [
  91.             Attribute::ATTRIBUTE_ID_QUALITY      => 5959,
  92.             Attribute::ATTRIBUTE_ID_RAM_PC       => 6000,
  93.             Attribute::ATTRIBUTE_ID_SSD          => 135,
  94.             Attribute::ATTRIBUTE_ID_HDD_35       => 157,
  95.             Attribute::ATTRIBUTE_ID_ACCESSORY_OS => 247,
  96.             Attribute::ATTRIBUTE_ID_TOUCH_SCREEN => 5964,
  97.         ],
  98.         ProductType::PRODUCT_TYPE_ID_MONITOR         => [
  99.             Attribute::ATTRIBUTE_ID_QUALITY => 5959,
  100.         ],
  101.         ProductType::PRODUCT_TYPE_ID_DOCKING_STATION => [
  102.             Attribute::ATTRIBUTE_ID_QUALITY => 5959,
  103.         ],
  104.         ProductType::PRODUCT_TYPE_ID_SMARTPHONE      => [
  105.             Attribute::ATTRIBUTE_ID_QUALITY => 5959,
  106.         ],
  107.         ProductType::PRODUCT_TYPE_ID_TABLET          => [
  108.             Attribute::ATTRIBUTE_ID_QUALITY      => 5959,
  109.             Attribute::ATTRIBUTE_ID_RAM_NB       => 5960,
  110.             Attribute::ATTRIBUTE_ID_SSD          => 135,
  111.             Attribute::ATTRIBUTE_ID_ACCESSORY_OS => 247,
  112.             Attribute::ATTRIBUTE_ID_TOUCH_SCREEN => 5964,
  113.         ],
  114.     ];
  115.     public const array KEYBOARD_REPRINT_ATTRIBUTE_ID_LIST_BY_LANGUAGE_TITLE = [
  116.         //Backmarket
  117.         'French'                => 5499,
  118.         'Italian'               => 5497,
  119.         'Spanish'               => 5496,
  120.         'English'               => 5504,
  121.         'German'                => 2487,
  122.         'Portuguese'            => 5494,
  123.         'Belgian'               => 5510,
  124.         'Russian'               => 5515,
  125.         'Polish'                => 5512,
  126.         'Swedish'               => 5505,
  127.         'Irish'                 => 5504,
  128.         'Czech'                 => 2444,
  129.         // Backmarket - DE
  130.         'Französisch'           => 5499,
  131.         'Italienisch'           => 5497,
  132.         'Spanisch'              => 5496,
  133.         'Englisch'              => 5504,
  134.         'Deutsch'               => 2487,
  135.         'Portugiesisch'         => 5494,
  136.         'Belgisch'              => 5510,
  137.         'Russisch'              => 5515,
  138.         'Polnisch'              => 5512,
  139.         'Schwedisch'            => 5505,
  140.         // Refurbed
  141.         'FR'                    => 5499,
  142.         'IT'                    => 5497,
  143.         'ES'                    => 5496,
  144.         'US'                    => 5495,
  145.         'International English' => 5504,
  146.         'UK'                    => 5504,
  147.         'DE'                    => 2487,
  148.         'PT'                    => 5494,
  149.         'BE'                    => 5510,
  150.         'PO'                    => 5512,
  151.         'SE'                    => 5505,
  152.         'SWE'                   => 5505,
  153.         'SK'                    => 2444,
  154.         'NL'                    => 5501,
  155.         'DK'                    => 5493,
  156.         'FI'                    => 5511,
  157.         'IE'                    => 5504,
  158.         'CZ'                    => 2444,
  159.     ];
  160.     // If new country added, Update the StockItem::KEYBOARD_LANGUAGE_VALID_VALUE_LIST constant!
  161.     public const array LANGUAGE_CODE_LIST_BY_NAME = [
  162.         'French'            => "FR",
  163.         'Italian'           => "IT",
  164.         'Spanish'           => "ES",
  165.         'English'           => "EN",
  166.         'German'            => "DE",
  167.         'Portuguese'        => "PT",
  168.         'Belgian'           => "BE",
  169.         'Russian'           => "RU",
  170.         'Polish'            => "PL",
  171.         'Swedish'           => "SE",
  172.         'Irish'             => "IE",
  173.         'Französisch'       => "FR",
  174.         'Italienisch'       => "IT",
  175.         'Spanisch'          => "ES",
  176.         'Englisch'          => "EN",
  177.         'Deutsch'           => "DE",
  178.         'Portugiesisch'     => "PT",
  179.         'Belgisch'          => "BE",
  180.         'Russisch'          => "RU",
  181.         'Polnisch'          => "PL",
  182.         'Schwedisch'        => "SE",
  183.         'Denmark'           => "DN",
  184.         'Czech'             => "CZ",
  185.         'United Kingdom'    => "UK",
  186.         'Finland'           => "FI",
  187.         'USA'               => "US"
  188.     ];
  189.     /**
  190.      * @var Product
  191.      *
  192.      * @ManyToOne(targetEntity="Product", inversedBy="productVariations")
  193.      * @JoinColumn(name="product_id", referencedColumnName="id")
  194.      */
  195.     private Product $product;
  196.     /**
  197.      * @var string
  198.      *
  199.      * @Column(name="code", type="string", unique=true)
  200.      */
  201.     private string $code;
  202.     /**
  203.      * @var string
  204.      *
  205.      * @Column(name="code_suffix", type="string")
  206.      */
  207.     private string $codeSuffix;
  208.     /**
  209.      * @var string
  210.      *
  211.      * @Column(name="attribute_options", type="text")
  212.      */
  213.     private string $attributeOptions;
  214.     /**
  215.      * @var string
  216.      *
  217.      * @Column(name="config", type="text")
  218.      */
  219.     private string $config;
  220.     /**
  221.      * @var PersistentCollection
  222.      *
  223.      * @OneToMany(targetEntity="ProductMarketplaceListing", mappedBy="productVariation", cascade={"persist", "remove"})
  224.      **/
  225.     private $productMarketplaceListings;
  226.     /**
  227.      * @var PersistentCollection
  228.      *
  229.      * @OneToMany(targetEntity="OrderItem", mappedBy="productVariation")
  230.      **/
  231.     private $orderItems;
  232.     /**
  233.      * @var bool
  234.      *
  235.      * @Column(name="archived", type="boolean", nullable=true)
  236.      */
  237.     private $archived;
  238.     public function __construct()
  239.     {
  240.         $this->productMarketplaceListings = new ArrayCollection();
  241.         $this->orderItems = new ArrayCollection();
  242.     }
  243.     /**
  244.      * @param ProductType $productType
  245.      *
  246.      * @return array
  247.      */
  248.     public function getAvailableAttributesForProductType(ProductType $productType): array
  249.     {
  250.         return $this->getAvailableAttributesForProductTypeId($productType->getId());
  251.     }
  252.     /**
  253.      * @param int $productTypeId
  254.      *
  255.      * @return array
  256.      */
  257.     public function getAvailableAttributesForProductTypeId(int $productTypeId): array
  258.     {
  259.         return self::VARIABLE_ATTRIBUTE_IDS[$productTypeId] ?? [];
  260.     }
  261.     /**
  262.      * @return string
  263.      */
  264.     public function getCode(): string
  265.     {
  266.         return $this->code;
  267.     }
  268.     /**
  269.      * @param string $code
  270.      *
  271.      * @return void
  272.      */
  273.     public function setCode(string $code): void
  274.     {
  275.         $this->code = $code;
  276.     }
  277.     /**
  278.      * @return PersistentCollection
  279.      */
  280.     public function getProductMarketplaceListings(): PersistentCollection
  281.     {
  282.         return $this->productMarketplaceListings;
  283.     }
  284.     /**
  285.      * @param ProductMarketplaceListing $productMarketplaceListing
  286.      *
  287.      * @return $this
  288.      */
  289.     public function addProductMarketPlaceListing(ProductMarketplaceListing $productMarketplaceListing): self
  290.     {
  291.         if (!$this->productMarketplaceListings->contains($productMarketplaceListing)) {
  292.             $this->productMarketplaceListings[] = $productMarketplaceListing;
  293.             $productMarketplaceListing->setProductVariation($this);
  294.         }
  295.         return $this;
  296.     }
  297.     /**
  298.      * @return PersistentCollection
  299.      */
  300.     public function getOrderItems(): PersistentCollection
  301.     {
  302.         return $this->orderItems;
  303.     }
  304.     /**
  305.      * @return string
  306.      */
  307.     public function getAttributeOptions(): string
  308.     {
  309.         return $this->attributeOptions;
  310.     }
  311.     /**
  312.      * @param string $attributeOptions
  313.      *
  314.      * @return void
  315.      */
  316.     public function setAttributeOptions(string $attributeOptions): void
  317.     {
  318.         $this->attributeOptions = $attributeOptions;
  319.     }
  320.     /**
  321.      * @return Product
  322.      */
  323.     public function getProduct(): Product
  324.     {
  325.         return $this->product;
  326.     }
  327.     /**
  328.      * @param Product $product
  329.      *
  330.      * @return void
  331.      */
  332.     public function setProduct(Product $product): void
  333.     {
  334.         $this->product = $product;
  335.     }
  336.     /**
  337.      * @return string
  338.      */
  339.     public function getCodeSuffix(): string
  340.     {
  341.         return $this->codeSuffix;
  342.     }
  343.     /**
  344.      * @param string $codeSuffix
  345.      *
  346.      * @return void
  347.      */
  348.     public function setCodeSuffix(string $codeSuffix): void
  349.     {
  350.         $this->codeSuffix = $codeSuffix;
  351.     }
  352.     /**
  353.      * @param array $attributeOptionIds
  354.      *
  355.      * @return string
  356.      */
  357.     public static function getSuffixFromAttributeOptionIdsArray(array $attributeOptionIds): string
  358.     {
  359.         return self::getSuffixFromAttributeOptionIdsText(implode($attributeOptionIds));
  360.     }
  361.     /**
  362.      * @param string $attributeOptionIds
  363.      *
  364.      * @return string
  365.      */
  366.     public static function getSuffixFromAttributeOptionIdsText(string $attributeOptionIds): string
  367.     {
  368.         return strtoupper(substr(md5($attributeOptionIds), 0, 8));
  369.     }
  370.     /**
  371.      * @param Product $product
  372.      * @param array $attributeOptionIds
  373.      *
  374.      * @return string
  375.      */
  376.     public static function createProductVariationCode(Product $product, array $attributeOptionIds): string
  377.     {
  378.         $suffix = self::getSuffixFromAttributeOptionIdsArray($attributeOptionIds);
  379.         return $product->getCode() . '-' . $suffix;
  380.     }
  381.     /**
  382.      * @return string
  383.      */
  384.     public function getConfig(): string
  385.     {
  386.         return $this->config;
  387.     }
  388.     /**
  389.      * @param string $config
  390.      *
  391.      * @return void
  392.      */
  393.     public function setConfig(string $config): void
  394.     {
  395.         $this->config = $config;
  396.     }
  397.     /**
  398.      * @return array
  399.      */
  400.     public function getAttributeOptionIdsAsArray(): array
  401.     {
  402.         return explode(',', $this->attributeOptions);
  403.     }
  404.     /**
  405.      * @return boolean
  406.      */
  407.     public function isArchived()
  408.     {
  409.         return $this->archived;
  410.     }
  411.     /**
  412.      * @param boolean $archived
  413.      */
  414.     public function setArchived($archived)
  415.     {
  416.         $this->archived = $archived;
  417.     }
  418. }