<?php
namespace App\Entity;
use App\Entity\Embedded\ApplicantConfig;
use App\Repository\ApplicantsRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use OSAdmin\Annotation\EntityConfig;
use OSAdmin\Annotation\EntityFormConfig;
use OSAdmin\Annotation\EntityToRoute;
use OSAdmin\Util\EntityExportableInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
#[ORM\Entity(repositoryClass: ApplicantsRepository::class)]
#[UniqueEntity(fields: ['email'], message: 'Un utilisateur existe déjà avec cette adresse email.')]
#[EntityToRoute(
config: new EntityConfig(
title: "Gestion des candidats",
listSubtitle: "Liste des candidats",
remove: ["EDIT", "ADD"]
),
)]
class Applicants extends Users implements EntityExportableInterface
{
public function __construct()
{
parent::__construct();
$this->isEnabled = true;
$this->isEmailVerified = false;
$this->jobsApplications = new ArrayCollection();
$this->curriculumVitaes = new ArrayCollection();
}
public const ROLE_APPLICANT = 'ROLE_APPLICANT';
#[ORM\Column(type: 'boolean', nullable: true)]
private bool $isEmailVerified;
#[ORM\Column(type: 'boolean')]
private bool $isVerified = false;
#[ORM\OneToMany(mappedBy: 'applicant', targetEntity: JobsApplications::class)]
private Collection $jobsApplications;
#[ORM\OneToMany(mappedBy: 'applicant', targetEntity: CurriculumVitae::class, orphanRemoval: true)]
private Collection $curriculumVitaes;
#[ORM\Embedded(class: ApplicantConfig::class, columnPrefix: "config")]
private ?ApplicantConfig $config;
public function getRoles(): array
{
$roles= parent::getRoles();
return array_unique(array_merge($roles, [self::ROLE_APPLICANT]));
}
public function isEmailVerified(): ?bool
{
return $this->isEmailVerified;
}
public function setIsEmailVerified(?bool $isEmailVerified): self
{
$this->isEmailVerified = $isEmailVerified;
return $this;
}
public function isVerified(): bool
{
return $this->isVerified;
}
public function setIsVerified(bool $isVerified): self
{
$this->isVerified = $isVerified;
return $this;
}
public function setHashPassword(?string $password = null): self
{
$this->password = $password;
return $this;
}
/**
* @return Collection<int, JobsApplications>
*/
public function getJobsApplications(): Collection
{
return $this->jobsApplications;
}
public function addJobsApplication(JobsApplications $jobsApplication): self
{
if (!$this->jobsApplications->contains($jobsApplication)) {
$this->jobsApplications[] = $jobsApplication;
$jobsApplication->setApplicant($this);
}
return $this;
}
public function removeJobsApplication(JobsApplications $jobsApplication): self
{
if ($this->jobsApplications->removeElement($jobsApplication)) {
// set the owning side to null (unless already changed)
if ($jobsApplication->getApplicant() === $this) {
$jobsApplication->setApplicant(null);
}
}
return $this;
}
/**
* @return Collection<int, CurriculumVitae>
*/
public function getCurriculumVitaes(): Collection
{
return $this->curriculumVitaes;
}
public function addCurriculumVitae(CurriculumVitae $curriculumVitae): self
{
if (!$this->curriculumVitaes->contains($curriculumVitae)) {
$this->curriculumVitaes[] = $curriculumVitae;
$curriculumVitae->setApplicant($this);
}
return $this;
}
public function removeCurriculumVitae(CurriculumVitae $curriculumVitae): self
{
if ($this->curriculumVitaes->removeElement($curriculumVitae)) {
// set the owning side to null (unless already changed)
if ($curriculumVitae->getApplicant() === $this) {
$curriculumVitae->setApplicant(null);
}
}
return $this;
}
/**
* @return ApplicantConfig|null
*/
public function getConfig(): ?ApplicantConfig
{
return $this->config;
}
/**
* @param ApplicantConfig|null $config
* @return Applicants
*/
public function setConfig(?ApplicantConfig $config): Applicants
{
$this->config = $config;
return $this;
}
public function getCv(): ?CurriculumVitae
{
return $this->curriculumVitaes->isEmpty() ? null : $this->curriculumVitaes->first();
}
public function countNbApplications(): int
{
return $this->jobsApplications->filter(function (JobsApplications $jobsApplication) {
return $jobsApplication->isConfirmed();
})->count();
}
public function countAcceptedApplication(): int
{
return $this->jobsApplications->filter(function (JobsApplications $jobsApplication) {
return $jobsApplication->isConfirmed() && $jobsApplication->isAccepted();
})->count();
}
public function countRejectedApplication(): int
{
return $this->jobsApplications->filter(function (JobsApplications $jobsApplication) {
return $jobsApplication->isConfirmed() && $jobsApplication->isRejected();
})->count();
}
public function __toString(): string
{
return $this->getFullName();
}
public function getExportData(): array
{
return [
'ID' => function (Applicants $item) {
return $item->getId();
},
'Nom' => function (Applicants $item) {
return $item->getLName();
},
'Prénom' => function (Applicants $item) {
return $item->getFName();
},
'Contact' => function (Applicants $item) {
return $item->getCv() ? $item->getCv()->getContact() : "-";
},
'Adresse' => function (Applicants $item) {
return $item->getCv() ? $item->getCv()->getAddress() : "-";
},
'Secteur d\'activités' => function (Applicants $item) {
return $item->getCv() ? (implode(", ", $item->getCv()->getActivitySectors()->toArray())) : "-";
}
];
}
}