<?php
namespace App\Entity\ECommerce;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as JMS;
use Knp\DoctrineBehaviors\Contract\Entity\TranslatableInterface;
use App\Entity\ECommerce\Traits\DatesInterface;
use App\Entity\ECommerce\Traits\DatesTrait;
use App\Entity\ECommerce\Traits\RemoteInterface;
use App\Entity\ECommerce\Traits\RemoteTrait;
use Knp\DoctrineBehaviors\Model\Translatable\TranslatableTrait;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* Product
*
* @ORM\Table(name="product",
* indexes={
* @ORM\Index(name="product_title", columns={"title"}),
* @ORM\Index(name="product_search_title", columns={"search_title"}),
* @ORM\Index(name="product_slug", columns={"slug"}),
* @ORM\Index(name="product_id", columns={"id"}),
* @ORM\Index(name="product_remote_id", columns={"remote_id"}),
* @ORM\Index(name="product_dimensions", columns={"inner_diameter_min", "inner_diameter_max", "outer_diameter_min", "outer_diameter_max", "width_min", "width_max"}),
* @ORM\Index(name="title_manufacturer", columns={"title", "manufacturer"})
* },
* uniqueConstraints={})
*
* @ORM\Entity(repositoryClass="App\Repository\ECommerce\ProductRepository")
* @ORM\Cache(usage="READ_ONLY", region="public")
*/
class Product implements DatesInterface, RemoteInterface, TranslatableInterface
{
/**
* traits
*/
use TranslatableTrait;
use DatesTrait {
DatesTrait::__construct as __D_construct;
}
use RemoteTrait;
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*
* @JMS\Expose()
* @JMS\Groups({"filter", "depot_products", "depot_product_private", "cart_private", "view_product"})
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="code", type="string", nullable=true, length=10)
*
* @JMS\Groups({"filter", "depot_products", "depot_product_private", "cart_private", "view_product"})
*/
private $code;
/**
* @var string
*
* @ORM\Column(name="barcode", type="text", nullable=true)
*
* @JMS\Groups({"filter", "depot_products", "depot_product_private", "cart_private", "view_product"})
*/
protected $barcode;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=255, nullable=false)
*
* @JMS\Expose()
*
* @JMS\Groups({"filter", "depot_products", "depot_product_private", "cart_private", "view_product"})
*/
private $title;
/**
* @var string
*
* @ORM\Column(name="original_title", type="string", length=255, nullable=true)
*/
private $originalTitle;
/**
* @var string
*
* @ORM\Column(name="search_title", type="string", length=255, nullable=true)
*/
private $searchTitle;
/**
* @var string
*
* @ORM\Column(name="slug", type="string", length=255, nullable=true)
*/
private $slug;
/**
* @var string
*
* @ORM\Column(name="origin", type="string", length=50, nullable=true)
*
* @JMS\Groups({"depot_product_private", "cart_private"})
*/
private $origin;
/**
* @var string
*
* @ORM\Column(name="link", type="string", length=255, nullable=true)
*/
private $link;
/**
* @var float
*
* @ORM\Column(name="inner_diameter_min", type="float", nullable=true, precision=4, scale=3)
*
* @JMS\Groups({"depot_product_private", "cart_private"})
*/
private $innerDiameterMin;
/**
* @var float
*
* @ORM\Column(name="inner_diameter_max", type="float", nullable=true, precision=4, scale=3)
*
* @JMS\Groups({"depot_product_private", "cart_private"})
*/
private $innerDiameterMax;
/**
* @var float
*
* @ORM\Column(name="outer_diameter_min", type="float", nullable=true, precision=4, scale=3)
*
* @JMS\Groups({"depot_product_private", "cart_private"})
*/
private $outerDiameterMin;
/**
* @var float
*
* @ORM\Column(name="outer_diameter_max", type="float", nullable=true, precision=4, scale=3)
*
* @JMS\Groups({"depot_product_private", "cart_private"})
*/
private $outerDiameterMax;
/**
* @var float
*
* @ORM\Column(name="width_min", type="float", nullable=true, precision=4, scale=3)
*
* @JMS\Groups({"depot_product_private", "cart_private"})
*/
private $widthMin;
/**
* @var float
*
* @ORM\Column(name="width_max", type="float", nullable=true, precision=4, scale=3)
*
* @JMS\Groups({"depot_product_private", "cart_private"})
*/
private $widthMax;
/**
* @var float
*
* @ORM\Column(name="weight", type="float", nullable=true)
*
* @JMS\Groups({"depot_products", "depot_product_private", "cart_private"})
*/
private $weight;
/**
* @var float
*
* @ORM\Column(name="gross_price", type="decimal", precision=18, scale=4, nullable=true)
*/
private $grossPrice;
/**
* @var float
*
* @ORM\Column(name="minimal_quantity", type="float", nullable=true)
*
* @JMS\Groups({"depot_product_private", "cart_private"})
*/
private $minimalQuantity;
/**
* @var bool
*
* @ORM\Column(name="disabled", type="boolean", nullable=true)
*
* @JMS\Groups({"depot_product_private", "cart_private"})
*/
private $disabled;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="App\Entity\ECommerce\ProductPhoto", mappedBy="product", cascade={"ALL"}, fetch="EAGER")
*
* @JMS\Groups({"depot_products", "depot_product_private", "cart_private", "product_photo"})
*/
private $photos;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="App\Entity\ECommerce\ProductDocument", mappedBy="product", cascade={"all"}, fetch="EAGER")
*
* @JMS\Groups({"depot_products", "depot_product_private", "cart_private", "product_document"})
*/
private $documents;
/**
* @var ProductCategory
*
* @ORM\ManyToOne(targetEntity="App\Entity\ECommerce\ProductCategory", inversedBy="products")
* @ORM\JoinColumn(name="category", referencedColumnName="id", nullable=true)
*
* @JMS\Groups({"depot_products", "depot_product_private", "cart_private", "view_product"})
*/
private $category;
/**
* @var ProductCategory
*
* @ORM\ManyToOne(targetEntity="App\Entity\ECommerce\ProductSubCategory", inversedBy="products")
* @ORM\JoinColumn(name="sub_category", referencedColumnName="id", nullable=true)
*
* @JMS\Groups({"depot_products", "depot_product_private", "cart_private", "view_product"})
*/
private $subCategory;
/**
* @var ProductGroup
*
* @ORM\ManyToOne(targetEntity="App\Entity\ECommerce\ProductGroup", inversedBy="products")
* @ORM\JoinColumn(name="product_group", referencedColumnName="id", nullable=true)
*
* @JMS\Groups({"depot_products", "depot_product_private", "cart_private"})
*/
private $group;
/**
* @var ProductManufacturer
*
* @ORM\ManyToOne(targetEntity="App\Entity\ECommerce\ProductManufacturer")
* @ORM\JoinColumn(name="manufacturer", referencedColumnName="id", nullable=true)
*
* @JMS\Groups({"depot_products", "depot_product_private", "cart_private", "view_product"})
*/
private $manufacturer;
/**
* @var ArrayCollection
*
* @ORM\OneToMany(targetEntity="App\Entity\ECommerce\DepotProduct", mappedBy="product", cascade={"all"})
*
* @JMS\Groups({"depot_products", "depot_product_private"})
*/
private $quantities;
/**
* @var Collection
*
* @ORM\OneToMany(targetEntity="App\Entity\ECommerce\ProductAlternative", mappedBy="product", cascade={"all"})
* @ORM\OrderBy({"title" = "ASC"})
*
* @JMS\Groups({"depot_product_private", "cart_private"})
*/
private $alternatives;
/**
* @var Collection
*
* @ORM\ManyToMany(targetEntity="App\Entity\ECommerce\ProductInfo")
* @ORM\JoinTable(name="product_product_info",
* joinColumns={@ORM\JoinColumn(name="product", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="product_info", referencedColumnName="id")}
* )
*/
private $infoCodes;
/**
* @var Unit
*
* @ORM\ManyToOne(targetEntity="App\Entity\ECommerce\Unit", inversedBy="products")
* @ORM\JoinColumn(name="unit_of_measurement", referencedColumnName="id", nullable=true)
*
* @JMS\Groups({"depot_products", "depot_product_private", "cart_private"})
*/
private $unitOfMeasurement;
/**
* Constructor
*/
public function __construct()
{
$this->__D_construct();
$this->photos = new ArrayCollection();
$this->documents = new ArrayCollection();
$this->quantities = new ArrayCollection();
$this->alternatives = new ArrayCollection();
}
/**
* @return string
*/
public function __toString(): string
{
return (string)$this->id;
}
/**
* Get id
*
* @return int
*/
public function getId(): ?int
{
return $this->id;
}
/**
* Set title
*
* @param string $title
*
* @return self
*/
public function setTitle($title): self
{
$this->title = $title;
return $this;
}
/**
* Get title
*
* @return string
*/
public function getTitle(): ?string
{
return $this->title;
}
/**
* Set originalTitle
*
* @param string $originalTitle
*
* @return self
*/
public function setOriginalTitle($originalTitle): self
{
$this->originalTitle = $originalTitle;
return $this;
}
/**
* Get originalTitle
*
* @return string
*/
public function getOriginalTitle(): ?string
{
return $this->originalTitle;
}
/**
* Set searchTitle
*
* @param string|null $searchTitle
*
* @return self
*/
public function setSearchTitle($searchTitle = null): self
{
$this->searchTitle = $searchTitle;
return $this;
}
/**
* Get searchTitle
*
* @return string|null
*/
public function getSearchTitle(): ?string
{
return $this->searchTitle;
}
/**
* Set slug
*
* @param string $slug
*
* @return self
*/
public function setSlug(string $slug): self
{
$this->slug = $slug;
return $this;
}
/**
* @return string
*/
public function getSlug(): string
{
return $this->slug;
}
/**
* Set alternatives
*
* @param Collection $alternatives
*
* @return self
*/
public function setAlternatives($alternatives): self
{
$this->alternatives = $alternatives;
return $this;
}
/**
* Add alternative
*
* @param ProductAlternative $alternative
*
* @return self
*/
public function addAlternative(ProductAlternative $alternative): self
{
$this->alternatives[] = $alternative;
return $this;
}
/**
* Remove alternative
*
* @param ProductAlternative $alternative
*/
public function removeAlternative(ProductAlternative $alternative): void
{
$this->alternatives->removeElement($alternative);
}
/**
* Get alternatives
*
* @return Collection
*/
public function getAlternatives()
{
return $this->alternatives;
}
/**
* Set unitOfMeasurement
*
* @param Unit $unitOfMeasurement
*
* @return self
*/
public function setUnitOfMeasurement(Unit $unitOfMeasurement): self
{
$this->unitOfMeasurement = $unitOfMeasurement;
return $this;
}
/**
* Get unitOfMeasurement
*
* @return Unit
*/
public function getUnitOfMeasurement(): ?Unit
{
return $this->unitOfMeasurement;
}
/**
* Set origin
*
* @param string $origin
*
* @return self
*/
public function setOrigin($origin): self
{
$this->origin = $origin;
return $this;
}
/**
* Get origin
*
* @return string
*/
public function getOrigin(): ?string
{
return $this->origin;
}
/**
* Set link
*
* @param string $link
*
* @return self
*/
public function setLink($link): self
{
$this->link = $link;
return $this;
}
/**
* Get link
*
* @return string
*/
public function getLink(): ?string
{
return $this->link;
}
/**
* Set innerDiameter
*
* @param string $innerDiameter
*
* @return self
*/
public function setInnerDiameter(string $innerDiameter): self
{
$dimensions = explode('/', $innerDiameter);
$this->innerDiameterMin = array_shift($dimensions);
if (count($dimensions)) {
$this->innerDiameterMax = array_shift($dimensions);
}
return $this;
}
/**
* Get innerDiameter
*
* @return string
*/
public function getInnerDiameter(): string
{
return implode('/', array_filter(array($this->innerDiameterMin, $this->innerDiameterMax)));
}
/**
* Set innerDiameterMin
*
* @param float $innerDiameterMin
*
* @return self
*/
public function setInnerDiameterMin($innerDiameterMin): self
{
$this->innerDiameterMin = $innerDiameterMin;
return $this;
}
/**
* Get innerDiameterMin
*
* @return float
*/
public function getInnerDiameterMin(): ?float
{
return $this->innerDiameterMin;
}
/**
* Set innerDiameterMax
*
* @param float $innerDiameterMax
*
* @return self
*/
public function setInnerDiameterMax($innerDiameterMax): self
{
$this->innerDiameterMax = $innerDiameterMax;
return $this;
}
/**
* Get innerDiameterMax
*
* @return float
*/
public function getInnerDiameterMax(): ?float
{
return $this->innerDiameterMax;
}
/**
* Set outerDiameter
*
* @param float $outerDiameter
*
* @return self
*/
public function setOuterDiameter($outerDiameter): self
{
$dimensions = explode('/', $outerDiameter);
$this->outerDiameterMin = array_shift($dimensions);
if (count($dimensions)) {
$this->outerDiameterMax = array_shift($dimensions);
}
return $this;
}
/**
* Get outerDiameter
*
* @return float
*/
public function getOuterDiameter()
{
return implode('/', array_filter(array($this->outerDiameterMin, $this->outerDiameterMax)));
}
/**
* Set outerDiameterMin
*
* @param float $outerDiameterMin
*
* @return self
*/
public function setOuterDiameterMin($outerDiameterMin): self
{
$this->outerDiameterMin = $outerDiameterMin;
return $this;
}
/**
* Get outerDiameterMin
*
* @return float
*/
public function getOuterDiameterMin(): ?float
{
return $this->outerDiameterMin;
}
/**
* Set outerDiameterMax
*
* @param float $outerDiameterMax
*
* @return self
*/
public function setOuterDiameterMax($outerDiameterMax): self
{
$this->outerDiameterMax = $outerDiameterMax;
return $this;
}
/**
* Get outerDiameterMax
*
* @return float
*/
public function getOuterDiameterMax(): ?float
{
return $this->outerDiameterMax;
}
/**
* Set widthMin
*
* @param float $widthMin
*
* @return self
*/
public function setWidthMin($widthMin): self
{
$this->widthMin = $widthMin;
return $this;
}
/**
* Get widthMin
*
* @return float
*/
public function getWidthMin(): ?float
{
return (float)$this->widthMin;
}
/**
* Set widthMax
*
* @param float $widthMax
*
* @return self
*/
public function setWidthMax($widthMax): self
{
$this->widthMax = $widthMax;
return $this;
}
/**
* Get widthMax
*
* @return float
*/
public function getWidthMax(): ?float
{
return $this->widthMax;
}
/**
* Set width
*
* @param float $width
*
* @return self
*/
public function setWidth($width): self
{
$dimensions = explode('/', $width);
$this->widthMin = array_shift($dimensions);
if (count($dimensions)) {
$this->widthMax = array_shift($dimensions);
}
return $this;
}
/**
* Get width
*
* @return string
*/
public function getWidth(): string
{
return implode('/', array_filter(array($this->widthMin, $this->widthMax)));
}
/**
* Get dimensions string
*
* @return string
*/
public function getDimensions(): string
{
return implode('x', array_filter(array($this->getInnerDiameter(), $this->getOuterDiameter(), $this->getWidth())));
}
/**
* Set weight
*
* @param float $weight
*
* @return self
*/
public function setWeight($weight): self
{
$this->weight = $weight;
return $this;
}
/**
* Get weight
*
* @return float
*/
public function getWeight(): ?float
{
return $this->weight;
}
/**
* Set grossPrice
*
* @param float $grossPrice
*
* @return self
*/
public function setGrossPrice($grossPrice): self
{
$this->grossPrice = $grossPrice;
return $this;
}
/**
* Get grossPrice
*
* @return float
*/
public function getGrossPrice(): ?float
{
return $this->grossPrice;
}
/**
* Set minimalQuantity
*
* @param float $minimalQuantity
*
* @return self
*/
public function setMinimalQuantity($minimalQuantity): self
{
$this->minimalQuantity = $minimalQuantity;
return $this;
}
/**
* Get minimalQuantity
*
* @return float
*/
public function getMinimalQuantity(): ?float
{
return $this->minimalQuantity;
}
/**
* Set code
*
* @param string $code
*
* @return self
*/
public function setCode($code): self
{
$this->code = $code;
return $this;
}
/**
* Get code
*
* @return string
*/
public function getCode(): ?string
{
return $this->code;
}
/**
* Set barcode
*
* @param string $barcode
*
* @return self
*/
public function setBarcode(string $barcode): self
{
$this->barcode = $barcode;
return $this;
}
/**
* Get barcode
*
* @return string|null
*/
public function getBarcode(): ?string
{
return $this->barcode;
}
/**
* Set disabled
*
* @param bool $disabled
*
* @return self
*/
public function setDisabled(bool $disabled): self
{
$this->disabled = $disabled;
return $this;
}
/**
* Is disabled
*
* @return bool
*/
public function isDisabled(): bool
{
return $this->disabled;
}
/**
* Set category
*
* @param ProductCategory $category
*
* @return self
*/
public function setCategory(ProductCategory $category = null): self
{
$this->category = $category ? $category->addProduct($this) : null;
return $this;
}
/**
* Get category
*
* @return ProductCategory
*/
public function getCategory(): ?ProductCategory
{
return $this->category;
}
/**
* Set group
*
* @param ProductGroup $group
*
* @return self
*/
public function setGroup(ProductGroup $group = null): self
{
$this->group = $group;
return $this;
}
/**
* Get group
*
* @return ProductGroup
*/
public function getGroup(): ?ProductGroup
{
return $this->group;
}
/**
* Set manufacturer
*
* @param ProductManufacturer $manufacturer
*
* @return self
*/
public function setManufacturer(ProductManufacturer $manufacturer = null): self
{
$this->manufacturer = $manufacturer;
return $this;
}
/**
* Get manufacturer
*
* @return ProductManufacturer|null
*/
public function getManufacturer(): ?ProductManufacturer
{
return $this->manufacturer;
}
/**
* Add photo
*
* @param ProductPhoto $photo
*
* @return self
*/
public function addPhoto(ProductPhoto $photo): self
{
$this->photos[] = $photo;
return $this;
}
/**
* Remove photo
*
* @param ProductPhoto $photo
*/
public function removePhoto(ProductPhoto $photo): void
{
$this->photos->removeElement($photo);
}
/**
* Get photos
*
* @return Collection
*/
public function getPhotos(): Collection
{
return $this->photos;
}
/**
* Add document
*
* @param ProductDocument $document
*
* @return self
*/
public function addDocument(ProductDocument $document): self
{
$this->documents[] = $document;
return $this;
}
/**
* Remove document
*
* @param ProductDocument $document
*/
public function removeDocument(ProductDocument $document): void
{
$this->documents->removeElement($document);
}
/**
* Get documents
*
* @return Collection
*/
public function getDocuments(): Collection
{
return $this->documents;
}
/**
* Get documents
*
* @param string|null $locale
*
* @return Collection
*/
public function getPublicDocuments(string $locale = null): Collection
{
return $this->documents->filter(static function (ProductDocument $document) {
return $document->getDocument()->getEnabled();
});
}
/**
* Add quantity
*
* @param DepotProduct $quantity
*
* @return self
*/
public function addQuantity(DepotProduct $quantity): self
{
$this->quantities[] = $quantity;
return $this;
}
/**
* Remove quantity
*
* @param DepotProduct $quantity
*/
public function removeQuantity(DepotProduct $quantity): void
{
$this->quantities->removeElement($quantity);
}
/**
* Get quantities
*
* @return Collection
*/
public function getQuantities(): Collection
{
return $this->quantities;
}
/**
* Filter quantities by user
*
* @param UserInterface $user
* @return void
*/
public function filterUserQuantities(UserInterface $user): void
{
$this->quantities = $this->quantities->filter(static function (DepotProduct $depotProduct) use ($user) {
return $depotProduct->getDepot()->getUsers()->contains($user);
});
}
/**
* Add infoCode
*
* @param ProductInfo $infoCode
*
* @return self
*/
public function addInfoCode(ProductInfo $infoCode): self
{
$this->infoCodes[] = $infoCode;
return $this;
}
/**
* Remove infoCode
*
* @param ProductInfo $infoCode
*/
public function removeInfoCode(ProductInfo $infoCode): void
{
$this->infoCodes->removeElement($infoCode);
}
/**
* Get infoCodes
*
* @return Collection
*/
public function getInfoCodes(): Collection
{
return $this->infoCodes;
}
/**
* Set subCategory
*
* @param ProductSubCategory $subCategory
*
* @return self
*/
public function setSubCategory(ProductSubCategory $subCategory = null): self
{
$this->subCategory = $subCategory;
return $this;
}
/**
* Get subCategory
*
* @return ProductCategory
*/
public function getSubCategory(): ?ProductCategory
{
return $this->subCategory;
}
}