<?php
namespace App\AtechNet\CoreBundle\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Entity;
use Doctrine\ORM\Mapping\JoinColumn;
use Doctrine\ORM\Mapping\JoinTable;
use Doctrine\ORM\Mapping\ManyToMany;
use Doctrine\ORM\Mapping\ManyToOne;
use Doctrine\ORM\Mapping\Table as Table;
/**
* Coupon
*
* @Table(name="coupons")
* @Entity(repositoryClass="App\AtechNet\CoreBundle\Repository\CouponRepository")
*/
class Coupon extends AbstractSignedEntity
{
public const DISCOUNT_TYPE_PERCENT = 1;
public const DISCOUNT_TYPE_PRICE = 2;
public const DISCOUNT_TYPE_BONUS_PRODUCT = 3;
public const COUPON_PRODUCT_ID = 10427;
public const MAC_MOUSE_COUPON_CODE = 'MACLICK';
public const SUMMER_2026_COUPON_CODE = 'SUMMER10';
public static function getDiscountTypes(): array
{
return [
'Price percent' => self::DISCOUNT_TYPE_PERCENT,
'Price discount' => self::DISCOUNT_TYPE_PRICE,
// 'Bonus product' => self::DISCOUNT_TYPE_BONUS_PRODUCT
];
}
/**
* @var Domain
*
* @ManyToOne(targetEntity="Domain")
* @JoinColumn(name="domain_id", referencedColumnName="id", nullable=false)
*/
private $domain;
/**
* @var string
*
* @Column(name="code", type="string", length=24)
*/
private $code;
/**
* @var bool
*
* @Column(name="enabled", type="boolean")
*/
private $enabled = false;
/**
* @var string
*
* @Column(name="description", type="text")
*/
private $description;
/**
* @var \DateTime
*
* @Column(name="valid_form", type="datetime", nullable=true)
*/
private $validFrom;
/**
* @var \DateTime
*
* @Column(name="valid_to", type="datetime", nullable=true)
*/
private $validTo;
/**
* @var int
*
* @Column(name="discount_type", type="integer")
*/
private $discountType;
/**
* @var int
*
* @Column(name="discount", type="float")
*/
private $discount;
/**
* @var int
*
* @Column(name="total", type="float")
*/
private $total;
/**
* @var bool
*
* @Column(name="available_for_discounted_products", type="boolean")
*/
private $availableForDiscountedProducts = false;
/**
* @var bool
*
* @Column(name="only_once_use", type="boolean")
*/
private $onlyOnceUse = false;
/**
* @var bool
*
* @Column(name="only_once_customer_use", type="boolean")
*/
private $onlyOnceCustomerUse = false;
/**
* @var bool
*
* @Column(name="free_shipping", type="boolean")
*/
private $freeShipping = false;
/**
* @var ArrayCollection
*
* @ManyToMany(targetEntity="ProductType")
* @JoinTable(name="coupons__product_types",
* joinColumns={@JoinColumn(name="coupon_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="product_type_id", referencedColumnName="id")}
* )
*/
private $productTypes;
/**
* @var ArrayCollection
*
* @ManyToMany(targetEntity="Vendor")
* @JoinTable(name="coupons__vendors",
* joinColumns={@JoinColumn(name="coupon_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="vendor_id", referencedColumnName="id")}
* )
*/
private $vendors;
/**
* @var ArrayCollection
*
* @ManyToMany(targetEntity="Product", inversedBy="coupons")
* @JoinTable(name="coupons__products",
* joinColumns={@JoinColumn(name="coupon_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="product_id", referencedColumnName="id")}
* )
*/
private $products;
/**
* @var string
*
* @Column(name="product_tags", type="string", nullable=true)
*/
private string|null $productTags;
/**
* @var bool
*
* @Column(name="show_badge_on_website", type="boolean", options={"default": false})
*/
private bool $showBadgeOnWebsite = false;
public function __construct()
{
parent::__construct();
$this->productTypes = new ArrayCollection();
$this->vendors = new ArrayCollection();
$this->products = new ArrayCollection();
}
/**
* @return Domain
*/
public function getDomain()
{
return $this->domain;
}
/**
* @param Domain $domain
*/
public function setDomain($domain)
{
$this->domain = $domain;
}
/**
* @return string
*/
public function getCode()
{
return $this->code;
}
/**
* @param string $code
*/
public function setCode($code)
{
$this->code = $code;
}
/**
* @return bool
*/
public function isEnabled()
{
return $this->enabled;
}
/**
* @param bool $enabled
*/
public function setEnabled($enabled)
{
$this->enabled = $enabled;
}
/**
* @return string
*/
public function getDescription()
{
return $this->description;
}
/**
* @param string $description
*/
public function setDescription($description)
{
$this->description = $description;
}
/**
* @return \DateTime
*/
public function getValidFrom()
{
return $this->validFrom;
}
/**
* @param \DateTime $validFrom
*/
public function setValidFrom($validFrom)
{
$this->validFrom = $validFrom;
}
/**
* @return \DateTime
*/
public function getValidTo()
{
return $this->validTo;
}
/**
* @param \DateTime $validTo
*/
public function setValidTo($validTo)
{
$this->validTo = $validTo;
}
/**
* @return bool
*/
public function isActive()
{
if (!$this->enabled) {
return false;
}
$currentDateTime = new \DateTime();
if (!is_null($this->validFrom) && is_null($this->validTo)) {
return $this->validFrom < $currentDateTime;
} elseif (is_null($this->validFrom) && !is_null($this->validTo)) {
return $this->validTo > $currentDateTime;
} elseif (!is_null($this->validFrom) && !is_null($this->validTo)) {
return $this->validFrom < $currentDateTime && $this->validTo > $currentDateTime;
}
return true;
}
/**
* @return int
*/
public function getDiscount()
{
return $this->discount;
}
/**
* @param int $discount
*/
public function setDiscount($discount)
{
$this->discount = $discount;
}
/**
* @return int
*/
public function getDiscountType()
{
return $this->discountType;
}
/**
* @param int $discountType
*/
public function setDiscountType($discountType)
{
$this->discountType = $discountType;
}
/**
* @return float
*/
public function getTotal(): ?float
{
return $this->total;
}
/**
* @param float $total
*/
public function setTotal(float $total)
{
$this->total = $total;
}
/**
* @return bool
*/
public function isAvailableForDiscountedProducts()
{
return $this->availableForDiscountedProducts;
}
/**
* @param bool $availableForDiscountedProducts
*/
public function setAvailableForDiscountedProducts($availableForDiscountedProducts)
{
$this->availableForDiscountedProducts = $availableForDiscountedProducts;
}
/**
* @return bool
*/
public function hasFreeShipping(): bool
{
return $this->freeShipping;
}
/**
* @param bool $freeShipping
*/
public function setFreeShipping(bool $freeShipping)
{
$this->freeShipping = $freeShipping;
}
/**
* @return bool
*/
public function isOnlyOnceUse(): bool
{
return $this->onlyOnceUse;
}
/**
* @param bool $onlyOnceUse
*/
public function setOnlyOnceUse(bool $onlyOnceUse)
{
$this->onlyOnceUse = $onlyOnceUse;
}
/**
* @return bool
*/
public function isOnlyOnceCustomerUse(): bool
{
return $this->onlyOnceCustomerUse;
}
/**
* @param bool $onlyOnceCustomerUse
*/
public function setOnlyOnceCustomerUse(bool $onlyOnceCustomerUse)
{
$this->onlyOnceCustomerUse = $onlyOnceCustomerUse;
}
/**
* @return Collection
*/
public function getProductTypes(): Collection
{
return $this->productTypes;
}
/**
* @param ArrayCollection $productTypes
*/
public function setProductTypes(ArrayCollection $productTypes)
{
$this->productTypes = $productTypes;
}
/**
* @param ProductType $productType
*/
public function addProductType(ProductType $productType)
{
$this->productTypes->add($productType);
}
/**
* @param ProductType $productType
*/
public function removeProductType(ProductType $productType)
{
$this->productTypes->removeElement($productType);
}
/**
* @return Collection
*/
public function getVendors(): Collection
{
return $this->vendors;
}
/**
* @param ArrayCollection $vendors
*/
public function setVendors(ArrayCollection $vendors)
{
$this->vendors = $vendors;
}
/**
* @param Vendor $vendor
*/
public function addVendor(Vendor $vendor)
{
$this->vendors->add($vendor);
}
/**
* @param Vendor $vendor
*/
public function removeVendor(Vendor $vendor)
{
$this->vendors->removeElement($vendor);
}
/**
* @return Collection
*/
public function getProducts(): Collection
{
return $this->products;
}
/**
* @param ArrayCollection $products
*/
public function setProducts(ArrayCollection $products)
{
$this->products = $products;
}
/**
* @param Product $product
*/
public function addProduct(Product $product)
{
if ( !$this->products->contains($product) ) {
$this->products->add($product);
}
}
/**
* @param Product $product
*/
public function removeProduct(Product $product)
{
$this->products->removeElement($product);
}
public function clearProducts(): void
{
$this->products = new ArrayCollection();
}
/**
* @return string|null
*/
public function getEmail(): ?string
{
return $this->email;
}
/**
* @param string|null $email
*/
public function setEmail(?string $email)
{
$this->email = $email;
}
public function getProductTagIds(): array
{
if (is_null($this->productTags)) {
return [];
}
return explode(',', trim($this->productTags, ','));
}
public function addProductTag(string|int $productTagId): void
{
$this->productTags .= $productTagId . ',';
}
public function removeProductTag(string|int $productTagId): void
{
$productTags = explode(',', trim($this->productTags, ','));
foreach ($productTags as $key => $tag) {
if ($tag == (string)$productTagId) {
unset($productTags[$key]);
}
}
$this->productTags = implode(',', $productTags);
}
/**
* @return bool
*/
public function isShowBadgeOnWebsite(): bool
{
return $this->showBadgeOnWebsite;
}
/**
* @param bool $showBadgeOnWebsite
*
* @return void
*/
public function setShowBadgeOnWebsite(bool $showBadgeOnWebsite): void
{
$this->showBadgeOnWebsite = $showBadgeOnWebsite;
}
}