vendor/bluue/products-bundle/src/Entity/Product.php line 51

Open in your IDE?
  1. <?php
  2. /**
  3.  * @author Leo BANNHOLTZER (contact@scaledev.fr)
  4.  * @copyright 2021 - ScaleDEV SAS, 12 RUE CHARLES MORET, 10120 ST ANDRE LES VERGERS
  5.  * @license commercial
  6.  */
  7. declare(strict_types=1);
  8. namespace Bluue\ProductsBundle\Entity;
  9. use App\Entity\Context;
  10. use App\Entity\TaxRule;
  11. use App\Entity\Currency;
  12. use App\Entity\UnitMeasure;
  13. use Symfony\Component\Uid\Uuid;
  14. use Doctrine\ORM\Mapping as ORM;
  15. use Gedmo\Mapping\Annotation as Gedmo;
  16. use App\Entity\Traits\ContextServiceEntity;
  17. use Doctrine\Common\Collections\Collection;
  18. use Bluue\ProductsBundle\Entity\ProductType;
  19. use Bluue\ProductsBundle\Entity\ProductContext;
  20. use Bluue\ProductsBundle\Entity\RelatedProduct;
  21. use Bluue\ProductsBundle\Entity\PackProduct;
  22. use Doctrine\Common\Collections\ArrayCollection;
  23. use Bluue\ProductsBundle\Entity\ProductAttachment;
  24. use Bluue\ProductsBundle\Repository\ProductRepository;
  25. use Symfony\Bridge\Doctrine\IdGenerator\UuidGenerator;
  26. use Bluue\ProductsBundle\Validator\UniqueProductReferenceBrand;
  27. use App\DoctrineExtensions\Timestampable\Traits\UserTimestampableEntity;
  28. use App\DoctrineExtensions\SoftDeleteable\Traits\UserSoftDeleteableEntity;
  29. use App\Entity\User;
  30. use DateTime;
  31. use Bluue\ProductsBundle\Entity\ProductTag;
  32. /**
  33.  * @ORM\Entity(repositoryClass=ProductRepository::class)
  34.  * @ORM\Table(name="products_bundle__product", indexes={
  35.  *      @ORM\Index(name="reference_brand", columns={"reference_brand"}),
  36.  *      @ORM\Index(name="serial_number", columns={"serial_number"}),
  37.  *      @ORM\Index(name="deleted_at", columns={"deleted_at"}),
  38.  *      @ORM\Index(name="created_at", columns={"created_at"}),
  39.  *      @ORM\Index(name="updated_at", columns={"updated_at"}),
  40.  *      @ORM\Index(name="energy_code", columns={"energy_code"}),
  41.  *  },
  42.  * )
  43.  * @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false, hardDelete=false)
  44.  * @UniqueProductReferenceBrand
  45.  */
  46. class Product
  47. {
  48.     use UserTimestampableEntity;
  49.     use UserSoftDeleteableEntity;
  50.     use ContextServiceEntity;
  51.     /**
  52.      * @ORM\Id
  53.      * @ORM\Column(type="uuid")
  54.      * @ORM\GeneratedValue(strategy="CUSTOM")
  55.      * @ORM\CustomIdGenerator(class=UuidGenerator::class)
  56.      */
  57.     private ?Uuid $id null;
  58.     /**
  59.      * @ORM\ManyToOne(targetEntity=ProductType::class, inversedBy="products", cascade={"persist"})
  60.      * @ORM\JoinColumn(nullable=false)
  61.      */
  62.     private ProductType $product_type;
  63.     /**
  64.      * @ORM\ManyToOne(targetEntity=UnitMeasure::class)
  65.      */
  66.     private ?UnitMeasure $unit_measure null;
  67.     /**
  68.      * @ORM\ManyToOne(targetEntity=Brand::class, inversedBy="products")
  69.      */
  70.     private ?Brand $brand null;
  71.     /**
  72.      * @ORM\ManyToOne(targetEntity=Product::class, inversedBy="childProducts")
  73.      */
  74.     private ?Product $parent null;
  75.     /**
  76.      * @ORM\OneToMany(targetEntity=Product::class, mappedBy="parent", cascade={"remove"}, fetch="EXTRA_LAZY")
  77.      */
  78.     private Collection $childProducts;
  79.     /**
  80.      * @ORM\Column(type="string", length=255, nullable=true)
  81.      */
  82.     private ?string $reference_brand null;
  83.     /**
  84.      * @ORM\Column(type="string", length=255, nullable=true)
  85.      */
  86.     private ?string $serialNumber null;
  87.     /**
  88.      * @ORM\OneToMany(
  89.      *     targetEntity=Ean13::class,
  90.      *     mappedBy="product",
  91.      *     cascade={"persist", "remove"},
  92.      *     fetch="EXTRA_LAZY")
  93.      */
  94.     private Collection $ean13s;
  95.     /**
  96.      * @ORM\Column(type="decimal", precision=20, scale=6, nullable=true)
  97.      */
  98.     private ?string $initial_unit null;
  99.     /**
  100.      * @ORM\Column(type="decimal", precision=20, scale=6, nullable=true)
  101.      */
  102.     private ?string $weight;
  103.     /**
  104.      * @ORM\Column(type="decimal", precision=20, scale=6, nullable=true)
  105.      */
  106.     private ?string $width;
  107.     /**
  108.      * @ORM\Column(type="decimal", precision=20, scale=6, nullable=true)
  109.      */
  110.     private ?string $height;
  111.     /**
  112.      * @ORM\Column(type="decimal", precision=20, scale=6, nullable=true)
  113.      */
  114.     private ?string $depth;
  115.     /**
  116.      * @ORM\Column(type="string", length=10, nullable=true)
  117.      */
  118.     private ?string $customsCode null;
  119.     /**
  120.      * @ORM\Column(type="boolean", options={"default" : "0"})
  121.      */
  122.     private bool $manufacturedPack false;
  123.     /**
  124.      * @ORM\Column(type="boolean", options={"default" : "0"})
  125.      */
  126.     private bool $sellPriceFromChildren false;
  127.     /**
  128.      * @ORM\Column(type="boolean", options={"default" : "0"})
  129.      */
  130.     private bool $retrieveInfoFromFirstChildOfPack false;
  131.     /**
  132.      * @ORM\Column(type="string", nullable=true)
  133.      */
  134.     private ?string $energyCode null;
  135.     /**
  136.      * @ORM\OneToMany(targetEntity=Declination::class, mappedBy="product", cascade={"remove"}, fetch="EXTRA_LAZY")
  137.      */
  138.     private Collection $declinations;
  139.     /**
  140.      * @ORM\OneToMany(targetEntity=ProductContext::class, mappedBy="product", cascade={"remove"}, fetch="EXTRA_LAZY")
  141.      */
  142.     private Collection $productContexts;
  143.     /**
  144.      * @ORM\OneToMany(targetEntity=RelatedProduct::class, mappedBy="parent", cascade={"remove"}, fetch="EXTRA_LAZY")
  145.      * @ORM\OrderBy({"position" = "ASC"})
  146.      */
  147.     private Collection $relatedProducts;
  148.     /**
  149.      * @ORM\OneToMany(targetEntity=PackProduct::class, mappedBy="parent", cascade={"remove"}, fetch="EXTRA_LAZY")
  150.      * @ORM\OrderBy({"position" = "ASC"})
  151.      */
  152.     private Collection $packProducts;
  153.     /**
  154.      * @ORM\OneToMany(
  155.      *  targetEntity=ProductAttachment::class,
  156.      *  mappedBy="product",
  157.      *  cascade={"persist", "remove"},
  158.      *  fetch="EXTRA_LAZY"
  159.      * )
  160.      */
  161.     private Collection $productAttachments;
  162.     /**
  163.      * @ORM\Column(type="boolean", options={"default" : "0"})
  164.      */
  165.     private bool $noCustomerDiscount false;
  166.     /**
  167.      * @ORM\Column(type="json", nullable="true")
  168.      */
  169.     private array $options = [];
  170.     private ?Context $context null;
  171.     /**
  172.      * @ORM\OneToMany(
  173.      *  targetEntity="ProductTag",
  174.      *  mappedBy="product",
  175.      *  fetch="EXTRA_LAZY",
  176.      *  cascade={"persist", "remove"}
  177.      * )
  178.      */
  179.     private Collection $productTags;
  180.     /**
  181.      * @ORM\ManyToMany(targetEntity=User::class, fetch="EXTRA_LAZY")
  182.      * @ORM\JoinTable(
  183.      *     name="products_bundle__product_user",
  184.      *     joinColumns={@ORM\JoinColumn(name="product_id", referencedColumnName="id")},
  185.      *     inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
  186.      * )
  187.      */
  188.     private Collection $users;
  189.     // For stock bundle
  190.     private Collection $stockProducts;
  191.     private Collection $stockProductRoots;
  192.     public $stockProductConfiguration null;
  193.     public ?object $stockProductRoot null;
  194.     public $quantity_real null;
  195.     public $quantity_virtual null;
  196.     public $product_suppliers null;
  197.     public $giftCards null;
  198.     public $applyWholesalePriceToAllContexts null;
  199.     public $applySellPriceToAllContexts null;
  200.     public function __construct()
  201.     {
  202.         $this->childProducts = new ArrayCollection();
  203.         $this->declinations = new ArrayCollection();
  204.         $this->productContexts = new ArrayCollection();
  205.         $this->relatedProducts = new ArrayCollection();
  206.         $this->packProducts = new ArrayCollection();
  207.         $this->productAttachments = new ArrayCollection();
  208.         $this->productTags = new ArrayCollection();
  209.         $this->users = new ArrayCollection();
  210.         // For stock bundle.
  211.         $this->stockProducts = new ArrayCollection();
  212.         $this->stockProductRoots = new ArrayCollection();
  213.         $this->ean13s = new ArrayCollection();
  214.         $this->product_suppliers = new ArrayCollection();
  215.         $this->giftCards = new ArrayCollection();
  216.     }
  217.     /**
  218.      * @return Uuid|null
  219.      */
  220.     public function getId(): ?Uuid
  221.     {
  222.         return $this->id;
  223.     }
  224.     /**
  225.      * @return ProductType|null
  226.      */
  227.     public function getProductType(): ?ProductType
  228.     {
  229.         return $this->product_type;
  230.     }
  231.     /**
  232.      * @param ProductType|null $product_type
  233.      * @return $this
  234.      */
  235.     public function setProductType(?ProductType $product_type): self
  236.     {
  237.         $this->product_type $product_type;
  238.         return $this;
  239.     }
  240.     /**
  241.      * @return UnitMeasure|null
  242.      */
  243.     public function getUnitMeasure(): ?UnitMeasure
  244.     {
  245.         if ($this->unit_measure) {
  246.             return $this->unit_measure;
  247.         } elseif ($this->getParent() && $this->getParent()->getUnitMeasure()) {
  248.             return $this->getParent()->getUnitMeasure();
  249.         }
  250.         return null;
  251.     }
  252.     /**
  253.      * @param UnitMeasure|null $unit_measure
  254.      * @return $this
  255.      */
  256.     public function setUnitMeasure(?UnitMeasure $unit_measure): self
  257.     {
  258.         $this->unit_measure $unit_measure;
  259.         return $this;
  260.     }
  261.     /**
  262.      * @return Brand|null
  263.      */
  264.     public function getBrand(): ?Brand
  265.     {
  266.         return $this->brand;
  267.     }
  268.     /**
  269.      * @param Brand|null $brand
  270.      * @return $this
  271.      */
  272.     public function setBrand(?Brand $brand): self
  273.     {
  274.         $this->brand $brand;
  275.         return $this;
  276.     }
  277.     /**
  278.      * @return self|null
  279.      */
  280.     public function getParent(): ?self
  281.     {
  282.         return $this->parent;
  283.     }
  284.     /**
  285.      * @param self|null $parent
  286.      * @return $this
  287.      */
  288.     public function setParent(?self $parent): self
  289.     {
  290.         $this->parent $parent;
  291.         return $this;
  292.     }
  293.     /**
  294.      * @return Collection|self[]
  295.      */
  296.     public function getChildProducts(): Collection
  297.     {
  298.         return $this->childProducts;
  299.     }
  300.     /**
  301.      * @param self $childProduct
  302.      * @return $this
  303.      */
  304.     public function addChildProduct(self $childProduct): self
  305.     {
  306.         if (!$this->childProducts->contains($childProduct)) {
  307.             $this->childProducts[] = $childProduct;
  308.             $childProduct->setParent($this);
  309.         }
  310.         return $this;
  311.     }
  312.     /**
  313.      * @param self $childProduct
  314.      * @return $this
  315.      */
  316.     public function removeChildProduct(self $childProduct): self
  317.     {
  318.         if ($this->childProducts->removeElement($childProduct)) {
  319.             if ($childProduct->getParent() === $this) {
  320.                 $childProduct->setParent(null);
  321.             }
  322.         }
  323.         return $this;
  324.     }
  325.     /**
  326.      * @return string|null
  327.      */
  328.     public function getReferenceBrand(): ?string
  329.     {
  330.         return $this->reference_brand;
  331.     }
  332.     /**
  333.      * @param string|null $reference_brand
  334.      * @return $this
  335.      */
  336.     public function setReferenceBrand(?string $reference_brand): self
  337.     {
  338.         $this->reference_brand $reference_brand;
  339.         return $this;
  340.     }
  341.     /**
  342.      * @return string|null
  343.      */
  344.     public function getSerialNumber(): ?string
  345.     {
  346.         return $this->serialNumber;
  347.     }
  348.     /**
  349.      * @param string|null $serialNumber
  350.      * @return $this
  351.      */
  352.     public function setSerialNumber(?string $serialNumber): self
  353.     {
  354.         $this->serialNumber $serialNumber;
  355.         return $this;
  356.     }
  357.     /**
  358.      * @return Collection|Ean13[]
  359.      */
  360.     public function getEan13s(): Collection
  361.     {
  362.         return $this->ean13s;
  363.     }
  364.     /**
  365.      * @param Ean13 $ean13
  366.      * @return $this
  367.      */
  368.     public function addEan13(Ean13 $ean13): self
  369.     {
  370.         if (!$this->ean13s->contains($ean13)) {
  371.             $this->ean13s[] = $ean13;
  372.             $ean13->setProduct($this);
  373.         }
  374.         return $this;
  375.     }
  376.     /**
  377.      * @param Ean13 $ean13
  378.      * @return $this
  379.      */
  380.     public function removeEan13(Ean13 $ean13): self
  381.     {
  382.         $this->ean13s->removeElement($ean13);
  383.         return $this;
  384.     }
  385.     /**
  386.      * @return $this
  387.      */
  388.     public function removeAllEan13(): self
  389.     {
  390.         $this->ean13s->slice(0);
  391.         return $this;
  392.     }
  393.     public function getDefaultEan13()
  394.     {
  395.         $ean13 $this->ean13s->filter(function ($item) {
  396.             return $item->getIsDefault();
  397.         });
  398.         return count($ean13) ? $ean13->first() : false;
  399.     }
  400.     public function showDefaultEan13(): string
  401.     {
  402.         $default_ean13 $this->getDefaultEan13();
  403.         return $default_ean13 && !empty($default_ean13->getValue()) ? $default_ean13->getValue() : '';
  404.     }
  405.     /**
  406.      * @return string|null
  407.      */
  408.     public function getInitialUnit(): ?string
  409.     {
  410.         return $this->initial_unit;
  411.     }
  412.     /**
  413.      * @param string|null $initial_unit
  414.      * @return $this
  415.      */
  416.     public function setInitialUnit(?string $initial_unit): self
  417.     {
  418.         $this->initial_unit $initial_unit;
  419.         return $this;
  420.     }
  421.     /**
  422.      * @return string|null
  423.      */
  424.     public function getWeight(): ?string
  425.     {
  426.         return $this->weight;
  427.     }
  428.     /**
  429.      * @param string|null $weight
  430.      * @return $this
  431.      */
  432.     public function setWeight(?string $weight): self
  433.     {
  434.         $this->weight $weight;
  435.         return $this;
  436.     }
  437.     /**
  438.      * @return string|null
  439.      */
  440.     public function getWidth(): ?string
  441.     {
  442.         return $this->width;
  443.     }
  444.     /**
  445.      * @param string|null $width
  446.      * @return $this
  447.      */
  448.     public function setWidth(?string $width): self
  449.     {
  450.         $this->width $width;
  451.         return $this;
  452.     }
  453.     /**
  454.      * @return string|null
  455.      */
  456.     public function getHeight(): ?string
  457.     {
  458.         return $this->height;
  459.     }
  460.     /**
  461.      * @param string|null $height
  462.      * @return $this
  463.      */
  464.     public function setHeight(?string $height): self
  465.     {
  466.         $this->height $height;
  467.         return $this;
  468.     }
  469.     /**
  470.      * @return string|null
  471.      */
  472.     public function getDepth(): ?string
  473.     {
  474.         return $this->depth;
  475.     }
  476.     /**
  477.      * @param string|null $depth
  478.      * @return $this
  479.      */
  480.     public function setDepth(?string $depth): self
  481.     {
  482.         $this->depth $depth;
  483.         return $this;
  484.     }
  485.     /**
  486.      * https://www.tarifdouanier.eu/
  487.      * @return string|null
  488.      */
  489.     public function getCustomsCode(): ?string
  490.     {
  491.         return $this->customsCode;
  492.     }
  493.     /**
  494.      * @param string|null $customsCode
  495.      * @return $this
  496.      */
  497.     public function setCustomsCode(?string $customsCode): self
  498.     {
  499.         $this->customsCode $customsCode;
  500.         return $this;
  501.     }
  502.     /**
  503.      * @return bool
  504.      */
  505.     public function isManufacturedPack(): bool
  506.     {
  507.         return $this->manufacturedPack;
  508.     }
  509.     /**
  510.      * @param bool $manufacturedPack
  511.      * @return Product
  512.      */
  513.     public function setManufacturedPack(bool $manufacturedPack): Product
  514.     {
  515.         $this->manufacturedPack $manufacturedPack;
  516.         return $this;
  517.     }
  518.     /**
  519.      * @return bool
  520.      */
  521.     public function isSellPriceFromChildren(): bool
  522.     {
  523.         return $this->sellPriceFromChildren;
  524.     }
  525.     /**
  526.      * @param bool $sellPriceFromChildren
  527.      * @return Product
  528.      */
  529.     public function setSellPriceFromChildren(bool $sellPriceFromChildren): Product
  530.     {
  531.         $this->sellPriceFromChildren $sellPriceFromChildren;
  532.         return $this;
  533.     }
  534.     /**
  535.      * @return bool
  536.      */
  537.     public function getRetrieveInfoFromFirstChildOfPack(): bool
  538.     {
  539.         return $this->retrieveInfoFromFirstChildOfPack;
  540.     }
  541.     /**
  542.      * @param bool $retrieveInfoFromFirstChildOfPack
  543.      * @return Product
  544.      */
  545.     public function setRetrieveInfoFromFirstChildOfPack(bool $retrieveInfoFromFirstChildOfPack): Product
  546.     {
  547.         $this->retrieveInfoFromFirstChildOfPack $retrieveInfoFromFirstChildOfPack;
  548.         return $this;
  549.     }
  550.     /**
  551.      * @return string|null
  552.      */
  553.     public function getEnergyCode(): ?string
  554.     {
  555.         return $this->energyCode;
  556.     }
  557.     /**
  558.      * @param string|null $energyCode
  559.      * @return $this
  560.      */
  561.     public function setEnergyCode(?string $energyCode): self
  562.     {
  563.         $this->energyCode $energyCode;
  564.         return $this;
  565.     }
  566.     /**
  567.      * @return Collection|Declination[]
  568.      */
  569.     public function getDeclinations(): Collection
  570.     {
  571.         $declinations $this->declinations->toArray();
  572.         usort($declinations, function ($a$b) {
  573.             return $a->getName() <=> $b->getName();
  574.         });
  575.         return new ArrayCollection($declinations);
  576.     }
  577.     /**
  578.      * @param Declination $declination
  579.      * @return $this
  580.      */
  581.     public function addDeclination(Declination $declination): self
  582.     {
  583.         if (!$this->declinations->contains($declination)) {
  584.             $this->declinations[] = $declination;
  585.             $declination->setProduct($this);
  586.         }
  587.         return $this;
  588.     }
  589.     /**
  590.      * @param Declination $declination
  591.      * @return $this
  592.      */
  593.     public function removeDeclination(Declination $declination): self
  594.     {
  595.         if ($this->declinations->removeElement($declination)) {
  596.             if ($declination->getProduct() === $this) {
  597.                 $declination->setProduct(null);
  598.             }
  599.         }
  600.         return $this;
  601.     }
  602.     /**
  603.      * @return Collection|ProductContext[]
  604.      */
  605.     public function getProductContexts(): Collection
  606.     {
  607.         return $this->productContexts;
  608.     }
  609.     /**
  610.      * @param ProductContext $productContext
  611.      * @return $this
  612.      */
  613.     public function addProductContext(ProductContext $productContext): self
  614.     {
  615.         if (!$this->productContexts->contains($productContext)) {
  616.             $this->productContexts[] = $productContext;
  617.             $productContext->setProduct($this);
  618.         }
  619.         return $this;
  620.     }
  621.     /**
  622.      * @param ProductContext $productContext
  623.      * @return $this
  624.      */
  625.     public function removeProductContext(ProductContext $productContext): self
  626.     {
  627.         if ($this->productContexts->removeElement($productContext)) {
  628.             if ($productContext->getProduct() === $this) {
  629.                 $productContext->setProduct(null);
  630.             }
  631.         }
  632.         return $this;
  633.     }
  634.     /**
  635.      * @param ?Context $context
  636.      * @return ProductContext|null
  637.      */
  638.     public function getProductContext(?Context $context null): ?ProductContext
  639.     {
  640.         $value null;
  641.         if ($this->getId()) {
  642.             if (!$this->context) {
  643.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  644.             } elseif ($context && $context != $this->context) {
  645.                 $this->context $context;
  646.             }
  647.             foreach ($this->getProductContexts() as $pc) {
  648.                 if ($pc->getContext() == $this->context) {
  649.                     $value $pc;
  650.                 }
  651.             }
  652.         }
  653.         return $value;
  654.     }
  655.     /**
  656.      * @param ?Context $context
  657.      * @return ProductImage|null
  658.      */
  659.     public function getCoverImageOfProductContext(?Context $context null): ?ProductImage
  660.     {
  661.         $productContext null;
  662.         if ($this->getId()) {
  663.             if (!$this->context) {
  664.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  665.             } elseif ($context && $context != $this->context) {
  666.                 $this->context $context;
  667.             }
  668.             foreach ($this->getProductContexts() as $pc) {
  669.                 if ($pc->getContext() == $this->context) {
  670.                     $productContext $pc;
  671.                 }
  672.             }
  673.         }
  674.         $image null;
  675.         if ($productContext) {
  676.             foreach ($productContext->getProductImages() as $pi) {
  677.                 if ($pi->getIsCover()) {
  678.                     $image $pi;
  679.                 }
  680.             }
  681.         }
  682.         return $image;
  683.     }
  684.     /**
  685.      * @return Collection|RelatedProduct[]
  686.      */
  687.     public function getRelatedProducts(): Collection
  688.     {
  689.         return $this->relatedProducts;
  690.     }
  691.     /**
  692.      * @param RelatedProduct $relatedProduct
  693.      * @return $this
  694.      */
  695.     public function addRelatedProduct(RelatedProduct $relatedProduct): self
  696.     {
  697.         if (!$this->relatedProducts->contains($relatedProduct)) {
  698.             $this->relatedProducts[] = $relatedProduct;
  699.             $relatedProduct->setParent($this);
  700.         }
  701.         return $this;
  702.     }
  703.     /**
  704.      * @return Collection|PackProduct[]
  705.      */
  706.     public function getPackProducts(): Collection
  707.     {
  708.         return $this->packProducts;
  709.     }
  710.     /**
  711.      * @param PackProduct $packProduct
  712.      * @return $this
  713.      */
  714.     public function addPackProduct(PackProduct $packProduct): self
  715.     {
  716.         if (!$this->packProducts->contains($packProduct)) {
  717.             $this->packProducts[] = $packProduct;
  718.             $packProduct->setParent($this);
  719.         }
  720.         return $this;
  721.     }
  722.     /**
  723.      * @return Collection|ProductAttachment[]
  724.      */
  725.     public function getProductAttachments(): Collection
  726.     {
  727.         return $this->productAttachments;
  728.     }
  729.     /**
  730.      * @param ProductAttachment $productAttachment
  731.      * @return $this
  732.      */
  733.     public function addProductAttachment(ProductAttachment $productAttachment): self
  734.     {
  735.         if (!$this->productAttachments->contains($productAttachment)) {
  736.             $this->productAttachments[] = $productAttachment;
  737.             $productAttachment->setProduct($this);
  738.         }
  739.         return $this;
  740.     }
  741.     /**
  742.      * @param bool|null $noCustomerDiscount
  743.      * @return $this
  744.      */
  745.     public function setNoCustomerDiscount(?bool $noCustomerDiscount): self
  746.     {
  747.         $this->noCustomerDiscount $noCustomerDiscount;
  748.         return $this;
  749.     }
  750.     /**
  751.      * @return bool|null
  752.      */
  753.     public function getNoCustomerDiscount(): ?bool
  754.     {
  755.         return $this->noCustomerDiscount;
  756.     }
  757.     /**
  758.      * @return array
  759.      */
  760.     public function getOptions(): array
  761.     {
  762.         return $this->options;
  763.     }
  764.     /**
  765.      * @param array $options
  766.      * @return $this
  767.      */
  768.     public function setOptions(array $options): self
  769.     {
  770.         $this->options $options;
  771.         return $this;
  772.     }
  773.     /**
  774.      * @param array $options
  775.      * @return $this
  776.      */
  777.     public function addOptions(array $options): self
  778.     {
  779.         return $this->setOptions(array_merge($this->options$options));
  780.     }
  781.     /**
  782.      * @return UnitMeasure|null
  783.      */
  784.     public function getRootUnitMeasure(): ?UnitMeasure
  785.     {
  786.         $rootUnitMeasure null;
  787.         if ($this->getChildProducts()->count()) {
  788.             foreach ($this->getChildProducts() as $childProduct) {
  789.                 if ($childProduct->getUnitMeasure()) {
  790.                     if ($childProduct->getUnitMeasure()->getParent()) {
  791.                         $rootUnitMeasure $childProduct->getUnitMeasure()->getParent();
  792.                     } else {
  793.                         $rootUnitMeasure $childProduct->getUnitMeasure();
  794.                     }
  795.                     break;
  796.                 }
  797.             }
  798.         } elseif ($this->getDeclinations()->count()) {
  799.             foreach ($this->getDeclinations() as $declination) {
  800.                 if ($declination->getUnitMeasure()) {
  801.                     if ($declination->getUnitMeasure()->getParent()) {
  802.                         $rootUnitMeasure $declination->getUnitMeasure()->getParent();
  803.                     } else {
  804.                         $rootUnitMeasure $declination->getUnitMeasure();
  805.                     }
  806.                     break;
  807.                 }
  808.             }
  809.         } elseif ($this->getParent() && $this->getParent()->getUnitMeasure()) {
  810.             if ($this->getParent()->getUnitMeasure()->getParent()) {
  811.                 $rootUnitMeasure $this->getParent()->getUnitMeasure()->getParent();
  812.             } else {
  813.                 $rootUnitMeasure $this->getParent()->getUnitMeasure();
  814.             }
  815.         }
  816.         return $rootUnitMeasure;
  817.     }
  818.     /**
  819.      * @param ?Context $context
  820.      * @return string|null
  821.      */
  822.     public function getName(?Context $context null): ?string
  823.     {
  824.         $value null;
  825.         if ($this->getId()) {
  826.             if (
  827.                 $this->getProductContexts()->count() == &&
  828.                 $this->getProductContexts()->first()->getContext() != $context
  829.             ) {
  830.                 $context $this->getProductContexts()->first()->getContext();
  831.             }
  832.             if (
  833.                 !$context
  834.                 && !$this->getProductContexts()->isEmpty()
  835.                 && !$this->getProductContext($this->context ?: $this->contextService->getActualOrDefault())
  836.             ) {
  837.                 $context $this->getProductContexts()->first()->getContext();
  838.             }
  839.             if (!$this->context) {
  840.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  841.             } elseif ($context && $context != $this->context) {
  842.                 $this->context $context;
  843.             }
  844.             foreach ($this->getProductContexts() as $pc) {
  845.                 if ($pc->getContext() == $this->context) {
  846.                     $value $pc->getName();
  847.                 }
  848.             }
  849.         }
  850.         return $value;
  851.     }
  852.     /**
  853.      * @param ?Context $context
  854.      * @return string|null
  855.      */
  856.     public function getMetaTagName(?Context $context null): ?string
  857.     {
  858.         $value null;
  859.         if ($this->getId()) {
  860.             if (!$this->context) {
  861.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  862.             } elseif ($context && $context != $this->context) {
  863.                 $this->context $context;
  864.             }
  865.             foreach ($this->getProductContexts() as $pc) {
  866.                 if ($pc->getContext() == $this->context) {
  867.                     $value $pc->getMetaTagName();
  868.                 }
  869.             }
  870.         }
  871.         return $value;
  872.     }
  873.     /**
  874.      * @param ?Context $context
  875.      * @return string|null
  876.      */
  877.     public function getDescription(?Context $context null): ?string
  878.     {
  879.         $value null;
  880.         if ($this->getId()) {
  881.             if (!$this->context) {
  882.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  883.             } elseif ($context && $context != $this->context) {
  884.                 $this->context $context;
  885.             }
  886.             foreach ($this->getProductContexts() as $pc) {
  887.                 if ($pc->getContext() == $this->context) {
  888.                     $value $pc->getDescription();
  889.                 }
  890.             }
  891.         }
  892.         return $value;
  893.     }
  894.     /**
  895.      * @param ?Context $context
  896.      * @return string|null
  897.      */
  898.     public function getMetaTagDescription(?Context $context null): ?string
  899.     {
  900.         $value null;
  901.         if ($this->getId()) {
  902.             if (!$this->context) {
  903.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  904.             } elseif ($context && $context != $this->context) {
  905.                 $this->context $context;
  906.             }
  907.             foreach ($this->getProductContexts() as $pc) {
  908.                 if ($pc->getContext() == $this->context) {
  909.                     $value $pc->getMetaTagDescription();
  910.                 }
  911.             }
  912.         }
  913.         return $value;
  914.     }
  915.     /**
  916.      * @param ?Context $context
  917.      * @return string|null
  918.      */
  919.     public function getSummary(?Context $context null): ?string
  920.     {
  921.         $value null;
  922.         if ($this->getId()) {
  923.             if (!$this->context) {
  924.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  925.             } elseif ($context && $context != $this->context) {
  926.                 $this->context $context;
  927.             }
  928.             foreach ($this->getProductContexts() as $pc) {
  929.                 if ($pc->getContext() == $this->context) {
  930.                     $value $pc->getSummary();
  931.                 }
  932.             }
  933.         }
  934.         return $value;
  935.     }
  936.     /**
  937.      * @param ?Context $context
  938.      * @return string|null
  939.      */
  940.     public function getSource(?Context $context null): ?string
  941.     {
  942.         $value null;
  943.         if ($this->getId()) {
  944.             if (!$this->context) {
  945.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  946.             } elseif ($context && $context != $this->context) {
  947.                 $this->context $context;
  948.             }
  949.             foreach ($this->getProductContexts() as $pc) {
  950.                 if ($pc->getContext() == $this->context) {
  951.                     $value $pc->getSource();
  952.                 }
  953.             }
  954.         }
  955.         return $value;
  956.     }
  957.     /**
  958.      * @param ?Context $context
  959.      * @return EcoPart|null
  960.      */
  961.     public function getEcoPart(?Context $context null): ?EcoPart
  962.     {
  963.         $value null;
  964.         if ($this->getId()) {
  965.             if (!$this->context) {
  966.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  967.             } elseif ($context && $context != $this->context) {
  968.                 $this->context $context;
  969.             }
  970.             foreach ($this->getProductContexts() as $pc) {
  971.                 if ($pc->getContext() == $this->context) {
  972.                     $value $pc->getEcoPart();
  973.                 }
  974.             }
  975.         }
  976.         return $value;
  977.     }
  978.     /**
  979.      * @param ?Context $context
  980.      * @return string|null
  981.      */
  982.     public function getEcoPartAmount(?Context $context null): ?string
  983.     {
  984.         $value null;
  985.         if ($this->getId()) {
  986.             if (!$this->context) {
  987.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  988.             } elseif ($context && $context != $this->context) {
  989.                 $this->context $context;
  990.             }
  991.             foreach ($this->getProductContexts() as $pc) {
  992.                 if ($pc->getContext() == $this->context) {
  993.                     $value $pc->getEcoPartAmount();
  994.                 }
  995.             }
  996.         }
  997.         return $value;
  998.     }
  999.     /**
  1000.      * @param ?Context $context
  1001.      * @return TaxRule|null
  1002.      */
  1003.     public function getTaxRule(?Context $context null): ?TaxRule
  1004.     {
  1005.         $value null;
  1006.         if ($this->getId()) {
  1007.             if (!$this->context) {
  1008.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1009.             } elseif ($context && $context != $this->context) {
  1010.                 $this->context $context;
  1011.             }
  1012.             foreach ($this->getProductContexts() as $pc) {
  1013.                 if ($pc->getContext() == $this->context) {
  1014.                     $value $pc->getTaxRule();
  1015.                 }
  1016.             }
  1017.         }
  1018.         return $value;
  1019.     }
  1020.     /**
  1021.      * @param ?Context $context
  1022.      * @return Currency|null
  1023.      */
  1024.     public function getCurrency(?Context $context null): ?Currency
  1025.     {
  1026.         $value null;
  1027.         if ($this->getId()) {
  1028.             if (
  1029.                 $this->getProductContexts()->count() == &&
  1030.                 $this->getProductContexts()->first()->getContext() != $context
  1031.             ) {
  1032.                 $context $this->getProductContexts()->first()->getContext();
  1033.             }
  1034.             if (
  1035.                 !$context
  1036.                 && !$this->getProductContexts()->isEmpty()
  1037.                 && !$this->getProductContext($this->context ?: $this->contextService->getActualOrDefault())
  1038.             ) {
  1039.                 $context $this->getProductContexts()->first()->getContext();
  1040.             }
  1041.             if (!$this->context) {
  1042.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1043.             } elseif ($context && $context != $this->context) {
  1044.                 $this->context $context;
  1045.             }
  1046.             foreach ($this->getProductContexts() as $pc) {
  1047.                 if ($pc->getContext() == $this->context) {
  1048.                     $value $pc->getCurrency();
  1049.                 }
  1050.             }
  1051.         }
  1052.         return $value;
  1053.     }
  1054.     /**
  1055.      * @param ?Context $context
  1056.      * @return string|null
  1057.      */
  1058.     public function getLinkRewrite(?Context $context null): ?string
  1059.     {
  1060.         $value null;
  1061.         if ($this->getId()) {
  1062.             if (!$this->context) {
  1063.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1064.             } elseif ($context && $context != $this->context) {
  1065.                 $this->context $context;
  1066.             }
  1067.             foreach ($this->getProductContexts() as $pc) {
  1068.                 if ($pc->getContext() == $this->context) {
  1069.                     $value $pc->getLinkRewrite();
  1070.                 }
  1071.             }
  1072.         }
  1073.         return $value;
  1074.     }
  1075.     /**
  1076.      * @param ?Context $context
  1077.      * @return bool|null
  1078.      */
  1079.     public function getIsActive(?Context $context null): ?bool
  1080.     {
  1081.         $value null;
  1082.         if ($this->getId()) {
  1083.             if (!$this->context) {
  1084.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1085.             } elseif ($context && $context != $this->context) {
  1086.                 $this->context $context;
  1087.             }
  1088.             foreach ($this->getProductContexts() as $pc) {
  1089.                 if ($pc->getContext() == $this->context) {
  1090.                     $value $pc->getIsActive();
  1091.                 }
  1092.             }
  1093.         }
  1094.         return $value;
  1095.     }
  1096.     /**
  1097.      * @param ?Context $context
  1098.      * @return bool|null
  1099.      */
  1100.     public function getAvailableForOrder(?Context $context null): ?bool
  1101.     {
  1102.         $value null;
  1103.         if ($this->getId()) {
  1104.             if (!$this->context) {
  1105.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1106.             } elseif ($context && $context != $this->context) {
  1107.                 $this->context $context;
  1108.             }
  1109.             foreach ($this->getProductContexts() as $pc) {
  1110.                 if ($pc->getContext() == $this->context) {
  1111.                     $value $pc->getAvailableForOrder();
  1112.                 }
  1113.             }
  1114.         }
  1115.         return $value;
  1116.     }
  1117.     /**
  1118.      * @param ?Context $context
  1119.      * @return string|null
  1120.      */
  1121.     public function getReference(?Context $context null): ?string
  1122.     {
  1123.         $value null;
  1124.         if ($this->getId()) {
  1125.             if (
  1126.                 $this->getProductContexts()->count() == &&
  1127.                 $this->getProductContexts()->first()->getContext() != $context
  1128.             ) {
  1129.                 $context $this->getProductContexts()->first()->getContext();
  1130.             }
  1131.             if (
  1132.                 !$context
  1133.                 && !$this->getProductContexts()->isEmpty()
  1134.                 && !$this->getProductContext($this->context ?: $this->contextService->getActualOrDefault())
  1135.             ) {
  1136.                 $context $this->getProductContexts()->first()->getContext();
  1137.             }
  1138.             if (!$this->context) {
  1139.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1140.             } elseif ($context && $context != $this->context) {
  1141.                 $this->context $context;
  1142.             }
  1143.             foreach ($this->getProductContexts() as $pc) {
  1144.                 if ($pc->getContext() == $this->context) {
  1145.                     $value $pc->getReference();
  1146.                 }
  1147.             }
  1148.         }
  1149.         return $value;
  1150.     }
  1151.     /**
  1152.      * @param ?Context $context
  1153.      * @return string|null
  1154.      */
  1155.     public function getWholesalePrice(?Context $context null): ?string
  1156.     {
  1157.         $value null;
  1158.         if ($this->getId()) {
  1159.             if (!$this->context) {
  1160.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1161.             } elseif ($context && $context != $this->context) {
  1162.                 $this->context $context;
  1163.             }
  1164.             foreach ($this->getProductContexts() as $pc) {
  1165.                 if ($pc->getContext() == $this->context) {
  1166.                     $value $pc->getWholesalePrice();
  1167.                 }
  1168.             }
  1169.         }
  1170.         return $value;
  1171.     }
  1172.     /**
  1173.      * @param ?Context $context
  1174.      * @return DateTime|null
  1175.      */
  1176.     public function getCreatedAtWithContext(?Context $context null): ?DateTime
  1177.     {
  1178.         $value $this->getCreatedAt();
  1179.         if ($this->getId()) {
  1180.             if (!$this->context) {
  1181.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1182.             } elseif ($context && $context != $this->context) {
  1183.                 $this->context $context;
  1184.             }
  1185.             foreach ($this->getProductContexts() as $pc) {
  1186.                 if ($pc->getContext() == $this->context) {
  1187.                     $value $pc->getCreatedAt();
  1188.                 }
  1189.             }
  1190.         }
  1191.         return $value;
  1192.     }
  1193.     /**
  1194.      * @param ?Context $context
  1195.      * @return DateTime|null
  1196.      */
  1197.     public function getUpdatedAtWithContext(?Context $context null): ?DateTime
  1198.     {
  1199.         $value $this->getUpdatedAt();
  1200.         if ($this->getId()) {
  1201.             if (!$this->context) {
  1202.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1203.             } elseif ($context && $context != $this->context) {
  1204.                 $this->context $context;
  1205.             }
  1206.             foreach ($this->getProductContexts() as $pc) {
  1207.                 if ($pc->getContext() == $this->context) {
  1208.                     $value $pc->getUpdatedAt();
  1209.                 }
  1210.             }
  1211.         }
  1212.         return $value;
  1213.     }
  1214.     /**
  1215.      * @param ?Context $context
  1216.      * @return string|null
  1217.      */
  1218.     public function getSellPrice(?Context $context null): ?string
  1219.     {
  1220.         $value null;
  1221.         if ($this->getId()) {
  1222.             if (!$this->context) {
  1223.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1224.             } elseif ($context && $context != $this->context) {
  1225.                 $this->context $context;
  1226.             }
  1227.             foreach ($this->getProductContexts() as $pc) {
  1228.                 if ($pc->getContext() == $this->context) {
  1229.                     $value $pc->getSellPrice();
  1230.                 }
  1231.             }
  1232.         }
  1233.         return $value;
  1234.     }
  1235.     /**
  1236.      * @param ?Context $context
  1237.      * @return bool|null
  1238.      */
  1239.     public function isChangeableTaxRule(?Context $context null): ?bool
  1240.     {
  1241.         $value null;
  1242.         if ($this->getId()) {
  1243.             if (!$this->context) {
  1244.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1245.             } elseif ($context && $context != $this->context) {
  1246.                 $this->context $context;
  1247.             }
  1248.             foreach ($this->getProductContexts() as $pc) {
  1249.                 if ($pc->getContext() == $this->context) {
  1250.                     $value $pc->isChangeableTaxRule();
  1251.                 }
  1252.             }
  1253.         }
  1254.         return $value;
  1255.     }
  1256.     /**
  1257.      * @param ?Context $context
  1258.      */
  1259.     public function getTranslations(?Context $context null)
  1260.     {
  1261.         $collection = [];
  1262.         if ($this->getId()) {
  1263.             if (
  1264.                 $this->getProductContexts()->count() == &&
  1265.                 $this->getProductContexts()->first()->getContext() != $context
  1266.             ) {
  1267.                 $context $this->getProductContexts()->first()->getContext();
  1268.             }
  1269.             if (
  1270.                 !$context
  1271.                 && !$this->getProductContexts()->isEmpty()
  1272.                 && !$this->getProductContext($this->context ?: $this->contextService->getActualOrDefault())
  1273.             ) {
  1274.                 $context $this->getProductContexts()->first()->getContext();
  1275.             }
  1276.             if (!$this->context) {
  1277.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1278.             } elseif ($context && $context != $this->context) {
  1279.                 $this->context $context;
  1280.             }
  1281.             foreach ($this->getProductContexts() as $pc) {
  1282.                 if ($pc->getContext() == $this->context) {
  1283.                     $collection $pc->getTranslations();
  1284.                 }
  1285.             }
  1286.         }
  1287.         return $collection;
  1288.     }
  1289.     /**
  1290.      * @param Context|null $context
  1291.      * @return string
  1292.      */
  1293.     public function getChoiceLabel(?Context $context null): string
  1294.     {
  1295.         if (
  1296.             $this->getProductContexts()->count() == &&
  1297.             $this->getProductContexts()->first()->getContext() != $context
  1298.         ) {
  1299.             $context $this->getProductContexts()->first()->getContext();
  1300.         }
  1301.         if (
  1302.             !$context
  1303.             && !$this->getProductContexts()->isEmpty()
  1304.             && !$this->getProductContext($this->context ?: $this->contextService->getActualOrDefault())
  1305.         ) {
  1306.             $context $this->getProductContexts()->first()->getContext();
  1307.         }
  1308.         $return '';
  1309.         if ($ref $this->getReference($context)) {
  1310.             $return '[' $ref '] ';
  1311.         }
  1312.         return $return $this->getName($context);
  1313.     }
  1314.     /**
  1315.      * @return bool
  1316.      */
  1317.     public function getIsPack(): bool
  1318.     {
  1319.         return $this->getId() && $this->getProductType()->getNumber() == 3;
  1320.     }
  1321.     // For stock bundle
  1322.     /**
  1323.      * @param Uuid|null $warehouseId
  1324.      * @param Context|null $context
  1325.      * @return Collection
  1326.      */
  1327.     public function getStockProducts(?Uuid $warehouseId null, ?Context $context null): Collection
  1328.     {
  1329.         $stockProducts $this->stockProducts->filter(function ($stockProduct) use ($context) {
  1330.             if ($context) {
  1331.                 return !$stockProduct->getDeclination() &&
  1332.                     $stockProduct->getStockProductRootContexts()->filter(
  1333.                         function ($stockProductRootContext) use ($context) {
  1334.                             return $stockProductRootContext->getContext() == $context;
  1335.                         }
  1336.                     )->count() > 0;
  1337.             }
  1338.             return !$stockProduct->getDeclination();
  1339.         });
  1340.         if ($warehouseId) {
  1341.             $stockProducts $stockProducts->filter(function ($stockProduct) use ($warehouseId) {
  1342.                 return $stockProduct->getWarehouse()->getId() == $warehouseId;
  1343.             });
  1344.         }
  1345.         return $stockProducts;
  1346.     }
  1347.     /**
  1348.      * @return Collection
  1349.      */
  1350.     public function getStockProductRoots(): Collection
  1351.     {
  1352.         return $this->stockProductRoots;
  1353.     }
  1354.     /**
  1355.      * @return object|null
  1356.      */
  1357.     public function getStockProductRoot(): ?object
  1358.     {
  1359.         $stockProductRoots $this->stockProductRoots->filter(function ($item) {
  1360.             return !$item->getDeclination();
  1361.         });
  1362.         return count($stockProductRoots) ? $stockProductRoots->first() : null;
  1363.     }
  1364.     /**
  1365.      * @param $stockProductRoot
  1366.      * @return $this
  1367.      */
  1368.     public function addStockProductRoot($stockProductRoot): self
  1369.     {
  1370.         if (!$this->stockProductRoots->contains($stockProductRoot)) {
  1371.             $this->stockProductRoots[] = $stockProductRoot;
  1372.             $stockProductRoot->setProduct($this);
  1373.         }
  1374.         return $this;
  1375.     }
  1376.     /**
  1377.      * @param $stockProductRoot
  1378.      * @return $this
  1379.      */
  1380.     public function removeStockProductRoot($stockProductRoot): self
  1381.     {
  1382.         if ($this->stockProductRoots->removeElement($stockProductRoot)) {
  1383.             if ($stockProductRoot->getProduct() === $this) {
  1384.                 $stockProductRoot->setProduct(null);
  1385.             }
  1386.         }
  1387.         return $this;
  1388.     }
  1389.     /**
  1390.      * @param Uuid|null $warehouseId
  1391.      * @return int
  1392.      */
  1393.     public function getStockProductsFinalQuantity(?Uuid $warehouseId null): int
  1394.     {
  1395.         $quantity 0;
  1396.         if ($warehouseId) {
  1397.             foreach ($this->getStockProducts($warehouseId) as $stock_product) {
  1398.                 $quantity += $stock_product->getQuantityAvailable();
  1399.             }
  1400.         } else {
  1401.             $quantity += $this->getStockProductRoot() ? $this->getStockProductRoot()->getQuantityAvailable() : 0;
  1402.         }
  1403.         return $quantity;
  1404.     }
  1405.     /**
  1406.      * @param $stockProducts
  1407.      * @return Product
  1408.      */
  1409.     public function setStockProducts($stockProducts): self
  1410.     {
  1411.         $this->stockProducts $stockProducts;
  1412.         return $this;
  1413.     }
  1414.     /**
  1415.      * @return Product
  1416.      */
  1417.     public function setStockProductRoot($stockProductRoot): self
  1418.     {
  1419.         $this->stockProductRoot $stockProductRoot;
  1420.         return $this;
  1421.     }
  1422.     /**
  1423.      * @param Context|null $context
  1424.      * @return object|null
  1425.      */
  1426.     public function getStockProductRootContext(?Context $context null): ?object
  1427.     {
  1428.         if (!$this->context) {
  1429.             $this->context $context ?: $this->contextService->getActualOrDefault();
  1430.         } elseif ($context && $context != $this->context) {
  1431.             $this->context $context;
  1432.         }
  1433.         return $this->getStockProductRoot() ?
  1434.             $this->getStockProductRoot()->getStockProductRootContext($this->context) : null
  1435.         ;
  1436.     }
  1437.     public function getDefaultProductSupplier()
  1438.     {
  1439.         if ($this->product_suppliers) {
  1440.             if (!$this->context) {
  1441.                 $this->context $this->contextService->getActualOrDefault();
  1442.             }
  1443.             foreach ($this->product_suppliers as $product_supplier) {
  1444.                 foreach ($product_supplier->getProductSupplierContexts() as $psContext) {
  1445.                     if ($psContext->getContext()->getId() == $this->context->getId() && $psContext->getIsDefault()) {
  1446.                         return $product_supplier;
  1447.                     }
  1448.                 }
  1449.             }
  1450.         }
  1451.         return false;
  1452.     }
  1453.     /**
  1454.      * @return Collection|ProductTag[]
  1455.      */
  1456.     public function getProductTags(): Collection
  1457.     {
  1458.         return $this->productTags;
  1459.     }
  1460.     /**
  1461.      * @param ProductTag $productTag
  1462.      * @return $this
  1463.      */
  1464.     public function addProductTag(?ProductTag $productTag): self
  1465.     {
  1466.         if (!$this->productTags->contains($productTag)) {
  1467.             $this->productTags[] = $productTag;
  1468.             $productTag->setProduct($this);
  1469.         }
  1470.         return $this;
  1471.     }
  1472.     /**
  1473.      * @param ProductTag $productTag
  1474.      * @return $this
  1475.      */
  1476.     public function removeProductTag(ProductTag $productTag): self
  1477.     {
  1478.         $this->productTags->removeElement($productTag);
  1479.         return $this;
  1480.     }
  1481.     public function getUsers(): Collection
  1482.     {
  1483.         return $this->users;
  1484.     }
  1485.     public function getGiftCards()
  1486.     {
  1487.         return $this->giftCards;
  1488.     }
  1489.     public function getIsGiftCard()
  1490.     {
  1491.         return $this->getId() && $this->getProductType()->getNumber() == 10 true false;
  1492.     }
  1493.     /**
  1494.      * @param Context $context
  1495.      * @return int|null
  1496.      */
  1497.     public function getQuantityMin(?Context $context null)
  1498.     {
  1499.         $value null;
  1500.         if ($this->getId()) {
  1501.             if (!$this->context) {
  1502.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1503.             } elseif ($context && $context != $this->context) {
  1504.                 $this->context $context;
  1505.             }
  1506.             foreach ($this->getProductContexts() as $pc) {
  1507.                 if ($pc->getContext() == $this->context) {
  1508.                     $value $pc->getQuantityMin();
  1509.                 }
  1510.             }
  1511.         }
  1512.         return $value;
  1513.     }
  1514.     /**
  1515.      * @param Context|null $context
  1516.      * @return string|null
  1517.      */
  1518.     public function getVisibility(?Context $context null): ?string
  1519.     {
  1520.         $value null;
  1521.         if ($this->getId()) {
  1522.             if (!$this->context) {
  1523.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1524.             } elseif ($context && $context != $this->context) {
  1525.                 $this->context $context;
  1526.             }
  1527.             foreach ($this->getProductContexts() as $pc) {
  1528.                 if ($pc->getContext() == $this->context) {
  1529.                     $value $pc->getVisibility();
  1530.                 }
  1531.             }
  1532.         }
  1533.         return $value;
  1534.     }
  1535.     /**
  1536.      * @param Context|null $context
  1537.      * @return string|null
  1538.      */
  1539.     public function getRedirectType(?Context $context null): ?string
  1540.     {
  1541.         $value null;
  1542.         if ($this->getId()) {
  1543.             if (!$this->context) {
  1544.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1545.             } elseif ($context && $context != $this->context) {
  1546.                 $this->context $context;
  1547.             }
  1548.             foreach ($this->getProductContexts() as $pc) {
  1549.                 if ($pc->getContext() == $this->context) {
  1550.                     $value $pc->getRedirectType();
  1551.                 }
  1552.             }
  1553.         }
  1554.         return $value;
  1555.     }
  1556.     /**
  1557.      * @param Context|null $context
  1558.      * @return Product|null
  1559.      */
  1560.     public function getProductRedirect(?Context $context null): ?Product
  1561.     {
  1562.         $value null;
  1563.         if ($this->getId()) {
  1564.             if (!$this->context) {
  1565.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1566.             } elseif ($context && $context != $this->context) {
  1567.                 $this->context $context;
  1568.             }
  1569.             foreach ($this->getProductContexts() as $pc) {
  1570.                 if ($pc->getContext() == $this->context) {
  1571.                     $value $pc->getProductRedirect();
  1572.                 }
  1573.             }
  1574.         }
  1575.         return $value;
  1576.     }
  1577.     /**
  1578.      * @param Context|null $context
  1579.      * @return object|null
  1580.      */
  1581.     public function getCategoryRedirect(?Context $context null): ?object
  1582.     {
  1583.         $value null;
  1584.         if ($this->getId()) {
  1585.             if (!$this->context) {
  1586.                 $this->context $context ?: $this->contextService->getActualOrDefault();
  1587.             } elseif ($context && $context != $this->context) {
  1588.                 $this->context $context;
  1589.             }
  1590.             foreach ($this->getProductContexts() as $pc) {
  1591.                 if ($pc->getContext() == $this->context) {
  1592.                     $value $pc->getCategoryRedirect();
  1593.                 }
  1594.             }
  1595.         }
  1596.         return $value;
  1597.     }
  1598. }