<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping\OrderBy;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\Serializer\Annotation\Groups;
use App\Repository\ProduitsRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Core\Bridge\Elasticsearch\DataProvider\Filter\OrderFilter;
/**
* @ORM\Entity(repositoryClass=ProduitsRepository::class)
* @ApiResource(
* normalizationContext={"groups"={"produit:read"}, "skip_null_values" = false},
*
* denormalizationContext={"groups"={"produit:write"}} ,
* attributes= {"pagination_items_per_page" = 10},
* order= {"id" = "DESC"},
* )
* @ApiFilter(SearchFilter::class, properties={"libelle" : "partial"})
* @ApiFilter(OrderFilter::class, properties={"id" : "DESC"})
*
* )
*/
class Produits
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({"produit:read","commandes:read","user:read","panier"})
*
*/
private $id;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({"produit:read","commandes:read","user:read","panier","produit:write"})
*/
private $libelle;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Gedmo\Slug(fields={"libelle"})
*/
private $slug;
/**
* @ORM\Column(type="text", nullable=true)
* @Groups({"produit:read","commandes:read","user:read","produit:write","panier"})
*/
private $description;
/**
* @ORM\Column(type="datetime", nullable=true)
* @Groups({"produit:read","commandes:read","user:read","produit:write","panier"})
*/
private $disponibilite;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({"produit:read","commandes:read","user:read","produit:write","panier"})
*/
private $uniteMesure;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({"produit:read"})
*/
private $typePrix;
/**
* @ORM\Column(type="float", nullable=true)
* @Groups({"produit:read","user:read","produit:write","panier"})
*/
private $prix;
/**
* @ORM\Column(type="float", nullable=true)
* @Groups({"produit:read","user:read","produit:write","panier"})
*/
private $stock;
/**
* @ORM\ManyToOne(targetEntity=Quartier::class, inversedBy="produit")
* @Groups({"produit:read","user:read","produit:write","panier"})
*/
private $localite;
/**
* @ORM\Column(type="boolean", nullable=true)
* @Groups({"produit:read","user:read"})
*/
private $valide;
/**
* @ORM\Column(type="boolean", nullable=true)
* @Groups({"produit:read","user:read"})
*/
private $feature;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({"produit:read","user:read","produit:write"})
*/
private $terminal;
/**
* @ORM\ManyToOne(targetEntity=User::class, inversedBy="produits")
* @Groups({"produit:read","commandes:read","produit:write"})
*/
private $utilisateur;
/**
* @ORM\OneToMany(targetEntity=ImagesProduits::class, mappedBy="produit")
* @Groups({"produit:read","commandes:read","user:read","produit:write","panier"})
*/
private $imagesProduits;
/**
* @ORM\OneToMany(targetEntity=LignesCommandes::class, mappedBy="produit")
*
*/
private $lignesCommandes;
/**
* @ORM\OneToMany(targetEntity=Panier::class, mappedBy="produit")
*/
private $paniers;
/**
* @ORM\Column(type="boolean", nullable=true)
* @Groups({"produit:read","commandes:read","user:read","produit:write"})
*/
private $active;
/**
* @ORM\ManyToOne(targetEntity=CategorieProduits::class, inversedBy="produits")
* @Groups({"produit:read","commandes:read","produit:write"})
*/
private $categorie;
/**
* @ORM\OneToMany(targetEntity=Produitstatsvisite::class, mappedBy="produit")
*
*/
private $statsproduit;
/**
* @ORM\OneToMany(targetEntity=FavorisProduits::class, mappedBy="produit")
*/
private $favoris;
public function __construct()
{
$this->imagesProduits = new ArrayCollection();
$this->lignesCommandes = new ArrayCollection();
$this->paniers = new ArrayCollection();
$this->active = true;
$this->valide = true;
$this->favoris = new ArrayCollection();
$this->statsproduit = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getLibelle(): ?string
{
return $this->libelle;
}
public function setLibelle(?string $libelle): self
{
$this->libelle = $libelle;
return $this;
}
public function getSlug(): ?string
{
return $this->slug;
}
public function setSlug(?string $slug): self
{
$this->slug = $slug;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
public function getDisponibilite(): ?\DateTime
{
return $this->disponibilite;
}
public function setDisponibilite(?\DateTime $disponibilite): self
{
$this->disponibilite = $disponibilite;
return $this;
}
public function getUniteMesure(): ?string
{
return $this->uniteMesure;
}
public function setUniteMesure(?string $uniteMesure): self
{
$this->uniteMesure = $uniteMesure;
return $this;
}
public function getTypePrix(): ?string
{
return $this->typePrix;
}
public function setTypePrix(?string $typePrix): self
{
$this->typePrix = $typePrix;
return $this;
}
public function getPrix(): ?float
{
return $this->prix;
}
public function setPrix(?float $prix): self
{
$this->prix = $prix;
return $this;
}
public function getStock(): ?float
{
return $this->stock;
}
public function setStock(?float $stock): self
{
$this->stock = $stock;
return $this;
}
public function getLocalite(): ?Quartier
{
return $this->localite;
}
public function setLocalite(?Quartier $localite): self
{
$this->localite = $localite;
return $this;
}
public function isValide(): ?bool
{
return $this->valide;
}
public function setValide(?bool $valide): self
{
$this->valide = $valide;
return $this;
}
public function isFeature(): ?bool
{
return $this->feature;
}
public function setFeature(?bool $feature): self
{
$this->feature = $feature;
return $this;
}
public function getTerminal(): ?string
{
return $this->terminal;
}
public function setTerminal(?string $terminal): self
{
$this->terminal = $terminal;
return $this;
}
public function getUtilisateur(): ?User
{
return $this->utilisateur;
}
public function setUtilisateur(?User $utilisateur): self
{
$this->utilisateur = $utilisateur;
return $this;
}
/**
* @return Collection<int, ImagesProduits>
*/
public function getImagesProduits(): Collection
{
return $this->imagesProduits;
}
public function addImagesProduit(ImagesProduits $imagesProduit): self
{
if (!$this->imagesProduits->contains($imagesProduit)) {
$this->imagesProduits[] = $imagesProduit;
$imagesProduit->setProduit($this);
}
return $this;
}
public function removeImagesProduit(ImagesProduits $imagesProduit): self
{
if ($this->imagesProduits->removeElement($imagesProduit)) {
// set the owning side to null (unless already changed)
if ($imagesProduit->getProduit() === $this) {
$imagesProduit->setProduit(null);
}
}
return $this;
}
/**
* @return Collection<int, LignesCommandes>
*/
public function getLignesCommandes(): Collection
{
return $this->lignesCommandes;
}
public function addLignesCommande(LignesCommandes $lignesCommande): self
{
if (!$this->lignesCommandes->contains($lignesCommande)) {
$this->lignesCommandes[] = $lignesCommande;
$lignesCommande->setProduit($this);
}
return $this;
}
public function removeLignesCommande(LignesCommandes $lignesCommande): self
{
if ($this->lignesCommandes->removeElement($lignesCommande)) {
// set the owning side to null (unless already changed)
if ($lignesCommande->getProduit() === $this) {
$lignesCommande->setProduit(null);
}
}
return $this;
}
/**
* @return Collection<int, Panier>
*/
public function getPaniers(): Collection
{
return $this->paniers;
}
public function addPanier(Panier $panier): self
{
if (!$this->paniers->contains($panier)) {
$this->paniers[] = $panier;
$panier->setProduit($this);
}
return $this;
}
public function removePanier(Panier $panier): self
{
if ($this->paniers->removeElement($panier)) {
// set the owning side to null (unless already changed)
if ($panier->getProduit() === $this) {
$panier->setProduit(null);
}
}
return $this;
}
public function isActive(): ?bool
{
return $this->active;
}
public function setActive(?bool $active): self
{
$this->active = $active;
return $this;
}
public function getCategorie(): ?CategorieProduits
{
return $this->categorie;
}
public function setCategorie(?CategorieProduits $categorie): self
{
$this->categorie = $categorie;
return $this;
}
/**
* @return Collection<int, FavorisProduits>
*/
public function getFavoris(): Collection
{
return $this->favoris;
}
public function addFavori(FavorisProduits $favori): self
{
if (!$this->favoris->contains($favori)) {
$this->favoris[] = $favori;
$favori->setProduit($this);
}
return $this;
}
public function removeFavori(FavorisProduits $favori): self
{
if ($this->favoris->removeElement($favori)) {
// set the owning side to null (unless already changed)
if ($favori->getProduit() === $this) {
$favori->setProduit(null);
}
}
return $this;
}
/**
* Permet d'obtenir la moyenne globale des notes pour cette annonce
*
* @return float
*/
public function getNbVisite()
{
// Calculer la somme des notations
$sum = array_reduce($this->statsproduit->toArray(), function ($total, $comment) {
return $total + $comment->getNbVisite();
}, 0);
// Faire la division avec le nombre de notes
if (count($this->statsproduit) > 0) return $sum;
return 0;
}
/**
* @return Collection|Produitstatsvisite[]
*/
public function getStatsproduit(): Collection
{
return $this->statsproduit;
}
public function addStatsproduit(Produitstatsvisite $statsproduit): self
{
if (!$this->statsproduit->contains($statsproduit)) {
$this->statsproduit[] = $statsproduit;
$statsproduit->setProduit($this);
}
return $this;
}
public function removeStatsproduit(Produitstatsvisite $statsproduit): self
{
if ($this->statsproduit->contains($statsproduit)) {
$this->statsproduit->removeElement($statsproduit);
// set the owning side to null (unless already changed)
if ($statsproduit->getProduit() === $this) {
$statsproduit->setProduit(null);
}
}
return $this;
}
}