<?php
namespace App\Entity;
use App\Entity\Profile\JoboffererProfile;
use App\Entity\Profile\JobseekerProfile;
use App\Utility\GuidUtility;
use DateTime;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
/**
* @ORM\Entity
*
* @ORM\Table(
* name="profile_reviews",
* uniqueConstraints={
*
* @ORM\UniqueConstraint(name="jobseeker_profiles_id_jobofferer_profiles_id_reviewer_unique_idx", columns={"jobseeker_profiles_id", "jobofferer_profiles_id", "reviewer"})
* }
* )
*
* The unique constraint ensures only one review from a jobseeker to a jobofferer or vice versa.
*/
class ProfileReview
{
public const RATING_POSITIVE = 1;
public const RATING_NEGATIVE = -1;
public const POSSIBLE_RATINGS_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING = [
'reviews.rating_form_label_positive' => self::RATING_POSITIVE,
'reviews.rating_form_label_negative' => self::RATING_NEGATIVE
];
public const REVIEWER_JOBSEEKER = 0;
public const REVIEWER_JOBOFFERER = 1;
/**
* @var string
*
* @ORM\GeneratedValue(strategy="CUSTOM")
*
* @ORM\CustomIdGenerator(class="App\Utility\DatabaseIdGenerator")
*
* @ORM\Column(name="id", type="guid")
*
* @ORM\Id
*/
protected $id;
/**
* @var JobseekerProfile
*
* @ORM\ManyToOne(targetEntity="App\Entity\Profile\JobseekerProfile", inversedBy="profileReviews", cascade={"persist"})
*
* @ORM\JoinColumn(name="jobseeker_profiles_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
*/
protected $jobseekerProfile;
/**
* @var JoboffererProfile
*
* @ORM\ManyToOne(targetEntity="App\Entity\Profile\JoboffererProfile", inversedBy="profileReviews", cascade={"persist"})
*
* @ORM\JoinColumn(name="jobofferer_profiles_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
*/
protected $joboffererProfile;
/**
* @var int
*
* @ORM\Column(name="reviewer", type="smallint", nullable=false)
*/
protected $reviewer;
/**
* @var int
*
* @ORM\Column(name="rating", type="smallint", nullable=false)
*/
protected $rating;
/**
* @var string
*
* @ORM\Column(name="feedback", type="text", length=4096, nullable=true)
*/
protected $feedback;
/**
* @var DateTime
*
* @ORM\Column(name="created_at", type="datetime", nullable=false)
*/
protected $createdAt;
/**
* @var bool
*
* @ORM\Column(name="is_activated_by_admin", type="boolean", nullable=false)
*/
protected $isActivatedByAdmin;
public function __construct()
{
$this->setIsActivatedByAdmin(false);
}
public function isReviewer(Profile $profile)
{
if (($this->reviewer === self::REVIEWER_JOBSEEKER
&& $profile instanceof JobseekerProfile
&& $profile->getId() === $this->getJobseekerProfile()->getId())
|| ($this->reviewer === self::REVIEWER_JOBOFFERER
&& $profile instanceof JoboffererProfile
&& $profile->getId() === $this->getJoboffererProfile()->getId())
) {
return true;
} else {
return false;
}
}
public function isReviewee(Profile $profile)
{
if (($this->reviewer === self::REVIEWER_JOBSEEKER
&& $profile instanceof JoboffererProfile
&& $profile->getId() === $this->getJoboffererProfile()->getId())
|| ($this->reviewer === self::REVIEWER_JOBOFFERER
&& $profile instanceof JobseekerProfile
&& $profile->getId() === $this->getJobseekerProfile()->getId())
) {
return true;
} else {
return false;
}
}
public function setId(string $id)
{
GuidUtility::validOrThrow($id);
$this->id = $id;
}
public function getId()
{
return $this->id;
}
/**
* @return JobseekerProfile
*/
public function getJobseekerProfile()
{
return $this->jobseekerProfile;
}
public function setJobseekerProfile(JobseekerProfile $jobseekerProfile)
{
$this->jobseekerProfile = $jobseekerProfile;
}
/**
* @return JoboffererProfile
*/
public function getJoboffererProfile()
{
return $this->joboffererProfile;
}
public function setJoboffererProfile(JoboffererProfile $joboffererProfile)
{
$this->joboffererProfile = $joboffererProfile;
}
/**
* @return int
*/
public function getReviewer()
{
return $this->reviewer;
}
public function setReviewer(int $reviewer)
{
$this->reviewer = $reviewer;
}
/**
* @return int
*/
public function getRating()
{
return $this->rating;
}
public function setRating(int $rating)
{
$this->rating = $rating;
}
public function getFeedback()
{
return $this->feedback;
}
public function setFeedback(string $feedback)
{
$this->feedback = $feedback;
}
/**
* @return DateTime
*/
public function getCreatedAt()
{
return $this->createdAt;
}
public function setCreatedAt(DateTime $createdAt)
{
$this->createdAt = $createdAt;
}
public function isActivatedByAdmin(): bool
{
return $this->isActivatedByAdmin;
}
public function setIsActivatedByAdmin(bool $isActivatedByAdmin)
{
$this->isActivatedByAdmin = $isActivatedByAdmin;
}
public function isActive(): bool
{
return $this->isActivatedByAdmin;
}
public function __toString()
{
return $this->getId();
}
/**
* @Assert\Callback
*/
public function validate(ExecutionContextInterface $context, $payload)
{
if ($this->rating === self::RATING_NEGATIVE && (is_null($this->feedback) || trim($this->feedback) === '')) {
$context
->buildViolation('reviews.new_form_page.feedback_required_error')
->setTranslationDomain('messages')
->atPath('feedback')
->addViolation();
}
}
}