<?php
namespace App\Entity\Produit;
use App\Entity\ProduitCarrier;
use App\Repository\ProduitRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use App\Entity\Produit\{Couleur, Finition, Garantie, ImageProduit, Option};
use Knp\DoctrineBehaviors\Contract\Entity\TranslatableInterface;
use Knp\DoctrineBehaviors\Model\Translatable\TranslatableTrait;
use App\Entity\{Categorie, ProduitRelatedVersion, AvisClient};
use App\Entity\Order\OrderLine;
#[ORM\Entity(repositoryClass: ProduitRepository::class)]
class Produit implements TranslatableInterface
{
use TranslatableTrait;
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private $id;
#[ORM\OneToMany(mappedBy: 'produitImage', targetEntity: ImageProduit::class, orphanRemoval: true)]
private $imageProduits;
#[ORM\ManyToMany(targetEntity: Categorie::class, inversedBy: 'produits')]
private $Categories;
#[ORM\Column(type: 'datetime')]
private $createdAt;
#[ORM\Column(type: 'string', length: 400, nullable:true)]
private $imageProduitsPrincipale;
#[ORM\Column(type: 'integer', nullable:true)]
private $stock;
#[ORM\OneToMany(mappedBy: 'produit', targetEntity: ProduitRelatedVersion::class, orphanRemoval: true)]
private $produitRelatedVersions;
#[ORM\ManyToMany(targetEntity: Garantie::class, inversedBy: 'produits')]
private $garantie;
#[ORM\ManyToMany(targetEntity: Option::class, inversedBy: 'produits')]
private $produitOption;
#[ORM\OneToMany(mappedBy: 'produit', targetEntity: AvisClient::class)]
private $avisClients;
#[ORM\ManyToOne(targetEntity: Finition::class, inversedBy: 'produits')]
#[ORM\JoinColumn(name:"finition_id", referencedColumnName:"id", nullable:true, onDelete:"SET NULL")]
private $finition;
#[ORM\ManyToOne(targetEntity: self::class, inversedBy: 'produits')]
private $produitParent;
#[ORM\OneToMany(mappedBy: 'produitParent', targetEntity: self::class)]
private $produits;
#[ORM\ManyToMany(targetEntity: Couleur::class, inversedBy: 'produitsColors')]
private $colors;
#[Assert\Valid]
protected $translations;
#[ORM\Column(type: Types::DECIMAL, precision: 10, scale: 2, nullable: true)]
private ?string $priceTtc = null;
#[ORM\Column(type: Types::DECIMAL, precision: 10, scale: 2, nullable: true)]
private ?string $priceHt = null;
#[ORM\Column(type: Types::DECIMAL, precision: 10, scale: 2, nullable: true)]
private ?string $taxRate = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $ref = null;
#[ORM\OneToMany(mappedBy: 'produit', targetEntity: ProduitCarrier::class, indexBy: 'carrier_id', orphanRemoval: true)]
private Collection $produitCarriers;
#[ORM\Column(nullable:true)]
private ?bool $isSelection = null;
#[ORM\Column(type: Types::DECIMAL, precision: 10, scale: 2, nullable: true)]
private ?string $priceProductTtc = null;
#[ORM\Column(type: Types::DECIMAL, precision: 10, scale: 2, nullable: true)]
private ?string $priceProductHt = null;
#[ORM\Column(type: Types::DECIMAL, precision: 10, scale: 2, nullable: true)]
private ?string $taxRateProductHt = null;
#[ORM\Column(type: Types::DECIMAL, precision: 10, scale: 2, nullable: true)]
private ?string $priceServiceTtc = null;
#[ORM\Column(type: Types::DECIMAL, precision: 10, scale: 2, nullable: true)]
private ?string $priceServiceHt = null;
#[ORM\Column(type: Types::DECIMAL, precision: 10, scale: 2, nullable: true)]
private ?string $taxRateServiceTtc = null;
#[ORM\OneToMany(mappedBy: 'produit', targetEntity: OrderLine::class)]
private Collection $orderLinesProduit;
#[ORM\Column]
private ?bool $isCoupCoeur = null;
#[ORM\Column(length: 255, nullable: true)]
private ?string $templatePdf = null;
public function __construct()
{
$this->imageProduits = new ArrayCollection();
$this->Categories = new ArrayCollection();
$this->produitRelatedVersions = new ArrayCollection();
$this->garantie = new ArrayCollection();
$this->produitOption = new ArrayCollection();
$this->avisClients = new ArrayCollection();
$this->produits = new ArrayCollection();
$this->colors = new ArrayCollection();
$this->produitCarriers = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
/**
* @return Collection<int, ImageProduit>
*/
public function getImageProduits(): Collection
{
return $this->imageProduits;
}
public function addImageProduit(ImageProduit $imageProduit): self
{
if (!$this->imageProduits->contains($imageProduit)) {
$this->imageProduits[] = $imageProduit;
$imageProduit->setProduitImage($this);
}
return $this;
}
public function removeImageProduit(ImageProduit $imageProduit): self
{
if ($this->imageProduits->removeElement($imageProduit)) {
// set the owning side to null (unless already changed)
if ($imageProduit->getProduitImage() === $this) {
$imageProduit->setProduitImage(null);
}
}
return $this;
}
/**
* @return Collection<int, Categorie>
*/
public function getCategories(): Collection
{
return $this->Categories;
}
public function addCategory(Categorie $category): self
{
if (!$this->Categories->contains($category)) {
$this->Categories[] = $category;
}
return $this;
}
public function removeCategory(Categorie $category): self
{
$this->Categories->removeElement($category);
return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getImageProduitsPrincipale(): ?string
{
return $this->imageProduitsPrincipale;
}
public function setImageProduitsPrincipale(string $imageProduitsPrincipale): self
{
$this->imageProduitsPrincipale = $imageProduitsPrincipale;
return $this;
}
public function getStock(): ?int
{
return $this->stock;
}
public function setStock(int $stock): self
{
$this->stock = $stock;
return $this;
}
/**
* @return Collection<int, ProduitRelatedVersion>
*/
public function getProduitRelatedVersions(): Collection
{
return $this->produitRelatedVersions;
}
public function addProduitRelatedVersion(ProduitRelatedVersion $produitRelatedVersion): self
{
if (!$this->produitRelatedVersions->contains($produitRelatedVersion)) {
$this->produitRelatedVersions[] = $produitRelatedVersion;
$produitRelatedVersion->setProduit($this);
}
return $this;
}
public function removeProduitRelatedVersion(ProduitRelatedVersion $produitRelatedVersion): self
{
if ($this->produitRelatedVersions->removeElement($produitRelatedVersion)) {
// set the owning side to null (unless already changed)
if ($produitRelatedVersion->getProduit() === $this) {
$produitRelatedVersion->setProduit(null);
}
}
return $this;
}
/**
* @return Collection<int, Garantie>
*/
public function getGarantie(): Collection
{
return $this->garantie;
}
public function addGarantie(Garantie $garantie): self
{
if (!$this->garantie->contains($garantie)) {
$this->garantie[] = $garantie;
}
return $this;
}
public function removeGarantie(Garantie $garantie): self
{
$this->garantie->removeElement($garantie);
return $this;
}
/**
* @return Collection<int, Option>
*/
public function getProduitOption(): Collection
{
return $this->produitOption;
}
public function addProduitOption(Option $produitOption): self
{
if (!$this->produitOption->contains($produitOption)) {
$this->produitOption[] = $produitOption;
}
return $this;
}
public function removeProduitOption(Option $produitOption): self
{
$this->produitOption->removeElement($produitOption);
return $this;
}
/**
* @return Collection<int, AvisClient>
*/
public function getAvisClients(): Collection
{
return $this->avisClients;
}
public function addAvisClient(AvisClient $avisClient): self
{
if (!$this->avisClients->contains($avisClient)) {
$this->avisClients[] = $avisClient;
$avisClient->setProduit($this);
}
return $this;
}
public function removeAvisClient(AvisClient $avisClient): self
{
if ($this->avisClients->removeElement($avisClient)) {
// set the owning side to null (unless already changed)
if ($avisClient->getProduit() === $this) {
$avisClient->setProduit(null);
}
}
return $this;
}
public function getNoteClientOfOneProduct($listAvisClients){
$note = 0;
if ($listAvisClients){
$list = $listAvisClients->toArray();
if (count($list) > 0){
$noteAll = 0;
for ($i=0; $i<count($list); $i++){
$notePerClient = (floatval($list[$i]->getNote()) * 100) / 5;
$noteAll += $notePerClient;
}
$note = $noteAll/count($list);
}
}
return $note."%";
}
public function getFinition(): ?Finition
{
return $this->finition;
}
public function setFinition(?Finition $finition): self
{
$this->finition = $finition;
return $this;
}
public function getProduitParent(): ?self
{
return $this->produitParent;
}
public function setProduitParent(?self $produitParent): self
{
$this->produitParent = $produitParent;
return $this;
}
/**
* @return Collection<int, self>
*/
public function getProduits(): Collection
{
return $this->produits;
}
public function addProduit(self $produit): self
{
if (!$this->produits->contains($produit)) {
$this->produits[] = $produit;
$produit->setProduitParent($this);
}
return $this;
}
public function removeProduit(self $produit): self
{
if ($this->produits->removeElement($produit)) {
// set the owning side to null (unless already changed)
if ($produit->getProduitParent() === $this) {
$produit->setProduitParent(null);
}
}
return $this;
}
/**
* @return Collection<int, Couleur>
*/
public function getColors(): Collection
{
return $this->colors;
}
public function addColor(Couleur $color): self
{
if (!$this->colors->contains($color)) {
$this->colors[] = $color;
}
return $this;
}
public function removeColor(Couleur $color): self
{
$this->colors->removeElement($color);
return $this;
}
public function getPriceTtc(): ?string
{
return $this->priceTtc;
}
public function setPriceTtc(?string $priceTtc): static
{
$this->priceTtc = $priceTtc;
return $this;
}
public function getPriceHt(): ?string
{
return $this->priceHt;
}
public function setPriceHt(?string $priceHt): static
{
$this->priceHt = $priceHt;
return $this;
}
public function getTaxRate(): ?string
{
return $this->taxRate;
}
public function setTaxRate(?string $taxRate): static
{
$this->taxRate = $taxRate;
return $this;
}
public function getRef(): ?string
{
return $this->ref;
}
public function setRef(?string $ref): static
{
$this->ref = $ref;
return $this;
}
public function __toString()
{
if($this->translate()->getName()) {
return $this->translate()->getName();
}
return '';
}
//On triche pour ne pas repasser sur le front et dev en cours
public function getName()
{
if($this->translate()->getName()) {
return $this->translate()->getName();
}
return '';
}
public function getNameFr(): ?string
{
if($this->translate()->getName()) {
return $this->translate()->getName();
}
return '';
}
public function getNameLangue($lang): ?string
{
if($this->translate()->getName()) {
return $this->translate()->getName();
}
return '';
}
public function getDescription(): ?string
{
if($this->translate()->getDescription()) {
return $this->translate()->getDescription();
}
return '';
}
public function getPrice(){
return $this->getPriceTtc();
}
public function getPriceLangue($lang){
return $this->getPriceTtc();
}
/**
* @return Collection<int, ProduitCarrier>
*/
public function getProduitCarriers(): Collection
{
return $this->produitCarriers;
}
public function addProduitCarrier(ProduitCarrier $produitCarrier): static
{
if (!$this->produitCarriers->contains($produitCarrier)) {
$this->produitCarriers->add($produitCarrier);
$produitCarrier->setProduit($this);
}
return $this;
}
public function removeProduitCarrier(ProduitCarrier $produitCarrier): static
{
if ($this->produitCarriers->removeElement($produitCarrier)) {
// set the owning side to null (unless already changed)
if ($produitCarrier->getProduit() === $this) {
$produitCarrier->setProduit(null);
}
}
return $this;
}
public function isIsSelection(): ?bool
{
return $this->isSelection;
}
public function setIsSelection(bool $isSelection): static
{
$this->isSelection = $isSelection;
return $this;
}
public function getPriceProductTtc(): ?string
{
return $this->priceProductTtc;
}
public function setPriceProductTtc(?string $priceProductTtc): static
{
$this->priceProductTtc = $priceProductTtc;
return $this;
}
public function getPriceProductHt(): ?string
{
return $this->priceProductHt;
}
public function setPriceProductHt(?string $priceProductHt): static
{
$this->priceProductHt = $priceProductHt;
return $this;
}
public function getTaxRateProductHt(): ?string
{
return $this->taxRateProductHt;
}
public function setTaxRateProductHt(?string $taxRateProductHt): static
{
$this->taxRateProductHt = $taxRateProductHt;
return $this;
}
public function getPriceServiceTtc(): ?string
{
return $this->priceServiceTtc;
}
public function setPriceServiceTtc(?string $priceServiceTtc): static
{
$this->priceServiceTtc = $priceServiceTtc;
return $this;
}
public function getPriceServiceHt(): ?string
{
return $this->priceServiceHt;
}
public function setPriceServiceHt(?string $priceServiceHt): static
{
$this->priceServiceHt = $priceServiceHt;
return $this;
}
public function getTaxRateServiceTtc(): ?string
{
return $this->taxRateServiceTtc;
}
public function setTaxRateServiceTtc(?string $taxRateServiceTtc): static
{
$this->taxRateServiceTtc = $taxRateServiceTtc;
return $this;
}
public function isIsCoupCoeur(): ?bool
{
return $this->isCoupCoeur;
}
public function setIsCoupCoeur(bool $isCoupCoeur): static
{
$this->isCoupCoeur = $isCoupCoeur;
return $this;
}
public function getTemplatePdf(): ?string
{
return $this->templatePdf;
}
public function setTemplatePdf(?string $templatePdf): static
{
$this->templatePdf = $templatePdf;
return $this;
}
}