<?php
namespace App\Entity\OnlineShop;
use App\Annotation\SiteAware;
use App\Entity\AbstractBase;
use App\Entity\Interfaces\PublishedInterface;
use App\Entity\Interfaces\SiteInterface;
use App\Entity\MiniAbstractBase;
use App\Entity\Traits\NameTrait;
use App\Entity\Traits\PublishedTrait;
use App\Entity\Traits\SiteTrait;
use App\Entity\User;
use App\Entity\UserGroup;
use App\Persistence\Model\UserGroupAccessType;
use App\Repository\OnlineShop\FamilyRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Table(name="vulco_family", indexes={@ORM\Index(name="family_site_idx", columns={"site"})})
* @ORM\Entity(repositoryClass=FamilyRepository::class)
* @Gedmo\SoftDeleteable(fieldName="removedAt", timeAware=false)
* @SiteAware(siteFieldName="site")
*/
class Family extends AbstractBase implements SiteInterface, PublishedInterface
{
use NameTrait;
use PublishedTrait;
use SiteTrait;
/**
* @ORM\Column(type="string", length=200)
*/
private string $name;
/**
* @ORM\Column(type="user_group_access_type", nullable=false, options={"ignore"})
*/
private UserGroupAccessType $userGroupAccessType;
/**
* @ORM\Column(type="user_group_access_type", nullable=false, options={"ignore"})
*/
private UserGroupAccessType $userAccessType;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\OnlineShop\Supplier", fetch="EAGER")
* @ORM\JoinColumn(name="supplier_id", referencedColumnName="id")
*/
private Supplier $supplier;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\OnlineShop\SuperFamily", inversedBy="families", fetch="EAGER")
* @ORM\JoinColumn(name="super_family_id", referencedColumnName="id")
*/
private SuperFamily $superFamily;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\OnlineShop\FamilyLinealDiscount", orphanRemoval=true, cascade={"persist"})
* @ORM\JoinTable(name="vulco_family_lineal_discount",
* joinColumns={@ORM\JoinColumn(name="family_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="family_lineal_discount_id", referencedColumnName="id", unique=true)}
* )
*/
private ?Collection $linealDiscounts;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\UserGroup", inversedBy="families")
* @ORM\JoinTable(name="vulco_families_user_groups",
* joinColumns={@ORM\JoinColumn(name="family_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="user_group_id", referencedColumnName="id")}
* )
*/
private ?Collection $userGroups;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\User")
* @ORM\JoinTable(name="vulco_families_users",
* joinColumns={@ORM\JoinColumn(name="family_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
* )
*/
private ?Collection $users;
/**
* @ORM\OneToOne(targetEntity="App\Entity\OnlineShop\FamilyNoLinealDiscount", orphanRemoval=true, cascade={"persist"})
* @ORM\JoinColumn(name="family_no_lineal_discount_id", referencedColumnName="id")
*/
private FamilyNoLinealDiscount $noLinealDiscount;
public function __construct()
{
$this->userGroupAccessType = new UserGroupAccessType(UserGroupAccessType::getDefaultCode());
$this->userAccessType = new UserGroupAccessType(UserGroupAccessType::getDefaultCode());
$this->linealDiscounts = new ArrayCollection();
$this->userGroups = new ArrayCollection();
$this->users = new ArrayCollection();
}
public function getUserGroupAccessType(): UserGroupAccessType
{
return $this->userGroupAccessType;
}
public function setUserGroupAccessType(UserGroupAccessType $userGroupAccessType): self
{
$this->userGroupAccessType = $userGroupAccessType;
return $this;
}
public function getUserAccessType(): UserGroupAccessType
{
return $this->userAccessType;
}
public function setUserAccessType(UserGroupAccessType $userAccessType): self
{
$this->userAccessType = $userAccessType;
return $this;
}
public function getSupplier(): Supplier
{
return $this->supplier;
}
public function setSupplier(Supplier $supplier): self
{
$this->supplier = $supplier;
return $this;
}
public function getSuperFamily(): SuperFamily
{
return $this->superFamily;
}
public function setSuperFamily(SuperFamily $superFamily): self
{
$this->superFamily = $superFamily;
return $this;
}
public function getLinealDiscounts(): ?Collection
{
return $this->linealDiscounts;
}
public function setLinealDiscounts(?Collection $linealDiscounts): self
{
$this->linealDiscounts = $linealDiscounts;
return $this;
}
public function addLinealDiscount(FamilyLinealDiscount $discount): self
{
if (!$this->linealDiscounts->contains($discount)) {
$this->linealDiscounts->add($discount);
}
return $this;
}
public function removeLinealDiscount(FamilyLinealDiscount $discount): self
{
if ($this->linealDiscounts->contains($discount)) {
$this->linealDiscounts->removeElement($discount);
}
return $this;
}
public function getUserGroups(): ?Collection
{
return $this->userGroups;
}
public function setUserGroups(?Collection $userGroups): self
{
$this->userGroups = $userGroups;
return $this;
}
public function addUserGroup(UserGroup $userGroup): self
{
if (!$this->userGroups->contains($userGroup)) {
$this->userGroups->add($userGroup);
$userGroup->addFamilie($this);
}
return $this;
}
public function removeUserGroup(UserGroup $userGroup): self
{
if ($this->userGroups->contains($userGroup)) {
$this->userGroups->removeElement($userGroup);
}
return $this;
}
public function getUsers(): ?Collection
{
return $this->users;
}
public function setUsers(?Collection $users): self
{
$this->users = $users;
return $this;
}
public function addUser(User $user): self
{
if (!$this->users->contains($user)) {
$this->users->add($user);
}
return $this;
}
public function removeUser(User $user): self
{
if ($this->users->contains($user)) {
$this->users->removeElement($user);
}
return $this;
}
public function getNoLinealDiscount(): FamilyNoLinealDiscount
{
return $this->noLinealDiscount;
}
public function setNoLinealDiscount(FamilyNoLinealDiscount $noLinealDiscount): self
{
$this->noLinealDiscount = $noLinealDiscount;
return $this;
}
public function __toString(): string
{
return $this->id ? $this->getName() : MiniAbstractBase::DEFAULT_EMPTY_STRING;
}
}