<?php
namespace App\Entity;
use App\Model\TranslationModel;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Serializer\Annotation\Groups;
#[ORM\Entity(repositoryClass: 'App\Repository\ProductRepository')]
#[ORM\Table(name: 'product')]
#[ORM\InheritanceType('JOINED')]
#[ORM\DiscriminatorColumn(name: 'discr', type: 'string')]
#[ORM\DiscriminatorMap(['product' => Product::class, 'service' => Service::class, 'marchandise' => Marchandise::class])]
class Product extends TranslationModel
{
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
#[ORM\Column(type: 'integer', unique: true)]
#[Groups(['company', 'category'])]
protected $id;
#[ORM\ManyToOne(targetEntity: User::class)]
#[ORM\JoinColumn(name: 'owner', referencedColumnName: 'id')]
#[Groups(['company', 'category'])]
private $owner;
#[ORM\Column(name: 'name', type: 'string', length: 255)]
#[Groups(['company', 'category'])]
protected $name;
#[ORM\Column(name: 'latitude', type: 'decimal', nullable: true)]
#[Groups(['company', 'category'])]
protected $latitude;
#[ORM\Column(name: 'longitude', type: 'decimal', nullable: true)]
#[Groups(['company', 'category'])]
protected $longitude;
#[ORM\Column(name: 'description', type: 'text', nullable: true)]
#[Groups(['company', 'category'])]
protected $description;
#[ORM\Column(name: 'niveau', type: 'string', length: 255, nullable: true)]
#[Groups(['company', 'category'])]
protected $niveau;
#[ORM\Column(name: 'origin', type: 'string', length: 255, nullable: true)]
#[Groups(['company', 'category'])]
protected $origin;
#[ORM\Column(name: 'slug', type: 'string', length: 255)]
#[Groups(['company', 'category'])]
protected $slug;
#[ORM\Column(name: 'certification', type: 'string', length: 255)]
#[Groups(['company', 'category'])]
protected $certification;
#[ORM\Column(name: 'price', type: 'float', nullable: true)]
#[Groups(['company', 'category'])]
protected $price;
#[ORM\Column(name: 'currency', type: 'string', length: 255, nullable: true)]
#[Groups(['company', 'category'])]
protected $currency;
#[ORM\Column(name: 'wantevaluation', type: 'boolean')]
#[Groups(['company', 'category'])]
protected $wantevaluation;
#[ORM\Column(name: 'gaearecommanded', type: 'boolean')]
#[Groups(['company', 'category'])]
protected $gaearecommanded;
#[ORM\Column(name: 'creation_date', type: 'date')]
#[Groups(['company', 'category'])]
protected $creationdate;
#[ORM\Column(name: 'updated_date', type: 'date', nullable: true)]
#[Groups(['company', 'category'])]
protected $updateddate;
#[ORM\Column(name: 'image', type: 'string', length: 255, nullable: true)]
#[Groups(['company', 'category'])]
protected $image;
#[ORM\Column(name: 'type', type: 'string', length: 255)]
#[Groups(['company', 'category'])]
protected $type;
#[ORM\ManyToOne(targetEntity: Company::class, inversedBy: 'products')]
#[ORM\JoinColumn(name: 'company_id', referencedColumnName: 'id', nullable: false)]
#[Groups(['category'])]
protected $company;
#[ORM\ManyToOne(targetEntity: Category::class)]
#[ORM\JoinColumn(name: 'category_id', referencedColumnName: 'id')]
#[Groups(['company', 'category'])]
protected $category;
#[ORM\ManyToMany(targetEntity: 'App\Entity\Subcategory', inversedBy: 'products')]
#[ORM\JoinTable(name: 'product_subcategory')]
#[Groups(['company', 'category'])]
protected Collection $subcategories;
#[ORM\OneToMany(targetEntity: 'App\Entity\ProductFav', mappedBy: 'product', orphanRemoval: true, cascade: ['remove'])]
protected Collection $productFavProducts;
public function __construct()
{
parent::__construct();
$this->creationdate = new \DateTime();
$this->subcategories = new ArrayCollection();
$this->productFavProducts = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getOwner()
{
return $this->owner;
}
public function setOwner($owner): self
{
$this->owner = $owner;
return $this;
}
public function getCompany(): ?Company
{
return $this->company;
}
public function setCompany(?Company $company): self
{
$this->company = $company;
return $this;
}
public function getCategory(): ?Category
{
return $this->category;
}
public function setCategory(?Category $category): self
{
$this->category = $category;
return $this;
}
public function getSubcategories(): Collection
{
return $this->subcategories;
}
public function addSubcategory($subcategory): self
{
if (!$this->subcategories->contains($subcategory)) {
$this->subcategories->add($subcategory);
}
return $this;
}
public function removeSubcategory($subcategory): self
{
$this->subcategories->removeElement($subcategory);
return $this;
}
public function getProductFavProducts(): Collection
{
return $this->productFavProducts;
}
public function addProductFavProduct($productFavProduct): self
{
if (!$this->productFavProducts->contains($productFavProduct)) {
$this->productFavProducts->add($productFavProduct);
$productFavProduct->setProduct($this);
}
return $this;
}
public function removeProductFavProduct($productFavProduct): self
{
if ($this->productFavProducts->removeElement($productFavProduct)) {
if ($productFavProduct->getProduct() === $this) {
$productFavProduct->setProduct(null);
}
}
return $this;
}
public function getLatitude(): ?float
{
return $this->latitude;
}
public function setLatitude(?float $latitude): self
{
$this->latitude = $latitude;
return $this;
}
public function getLongitude(): ?float
{
return $this->longitude;
}
public function setLongitude(?float $longitude): self
{
$this->longitude = $longitude;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
public function getNiveau(): ?string
{
return $this->niveau;
}
public function setNiveau(?string $niveau): self
{
$this->niveau = $niveau;
return $this;
}
public function getOrigin(): ?string
{
return $this->origin;
}
public function setOrigin(?string $origin): self
{
$this->origin = $origin;
return $this;
}
public function getSlug(): ?string
{
return $this->slug;
}
public function setSlug(?string $slug): self
{
$this->slug = $slug;
return $this;
}
public function getCertification(): ?string
{
return $this->certification;
}
public function setCertification(?string $certification): self
{
$this->certification = $certification;
return $this;
}
public function getPrice(): ?float
{
return $this->price;
}
public function setPrice(?float $price): self
{
$this->price = $price;
return $this;
}
public function getCurrency(): ?string
{
return $this->currency;
}
public function setCurrency(?string $currency): self
{
$this->currency = $currency;
return $this;
}
public function getWantevaluation(): ?bool
{
return $this->wantevaluation;
}
public function setWantevaluation(?bool $wantevaluation): self
{
$this->wantevaluation = $wantevaluation;
return $this;
}
public function getGaearecommanded(): ?bool
{
return $this->gaearecommanded;
}
public function setGaearecommanded(?bool $gaearecommanded): self
{
$this->gaearecommanded = $gaearecommanded;
return $this;
}
public function getCreationdate(): ?\DateTimeInterface
{
return $this->creationdate;
}
public function setCreationdate(?\DateTimeInterface $creationdate): self
{
$this->creationdate = $creationdate;
return $this;
}
public function getUpdateddate(): ?\DateTimeInterface
{
return $this->updateddate;
}
public function setUpdateddate(?\DateTimeInterface $updateddate): self
{
$this->updateddate = $updateddate;
return $this;
}
public function getImage(): ?string
{
return $this->image;
}
public function setImage(?string $image): self
{
$this->image = $image;
return $this;
}
public function getType(): ?string
{
return $this->type;
}
public function setType(?string $type): self
{
$this->type = $type;
return $this;
}
}