<?php
namespace App\Entity\Gos;
use App\Enum\CouponCombinationMode;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* Coupon
*
* @ORM\Table(name="coupon")
* @ORM\Entity(repositoryClass="App\Repository\CouponRepository")
* @ORM\HasLifecycleCallbacks
*/
class Coupon extends BaseCoupon
{
/**
* @var string
*
* @ORM\Column(name="code", type="string", length=191, unique=true)
*/
protected $code;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Gos\ProductVariant", inversedBy="coupon")
* @ORM\JoinTable(name="product_variant_coupon")
*/
private $productVariant;
/**
* @ORM\ManyToMany(targetEntity="ProductVariantPack", inversedBy="coupons")
* @ORM\JoinTable(name="product_variant_pack_coupon")
*/
private $productVariantPacks;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Gos\ProductVariant", inversedBy="gratisCoupon")
* @ORM\JoinTable(name="product_variant_gratis_coupon")
*/
private $gratis;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Gos\ProductVariant", inversedBy="bundleCoupon")
* @ORM\JoinTable(name="product_variant_bundle_coupon")
*/
private $bundleProducts;
/**
* @ORM\Column(type="boolean", nullable=true)
*/
private $appliesToPack;
/**
* @ORM\Column(type="boolean", nullable=true)
*/
private $discountsAllProducts;
/**
* @ORM\ManyToMany(targetEntity=ProductVariant::class)
* @ORM\JoinTable(name="product_variant_coupon_exception")
*/
private $productVariantException;
/**
* @ORM\ManyToMany(targetEntity=ProductVariantPack::class)
* @ORM\JoinTable(name="product_variant_pack_coupon_exception")
*/
private $productVariantPackException;
/**
* @ORM\Column(type="boolean", nullable=true)
*/
private $isPubliclyAvailable;
/**
* @ORM\ManyToOne(targetEntity=ColporteurVoucher::class, inversedBy="coupons")
*/
private $colporteurVoucher;
/**
* @ORM\Column(type="string", nullable=false, options={"default":"none"})
*/
private $combinationMode = CouponCombinationMode::NONE;
/**
* @ORM\ManyToMany(targetEntity=Coupon::class, mappedBy="couponsToCombine")
*/
private $couponsCombiningWithMe;
/**
* @ORM\JoinTable(name="coupon_combination")
* @ORM\ManyToMany(targetEntity=Coupon::class, inversedBy="couponsCombiningWithMe")
*/
private $couponsToCombine;
/**
* Constructor
*/
public function __construct()
{
parent::__construct();
$this->productVariant = new ArrayCollection();
$this->gratis = new ArrayCollection();
$this->bundleProducts = new ArrayCollection();
$this->productVariantPacks = new ArrayCollection();
$this->productVariantException = new ArrayCollection();
$this->productVariantPackException = new ArrayCollection();
$this->couponsCombiningWithMe = new ArrayCollection();
$this->couponsToCombine = new ArrayCollection();
}
/**
* Add productVariant
*
* @param \App\Entity\Gos\ProductVariant $productVariant
*
* @return Coupon
*/
public function addProductVariant(\App\Entity\Gos\ProductVariant $productVariant)
{
if (!$this->productVariant->contains($productVariant))
{
$this->productVariant[] = $productVariant;
$productVariant->addCoupon($this);
}
return $this;
}
/**
* Remove productVariant
*
* @param \App\Entity\Gos\ProductVariant $productVariant
*/
public function removeProductVariant(\App\Entity\Gos\ProductVariant $productVariant)
{
if ($this->productVariant->contains($productVariant))
{
$this->productVariant->removeElement($productVariant);
$productVariant->removeCoupon($this);
}
}
/**
* Get productVariant
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getProductVariant()
{
return $this->productVariant;
}
/**
* Add bundleProducts
*
* @param \App\Entity\Gos\ProductVariant $productVariant
* @return Coupon
*/
public function addBundleProduct(\App\Entity\Gos\ProductVariant $productVariant)
{
$this->bundleProducts[] = $productVariant;
return $this;
}
/**
* Remove bundleProducts
*
* @param \App\Entity\Gos\ProductVariant $productVariant
*/
public function removeBundleProduct(\App\Entity\Gos\ProductVariant $productVariant)
{
$this->bundleProducts->removeElement($productVariant);
}
/**
* Get bundleProducts
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getBundleProducts()
{
return $this->bundleProducts;
}
/**
* Set bundleProducts
*
* @param \Doctrine\Common\Collections\Collection $bundleProducts
* @return \App\Entity\Gos\Coupon
*/
public function setBundleProducts($bundleProducts)
{
$this->bundleProducts = $bundleProducts;
return $this;
}
/**
* @return Collection|ProductVariant[]
*/
public function getGratis()
{
return $this->gratis;
}
public function addGrati(ProductVariant $grati): self
{
if (!$this->gratis->contains($grati)) {
$this->gratis[] = $grati;
}
return $this;
}
public function removeGrati(ProductVariant $grati): self
{
if ($this->gratis->contains($grati)) {
$this->gratis->removeElement($grati);
}
return $this;
}
/**
* @return Collection|ProductVariantPack[]
*/
public function getProductVariantPacks()
{
return $this->productVariantPacks;
}
public function addProductVariantPack(ProductVariantPack $productVariantPack): self
{
if (!$this->productVariantPacks->contains($productVariantPack)) {
$this->productVariantPacks[] = $productVariantPack;
}
return $this;
}
public function removeProductVariantPack(ProductVariantPack $productVariantPack): self
{
if ($this->productVariantPacks->contains($productVariantPack)) {
$this->productVariantPacks->removeElement($productVariantPack);
}
return $this;
}
public function getAppliesToPack(): ?bool
{
return $this->appliesToPack;
}
public function setAppliesToPack(?bool $appliesToPack): self
{
$this->appliesToPack = $appliesToPack;
return $this;
}
public function getDiscountsAllProducts(): ?bool
{
return $this->discountsAllProducts;
}
public function setDiscountsAllProducts(?bool $discountsAllProducts): self
{
$this->discountsAllProducts = $discountsAllProducts;
return $this;
}
/**
* @return Collection|ProductVariant[]
*/
public function getProductVariantException(): Collection
{
return $this->productVariantException;
}
public function addProductVariantException(ProductVariant $productVariantException): self
{
if (!$this->productVariantException->contains($productVariantException)) {
$this->productVariantException[] = $productVariantException;
}
return $this;
}
public function removeProductVariantException(ProductVariant $productVariantException): self
{
if ($this->productVariantException->contains($productVariantException)) {
$this->productVariantException->removeElement($productVariantException);
}
return $this;
}
/**
* @return Collection|ProductVariantPack[]
*/
public function getProductVariantPackException(): Collection
{
return $this->productVariantPackException;
}
public function addProductVariantPackException(ProductVariantPack $productVariantPackException): self
{
if (!$this->productVariantPackException->contains($productVariantPackException)) {
$this->productVariantPackException[] = $productVariantPackException;
}
return $this;
}
public function removeProductVariantPackException(ProductVariantPack $productVariantPackException): self
{
if ($this->productVariantPackException->contains($productVariantPackException)) {
$this->productVariantPackException->removeElement($productVariantPackException);
}
return $this;
}
public function getIsPubliclyAvailable(): ?bool
{
return $this->isPubliclyAvailable;
}
public function setIsPubliclyAvailable(?bool $isPubliclyAvailable): self
{
$this->isPubliclyAvailable = $isPubliclyAvailable;
return $this;
}
public function getColporteurVoucher(): ?ColporteurVoucher
{
return $this->colporteurVoucher;
}
public function setColporteurVoucher(?ColporteurVoucher $colporteurVoucher): self
{
$this->colporteurVoucher = $colporteurVoucher;
return $this;
}
public function setCombinationMode(string $combinationMode = CouponCombinationMode::NONE): self
{
if (!in_array($combinationMode, [
CouponCombinationMode::NONE,
CouponCombinationMode::ALL,
CouponCombinationMode::SELECTED
])) {
throw new \InvalidArgumentException("Invalid status");
}
$this->combinationMode = $combinationMode;
return $this;
}
public function getCombinationMode(): string
{
return $this->combinationMode;
}
public function addCouponsToCombine(Coupon $coupon): self
{
if (!$this->couponsToCombine->contains($coupon))
{
$this->couponsToCombine->add($coupon);
$this->couponsCombiningWithMe->add($coupon);
if ($coupon->getCombinationMode() === CouponCombinationMode::NONE)
{
$coupon->setCombinationMode(CouponCombinationMode::SELECTED);
}
$coupon->addCouponsToCombine($this);
}
return $this;
}
public function removeCouponsToCombine(Coupon $coupon): self
{
if ($this->couponsToCombine->contains($coupon))
{
$this->couponsToCombine->removeElement($coupon);
$this->couponsCombiningWithMe->removeElement($coupon);
$coupon->removeCouponsToCombine($this);
}
return $this;
}
public function getCouponsToCombine(): Collection
{
return $this->couponsToCombine;
}
}