src/AtechNet/CoreBundle/Entity/ProductModel.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\AtechNet\CoreBundle\Entity;
  3. use App\AtechNet\CoreBundle\Repository\ProductModelRepository;
  4. use Doctrine\Common\Collections\ArrayCollection;
  5. use Doctrine\ORM\Mapping\Column;
  6. use Doctrine\ORM\Mapping\Entity;
  7. use Doctrine\ORM\Mapping\JoinColumn;
  8. use Doctrine\ORM\Mapping\JoinTable;
  9. use Doctrine\ORM\Mapping\ManyToMany;
  10. use Doctrine\ORM\Mapping\ManyToOne;
  11. use Doctrine\ORM\Mapping\OneToMany;
  12. use Doctrine\ORM\Mapping\OneToOne;
  13. use Doctrine\ORM\Mapping\OrderBy;
  14. use Doctrine\ORM\Mapping\Table as Table;
  15. use Doctrine\ORM\Mapping\UniqueConstraint;
  16. use Doctrine\ORM\PersistentCollection;
  17. use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
  18. use Symfony\Component\Validator\Constraints as Assert;
  19. /**
  20.  * @Table(name="product_model", uniqueConstraints={
  21.  *      @UniqueConstraint(name="model_unique",
  22.  *          columns={"title", "vendor_id", "type_id", "is_product_v2"})
  23.  *      })
  24.  * @Entity(repositoryClass=ProductModelRepository::class)
  25.  * @UniqueEntity(fields={"title", "vendor", "type", "isProductV2"}, message="A product model with this title, vendor and type already exists.")
  26.  */
  27. class ProductModel extends AbstractSignedEntity
  28. {
  29.     /**
  30.      * @var string
  31.      *
  32.      * @Column(name="title", type="string", length=512)
  33.      */
  34.     private string $title;
  35.     /**
  36.      * @var ArrayCollection
  37.      *
  38.      * @OneToMany(targetEntity="Product", mappedBy="productModel")
  39.      */
  40.     private $products;
  41.     /**
  42.      * @var ArrayCollection
  43.      *
  44.      * @ManyToMany(targetEntity="Product", inversedBy="connectedProductModels")
  45.      * @JoinTable(
  46.      *   name="product_productmodel",
  47.      *   joinColumns={
  48.      *       @JoinColumn(name="productmodel_id", referencedColumnName="id")
  49.      *   },
  50.      *   inverseJoinColumns={
  51.      *       @JoinColumn(name="product_id", referencedColumnName="id")
  52.      *   })
  53.      * @OrderBy({"created" = "DESC"})
  54.      */
  55.     private $connectedProducts;
  56.     /**
  57.      * @var PersistentCollection
  58.      *
  59.      * @OneToMany(targetEntity="ProductMarketplaceListing", mappedBy="productModel")
  60.      */
  61.     private $productMarketplaceListings;
  62.     /**
  63.      * @var ArrayCollection
  64.      *
  65.      * @ManyToMany(targetEntity="ProductModel", inversedBy="parentProductModels")
  66.      * @JoinTable(
  67.      *  name="product_models_alternative_models",
  68.      *  joinColumns={
  69.      *      @JoinColumn(name="parent_model_id", referencedColumnName="id")
  70.      *  },
  71.      *  inverseJoinColumns={
  72.      *      @JoinColumn(name="alternative_model_id", referencedColumnName="id")
  73.      *  })
  74.      * @OrderBy({"created" = "DESC"})
  75.      */
  76.     private $alternativeProductModels;
  77.     /**
  78.      * @var ArrayCollection
  79.      *
  80.      * @ManyToMany(targetEntity="ProductModel", mappedBy="alternativeProductModels")
  81.      * @OrderBy({"created" = "DESC"})
  82.      */
  83.     private $parentProductModels;
  84.     /**
  85.      * @var int
  86.      *
  87.      * @Column(name="calculated_qty_for_marketplaces", type="integer", nullable=false)
  88.      */
  89.     private $calculatedQtyForMarketplaces = 0;
  90.     /**
  91.      * @var \DateTime
  92.      *
  93.      * @Column(name="calculated_qty_date", type="datetime", nullable=true)
  94.      */
  95.     private $calculatedDate;
  96.     /**
  97.      * @var ArrayCollection
  98.      *
  99.      * @OneToMany(targetEntity="MarketplaceJobProductModel", mappedBy="productModel")
  100.      */
  101.     private $marketplaceJobProductModels;
  102.     /**
  103.      * @var bool
  104.      *
  105.      * @Column(name="paused_for_internal_job", type="boolean")
  106.      */
  107.     private $pausedForInternalJob = false;
  108.     /**
  109.      * @var ProductModel|null
  110.      *
  111.      * @ManyToOne(targetEntity="ProductModel")
  112.      * @JoinColumn(name="priorized_alternative_model_id", referencedColumnName="id", nullable=true)
  113.      */
  114.     private ?ProductModel $priorizedAlternativeModel;
  115.     /**
  116.      * @var ProductModel|null
  117.      *
  118.      * @ManyToOne(targetEntity="ProductModel")
  119.      * @JoinColumn(name="current_alternative_model_for_availability_calculation", referencedColumnName="id", nullable=true)
  120.      */
  121.     private ?ProductModel $currentAlternativeModelForAvailabilityCalculation;
  122.     /**
  123.      * @var Album|null
  124.      *
  125.      * @OneToOne(targetEntity="Album", cascade={"persist", "remove"})
  126.      * @JoinColumn(name="photo_album_id", referencedColumnName="id")
  127.      */
  128.     private ?Album $album = null;
  129.     /**
  130.      * @var ArrayCollection
  131.      *
  132.      * @OneToMany(targetEntity="ProductModelMeta", mappedBy="productModel", cascade={"persist", "remove"}))
  133.      */
  134.     private $productModelMetas;
  135.     /**
  136.      * note ide attribute option id-k vannak mentve, szivesen -> te flegma GenZ
  137.      * @Column(name="product_config_settings", type="array", nullable=true)
  138.      */
  139.     private $fixedConfigSettings; //$productConfigSettings
  140.     /**
  141.      * note ide attribute option id-k vannak mentve, szivesen -> te flegma GenZ
  142.      * @Column(name="product_variation_settings", type="array", nullable=true)
  143.      */
  144.     private $configurableConfigSettings; //$productVariationSettings
  145.     /**
  146.      * note ide azok az attribute option id-k kerulnek, amelyeket az import hozott letre/hasznalt fel,
  147.      * es amelyekre nincs teljes variacio-kombinacio lista legeneralva
  148.      * @Column(name="partial_variation_attribute_options", type="array", nullable=true)
  149.      */
  150.     private $partialVariationAttributeOptions;
  151.     /**
  152.      * @var Vendor
  153.      *
  154.      * @ManyToOne(targetEntity="Vendor")
  155.      * @JoinColumn(name="vendor_id", referencedColumnName="id")
  156.      */
  157.     private $vendor;
  158.     /**
  159.      * @var ProductType
  160.      *
  161.      * @Assert\NotNull
  162.      *
  163.      * @ManyToOne(targetEntity="ProductType")
  164.      * @JoinColumn(name="type_id", referencedColumnName="id")
  165.      */
  166.     private $type;
  167.     /**
  168.      * @var bool
  169.      *
  170.      * @Column(name="is_product_v2", type="boolean")
  171.      */
  172.     private $isProductV2 = false;
  173.     /**
  174.      * @var bool
  175.      *
  176.      * @Column(name="is_bestseller", type="boolean")
  177.      */
  178.     private $isBestseller = false;
  179.     /**
  180.      * @var PersistentCollection
  181.      *
  182.      * @OneToMany(targetEntity="ModelMigrationSetting", mappedBy="productModel", orphanRemoval=true)
  183.      * @OrderBy({"created" = "DESC"})
  184.      **/
  185.     private $settings;
  186.     /**
  187.      * @var int|null
  188.      *
  189.      * @Column(name="base_parent_product_id", type="integer", nullable=true)
  190.      */
  191.     private ?int $baseParentProductId = null;
  192.     /**
  193.      * @var ArrayCollection
  194.      *
  195.      * @ManyToMany(targetEntity="FixedAttributeOptionCombination", inversedBy="productModels", fetch="EXTRA_LAZY")
  196.      * @JoinTable(
  197.      *  name="product_model_fixed_attribute_option_combinations",
  198.      *  joinColumns={
  199.      *      @JoinColumn(name="product_model_id", referencedColumnName="id", onDelete="CASCADE")
  200.      *  },
  201.      *  inverseJoinColumns={
  202.      *      @JoinColumn(name="fixed_attribute_option_combination_id", referencedColumnName="id")
  203.      *  })
  204.      * @OrderBy({"created" = "DESC"})
  205.      */
  206.     private $fixedAttributeOptionCombinations;
  207.     /**
  208.      * @var ArrayCollection
  209.      *
  210.      * @ManyToMany(targetEntity="ConfigurableAttributeOptionCombination", inversedBy="productModels", fetch="EXTRA_LAZY")
  211.      * @JoinTable(
  212.      *  name="product_model_configurable_attribute_option_combinations",
  213.      *  joinColumns={
  214.      *      @JoinColumn(name="product_model_id", referencedColumnName="id", onDelete="CASCADE")
  215.      *  },
  216.      *  inverseJoinColumns={
  217.      *      @JoinColumn(name="configurable_attribute_option_combination_id", referencedColumnName="id")
  218.      *  })
  219.      * @OrderBy({"created" = "DESC"})
  220.      */
  221.     private $configurableAttributeOptionCombinations;
  222.     /**
  223.      * @var bool
  224.      *
  225.      * @Column(name="archived", type="boolean")
  226.      */
  227.     private $archived = 0;
  228.     /**
  229.      * @var ArrayCollection
  230.      *
  231.      * @OneToMany(targetEntity="ProductModelConfigFieldValue", mappedBy="productModel")
  232.      **/
  233.     private $productModelConfigFieldValues;
  234.     public function __construct()
  235.     {
  236.         parent::__construct();
  237.         $this->products = new ArrayCollection();
  238.         $this->alternativeProductModels = new ArrayCollection();
  239.         $this->productModelMetas = new ArrayCollection();
  240.         $this->settings = new ArrayCollection();
  241.         $this->fixedAttributeOptionCombinations = new ArrayCollection();
  242.         $this->configurableAttributeOptionCombinations = new ArrayCollection();
  243.         $this->connectedProducts = new ArrayCollection();
  244.         $this->productModelConfigFieldValues = new ArrayCollection();
  245.     }
  246.     public function getConnectedProducts()
  247.     {
  248.         return $this->connectedProducts;
  249.     }
  250.     /**
  251.      * @param ArrayCollection $connectedProducts
  252.      */
  253.     public function setConnectedProducts($connectedProducts)
  254.     {
  255.         $this->connectedProducts = $connectedProducts;
  256.     }
  257.     /**
  258.      * @param Product $product
  259.      * @return bool
  260.      */
  261.     public function addConnectedProduct(Product $product): bool
  262.     {
  263.         if (!$this->connectedProducts->contains($product)) {
  264.             $this->connectedProducts->add($product);
  265.             return true;
  266.         }
  267.         return false;
  268.     }
  269.     /**
  270.      * @param Product $product
  271.      */
  272.     public function removeConnectedProduct(Product $product)
  273.     {
  274.         $this->connectedProducts->removeElement($product);
  275.     }
  276.     public function removeAllConnectedProducts()
  277.     {
  278.         $this->connectedProducts = new ArrayCollection();
  279.     }
  280.     /**
  281.      * @return string
  282.      */
  283.     public function getTitle(): string
  284.     {
  285.         return $this->title;
  286.     }
  287.     /**
  288.      * @param string $title
  289.      *
  290.      * @return void
  291.      */
  292.     public function setTitle(string $title): void
  293.     {
  294.         $this->title = $title;
  295.     }
  296.     /**
  297.      * @return ArrayCollection
  298.      */
  299.     public function getProducts()
  300.     {
  301.         return $this->products;
  302.     }
  303.     /**
  304.      * @param ArrayCollection $products
  305.      *
  306.      * @return void
  307.      */
  308.     public function setProducts(ArrayCollection $products): void
  309.     {
  310.         $this->products = $products;
  311.     }
  312.     /**
  313.      * @param Product $product
  314.      *
  315.      * @return void
  316.      */
  317.     public function addProduct(Product $product): void
  318.     {
  319.         $this->products->add($product);
  320.     }
  321.     /**
  322.      * @param Product $product
  323.      *
  324.      * @return void
  325.      */
  326.     public function removeProduct(Product $product): void
  327.     {
  328.         $this->products->remove($product);
  329.     }
  330.     /**
  331.      * @param null|int $marketplaceId
  332.      */
  333.     public function getProductMarketplaceListings(?int $marketplaceId = null)
  334.     {
  335.         if (!is_null($marketplaceId)) {
  336.             return $this->productMarketplaceListings->filter(
  337.                 function (ProductMarketplaceListing $pml) use ($marketplaceId) {
  338.                     return $pml->getCustomer()->getId() == $marketplaceId && !$pml->isArchived();
  339.                 }
  340.             );
  341.         }
  342.         return $this->productMarketplaceListings;
  343.     }
  344.     /**
  345.      * @param PersistentCollection $productMarketplaceListings
  346.      *
  347.      * @return void
  348.      */
  349.     public function setProductMarketplaceListings(PersistentCollection $productMarketplaceListings): void
  350.     {
  351.         $this->productMarketplaceListings = $productMarketplaceListings;
  352.     }
  353.     public function getAvailable()
  354.     {
  355.         $available = 0;
  356.         foreach ($this->products as $product) {
  357.             $available += $product->getAvailable();
  358.         }
  359.         return $available;
  360.     }
  361.     public function getInStock()
  362.     {
  363.         $inStock = 0;
  364.         foreach ($this->products as $product) {
  365.             $inStock += $product->getInStock();
  366.         }
  367.         return $inStock;
  368.     }
  369.     /**
  370.      * @return ArrayCollection
  371.      */
  372.     public function getParentProductModels()
  373.     {
  374.         return $this->parentProductModels;
  375.     }
  376.     /**
  377.      * @return ArrayCollection
  378.      */
  379.     public function getAlternativeProductModels()
  380.     {
  381.         return $this->alternativeProductModels;
  382.     }
  383.     /**
  384.      * @param ArrayCollection $alternativeProductModels
  385.      */
  386.     public function setAlternativeProductModels($alternativeProductModels)
  387.     {
  388.         $this->alternativeProductModels = $alternativeProductModels;
  389.     }
  390.     /**
  391.      * @param ProductModel $alternativeProductModel
  392.      */
  393.     public function addAlternativeProductModel(ProductModel $alternativeProductModel)
  394.     {
  395.         if (!$this->alternativeProductModels->contains($alternativeProductModel)) {
  396.             $this->alternativeProductModels->add($alternativeProductModel);
  397.         }
  398.     }
  399.     /**
  400.      * @param ProductModel $alternativeProductModel
  401.      */
  402.     public function removeAlternativeModel(ProductModel $alternativeProductModel)
  403.     {
  404.         $this->alternativeProductModels->removeElement($alternativeProductModel);
  405.     }
  406.     /**
  407.      * @return int
  408.      */
  409.     public function getCalculatedQtyForMarketplaces(): int
  410.     {
  411.         return $this->calculatedQtyForMarketplaces;
  412.     }
  413.     /**
  414.      * @param int $calculatedQtyForMarketplace
  415.      *
  416.      * @return void
  417.      */
  418.     public function setCalculatedQtyForMarketplace(int $calculatedQtyForMarketplaces): void
  419.     {
  420.         $this->calculatedQtyForMarketplaces = $calculatedQtyForMarketplaces;
  421.     }
  422.     /**
  423.      * @return null|\DateTime
  424.      */
  425.     public function getCalculatedDate(): ?\DateTime
  426.     {
  427.         return $this->calculatedDate;
  428.     }
  429.     /**
  430.      * @param null|\DateTime $calculatedDate
  431.      */
  432.     public function setCalculatedDate(?\DateTime $calculatedDate): void
  433.     {
  434.         $this->calculatedDate = $calculatedDate;
  435.     }
  436.     /**
  437.      * @return ArrayCollection
  438.      */
  439.     public function getMarketplaceJobProductModels()
  440.     {
  441.         return $this->marketplaceJobProductModels;
  442.     }
  443.     /**
  444.      * @return bool
  445.      */
  446.     public function isProductModelPaused()
  447.     {
  448.         return $this->pausedForInternalJob;
  449.     }
  450.     /**
  451.      * @return bool
  452.      */
  453.     public function setPauseStatusForMarketplaceJobs(bool $pauseStatus)
  454.     {
  455.         return $this->pausedForInternalJob = $pauseStatus;
  456.     }
  457.     /**
  458.      * @return ProductModel|null
  459.      */
  460.     public function getPriorizedAlternativeModel(): ?ProductModel
  461.     {
  462.         return $this->priorizedAlternativeModel;
  463.     }
  464.     /**
  465.      * @param ProductModel|null $priorizedProductModel
  466.      *
  467.      * @return void
  468.      */
  469.     public function setPriorizedAlternativeModel(?ProductModel $priorizedProductModel): void
  470.     {
  471.         $this->priorizedAlternativeModel = $priorizedProductModel;
  472.     }
  473.     /**
  474.      * @return ProductModel|null
  475.      */
  476.     public function getCurrentAlternativeModelForAvailabilityCalculation(): ?ProductModel
  477.     {
  478.         return $this->currentAlternativeModelForAvailabilityCalculation;
  479.     }
  480.     /**
  481.      * @param ProductModel|null $currentAlternativeModelForAvailabilityCalculation
  482.      *
  483.      * @return void
  484.      */
  485.     public function setCurrentAlternativeModelForAvailabilityCalculation(?ProductModel $currentAlternativeModelForAvailabilityCalculation): void
  486.     {
  487.         $this->currentAlternativeModelForAvailabilityCalculation = $currentAlternativeModelForAvailabilityCalculation;
  488.     }
  489.     public function getAlbum(): ?Album
  490.     {
  491.         return $this->album;
  492.     }
  493.     public function setAlbum(?Album $album): void
  494.     {
  495.         $this->album = $album;
  496.     }
  497.     /**
  498.      * @return ArrayCollection
  499.      */
  500.     public function getProductModelMetas()
  501.     {
  502.         return $this->productModelMetas;
  503.     }
  504.     /**
  505.      * @param string $languageCode
  506.      *
  507.      * @return ProductModelMeta|null
  508.      */
  509.     public function getMetaByLanguage(string $languageCode): ?ProductModelMeta
  510.     {
  511.         $result = $this->productModelMetas->filter(function (ProductModelMeta $productModelMeta) use ($languageCode) {
  512.             return $productModelMeta->getLanguage()->getCode() == $languageCode;
  513.         })->first();
  514.         return !$result ? null : $result;
  515.     }
  516.     /**
  517.      * @return array|null
  518.      */
  519.     public function getFixedConfigSettings(): ?array
  520.     {
  521.         return $this->fixedConfigSettings;
  522.     }
  523.     /**
  524.      * @param array|null $fixedConfigSettings
  525.      */
  526.     public function setFixedConfigSettings(array $fixedConfigSettings = [])
  527.     {
  528.         $this->fixedConfigSettings = $fixedConfigSettings;
  529.     }
  530.     /**
  531.      * @return array|null
  532.      */
  533.     public function getConfigurableConfigSettings(): ?array
  534.     {
  535.         return $this->configurableConfigSettings;
  536.     }
  537.     /**
  538.      * @param array|null $configurableVariationSettings
  539.      */
  540.     public function setConfigurableConfigSettings(array $configurableVariationSettings = [])
  541.     {
  542.         $this->configurableConfigSettings = $configurableVariationSettings;
  543.     }
  544.     /**
  545.      * @return array
  546.      */
  547.     public function getPartialVariationAttributeOptions(): array
  548.     {
  549.         return $this->partialVariationAttributeOptions ?? [];
  550.     }
  551.     /**
  552.      * @param array $partialVariationAttributeOptions
  553.      */
  554.     public function setPartialVariationAttributeOptions(array $partialVariationAttributeOptions = []): void
  555.     {
  556.         $this->partialVariationAttributeOptions = $partialVariationAttributeOptions;
  557.     }
  558.     /**
  559.      * @return Vendor
  560.      */
  561.     public function getVendor()
  562.     {
  563.         return $this->vendor;
  564.     }
  565.     /**
  566.      * @param Vendor $vendor
  567.      */
  568.     public function setVendor($vendor)
  569.     {
  570.         $this->vendor = $vendor;
  571.     }
  572.     /**
  573.      * @return ProductType
  574.      */
  575.     public function getType()
  576.     {
  577.         return $this->type;
  578.     }
  579.     /**
  580.      * @param ProductType $productType
  581.      */
  582.     public function setType($productType)
  583.     {
  584.         $this->type = $productType;
  585.     }
  586.     /**
  587.      * @return bool
  588.      */
  589.     public function isProductV2()
  590.     {
  591.         return $this->isProductV2;
  592.     }
  593.     /**
  594.      * @return bool
  595.      */
  596.     public function setIsProductV2(bool $isProductV2)
  597.     {
  598.         return $this->isProductV2 = $isProductV2;
  599.     }
  600.     /**
  601.      * @return bool
  602.      */
  603.     public function isBestseller()
  604.     {
  605.         return $this->isBestseller;
  606.     }
  607.     /**
  608.      * @param bool $isBestseller
  609.      *
  610.      * @return void
  611.      */
  612.     public function setIsBestseller(bool $isBestseller)
  613.     {
  614.         return $this->isBestseller = $isBestseller;
  615.     }
  616.     /**
  617.      * @return PersistentCollection
  618.      */
  619.     public function getSettings(): PersistentCollection
  620.     {
  621.         return $this->settings;
  622.     }
  623.     /**
  624.      * @param PersistentCollection $settings
  625.      *
  626.      * @return void
  627.      */
  628.     public function setSettings(PersistentCollection $settings): void
  629.     {
  630.         $this->settings = $settings;
  631.     }
  632.     /**
  633.      * @return ModelMigrationSetting|null
  634.      */
  635.     public function getArchivedModelSetting(): ?ModelMigrationSetting
  636.     {
  637.         /** @var ModelMigrationSetting $setting */
  638.         foreach ($this->getSettings() as $setting) {
  639.             if ($setting->getType() == ModelMigrationSetting::TYPE_PRODUCT_MODEL_ARCHIVED) {
  640.                 return $setting;
  641.             }
  642.         }
  643.         return null;
  644.     }
  645.     /**
  646.      * @return ModelMigrationSetting|null
  647.      */
  648.     public function getOldModelSetting(): ?ModelMigrationSetting
  649.     {
  650.         /** @var ModelMigrationSetting $setting */
  651.         foreach ($this->getSettings() as $setting) {
  652.             if (in_array($setting->getType(), [ModelMigrationSetting::TYPE_PRODUCT_MODEL_IDS, ModelMigrationSetting::TYPE_PRODUCT_IDS])) {
  653.                 return $setting;
  654.             }
  655.         }
  656.         return null;
  657.     }
  658.     /**
  659.      * @return ModelMigrationSetting|null
  660.      */
  661.     public function getSelectedProductModelMetaIdSetting(): ?ModelMigrationSetting
  662.     {
  663.         /** @var ModelMigrationSetting $setting */
  664.         foreach ($this->getSettings() as $setting) {
  665.             if ($setting->getType() == ModelMigrationSetting::TYPE_SELECTED_PRODUCT_MODEL_META_ID) {
  666.                 return $setting;
  667.             }
  668.         }
  669.         return null;
  670.     }
  671.     /**
  672.      * @return ModelMigrationSetting|null
  673.      */
  674.     public function getProductMemorySetting(): ?ModelMigrationSetting
  675.     {
  676.         /** @var ModelMigrationSetting $setting */
  677.         foreach ($this->getSettings() as $setting) {
  678.             if ($setting->getType() == ModelMigrationSetting::TYPE_PRODUCT_CARD_SELECTED_PRODUCT_MEMORY) {
  679.                 return $setting;
  680.             }
  681.         }
  682.         return null;
  683.     }
  684.     /**
  685.      * @return ModelMigrationSetting|null
  686.      */
  687.     public function getAiPairSuggestionsSetting(): ?ModelMigrationSetting
  688.     {
  689.         /** @var ModelMigrationSetting $setting */
  690.         foreach ($this->getSettings() as $setting) {
  691.             if ($setting->getType() === ModelMigrationSetting::TYPE_AI_PAIR_SUGGESTIONS) {
  692.                 return $setting;
  693.             }
  694.         }
  695.         return null;
  696.     }
  697.     /**
  698.      * @return ModelMigrationSetting|null
  699.      */
  700.     public function getProductModelProductModelVariationSetting(): ?ModelMigrationSetting
  701.     {
  702.         /** @var ModelMigrationSetting $setting */
  703.         foreach ($this->getSettings() as $setting) {
  704.             if ($setting->getType() == ModelMigrationSetting::TYPE_PRODUCT_MODEL_VARIATIONS_CREATED) {
  705.                 return $setting;
  706.             }
  707.         }
  708.         return null;
  709.     }
  710.     /**
  711.      * @return ModelMigrationSetting|null
  712.      */
  713.     public function getProductModelOpenTabSetting(): ?ModelMigrationSetting
  714.     {
  715.         /** @var ModelMigrationSetting $setting */
  716.         foreach ($this->getSettings() as $setting) {
  717.             if ($setting->getType() == ModelMigrationSetting::TYPE_PRODUCT_MODEL_OPEN_TAB_IDS) {
  718.                 return $setting;
  719.             }
  720.         }
  721.         return null;
  722.     }
  723.     /**
  724.      * @return ModelMigrationSetting|null
  725.      */
  726.     public function getProductModelFinishedTabSetting(): ?ModelMigrationSetting
  727.     {
  728.         /** @var ModelMigrationSetting $setting */
  729.         foreach ($this->getSettings() as $setting) {
  730.             if ($setting->getType() == ModelMigrationSetting::TYPE_PRODUCT_MODEL_FINISHED_TAB_IDS) {
  731.                 return $setting;
  732.             }
  733.         }
  734.         return null;
  735.     }
  736.     /**
  737.      * @param string $tab
  738.      *
  739.      * @return bool
  740.      */
  741.     public function isTabFinished(string $tab): bool
  742.     {
  743.         $setting = $this->getProductModelFinishedTabSetting();
  744.         foreach ($setting->getValue() as $finishedTab) {
  745.             if ($finishedTab == $tab) {
  746.                 return true;
  747.             }
  748.         }
  749.         return false;
  750.     }
  751.     /**
  752.      * @return bool
  753.      */
  754.     public function isProductModelVariationCreated(): bool
  755.     {
  756.         return !is_null($this->getProductModelProductModelVariationSetting());
  757.     }
  758.     /**
  759.      * @return ModelMigrationSetting|null
  760.      */
  761.     public function getProductModelLockedSetting(): ?ModelMigrationSetting
  762.     {
  763.         /** @var ModelMigrationSetting $setting */
  764.         foreach ($this->getSettings() as $setting) {
  765.             if ($setting->getType() == ModelMigrationSetting::TYPE_PRODUCT_MODEL_LOCKED) {
  766.                 return $setting;
  767.             }
  768.         }
  769.         return null;
  770.     }
  771.     /**
  772.      * @return ModelMigrationSetting|null
  773.      */
  774.     public function getProductModelAmazonPendingFeedSetting(): ?ModelMigrationSetting
  775.     {
  776.         /** @var ModelMigrationSetting $setting */
  777.         foreach ($this->getSettings() as $setting) {
  778.             if ($setting->getType() == ModelMigrationSetting::TYPE_PRODUCT_MODEL_AMAZON_PENDING_FEED_IDS) {
  779.                 return $setting;
  780.             }
  781.         }
  782.         return null;
  783.     }
  784.     /**
  785.      * @return bool
  786.      */
  787.     public function isProductModelUnderAttributeUpdate(): bool
  788.     {
  789.         /** @var ModelMigrationSetting $setting */
  790.         foreach ($this->getSettings() as $setting) {
  791.             if ($setting->getType() == ModelMigrationSetting::TYPE_PRODUCT_MODEL_IS_UNDER_ATTRIBUTE_UPDATE) {
  792.                 return true;
  793.             }
  794.         }
  795.         return false;
  796.     }
  797.     /**
  798.      * @return bool
  799.      */
  800.     public function isLocked(): bool
  801.     {
  802.         return !is_null($this->getProductModelLockedSetting());
  803.     }
  804.     public function isConfigChangesCreated(): bool
  805.     {
  806.         return !is_null($this->getProductModelConfigChangesCreatedSetting());
  807.     }
  808.     public function getProductModelConfigChangesCreatedSetting()
  809.     {
  810.         /** @var ModelMigrationSetting $setting */
  811.         foreach ($this->getSettings() as $setting) {
  812.             if ($setting->getType() == ModelMigrationSetting::TYPE_CONFIG_CHANGES_CREATED) {
  813.                 return $setting;
  814.             }
  815.         }
  816.         return null;
  817.     }
  818.     public function getProductModelArchivedCombinationIdsSetting(): ?ModelMigrationSetting
  819.     {
  820.         /** @var ModelMigrationSetting $setting */
  821.         foreach ($this->getSettings() as $setting) {
  822.             if ($setting->getType() == ModelMigrationSetting::TYPE_ARCHIVED_COMBINATION_IDS) {
  823.                 return $setting;
  824.             }
  825.         }
  826.         return null;
  827.     }
  828.     public function getArchivedFixedAttributeOptionCombinations(): ?array
  829.     {
  830.         $setting = $this->getProductModelArchivedCombinationIdsSetting();
  831.         if (!$setting) {
  832.             return null;
  833.         }
  834.         $data = $setting->getValue();
  835.         return $data['fixedAttributeOptionCombinations'] ?? null;
  836.     }
  837.     public function setArchivedFixedAttributeOptionCombinations(int $fixedAttributeOptionCombinationId): ModelMigrationSetting
  838.     {
  839.         $setting = $this->getProductModelArchivedCombinationIdsSetting();
  840.         if ($setting) {
  841.             $existing = $setting->getValue()['fixedAttributeOptionCombinations'] ?? [];
  842.             $setting->setValue(array_merge($setting->getValue(), [
  843.                 'fixedAttributeOptionCombinations' => array_merge($existing, [$fixedAttributeOptionCombinationId]),
  844.             ]));
  845.         } else {
  846.             $newSetting = ModelMigrationSetting::createSetting(
  847.                 $this,
  848.                 ModelMigrationSetting::TYPE_ARCHIVED_COMBINATION_IDS,
  849.                 [
  850.                     'fixedAttributeOptionCombinations' => [$fixedAttributeOptionCombinationId],
  851.                 ]
  852.             );
  853.             $this->settings->add($newSetting);
  854.             $setting = $newSetting;
  855.         }
  856.         return $setting;
  857.     }
  858.     public function removeArchivedFixedAttributeOptionCombination(int $fixedAttributeOptionCombinationId): ?ModelMigrationSetting
  859.     {
  860.         $setting = $this->getProductModelArchivedCombinationIdsSetting();
  861.         if (!$setting) {
  862.             return null;
  863.         }
  864.         $existing = $setting->getValue()['fixedAttributeOptionCombinations'] ?? [];
  865.         $setting->setValue(array_merge($setting->getValue(), [
  866.             'fixedAttributeOptionCombinations' => array_values(array_filter($existing, fn ($id) => $id !== $fixedAttributeOptionCombinationId)),
  867.         ]));
  868.         return $setting;
  869.     }
  870.     public function getArchivedConfigurableAttributeOptionCombinations(): ?array
  871.     {
  872.         $setting = $this->getProductModelArchivedCombinationIdsSetting();
  873.         if (!$setting) {
  874.             return null;
  875.         }
  876.         $data = $setting->getValue();
  877.         return $data['configurableAttributeOptionCombinations'] ?? null;
  878.     }
  879.     public function setArchivedConfigurableAttributeOptionCombinations(int $configurableAttributeOptionCombinationId): ModelMigrationSetting
  880.     {
  881.         $setting = $this->getProductModelArchivedCombinationIdsSetting();
  882.         if ($setting) {
  883.             $existing = $setting->getValue()['configurableAttributeOptionCombinations'] ?? [];
  884.             $setting->setValue(array_merge($setting->getValue(), [
  885.                 'configurableAttributeOptionCombinations' => array_merge($existing, [$configurableAttributeOptionCombinationId]),
  886.             ]));
  887.         } else {
  888.             $newSetting = ModelMigrationSetting::createSetting(
  889.                 $this,
  890.                 ModelMigrationSetting::TYPE_ARCHIVED_COMBINATION_IDS,
  891.                 [
  892.                     'configurableAttributeOptionCombinations' => [$configurableAttributeOptionCombinationId],
  893.                 ]
  894.             );
  895.             $this->settings->add($newSetting);
  896.             $setting = $newSetting;
  897.         }
  898.         return $setting;
  899.     }
  900.     public function removeArchivedConfigurableAttributeOptionCombination(int $configurableAttributeOptionCombinationId): ?ModelMigrationSetting
  901.     {
  902.         $setting = $this->getProductModelArchivedCombinationIdsSetting();
  903.         if (!$setting) {
  904.             return null;
  905.         }
  906.         $existing = $setting->getValue()['configurableAttributeOptionCombinations'] ?? [];
  907.         $setting->setValue(array_merge($setting->getValue(), [
  908.             'configurableAttributeOptionCombinations' => array_values(array_filter($existing, fn ($id) => $id !== $configurableAttributeOptionCombinationId)),
  909.         ]));
  910.         return $setting;
  911.     }
  912.     /**
  913.      * @return int|null
  914.      */
  915.     public function getBaseParentProductId(): ?int
  916.     {
  917.         return $this->baseParentProductId;
  918.     }
  919.     /**
  920.      * @param int|null $baseParentProductId
  921.      *
  922.      * @return void
  923.      */
  924.     public function setBaseParentProductId(?int $baseParentProductId): void
  925.     {
  926.         $this->baseParentProductId = $baseParentProductId;
  927.     }
  928.     /**
  929.      * @return ArrayCollection
  930.      */
  931.     public function getFixedAttributeOptionCombinations()
  932.     {
  933.         return $this->fixedAttributeOptionCombinations;
  934.     }
  935.     /**
  936.      * @param ArrayCollection $fixedAttributeOptionCombinations
  937.      */
  938.     public function setFixedAttributeOptionCombinations($fixedAttributeOptionCombinations)
  939.     {
  940.         $this->fixedAttributeOptionCombinations = $fixedAttributeOptionCombinations;
  941.     }
  942.     /**
  943.      * @param FixedAttributeOptionCombination $fixedAttributeOptionCombination
  944.      */
  945.     public function addFixedAttributeOptionCombination($fixedAttributeOptionCombination)
  946.     {
  947.         if (!$this->fixedAttributeOptionCombinations->contains($fixedAttributeOptionCombination)) {
  948.             $this->fixedAttributeOptionCombinations->add($fixedAttributeOptionCombination);
  949.         }
  950.     }
  951.     /**
  952.      * @param FixedAttributeOptionCombination $fixedAttributeOptionCombination
  953.      */
  954.     public function removeFixedAttributeOptionCombination($fixedAttributeOptionCombination)
  955.     {
  956.         $this->fixedAttributeOptionCombinations->removeElement($fixedAttributeOptionCombination);
  957.     }
  958.     /**
  959.      * @return ArrayCollection
  960.      */
  961.     public function getConfigurableAttributeOptionCombinations()
  962.     {
  963.         return $this->configurableAttributeOptionCombinations;
  964.     }
  965.     /**
  966.      * @param ArrayCollection $configurableAttributeOptionCombinations
  967.      */
  968.     public function setConfigurableAttributeOptionCombinations($configurableAttributeOptionCombinations)
  969.     {
  970.         $this->configurableAttributeOptionCombinations = $configurableAttributeOptionCombinations;
  971.     }
  972.     /**
  973.      * @param ConfigurableAttributeOptionCombination $configurableAttributeOptionCombination
  974.      */
  975.     public function addConfigurableAttributeOptionCombination($configurableAttributeOptionCombination)
  976.     {
  977.         if (!$this->configurableAttributeOptionCombinations->contains($configurableAttributeOptionCombination)) {
  978.             $this->configurableAttributeOptionCombinations->add($configurableAttributeOptionCombination);
  979.         }
  980.     }
  981.     /**
  982.      * @param ConfigurableAttributeOptionCombination $configurableAttributeOptionCombination
  983.      */
  984.     public function removeConfigurableAttributeOptionCombination($configurableAttributeOptionCombination)
  985.     {
  986.         $this->configurableAttributeOptionCombinations->removeElement($configurableAttributeOptionCombination);
  987.     }
  988.     /**
  989.      * @return bool
  990.      */
  991.     public function isArchived(): bool
  992.     {
  993.         return $this->archived;
  994.     }
  995.     /**
  996.      * @param bool $archived
  997.      * @return void
  998.      */
  999.     public function setArchived(bool $archived): void
  1000.     {
  1001.         $this->archived = $archived;
  1002.     }
  1003.     public function getProductModelConfigFieldValues()
  1004.     {
  1005.         return $this->productModelConfigFieldValues;
  1006.     }
  1007.     public function setProductModelConfigFieldValues($productModelConfigFieldValues): void
  1008.     {
  1009.         $this->productModelConfigFieldValues = $productModelConfigFieldValues;
  1010.     }
  1011.     public function getProductModelConfigFieldValueByAttribute(int $attributeId): ?ProductModelConfigFieldValue
  1012.     {
  1013.         return $this->productModelConfigFieldValues->filter(function (ProductModelConfigFieldValue $productModelConfigFieldValue) use ($attributeId) {
  1014.             return $productModelConfigFieldValue->getV2Attribute()->getId() == $attributeId;
  1015.         })->first() ?: null;
  1016.     }
  1017. }