<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter;
use App\Controller\Manager\Sponsorship\RefuseCandidateController;
use App\Controller\Manager\Sponsorship\ValidateCandidateController;
use App\Entity\Reference\ProfessionalStatusReference;
use App\Entity\Reference\ReferenceCandidateStatus;
use App\Repository\CandidateRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ApiResource(
* security="is_granted('ROLE_AGENT') or is_granted('ROLE_MANAGER')",
* normalizationContext={"groups"={"candidate:read"}, "swagger_definition_name"="Read"},
* denormalizationContext={"groups"={"candidate:write"},
* "swagger_definition_name"="Write","skip_null_values" = true},
* itemOperations={
* "get" = {
* "security"="is_granted('ROLE_AGENT') or is_granted('ROLE_MANAGER')"
* },
* "put" = {
* "denormalization_context"={"groups"={"candidate:put"}},
* "security"="is_granted('ROLE_MANAGER')"
* },
* "validate_candidate"={
* "denormalization_context"={"groups"={"candidate:validate"}},
* "security"="is_granted('ROLE_MANAGER')",
* "method"="PATCH",
* "path"="/candidate/{id}/validate",
* "controller"=ValidateCandidateController::class,
* "read"=true,
* "write"=false,
* },
* "refuse_candidate"={
* "security"="is_granted('ROLE_MANAGER')",
* "denormalization_context"={"groups"={"candidate:refuse"}},
* "method"="PATCH",
* "path"="/candidate/{id}/refuse",
* "controller"= RefuseCandidateController::class,
* "read"=true,
* "write"=false,
* }
*
* },
* collectionOperations={
* "get" = {
* "security "="is_granted('ROLE_AGENT') or is_granted('ROLE_MANAGER')"
* },
* "post" = {
* "security"="is_granted('ROLE_AGENT') or is_granted('ROLE_MANAGER')",
* "validation_groups"={"Default"}
* },
* },
*
* attributes={
* "pagination_items_per_page"=10,
* "formats"={"jsonld", "json", "html", "jsonhal", "csv"={"text/csv"} }
* }
* )
* @ApiFilter(SearchFilter::class, properties={
* "referenceStatus": "exact"
* })
* @ApiFilter(OrderFilter::class,
* properties={"id","firstName","lastName","sponsor.firstName","sponsor.lastName","referenceStatus.name","createdAt"},
* arguments= {"orderParameterName" : "order"})
* @ORM\Entity(repositoryClass=CandidateRepository::class)
* @UniqueEntity(
* fields={"cin" },
* entityClass=Candidate::class,
* message="AbstractPeople with cin {{ value }} is already used."
* )
* @UniqueEntity(
* fields={"email"},
* entityClass=Candidate::class,
* message="AbstractPeople with email {{ value }} is already used."
* )
* @UniqueEntity(
* fields={"professionalEmail"},
* entityClass=Candidate::class,
* message="AbstractPeople with emailPro {{ value }} is already used."
* )
* @ORM\HasLifecycleCallbacks()
*/
class Candidate extends AbstractPeople implements Loggable
{
/**
* @ORM\ManyToOne(targetEntity=Agent::class, inversedBy="candidates")
* @ORM\JoinColumn(nullable=false)
* @Groups({
* "candidate:read","siege:write","siege:put"
* })
*/
private ?Agent $sponsor = null;
/**
* @ORM\ManyToOne(targetEntity=ReferenceCandidateStatus::class)
* @ORM\JoinColumn(nullable=false)
* @Groups({
* "candidate:read","siege:put"
* })
*/
private ?ReferenceCandidateStatus $referenceStatus;
/**
* @ORM\Column(type="text", nullable=true)
* @Assert\Type("string")
*/
private ?string $refuseReason;
/**
* @ORM\OneToMany(targetEntity=IdentityVerificationImage::class, mappedBy="candidate")
*
* @Groups({
* "candidate:read"
* })
*/
private $identityFiles;
/**
* @ORM\OneToOne(targetEntity=Sector::class, cascade={"persist", "remove"})
*
* @Groups({
* "abstract-colloborator:read",
* "directory:collaborator:search",
* "candidate:read","candidate:write","candidate:put"
* })
*/
private ?Sector $sector;
/**
* @ORM\Column(type="string", length=100, nullable=true)
* @Groups({
* "abstract-colloborator:read",
* "directory:collaborator:search",
* "candidate:read","candidate:write","candidate:put"
* })
*/
private $cnss;
/**
* @ORM\Column(type="boolean", nullable=true)
* @Groups({
* "abstract-colloborator:read",
* "directory:collaborator:search",
* "candidate:read","candidate:write","candidate:put"
* })
*/
private $subjectToVAT;
/**
* @ORM\ManyToOne(targetEntity=Nationality::class)
* @ORM\JoinColumn(nullable=true)
* @Groups({
* "abstract-colloborator:read",
* "directory:collaborator:search",
* "candidate:read","candidate:write","candidate:put"
* })
*/
private $nationality;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({
* "abstract-colloborator:read",
* "directory:collaborator:search",
* "candidate:read","candidate:write","candidate:put"
* })
*/
private $professionalStatus;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @Groups({
* "abstract-colloborator:read",
* "directory:collaborator:search",
* "candidate:read","candidate:put"
* })
*/
private $professionalEmail;
public function __construct()
{
$this->identityFiles = new ArrayCollection();
}
public function getSponsor(): ?Agent
{
return $this->sponsor;
}
public function setSponsor(?Agent $sponsor): self
{
$this->sponsor = $sponsor;
return $this;
}
public function getReferenceStatus(): ?ReferenceCandidateStatus
{
return $this->referenceStatus;
}
public function setReferenceStatus(?ReferenceCandidateStatus $referenceStatus): self
{
$this->referenceStatus = $referenceStatus;
return $this;
}
public function getRefuseReason(): ?string
{
return $this->refuseReason;
}
public function setRefuseReason(?string $refuseReason): self
{
$this->refuseReason = $refuseReason;
return $this;
}
/**
* @return IdentityVerificationImage[]
*/
public function getIdentityFiles()
{
return $this->identityFiles;
}
public function addIdentityFile(IdentityVerificationImage $identityFile): self
{
if (!$this->identityFiles->contains($identityFile)) {
$this->identityFiles[] = $identityFile;
$identityFile->setCandidate($this);
}
return $this;
}
public function removeIdentityFile(IdentityVerificationImage $identityFile): self
{
// set the owning side to null (unless already changed)
if ($this->identityFiles->removeElement($identityFile) && $identityFile->getCandidate() === $this) {
$identityFile->setCandidate(null);
}
return $this;
}
public function getSector(): ?Sector
{
return $this->sector;
}
public function setSector(?Sector $sector): self
{
$this->sector = $sector;
return $this;
}
public function getCnss(): ?string
{
return $this->cnss;
}
public function setCnss(?string $cnss): self
{
$this->cnss = $cnss;
return $this;
}
public function getSubjectToVAT(): ?bool
{
return $this->subjectToVAT;
}
public function setSubjectToVAT(?bool $subjectToVAT): self
{
$this->subjectToVAT = $subjectToVAT;
return $this;
}
public function getNationality(): ?Nationality
{
return $this->nationality;
}
public function setNationality(?Nationality $nationality): self
{
$this->nationality = $nationality;
return $this;
}
public function getProfessionalStatus(): ?string
{
return $this->professionalStatus;
}
public function setProfessionalStatus(?string $professionalStatus): self
{
$this->professionalStatus = $professionalStatus;
return $this;
}
public function getProfessionalEmail(): ?string
{
return $this->professionalEmail;
}
public function setProfessionalEmail(?string $professionalEmail): self
{
$this->professionalEmail = $professionalEmail;
return $this;
}
/**
* @return array
*/
public function getFields(): array
{
return [
'gender' => 'gender',
'address' => 'address',
'email' => 'email',
'mainPhone' => 'mainPhone',
'birthDay' => 'birthDay',
'cin' => 'cin',
'sponsor' => 'sponsor',
'referenceStatus' => 'referenceStatus',
'sector' => 'sector',
'nationality' => 'nationality',
'cnss' => 'cnss',
'professionalStatus' => 'professionalStatus'
];
}
}