<?php
namespace App\Entity;
use App\Repository\ModelRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use DateTime;
//Repository de la classe Model
#[ORM\Entity(repositoryClass: ModelRepository::class)]
class Model
{
use TimestampableEntity;
//Déclarations des variables
#[ORM\Id]
#[ORM\Column(name: 'id_model',type: 'integer', nullable: false)]
//Spécifie que la valeur générée est un ID auto-incrémenté
#[ORM\GeneratedValue(strategy:'IDENTITY')]
private ?int $id;
#[ORM\Column(type:'integer',nullable:true)]
private ?int $annee = null;
#[ORM\Column(length:255,nullable:true)]
private ?string $nbExemplaireEdite = null;
#[ORM\Column(length:255,nullable:true)]
private ?string $fournisseur = null;
#[ORM\Column(length: 255, nullable: false)]
private ?string $titre = null;
#[ORM\Column(length: 2000, nullable: false)]
private ?string $description = null;
#[ORM\Column(type: 'integer',nullable: false)]
private ?int $nb = null;
#[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: false)]
#[Gedmo\Timestampable(on : 'create', field: 'dateCreation')]
private ?DateTime $dateCreation;
#[ORM\Column(type: Types::DATETIME_MUTABLE, nullable: false)]
#[Gedmo\Timestampable(on : 'update', field: 'dateModification')]
private ?DateTime $dateModification;
#[ORM\Column(nullable:true)]
private ?string $diametre = null;
#[ORM\Column(nullable:true)]
private ?string $reference = null;
//Association
#[ORM\OneToMany(mappedBy:'model', targetEntity: Photo::class, orphanRemoval: true)]
private Collection $photos;
//Associations bidirectionnelle
#[ORM\ManyToMany(targetEntity: Categorie::class, inversedBy: 'models', fetch: "EAGER")]
#[ORM\JoinTable(name:'model_categorie')]
#[ORM\JoinColumn(name: 'id_model', referencedColumnName: 'id_model')]
#[ORM\InverseJoinColumn(name: 'id_categorie', referencedColumnName: 'id_categorie')]
private ?Collection $categories;
#[ORM\ManyToMany(targetEntity: SousCategorie::class, inversedBy: 'models', fetch: "EAGER")]
#[ORM\JoinTable(name:'model_ss_categorie')]
#[ORM\JoinColumn(name: 'id_model', referencedColumnName: 'id_model')]
#[ORM\InverseJoinColumn(name: 'id_sous_categorie', referencedColumnName: 'id_sous_categorie')]
private ?Collection $sousCategories;
#[ORM\ManyToMany(targetEntity: Tag::class, inversedBy: 'models', fetch: "EAGER", orphanRemoval: true)]
#[ORM\JoinTable(name:'model_tag')]
#[ORM\JoinColumn(name: 'id_model', referencedColumnName: 'id_model')]
#[ORM\InverseJoinColumn(name: 'id_tag', referencedColumnName: 'id_tag')]
private ?Collection $tags;
#[ORM\ManyToMany(targetEntity: Page::class, inversedBy: 'models', fetch: "EAGER")]
#[ORM\JoinTable(name:'model_page')]
#[ORM\JoinColumn(name: 'id_model', referencedColumnName: 'id_model')]
#[ORM\InverseJoinColumn(name: 'id_page', referencedColumnName: 'id_page')]
private ?Collection $pages;
#[ORM\ManyToOne(targetEntity: Matiere::class, inversedBy: 'models')]
#[ORM\JoinColumn(referencedColumnName: 'id_matiere', nullable: false)]
private ?Matiere $matiere = null;
#[ORM\ManyToOne(targetEntity: Forme::class, inversedBy: 'models')]
#[ORM\JoinColumn(referencedColumnName: 'id_forme', nullable: false)]
private ?Forme $forme = null;
#[ORM\ManyToOne(targetEntity: Localisation::class, inversedBy: 'models')]
#[ORM\JoinColumn(referencedColumnName: 'id_localisation', nullable: false)]
private ?Localisation $localisation = null;
#[ORM\ManyToOne(targetEntity: TypeCollection::class, inversedBy: 'models')]
#[ORM\JoinColumn(referencedColumnName: 'id_type_collection', nullable: false)]
private ?TypeCollection $typeCollection = null;
//Constructeur
public function __construct()
{
$this->photos = new ArrayCollection();
$this->categories = new ArrayCollection();
$this->sousCategories = new ArrayCollection();
$this->tags = new ArrayCollection();
$this->pages = new ArrayCollection();
}
//On génère uniquement un getter pour l'id auto implémenté
/**
* @return int|null
*/
public function getId(): ?int
{
return $this->id;
}
/**
* @return Localisation|null
*/
public function getLocalisation(): ?Localisation
{
return $this->localisation;
}
/**
* @param Localisation|null $localisation
*/
public function setLocalisation(?Localisation $localisation): void
{
$this->localisation = $localisation;
}
/**
* @return Forme|null
*/
public function getForme(): ?Forme
{
return $this->forme;
}
/**
* @param Forme|null $forme
*/
public function setForme(?Forme $forme): void
{
$this->forme = $forme;
}
/**
* @return int|null
*/
public function getAnnee(): ?int
{
return $this->annee;
}
/**
* @param int|null $annee
*/
public function setAnnee(?int $annee): void
{
$this->annee = $annee;
}
/**
* @return string|null
*/
public function getNbExemplaireEdite(): ?string
{
return $this->nbExemplaireEdite;
}
/**
* @param string|null $nbExemplaireEdite
*/
public function setNbExemplaireEdite(?string $nbExemplaireEdite): void
{
$this->nbExemplaireEdite = $nbExemplaireEdite;
}
/**
* @return string|null
*/
public function getFournisseur(): ?string
{
return $this->fournisseur;
}
/**
* @return string|null
*/
public function getLocalisationVille(): ?string
{
return ($this->localisation)?$this->localisation->getVille():null;
}
/**
* @return string|null
*/
public function getLocalisationPays(): ?string
{
return ($this->localisation)?$this->localisation->getPays():null;
}
/**
* @return string|null
*/
public function getLocalisationRegion(): ?string
{
return ($this->localisation)?$this->localisation->getRegion():null;
}
/**
* @return string|null
*/
public function getLocalisationDepartement(): ?string
{
return ($this->localisation)?$this->localisation->getDepartement():null;
}
/**
* @param string|null $fournisseur
*/
public function setFournisseur(?string $fournisseur): void
{
$this->fournisseur = $fournisseur;
}
/**
* @return string|null
*/
public function getTitre(): ?string
{
return $this->titre;
}
/**
* @param string|null $titre
*/
public function setTitre(?string $titre): void
{
$this->titre = $titre;
}
/**
* @return string|null
*/
public function getDescription(): ?string
{
return $this->description;
}
/**
* @param string|null $description
*/
public function setDescription(?string $description): void
{
$this->description = $description;
}
/**
* @return int|null
*/
public function getNb(): ?int
{
return $this->nb;
}
/**
* @param int|null $nb
*/
public function setNb(?int $nb): void
{
$this->nb = $nb;
}
/**
* @return DateTime|null
*/
public function getDateCreation(): ?DateTime
{
return $this->dateCreation;
}
/**
* @param DateTime|null $dateCreation
*/
public function setDateCreation(?DateTime $dateCreation): void
{
$this->dateCreation = $dateCreation;
}
/**
* @return DateTime|null
*/
public function getDateModification(): ?DateTime
{
return $this->dateModification;
}
/**
* @param DateTime|null $dateModification
*/
public function setDateModification(?DateTime $dateModification): void
{
$this->dateModification = $dateModification;
}
/**
* @return string|null
*/
public function getDiametre(): ?string
{
return $this->diametre;
}
/**
* @param string|null $diametre
*/
public function setDiametre(?string $diametre): void
{
$this->diametre = $diametre;
}
/**
* @return string|null
*/
public function getReference(): ?string
{
return $this->reference;
}
/**
* @param string|null $reference
*/
public function setReference(?string $reference): void
{
$this->reference = $reference;
}
/**
* @return Matiere|null
*/
public function getMatiere(): ?Matiere
{
return $this->matiere;
}
/**
* @param Matiere|null $matiere
*/
public function setMatiere(?Matiere $matiere): void
{
$this->matiere = $matiere;
}
//Getter et Setter associations
/**
* @return Collection<int, Tag>
*/
public function getTags(): Collection
{
return $this->tags;
}
public function addTag(?Tag $tag): self
{
if (!$this->tags->contains($tag)) {
$this->tags->add($tag);
$tag->addModel($this);
}
return $this;
}
public function removeTag(?Tag $tag): self
{
if ($this->tags->removeElement($tag)) {
// set the owning side to null (unless already changed)
if ($tag->getModels() === $this) {
$tag->removeModel($this) ;
}
}
return $this;
}
/**
* @return Collection<int, Photo>
*/
public function getPhotos(): Collection
{
return $this->photos;
}
public function addPhoto(Photo $photo): self
{
if (!$this->photos->contains($photo)) {
$this->photos->add($photo);
$photo->addModel($this);
}
return $this;
}
public function removePhoto(Photo $photo): self
{
if ($this->photos->removeElement($photo)) {
// set the owning side to null (unless already changed)
if ($photo->getModel() === $this) {
$photo->setModel(null);
}
}
return $this;
}
/**
* @return Collection<int, Categorie>
*/
public function getCategories(): Collection
{
return $this->categories;
}
public function addCategorie(?Categorie $categorie): self
{
if (!is_null($categorie) && !$this->categories->contains($categorie)) {
$this->categories->add($categorie);
$categorie->addModel($this);
}
return $this;
}
public function removeCategorie(?Categorie $categorie): self
{
if ($this->categories->removeElement($categorie)) {
// set the owning side to null (unless already changed)
if ($categorie->getModels() === $this) {
$categorie->removeModel(null);
}
}
return $this;
}
public function setCategories(?Collection $categories): void
{
// Remove associations with current categories
foreach ($this->categories as $existingCategory) {
if (!$categories || !$categories->contains($existingCategory)) {
$this->removeCategorie($existingCategory);
}
}
// Add associations with new categories
if ($categories) {
foreach ($categories as $newCategory) {
$this->addCategorie($newCategory);
}
}
}
/**
* @return Collection<int, SousCategorie>
*/
public function getSousCategories(): Collection
{
return $this->sousCategories;
}
public function addSousCategorie(?SousCategorie $sousCategorie): self
{
if (!is_null($sousCategorie) && !$this->sousCategories->contains($sousCategorie)) {
$this->sousCategories->add($sousCategorie);
$sousCategorie->addModel($this);
}
return $this;
}
public function removeSousCategorie(?SousCategorie $sousCategorie): self
{
if ($this->sousCategories->removeElement($sousCategorie)) {
// set the owning side to null (unless already changed)
if ($sousCategorie->getModels() === $this) {
$sousCategorie->removeModel(null);
}
}
return $this;
}
public function setSousCategories(Collection $sousCategories): self
{
// Dissocier le modèle actuel de toutes les sous-catégories existantes
foreach ($this->sousCategories as $sousCategorie) {
if (!$sousCategories->contains($sousCategorie)) {
$this->removeSousCategorie($sousCategorie);
}
}
// Associer le modèle aux nouvelles sous-catégories et vice versa
foreach ($sousCategories as $sousCategorie) {
$this->addSousCategorie($sousCategorie);
}
return $this;
}
/**
* @return Collection<string, Page>
*/
public function getPages(): Collection
{
return $this->pages;
}
public function addPage(Page $page): self
{
if (!$this->pages->contains($page)) {
$this->pages->add($page);
$page->addModel($this);
}
return $this;
}
public function removePage(Page $page): self
{
if ($this->pages->removeElement($page)) {
// set the owning side to null (unless already changed)
if ($page->getModels() === $this) {
$page->addModel(null);
}
}
return $this;
}
/**
* @return int|null
*/
public function getPageNumero(): ?int
{
$page = $this->pages->first();
if ($page){
return $page->getNumero();
}
return null;
}
public function getTypeCollection(): ?TypeCollection
{
return $this->typeCollection;
}
public function setTypeCollection(?TypeCollection $typeCollection): self
{
$this->typeCollection = $typeCollection;
return $this;
}
public function getTagsText() {
return join(', ', $this->tags->toArray());
}
/*Model emplacement traitement*/
/**
* @return Armoire|null
*/
public function getArmoireNom(): ?Armoire
{
$page = $this->pages->first(); // Récupère la première page associée au modèle
if ($page) {
$classeur = $page->getClasseur(); // Récupère le classeur associé à la page
if ($classeur) {
$armoire = $classeur->getArmoire(); // Récupère l'armoire associée au classeur
return $armoire;
}
}
return null;
}
/**
* @return Etagere|null
*/
public function getEtagereNom(): ?Etagere
{
$page = $this->pages->first(); // Récupère la première page associée au modèle
if ($page) {
$classeur = $page->getClasseur(); // Récupère le classeur associé à la page
if ($classeur) {
$etagere = $classeur->getEtagere(); // Récupère l'armoire associée au classeur
return $etagere;
}
}
return null;
}
/**
* @return Classeur|null
*/
public function getClasseurNom(): ?Classeur
{
$page = $this->pages->first(); // Récupère la première page associée au modèle
if ($page) {
$classeur = $page->getClasseur(); // Récupère le classeur associé à la page
return $classeur;
}
return null;
}
/**
* @param Classeur $classeur
*/
public function setClasseur(Classeur $classeur)
{
$page = $this->getPages()->first();
if ($page) {
$page->setClasseur($classeur);
}
}
}