<?php
namespace App\Entity;
use App\Enum\Candidate\Status;
use App\Repository\CandidateRepository;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass=CandidateRepository::class)
*/
class Candidate
{
const CANDIDATE_FIELD_STATUS = 'candidate_status';
const CANDIDATE_FIELD_PERSON = 'candidate_person';
const CANDIDATE_FIELD_AUTHOR = 'candidate_author';
const CANDIDATE_FIELD_CALENDAR_EVENT = 'candidate_calendar_event';
const CANDIDATE_FIELD_CREATED_AT = 'candidate_created_at';
const CANDIDATE_FIELD_APPROVED_AT = 'candidate_approved_at';
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="enum", options={"values": "candidate_enum"})
*/
private $status = Status::STATUS_DRAFT;
/**
* @ORM\ManyToOne(targetEntity=User::class)
* @ORM\JoinColumn(nullable=false)
*/
private $author;
/**
* @ORM\ManyToOne(targetEntity=Person::class)
* @ORM\JoinColumn(nullable=true)
*/
private $person;
/**
* @ORM\ManyToOne(targetEntity=CalendarEvent::class)
*/
private $calendarEvent;
/**
* @ORM\Column(type="datetime")
*/
private $createdAt;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $viewerComment;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $approvedAt;
/**
* @ORM\ManyToOne(targetEntity=Image::class, cascade={"persist", "remove"})
*/
private $image;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $comment;
/**
* @ORM\Column(type="boolean", nullable=true)
*/
private $paymentDeferment;
/**
* @ORM\ManyToOne(targetEntity=User::class)
*/
private $selectedAuthor;
/**
* @ORM\Column(type="text", nullable=true)
*/
private $recommendations;
/**
* @ORM\ManyToOne(targetEntity=User::class)
*/
private $curator;
/**
* @ORM\Column(type="datetime")
*/
private $updatedAt;
public function __construct()
{
$this->createdAt = new \DateTime();
$this->updatedAt = new \DateTime();
}
public function getId(): ?int
{
return $this->id;
}
public function getStatus()
{
return $this->status;
}
public function isStatusApproved(): bool
{
return $this->status === Status::STATUS_APPROVED;
}
public function isStatusDeclined(): bool
{
return $this->status === Status::STATUS_DECLINED;
}
public function setStatus($status): self
{
$this->status = $status;
if ($status == Status::STATUS_APPROVED && !$this->getApprovedAt()) {
$this->setApprovedAt(new \DateTime());
}
return $this;
}
public function getAuthor(): ?User
{
// if ($this->getSelectedAuthor()) {
// return $this->getSelectedAuthor();
// }
return $this->author;
}
public function setAuthor(?User $author): self
{
$this->author = $author;
return $this;
}
public function getPerson(): ?Person
{
return $this->person;
}
public function setPerson(?Person $person): self
{
$this->person = $person;
return $this;
}
public function getCalendarEvent(): ?CalendarEvent
{
return $this->calendarEvent;
}
public function setCalendarEvent(?CalendarEvent $calendarEvent): self
{
$this->calendarEvent = $calendarEvent;
return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getViewerComment(): ?string
{
return $this->viewerComment;
}
public function setViewerComment(?string $viewerComment): self
{
$this->viewerComment = $viewerComment;
return $this;
}
public function getApprovedAt(): ?\DateTimeInterface
{
return $this->approvedAt;
}
public function setApprovedAt(?\DateTimeInterface $approvedAt): self
{
$this->approvedAt = $approvedAt;
return $this;
}
public function getImage(): ?Image
{
return $this->image;
}
public function setImage(?Image $image): self
{
$this->image = $image;
return $this;
}
public function getComment(): ?string
{
return $this->comment;
}
public function setComment(?string $comment): self
{
$this->comment = $comment;
return $this;
}
public function getStatusText(): string
{
return Status::getText($this->status);
}
public function getVirtualStatusText(): string
{
if (($this->getCalendarEvent() && !$this->getCalendarEvent()->isIsCandidateReviewRequired())
|| ($this->getPerson()->getStudent() && $this->getPerson()->getStudent()->isCandidateReviewIsNotRequired())) {
return Status::getText(Status::STATUS_NOT_REQUIRED);
}
return Status::getText($this->status);
}
public function getCssClass(): string
{
return Status::getCssClass($this->status);
}
public function getVirtualCssClass(): string
{
if (($this->getCalendarEvent() && !$this->getCalendarEvent()->isIsCandidateReviewRequired())
|| ($this->getPerson()->getStudent() && $this->getPerson()->getStudent()->isCandidateReviewIsNotRequired())) {
return Status::getCssClass(Status::STATUS_NOT_REQUIRED);
}
return Status::getCssClass($this->status);
}
public function isPaymentDeferment(): ?bool
{
return $this->paymentDeferment;
}
public function setPaymentDeferment(?bool $paymentDeferment): self
{
$this->paymentDeferment = $paymentDeferment;
return $this;
}
public function getSelectedAuthor(): ?User
{
return $this->selectedAuthor;
}
public function setSelectedAuthor(?User $selectedAuthor): self
{
$this->selectedAuthor = $selectedAuthor;
return $this;
}
public function getRecommendations(): ?string
{
return $this->recommendations;
}
public function setRecommendations(?string $recommendations): self
{
$this->recommendations = $recommendations;
return $this;
}
public function getCurator(): ?User
{
return $this->curator;
}
public function setCurator(?User $curator): self
{
$this->curator = $curator;
return $this;
}
public function getUpdatedAt(): ?\DateTimeInterface
{
if (!$this->updatedAt) {
return $this->getCreatedAt();
}
return $this->updatedAt;
}
public function setUpdatedAt(\DateTimeInterface $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
public function isTimeToSendReviewResultMessage(): array
{
$result = [
"result" => false,
'waitMinutes' => null,
];
$minutesLeftSinceUpdate = (int)ceil((time() - $this->getUpdatedAt()->getTimestamp()) / 60);
if ($this->getCalendarEvent()->getHoursLeftBeforeStart() >= 6 &&
$minutesLeftSinceUpdate < 15
) {
$result['result'] = false;
$result['waitMinutes'] = 15 - $minutesLeftSinceUpdate;
} else {
$result['result'] = true;
}
return $result;
}
}