<?php
namespace App\Entity;
use App\Entity\Embedded\DateAndTime;
use App\Entity\File\Biblios;
use App\Entity\File\Picture;
use App\Entity\Trait\EnabledDisabledTrait;
use App\Entity\Trait\TimestampTrait;
use App\Features\Core\Itranslatable;
use App\Form\JobsType;
use App\Repository\JobsRepository;
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\Component\Validator\Constraints\IsTrue;
use Symfony\Component\Validator\Constraints\Valid;
#[ORM\Entity(repositoryClass: JobsRepository::class)]
#[ORM\HasLifecycleCallbacks]
#[EntityToRoute(
config: new EntityConfig(
title: "Gestion des offres d'emploi",
editSubtitle: "Edition d'une offre d'emploi",
listSubtitle: "Liste des offres d'emploi",
),
formConfig: new EntityFormConfig(
formClass: JobsType::class,
)
)]
class Jobs implements EntityExportableInterface, Itranslatable
{
use TimestampTrait;
use EnabledDisabledTrait;
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private readonly ?int $id;
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private ?string $title;
public function getTranslateTitle(): ?string
{
if($this->currentLocal){
if($this->currentLocal === 'fr'){
return $this->title;
}
if($this->currentLocal === 'en' && $this->titleEn){
return $this->titleEn;
}
}
return $this->title;
}
#[ORM\Column(type: 'text', nullable: true)]
private ?string $content;
public function getTranslateContent(): ?string
{
if($this->currentLocal){
if($this->currentLocal === 'fr'){
return $this->content;
}
if($this->currentLocal === 'en' && $this->contentEn){
return $this->contentEn;
}
}
return $this->content;
}
#[ORM\Column(type: 'integer', nullable: true)]
private ?int $experienceYear;
#[ORM\Column(type: 'text', nullable: true)]
private ?string $qualifications;
public function getTranslateQualifications(): ?string
{
if($this->currentLocal){
if($this->currentLocal === 'fr'){
return $this->qualifications;
}
if($this->currentLocal === 'en' && $this->qualificationsEn){
return $this->qualificationsEn;
}
}
return $this->qualifications;
}
#[ORM\Embedded(class: DateAndTime::class)]
#[Valid]
private ?DateAndTime $startAt;
#[ORM\Embedded(class: DateAndTime::class)]
#[Valid]
private ?DateAndTime $endAt;
#[ORM\ManyToMany(targetEntity: StudyLevel::class)]
private Collection $studyLevel;
#[ORM\ManyToOne(targetEntity: EmploymentContract::class, fetch: "EAGER")]
private ?EmploymentContract $employmentContract;
#[ORM\ManyToMany(targetEntity: ActivitySector::class)]
private Collection $sectors;
#[ORM\OneToOne(targetEntity: Biblios::class, cascade: ['persist', 'remove'])]
private ?Biblios $biblio;
#[ORM\OneToOne(targetEntity: Picture::class, cascade: ['persist', 'remove'])]
private ?Picture $banner;
#[ORM\OneToMany(mappedBy: 'job', targetEntity: JobsApplications::class, orphanRemoval: true)]
private Collection $applications;
#[ORM\Column(type: 'text', nullable: true)]
private ?string $description;
public function getTranslateDescription(): ?string
{
if($this->currentLocal){
if($this->currentLocal === 'fr'){
return $this->description;
}
if($this->currentLocal === 'en' && $this->descriptionEn){
return $this->descriptionEn;
}
}
return $this->description;
}
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private string $uuid;
#[ORM\Column(type: 'date_immutable', nullable: true)]
private ?\DateTimeImmutable $createdDate;
public function __construct()
{
$this->studyLevel = new ArrayCollection();
$this->sectors = new ArrayCollection();
$this->isEnabled= true;
$this->createdAt = new \DateTimeImmutable();
$this->createdDate = new \DateTimeImmutable();
$this->applications = new ArrayCollection();
$this->uuid= uniqid('', true);
}
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->getTranslateTitle();
}
public function getContent(): ?string
{
return $this->getTranslateContent();
}
public function getExperienceYear(): ?int
{
return $this->experienceYear;
}
public function setExperienceYear(?int $experienceYear): self
{
$this->experienceYear = $experienceYear;
return $this;
}
public function getQualifications(): ?string
{
return $this->getTranslateQualifications();
}
/**
* @return DateAndTime|null
*/
public function getStartAt(): ?DateAndTime
{
return $this->startAt;
}
/**
* @param DateAndTime|null $startAt
*/
public function setStartAt(?DateAndTime $startAt): void
{
$this->startAt = $startAt;
}
/**
* @return DateAndTime|null
*/
public function getEndAt(): ?DateAndTime
{
return $this->endAt;
}
/**
* @param DateAndTime|null $endAt
*/
public function setEndAt(?DateAndTime $endAt): void
{
$this->endAt = $endAt;
}
/**
* @return Collection<int, StudyLevel>
*/
public function getStudyLevel(): Collection
{
return $this->studyLevel;
}
public function addStudyLevel(StudyLevel $studyLevel): self
{
if (!$this->studyLevel->contains($studyLevel)) {
$this->studyLevel[] = $studyLevel;
}
return $this;
}
public function removeStudyLevel(StudyLevel $studyLevel): self
{
$this->studyLevel->removeElement($studyLevel);
return $this;
}
public function getEmploymentContract(): ?EmploymentContract
{
return $this->employmentContract;
}
public function setEmploymentContract(?EmploymentContract $employmentContract): self
{
$this->employmentContract = $employmentContract;
return $this;
}
/**
* @return Collection<int, ActivitySector>
*/
public function getSectors(): Collection
{
return $this->sectors;
}
public function addSector(ActivitySector $sector): self
{
if (!$this->sectors->contains($sector)) {
$this->sectors[] = $sector;
}
return $this;
}
public function removeSector(ActivitySector $sector): self
{
$this->sectors->removeElement($sector);
return $this;
}
public function getBiblio(): ?Biblios
{
return $this->biblio;
}
public function setBiblio(?Biblios $biblio): self
{
$this->biblio = $biblio;
return $this;
}
public function getBanner(): ?Picture
{
return $this->banner;
}
public function setBanner(?Picture $banner): self
{
$this->banner = $banner;
return $this;
}
/**
* @return Collection<int, JobsApplications>
*/
public function getApplications(): Collection
{
return $this->applications->filter(function (JobsApplications $applications) {
return $applications->getConfirmedAt() !== null;
});
}
public function addApplication(JobsApplications $application): self
{
if (!$this->applications->contains($application)) {
$this->applications[] = $application;
$application->setJob($this);
}
return $this;
}
public function removeApplication(JobsApplications $application): self
{
if ($this->applications->removeElement($application)) {
// set the owning side to null (unless already changed)
if ($application->getJob() === $this) {
$application->setJob(null);
}
}
return $this;
}
public function getNbAcceptedRequest(): int
{
if($this->applications->isEmpty()) {
return 0;
}
return $this->applications->filter(function (JobsApplications $request) {
return $request->getConfirmedAt() != null && $request->getStatus() === "accepted";
})->count();
}
public function getNbRejectedRequest(): int
{
if($this->applications->isEmpty()) {
return 0;
}
return $this->applications->filter(function (JobsApplications $request) {
return $request->getConfirmedAt() != null && $request->getStatus() === "rejected";
})->count();
}
public function getNbWaitingRequest(): int
{
if($this->applications->isEmpty()) {
return 0;
}
return $this->applications->filter(function (JobsApplications $request) {
return $request->getConfirmedAt() != null && (!$request->getStatus() || $request->getStatus() === "registered");
})->count();
}
public function getNbRequest(): ?int
{
return $this->applications->filter(function (JobsApplications $application){
return $application->getConfirmedAt() != null;
})->count();
}
public function getDescription(): ?string
{
return $this->getTranslateDescription();
}
public function getUuid(): ?string
{
return $this->uuid;
}
public function setUuid(?string $uuid): self
{
$this->uuid = $uuid;
return $this;
}
public function getCreatedDate(): ?\DateTimeImmutable
{
return $this->createdDate;
}
public function setCreatedDate(?\DateTimeImmutable $createdDate): self
{
$this->createdDate = $createdDate;
return $this;
}
#[IsTrue(message: "La date de début doit être antérieure à la date de fin")]
public function isDateValid(): bool
{
return $this->endAt->asDate() > $this->startAt->asDate();
}
public function getExportData(): array
{
return [
'ID' => function (Jobs $item) {
return $item->getId();
},
'Titre' => function (Jobs $item) {
return $item->getTitle();
},
'Contenu' => function (Jobs $item) {
return $item->getContent();
},
'experienceYear' => function (Jobs $item) {
return $item->getExperienceYear();
}
];
}
private string $currentLocal = "fr";
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private string|null $titleEn;
/**
* @param array|null $titleTran
*/
public function setTitleTrans(array|null $titleTran): void
{
if($titleTran) {
$this->title= $titleTran['fr'] ?? null;
$this->titleEn = $titleTran['en'] ?? null;
}
}
/**
* @return array|null
*/
public function getTitleTrans(): array|null
{
return [
'fr' => $this->title,
'en' => $this->titleEn
];
}
#[ORM\Column(type: 'text', nullable: true)]
private string|null $contentEn;
/**
* @param array|null $contentTrans
*/
public function setContentTrans(array|null $contentTrans): void
{
if($contentTrans) {
$this->content = $contentTrans['fr'] ?? null;
$this->contentEn = $contentTrans['en'] ?? null;
}
}
/**
* @return array|null
*/
public function getContentTrans(): array|null
{
return [
'fr' => $this->content,
'en' => $this->contentEn
];
}
#[ORM\Column(type: 'text', nullable: true)]
private string|null $qualificationsEn;
/**
* @param array|null $qualificationsTrans
*/
public function setQualificationsTrans(array|null $qualificationsTrans): void
{
if($qualificationsTrans) {
$this->qualifications = $qualificationsTrans['fr'] ?? null;
$this->qualificationsEn = $qualificationsTrans['en'] ?? null;
}
}
/**
* @return array|null
*/
public function getQualificationsTrans(): array|null
{
return [
'fr' => $this->qualifications,
'en' => $this->qualificationsEn
];
}
#[ORM\Column(type: 'text', nullable: true)]
private string|null $descriptionEn;
/**
* @param array|null $descriptionTrans
*/
public function setDescriptionTrans(array|null $descriptionTrans): void
{
if($descriptionTrans) {
$this->description = $descriptionTrans['fr'] ?? null;
$this->descriptionEn = $descriptionTrans['en'] ?? null;
}
}
/**
* @return array|null
*/
public function getDescriptionTrans(): array|null
{
return [
'fr' => $this->description,
'en' => $this->descriptionEn
];
}
public function setCurrentLocal(string $locale): Itranslatable
{
$this->currentLocal = $locale;
return $this;
}
public function getCurrentLocal(): string
{
return $this->currentLocal;
}
public function getTitleEn(): ?string
{
return $this->titleEn;
}
public function setTitleEn(?string $titleEn): self
{
$this->titleEn = $titleEn;
return $this;
}
public function getContentEn(): ?string
{
return $this->contentEn;
}
public function setContentEn(string $contentEn): self
{
$this->contentEn = $contentEn;
return $this;
}
public function getQualificationsEn(): ?string
{
return $this->qualificationsEn;
}
public function setQualificationsEn(?string $qualificationsEn): self
{
$this->qualificationsEn = $qualificationsEn;
return $this;
}
public function getDescriptionEn(): ?string
{
return $this->descriptionEn;
}
public function setDescriptionEn(?string $descriptionEn): self
{
$this->descriptionEn = $descriptionEn;
return $this;
}
}