<?php
namespace App\Entity\Gos\RenewalOffer;
use App\Entity\Gos\EmailTemplate;
use App\Entity\Gos\PortalSettings;
use App\Entity\Gos\ProductVariant;
use App\Entity\Gos\User;
use App\Repository\Gos\RenewalOffer\RenewalOfferRepository;
use App\Utils\RenewalOffer\RenewalOfferTypes;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=RenewalOfferRepository::class)
* @ORM\HasLifecycleCallbacks
*/
class RenewalOffer
{
public const DAYS_TO_END_ACCESS = 30;
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $introductory;
/**
* @ORM\Column(type="boolean")
*/
private $isActive = true;
/**
* @ORM\Column(type="boolean")
*/
private $isForNewOrdersOnly = false;
/**
* @ORM\OneToMany(targetEntity=SuggestedVariant::class, mappedBy="renewalOffer", orphanRemoval=true, cascade={"persist", "remove"})
*/
private $suggestedVariants;
/**
* @ORM\OneToOne(targetEntity=Discount::class, mappedBy="renewalOffer", cascade={"persist", "remove"})
*/
private $discount;
/**
* @ORM\OneToMany(targetEntity=Freebie::class, mappedBy="renewalOffer", orphanRemoval=true, cascade={"persist", "remove"})
*/
private $freebies;
/**
* @ORM\OneToMany(targetEntity=UserRenewalOffer::class, mappedBy="renewalOffer", orphanRemoval=true)
*/
private $userRenewalOffers;
/**
* @ORM\Column(type="datetime")
*/
private $createdAt;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $updatedAt;
/**
* @ORM\Column(type="json")
*/
private $mailingSettings = [];
/**
* @ORM\Column(type="json", nullable=true)
*/
private $smsSettings = [];
/**
* @ORM\ManyToOne(targetEntity=PortalSettings::class)
* @ORM\JoinColumn(nullable=false)
*/
private $portalSettings;
/**
* @ORM\ManyToOne(targetEntity=EmailTemplate::class, inversedBy="renewalOffers")
*/
private $emailTemplate;
/**
* @ORM\ManyToOne(targetEntity=EmailTemplate::class)
*/
private $informationEmailTemplate;
/**
* @ORM\ManyToMany(targetEntity=ProductVariant::class)
*/
private $informationEmailVariants;
/**
* @ORM\Column(type="string", length=255)
*/
private $type = RenewalOfferTypes::MULTI;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $source;
/**
* @ORM\ManyToOne(targetEntity=User::class)
*/
private $user;
/**
* @ORM\Column(type="boolean", nullable=true)
*/
private $isUsed;
public function __construct()
{
$this->suggestedVariants = new ArrayCollection();
$this->freebies = new ArrayCollection();
$this->userRenewalOffers = new ArrayCollection();
$this->informationEmailVariants = new ArrayCollection();
}
public function __toString()
{
return sprintf("%s_%d", $this->name, $this->id);
}
public function __clone()
{
$this->id = null;
$this->createdAt = null;
$this->updatedAt = null;
$clonedSuggestedVariants = new ArrayCollection();
$clonedFreebies = new ArrayCollection();
$this->userRenewalOffers = new ArrayCollection();
$this->discount = (clone $this->discount)->setRenewalOffer($this);
foreach ($this->suggestedVariants as $suggestedVariant)
{
/** @var SuggestedVariant $clonedSuggestedVariant */
$clonedSuggestedVariant = clone $suggestedVariant;
$clonedSuggestedVariant->setRenewalOffer($this);
$clonedSuggestedVariants->add($clonedSuggestedVariant);
}
foreach ($this->freebies as $freebie)
{
/** @var Freebie $clonedFreebie */
$clonedFreebie = clone $freebie;
$clonedFreebie->setRenewalOffer($this);
$clonedFreebies->add($clonedFreebie);
}
$this->suggestedVariants = $clonedSuggestedVariants;
$this->freebies = $clonedFreebies;
}
/**
* @ORM\PrePersist()
*/
public function prePersist()
{
$this->createdAt = new \DateTime();
}
/**
* @ORM\PreUpdate()
*/
public function preUpdate()
{
$this->updatedAt = new \DateTime();
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getIntroductory(): ?string
{
return $this->introductory;
}
public function setIntroductory(?string $introductory): self
{
$this->introductory = $introductory;
return $this;
}
public function isActive(): ?bool
{
return $this->isActive;
}
public function setIsActive(bool $isActive): self
{
$this->isActive = $isActive;
return $this;
}
public function isForNewOrdersOnly(): ?bool
{
return $this->isForNewOrdersOnly;
}
public function setIsForNewOrdersOnly(bool $isForNewOrdersOnly): self
{
$this->isForNewOrdersOnly = $isForNewOrdersOnly;
return $this;
}
public function toggleActive(): self
{
$this->isActive = !$this->isActive;
return $this;
}
/**
* @return Collection|SuggestedVariant[]
*/
public function getSuggestedVariants(): Collection
{
return $this->suggestedVariants;
}
public function addSuggestedVariant(SuggestedVariant $suggestedVariant): self
{
if (!$this->suggestedVariants->contains($suggestedVariant)) {
$this->suggestedVariants[] = $suggestedVariant;
$suggestedVariant->setRenewalOffer($this);
}
return $this;
}
public function removeSuggestedVariant(SuggestedVariant $suggestedVariant): self
{
if ($this->suggestedVariants->contains($suggestedVariant)) {
$this->suggestedVariants->removeElement($suggestedVariant);
// set the owning side to null (unless already changed)
if ($suggestedVariant->getRenewalOffer() === $this) {
$suggestedVariant->setRenewalOffer(null);
}
}
return $this;
}
public function getDiscount(): ?Discount
{
return $this->discount;
}
public function setDiscount(Discount $discount): self
{
$this->discount = $discount;
// set the owning side of the relation if necessary
if ($discount->getRenewalOffer() !== $this) {
$discount->setRenewalOffer($this);
}
return $this;
}
/**
* @return Collection|Freebie[]
*/
public function getFreebies(): Collection
{
return $this->freebies;
}
public function addFreeby(Freebie $freeby): self
{
if (!$this->freebies->contains($freeby)) {
$this->freebies[] = $freeby;
$freeby->setRenewalOffer($this);
}
return $this;
}
public function removeFreeby(Freebie $freeby): self
{
if ($this->freebies->contains($freeby)) {
$this->freebies->removeElement($freeby);
// set the owning side to null (unless already changed)
if ($freeby->getRenewalOffer() === $this) {
$freeby->setRenewalOffer(null);
}
}
return $this;
}
/**
* @return Collection|UserRenewalOffer[]
*/
public function getUserRenewalOffers(): Collection
{
return $this->userRenewalOffers;
}
public function addUserRenewalOffer(UserRenewalOffer $userRenewalOffer): self
{
if (!$this->userRenewalOffers->contains($userRenewalOffer)) {
$this->userRenewalOffers[] = $userRenewalOffer;
$userRenewalOffer->setRenewalOffer($this);
}
return $this;
}
public function removeUserRenewalOffer(UserRenewalOffer $userRenewalOffer): self
{
if ($this->userRenewalOffers->contains($userRenewalOffer)) {
$this->userRenewalOffers->removeElement($userRenewalOffer);
// set the owning side to null (unless already changed)
if ($userRenewalOffer->getRenewalOffer() === $this) {
$userRenewalOffer->setRenewalOffer(null);
}
}
return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getUpdatedAt(): ?\DateTimeInterface
{
return $this->updatedAt;
}
public function setUpdatedAt(?\DateTimeInterface $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
public function getMailingSettings(): ?array
{
return $this->mailingSettings;
}
public function setMailingSettings(array $mailingSettings): self
{
$this->mailingSettings = $mailingSettings;
return $this;
}
public function getSmsSettings(): ?array
{
return $this->smsSettings;
}
public function setSmsSettings(?array $smsSettings): self
{
$this->smsSettings = $smsSettings;
return $this;
}
public function getPortalSettings(): ?PortalSettings
{
return $this->portalSettings;
}
public function setPortalSettings(?PortalSettings $domain): self
{
$this->portalSettings = $domain;
return $this;
}
public function getEmailTemplate(): ?EmailTemplate
{
return $this->emailTemplate;
}
public function setEmailTemplate(?EmailTemplate $emailTemplate): self
{
$this->emailTemplate = $emailTemplate;
return $this;
}
public function getInformationEmailTemplate(): ?EmailTemplate
{
return $this->informationEmailTemplate;
}
public function setInformationEmailTemplate(?EmailTemplate $informationEmailTemplate): self
{
$this->informationEmailTemplate = $informationEmailTemplate;
return $this;
}
/**
* @return Collection|ProductVariant[]
*/
public function getInformationEmailVariants(): Collection
{
return $this->informationEmailVariants;
}
public function addInformationEmailVariant(ProductVariant $informationEmailVariant): self
{
if (!$this->informationEmailVariants->contains($informationEmailVariant)) {
$this->informationEmailVariants[] = $informationEmailVariant;
}
return $this;
}
public function removeInformationEmailVariant(ProductVariant $informationEmailVariant): self
{
if ($this->informationEmailVariants->contains($informationEmailVariant)) {
$this->informationEmailVariants->removeElement($informationEmailVariant);
}
return $this;
}
public function getType(): ?string
{
return $this->type;
}
public function setType(string $type): self
{
$this->type = $type;
return $this;
}
public function getSource(): ?string
{
return $this->source;
}
public function setSource(?string $source): self
{
$this->source = $source;
return $this;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
public function getIsUsed(): ?bool
{
return $this->isUsed;
}
public function setIsUsed(?bool $isUsed): self
{
$this->isUsed = $isUsed;
return $this;
}
}