<?php
namespace App\Entity\Gos;
use App\Repository\Gos\CancellationQuestionRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=CancellationQuestionRepository::class)
*/
class CancellationQuestion
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=CancellationForm::class, inversedBy="cancellationQuestions")
*/
private $cancellationForm;
/**
* @ORM\ManyToOne(targetEntity=CancellationPoll::class, inversedBy="cancellationQuestions")
*/
private $cancellationPoll;
/**
* @ORM\Column(type="string", length=255)
*/
private $questionType;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\Column(type="boolean")
*/
private $isRequired;
/**
* @ORM\OneToMany(targetEntity=CancellationQuestionChoice::class, mappedBy="cancellationQuestion", orphanRemoval=true, cascade={"persist", "remove"})
*/
private $cancellationQuestionChoices;
/**
* @ORM\ManyToOne(targetEntity=CancellationQuestionChoice::class, inversedBy="cancellationSubquestions")
*/
private $parentCancellationQuestionChoice;
/**
* @ORM\Column(type="array", nullable=true)
*/
private $specificProductTypesVisibility = [];
/**
* @ORM\Column(type="integer")
*/
private $position;
/**
* @ORM\Column(type="boolean", options={"default": 1})
*/
private $isLabelVisible = true;
/**
* @ORM\ManyToMany(targetEntity=CancellationQuestion::class, inversedBy="necessaryForQuestions")
* @ORM\JoinTable(name="cancellation_question_necessary_question")
*/
private $necessaryQuestions;
/**
* @ORM\ManyToMany(targetEntity=CancellationQuestion::class, mappedBy="necessaryQuestions")
*/
private $necessaryForQuestions;
/**
* @ORM\ManyToOne(targetEntity=CancellationQuestionChoice::class, inversedBy="additionalCancellationQuestions")
*/
private $additionalQuestionForChoice;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $randomOrderForChoices;
/**
* @ORM\ManyToMany(targetEntity=CancellationQuestion::class, inversedBy="multiQuestionsRequirementBy")
* @ORM\JoinTable(name="cancellation_question_multi_requirement")
*/
private $multiQuestionsRequirement;
/**
* @ORM\ManyToMany(targetEntity=CancellationQuestion::class, mappedBy="multiQuestionsRequirement")
*/
private $multiQuestionsRequirementBy;
public function __construct()
{
$this->cancellationQuestionChoices = new ArrayCollection();
$this->necessaryQuestions = new ArrayCollection();
$this->necessaryForQuestions = new ArrayCollection();
$this->multiQuestionsRequirement = new ArrayCollection();
$this->multiQuestionsRequirementBy = new ArrayCollection();
}
public function __toString()
{
return $this->getName();
}
public function getId(): ?int
{
return $this->id;
}
public function getCancellationForm(): ?CancellationForm
{
return $this->cancellationForm;
}
public function getBaseCancellationForm(): ?CancellationForm
{
return $this->cancellationForm ??
(
$this->getParentCancellationQuestionChoice()
? $this->getParentCancellationQuestionChoice()->getCancellationForm()
: $this->getAdditionalQuestionForChoice()->getCancellationForm()
);
}
public function setCancellationForm(?CancellationForm $cancellationForm): self
{
$this->cancellationForm = $cancellationForm;
if ($cancellationForm !== null) {
$position = $cancellationForm->getCancellationQuestions()->count() + 1;
$this->setPosition($position);
}
return $this;
}
public function getCancellationPoll(): ?CancellationPoll
{
return $this->cancellationPoll;
}
public function setCancellationPoll(?CancellationPoll $cancellationPoll): self
{
$this->cancellationPoll = $cancellationPoll;
return $this;
}
public function getQuestionType(): ?string
{
return $this->questionType;
}
public function setQuestionType(string $questionType): self
{
$this->questionType = $questionType;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getIsRequired(): ?bool
{
return $this->isRequired;
}
public function setIsRequired(bool $isRequired): self
{
$this->isRequired = $isRequired;
return $this;
}
/**
* @return Collection|CancellationQuestionChoice[]
*/
public function getCancellationQuestionChoices(): Collection
{
return $this->cancellationQuestionChoices;
}
public function getSortedCancellationQuestionChoices(): array
{
$randomOrderForChoices = $this->getRandomOrderForChoices();
$choices = $this->getCancellationQuestionChoices()->toArray();
if ($randomOrderForChoices !== null && \count($choices) >= $randomOrderForChoices) {
$randomPart = \array_slice($choices, 0, $randomOrderForChoices);
$fixedPart = \array_slice($choices, $randomOrderForChoices);
shuffle($randomPart);
return array_merge($randomPart, $fixedPart);
}
return $choices;
}
public function addCancellationQuestionChoice(CancellationQuestionChoice $cancellationQuestionChoice): self
{
if (!$this->cancellationQuestionChoices->contains($cancellationQuestionChoice)) {
$this->cancellationQuestionChoices[] = $cancellationQuestionChoice;
$cancellationQuestionChoice->setCancellationQuestion($this);
}
return $this;
}
public function removeCancellationQuestionChoice(CancellationQuestionChoice $cancellationQuestionChoice): self
{
if ($this->cancellationQuestionChoices->contains($cancellationQuestionChoice)) {
$this->cancellationQuestionChoices->removeElement($cancellationQuestionChoice);
// set the owning side to null (unless already changed)
if ($cancellationQuestionChoice->getCancellationQuestion() === $this) {
$cancellationQuestionChoice->setCancellationQuestion(null);
}
}
return $this;
}
public function setCancellationQuestionChoices(Collection $choices): self
{
foreach ($choices as $choice) {
$this->addCancellationQuestionChoice($choice);
}
return $this;
}
public function getParentCancellationQuestionChoice(): ?CancellationQuestionChoice
{
return $this->parentCancellationQuestionChoice;
}
public function setParentCancellationQuestionChoice(?CancellationQuestionChoice $parentCancellationQuestionChoice): self
{
$this->parentCancellationQuestionChoice = $parentCancellationQuestionChoice;
if ($parentCancellationQuestionChoice !== null) {
$position = $parentCancellationQuestionChoice->getCancellationSubquestions()->count() + 1;
$this->setPosition($position);
}
return $this;
}
public function getTreeArrayInfo(array $infoArray = []): array
{
if($this->getParentCancellationQuestionChoice() !== null) {
$infoArray[] = 'Podzapytanie '. $this->getName();
$infoArray[] = 'Opcja ' . $this->getParentCancellationQuestionChoice()->getName();
return $this->getParentCancellationQuestionChoice()->getCancellationQuestion()->getTreeArrayInfo($infoArray);
}
if($this->getAdditionalQuestionForChoice() !== null) {
$infoArray[] = 'Dodatkowe pytanie '. $this->getName();
$infoArray[] = 'Opcja ' . $this->getAdditionalQuestionForChoice()->getName();
return $this->getAdditionalQuestionForChoice()->getCancellationQuestion()->getTreeArrayInfo($infoArray);
}
$infoArray[] = 'Pytanie '. $this->getName();
$infoArray[] = $this->getCancellationForm()->getName();
return $infoArray;
}
public function getSpecificProductTypesVisibility(): ?array
{
return $this->specificProductTypesVisibility;
}
public function isVisibleForSpecificProductType(?string $productType): bool
{
return empty($productType) || empty($this->specificProductTypesVisibility) ||
\in_array($productType, $this->specificProductTypesVisibility, true);
}
public function setSpecificProductTypesVisibility(?array $specificProductTypesVisibility): self
{
$this->specificProductTypesVisibility = $specificProductTypesVisibility;
return $this;
}
public function getPosition(): ?int
{
return $this->position;
}
public function setPosition(int $position): self
{
$this->position = $position;
return $this;
}
public function getIsLabelVisible(): ?bool
{
return $this->isLabelVisible;
}
public function setIsLabelVisible(bool $isLabelVisible): self
{
$this->isLabelVisible = $isLabelVisible;
return $this;
}
/**
* @return Collection|self[]
*/
public function getNecessaryQuestions(): Collection
{
return $this->necessaryQuestions;
}
public function addNecessaryQuestion(self $necessaryQuestion): self
{
if (!$this->necessaryQuestions->contains($necessaryQuestion)) {
$this->necessaryQuestions[] = $necessaryQuestion;
}
return $this;
}
public function removeNecessaryQuestion(self $necessaryQuestion): self
{
if ($this->necessaryQuestions->contains($necessaryQuestion)) {
$this->necessaryQuestions->removeElement($necessaryQuestion);
}
return $this;
}
/**
* @return Collection|self[]
*/
public function getNecessaryForQuestions(): Collection
{
return $this->necessaryForQuestions;
}
public function addNecessaryForQuestion(self $necessaryForQuestion): self
{
if (!$this->necessaryForQuestions->contains($necessaryForQuestion)) {
$this->necessaryForQuestions[] = $necessaryForQuestion;
$necessaryForQuestion->addNecessaryQuestion($this);
}
return $this;
}
public function removeNecessaryForQuestion(self $necessaryForQuestion): self
{
if ($this->necessaryForQuestions->contains($necessaryForQuestion)) {
$this->necessaryForQuestions->removeElement($necessaryForQuestion);
$necessaryForQuestion->removeNecessaryQuestion($this);
}
return $this;
}
public function getAdditionalQuestionForChoice(): ?CancellationQuestionChoice
{
return $this->additionalQuestionForChoice;
}
public function setAdditionalQuestionForChoice(?CancellationQuestionChoice $additionalQuestionForChoice): self
{
$this->additionalQuestionForChoice = $additionalQuestionForChoice;
if ($additionalQuestionForChoice !== null) {
$position = $additionalQuestionForChoice->getAdditionalCancellationQuestions()->count() + 1;
$this->setPosition($position);
}
return $this;
}
public function getRandomOrderForChoices(): ?int
{
return $this->randomOrderForChoices;
}
public function setRandomOrderForChoices(?int $randomOrderForChoices): self
{
$this->randomOrderForChoices = $randomOrderForChoices;
return $this;
}
/**
* @return Collection|self[]
*/
public function getMultiQuestionsRequirement(): Collection
{
return $this->multiQuestionsRequirement;
}
public function addMultiQuestionsRequirement(self $multiQuestionsRequirement): self
{
if (!$this->multiQuestionsRequirement->contains($multiQuestionsRequirement)) {
$this->multiQuestionsRequirement[] = $multiQuestionsRequirement;
}
return $this;
}
public function removeMultiQuestionsRequirement(self $multiQuestionsRequirement): self
{
if ($this->multiQuestionsRequirement->contains($multiQuestionsRequirement)) {
$this->multiQuestionsRequirement->removeElement($multiQuestionsRequirement);
}
return $this;
}
/**
* @return Collection|self[]
*/
public function getMultiQuestionsRequirementBy(): Collection
{
return $this->multiQuestionsRequirementBy;
}
public function addMultiQuestionsRequirementBy(self $multiQuestionsRequirementBy): self
{
if (!$this->multiQuestionsRequirementBy->contains($multiQuestionsRequirementBy)) {
$this->multiQuestionsRequirementBy[] = $multiQuestionsRequirementBy;
$multiQuestionsRequirementBy->addMultiQuestionsRequirement($this);
}
return $this;
}
public function removeMultiQuestionsRequirementBy(self $multiQuestionsRequirementBy): self
{
if ($this->multiQuestionsRequirementBy->contains($multiQuestionsRequirementBy)) {
$this->multiQuestionsRequirementBy->removeElement($multiQuestionsRequirementBy);
$multiQuestionsRequirementBy->removeMultiQuestionsRequirement($this);
}
return $this;
}
}