<?php
namespace App\Entity;
use App\Entity\OccupationalFieldsAndProfessionsSearch\OccupationalFieldsAndProfessionsSearchMergedResultset;
use App\Entity\OccupationalFieldsAndProfessionsSearch\OccupationalFieldsAndProfessionsSearchResultset;
use App\Entity\Profile\JobseekerProfile;
use App\Service\OccupationalFieldsAndProfessionsSearchService;
use App\Utility\DateTimeUtility;
use App\Utility\GuidUtility;
use App\Validator\Constraint as AppAssert;
use App\Value\PossibleAvailabilitiesValue;
use App\Value\ZipcodeRadiusesValue;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Exception;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\Count;
/**
* @ORM\Entity(repositoryClass="App\Repository\WantedJobRepository")
*
* @ORM\Table(
* name="wanted_jobs",
* indexes={
*
* @ORM\Index(name="status_idx", columns={"status"})
* }
* )
*/
class WantedJob extends AbstractJob
{
public const EMPLOYMENT_TYPE_ONCE = 0;
public const EMPLOYMENT_TYPE_HELP = 1;
public const EMPLOYMENT_TYPE_PART_TIME = 2;
public const EMPLOYMENT_TYPE_FULL_TIME = 3;
public const EMPLOYMENT_TYPE_UNDEFINED = 4;
public const STATUS_DRAFT = 0;
public const STATUS_ACTIVE = 1;
public const STATUS_INACTIVE = 2;
public const STATUS_HIDDEN = 3;
public const CAREER_LEVEL_TRAINEE = 0;
public const CAREER_LEVEL_ASSISTANT = 1;
public const CAREER_LEVEL_EXPERT = 2;
public const CAREER_LEVEL_EXECUTIVE = 3;
public const POSSIBLE_EMPLOYMENT_TYPE_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING = [
'wanted_jobs.new_page.employment_types.once' => self::EMPLOYMENT_TYPE_ONCE,
'wanted_jobs.new_page.employment_types.help' => self::EMPLOYMENT_TYPE_HELP,
'wanted_jobs.new_page.employment_types.part_time' => self::EMPLOYMENT_TYPE_PART_TIME,
'wanted_jobs.new_page.employment_types.full_time' => self::EMPLOYMENT_TYPE_FULL_TIME
];
public const POSSIBLE_CAREER_LEVEL_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING = [
'wanted_jobs.new_page.career_levels.trainee' => self::CAREER_LEVEL_TRAINEE,
'wanted_jobs.new_page.career_levels.assistant' => self::CAREER_LEVEL_ASSISTANT,
'wanted_jobs.new_page.career_levels.expert' => self::CAREER_LEVEL_EXPERT,
'wanted_jobs.new_page.career_levels.executive' => self::CAREER_LEVEL_EXECUTIVE
];
public const EXPERIENCE_NONE = 0;
public const EXPERIENCE_MORE_THAN_ONE_YEAR = 1;
public const EXPERIENCE_MORE_THAN_THREE_YEARS = 3;
public const EXPERIENCE_MORE_THAN_FIVE_YEARS = 5;
// This may only grow, never remove existing entries because it makes data already in the db invalid!
// Change POSSIBLE_EXPERIENCES_AVAILABLE_FOR_SELECTION instead.
public const POSSIBLE_EXPERIENCES = [
self::EXPERIENCE_NONE,
self::EXPERIENCE_MORE_THAN_ONE_YEAR,
self::EXPERIENCE_MORE_THAN_THREE_YEARS,
self::EXPERIENCE_MORE_THAN_FIVE_YEARS,
];
public const POSSIBLE_EXPERIENCES_AVAILABLE_FOR_SELECTION = [
self::EXPERIENCE_NONE,
self::EXPERIENCE_MORE_THAN_ONE_YEAR,
self::EXPERIENCE_MORE_THAN_THREE_YEARS
];
public const POSSIBLE_EXPERIENCES_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING = [
'wanted_jobs.experience_none' => self::EXPERIENCE_NONE,
'wanted_jobs.experience_more_than_one_year' => self::EXPERIENCE_MORE_THAN_ONE_YEAR,
'wanted_jobs.experience_more_than_three_years' => self::EXPERIENCE_MORE_THAN_THREE_YEARS
];
// This needs to contain ALL translations, even for entries that are not available in the frontend,
// because the db can contain entries with an experience value that is no longer offered, but must
// still be presented in the frontend
public const POSSIBLE_EXPERIENCES_WITH_TRANSLATION_MAPPING_REVERSE = [
self::EXPERIENCE_NONE => 'wanted_jobs.experience_none',
self::EXPERIENCE_MORE_THAN_ONE_YEAR => 'wanted_jobs.experience_more_than_one_year',
self::EXPERIENCE_MORE_THAN_THREE_YEARS => 'wanted_jobs.experience_more_than_three_years',
self::EXPERIENCE_MORE_THAN_FIVE_YEARS => 'wanted_jobs.experience_more_than_five_years'
];
public function __construct()
{
$this->requiredExperience = self::EXPERIENCE_MORE_THAN_ONE_YEAR;
$this->occupationalFields = new ArrayCollection();
$this->occupationalFieldCapabilityValues = new ArrayCollection();
$this->relevantOccupationalFields = new ArrayCollection();
$this->relevantProfessions = new ArrayCollection();
$this->deactivatedProfessions = new ArrayCollection();
$this->deactivatedOccupationalFields = new ArrayCollection();
$this->title = '';
$this->description = '';
$this->createdAt = DateTimeUtility::createDateTimeUtc();
$this->availabilityRadius = ZipcodeRadiusesValue::DEFAULT;
foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$attrName = 'isRequiredOn' . $weekday . $timeOfDay;
$this->$attrName = false;
}
}
$this->employmentTypes = [self::EMPLOYMENT_TYPE_PART_TIME, self::EMPLOYMENT_TYPE_FULL_TIME, self::EMPLOYMENT_TYPE_ONCE, self::EMPLOYMENT_TYPE_HELP];
$this->additionalDescription = '';
$this->careerLevels = [self::CAREER_LEVEL_ASSISTANT, self::CAREER_LEVEL_EXPERT];
$this->isImmediateAppointment = true;
$this->status = self::STATUS_ACTIVE;
}
/**
* @var string
*
* @ORM\GeneratedValue(strategy="CUSTOM")
*
* @ORM\CustomIdGenerator(class="App\Utility\DatabaseIdGenerator")
*
* @ORM\Column(name="id", type="guid")
*
* @ORM\Id
*/
protected $id;
public function setId(string $id): void
{
GuidUtility::validOrThrow($id);
$this->id = $id;
}
/**
* A callable for Elastica to decide if an object is to be indexed in ES.
*/
public function isFindable()
{
return $this->isPublished();
}
/**
* @var ?DateTime
*
* @ORM\Column(name="created_at", type="datetime", nullable=true)
*/
protected $createdAt;
public function getCreatedAt(): ?DateTime
{
return $this->createdAt;
}
/**
* @var ?DateTime
*
* @ORM\Column(name="edited_at", type="datetime", nullable=true)
*/
protected $editedAt;
public function setEditedAt(?DateTime $editedAt): void
{
$this->editedAt = $editedAt;
}
/**
* @var JobseekerProfile
*
* @ORM\ManyToOne(targetEntity="App\Entity\Profile\JobseekerProfile", inversedBy="wantedJobs", cascade={"persist"})
*
* @ORM\JoinColumn(name="jobseeker_profiles_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
*/
protected $jobseekerProfile;
/**
* @return JobseekerProfile
*/
public function getJobseekerProfile()
{
return $this->jobseekerProfile;
}
public function setJobseekerProfile(JobseekerProfile $jobseekerProfile)
{
$this->jobseekerProfile = $jobseekerProfile;
}
/**
* @var Collection|OccupationalField[]
*
* @ORM\ManyToMany(targetEntity="App\Entity\OccupationalField", inversedBy="wantedJobs", cascade={"persist"})
*
* @ORM\JoinTable(
* name="wanted_jobs_occupational_fields",
* joinColumns={
*
* @ORM\JoinColumn(name="wanted_jobs_id", referencedColumnName="id", onDelete="CASCADE")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="occupational_field_id", referencedColumnName="id", onDelete="CASCADE")
* }
* )
*
* @Assert\Type("\Doctrine\Common\Collections\Collection")
*/
protected $occupationalFields;
/**
* @var int
*
* @ORM\Column(name="required_experience", type="smallint", nullable=false)
*
* @Assert\Type("int")
*/
protected $requiredExperience;
/**
* @var string
*
* @ORM\Column(name="title", type="string", length=128, nullable=true)
*
* @Assert\Type("string")
*
* @Assert\Length(
* min = 0,
* max = 50,
* )
*/
protected $title;
public function setTitle(string $title)
{
$this->title = $title;
}
public function getTitle(): string
{
return $this->title;
}
/**
* @var string
*
* @ORM\Column(name="description", type="text", length=10000, nullable=true)
*
* @Assert\Type("string")
*/
protected $description;
public function setDescription(?string $description)
{
$this->description = $description;
}
public function getDescription(): ?string
{
return $this->description;
}
/** @throws Exception */
protected function setIsRequiredOnWeekday(string $weekday, bool $val)
{
if (!in_array($weekday, PossibleAvailabilitiesValue::WEEKDAYS)) {
throw new Exception('Unknown availability weekday "' . $weekday . '"');
}
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$attr = 'isRequiredOn' . $weekday . $timeOfDay;
$this->$attr = $val;
}
}
/** @throws Exception */
protected function isRequiredOnWeekday(string $weekday): bool
{
if (!in_array($weekday, PossibleAvailabilitiesValue::WEEKDAYS)) {
throw new Exception('Unknown availability weekday "' . $weekday . '"');
}
$result = false;
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$attr = 'isRequiredOn' . $weekday . $timeOfDay;
if ($this->$attr === true) {
$result = true;
}
}
return $result;
}
/** @throws Exception */
public function setIsRequiredOnMonday(bool $val)
{
$this->setIsRequiredOnWeekday('Monday', $val);
}
/** @throws Exception */
public function isRequiredOnMonday(): bool
{
return $this->isRequiredOnWeekday('Monday');
}
/** @throws Exception */
public function setIsRequiredOnTuesday(bool $val)
{
$this->setIsRequiredOnWeekday('Tuesday', $val);
}
/** @throws Exception */
public function isRequiredOnTuesday(): bool
{
return $this->isRequiredOnWeekday('Tuesday');
}
/** @throws Exception */
public function setIsRequiredOnWednesday(bool $val)
{
$this->setIsRequiredOnWeekday('Wednesday', $val);
}
/** @throws Exception */
public function isRequiredOnWednesday(): bool
{
return $this->isRequiredOnWeekday('Wednesday');
}
/** @throws Exception */
public function setIsRequiredOnThursday(bool $val)
{
$this->setIsRequiredOnWeekday('Thursday', $val);
}
/** @throws Exception */
public function isRequiredOnThursday(): bool
{
return $this->isRequiredOnWeekday('Thursday');
}
/** @throws Exception */
public function setIsRequiredOnFriday(bool $val)
{
$this->setIsRequiredOnWeekday('Friday', $val);
}
/** @throws Exception */
public function isRequiredOnFriday(): bool
{
return $this->isRequiredOnWeekday('Friday');
}
/** @throws Exception */
public function setIsRequiredOnSaturday(bool $val)
{
$this->setIsRequiredOnWeekday('Saturday', $val);
}
/** @throws Exception */
public function isRequiredOnSaturday(): bool
{
return $this->isRequiredOnWeekday('Saturday');
}
/** @throws Exception */
public function setIsRequiredOnSunday(bool $val)
{
$this->setIsRequiredOnWeekday('Sunday', $val);
}
/** @throws Exception */
public function isRequiredOnSunday(): bool
{
return $this->isRequiredOnWeekday('Sunday');
}
/** @throws Exception */
public function getRequiredWeekdays(): array
{
$result = [];
foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
if ($this->isRequiredOnWeekday($weekday)) {
$result[] = $weekday;
}
}
return $result;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_monday_morning", type="boolean", nullable=false)
*/
protected $isRequiredOnMondayMorning;
public function setIsRequiredOnMondayMorning(bool $isRequiredOnMondayMorning)
{
$this->isRequiredOnMondayMorning = $isRequiredOnMondayMorning;
}
public function isRequiredOnMondayMorning(): bool
{
return $this->isRequiredOnMondayMorning;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_monday_noon", type="boolean", nullable=false)
*/
protected $isRequiredOnMondayNoon;
public function setIsRequiredOnMondayNoon(bool $isRequiredOnMondayNoon)
{
$this->isRequiredOnMondayNoon = $isRequiredOnMondayNoon;
}
public function isRequiredOnMondayNoon(): bool
{
return $this->isRequiredOnMondayNoon;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_monday_evening", type="boolean", nullable=false)
*/
protected $isRequiredOnMondayEvening;
public function setIsRequiredOnMondayEvening(bool $isRequiredOnMondayEvening)
{
$this->isRequiredOnMondayEvening = $isRequiredOnMondayEvening;
}
public function isRequiredOnMondayEvening(): bool
{
return $this->isRequiredOnMondayEvening;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_monday_night", type="boolean", nullable=false)
*/
protected $isRequiredOnMondayNight;
public function setIsRequiredOnMondayNight(bool $isRequiredOnMondayNight)
{
$this->isRequiredOnMondayNight = $isRequiredOnMondayNight;
}
public function isRequiredOnMondayNight(): bool
{
return $this->isRequiredOnMondayNight;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_tuesday_morning", type="boolean", nullable=false)
*/
protected $isRequiredOnTuesdayMorning;
public function setIsRequiredOnTuesdayMorning(bool $isRequiredOnTuesdayMorning)
{
$this->isRequiredOnTuesdayMorning = $isRequiredOnTuesdayMorning;
}
public function isRequiredOnTuesdayMorning(): bool
{
return $this->isRequiredOnTuesdayMorning;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_tuesday_noon", type="boolean", nullable=false)
*/
protected $isRequiredOnTuesdayNoon;
public function setIsRequiredOnTuesdayNoon(bool $isRequiredOnTuesdayNoon)
{
$this->isRequiredOnTuesdayNoon = $isRequiredOnTuesdayNoon;
}
public function isRequiredOnTuesdayNoon(): bool
{
return $this->isRequiredOnTuesdayNoon;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_tuesday_evening", type="boolean", nullable=false)
*/
protected $isRequiredOnTuesdayEvening;
public function setIsRequiredOnTuesdayEvening(bool $isRequiredOnTuesdayEvening)
{
$this->isRequiredOnTuesdayEvening = $isRequiredOnTuesdayEvening;
}
public function isRequiredOnTuesdayEvening(): bool
{
return $this->isRequiredOnTuesdayEvening;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_tuesday_night", type="boolean", nullable=false)
*/
protected $isRequiredOnTuesdayNight;
public function setIsRequiredOnTuesdayNight(bool $isRequiredOnTuesdayNight)
{
$this->isRequiredOnTuesdayNight = $isRequiredOnTuesdayNight;
}
public function isRequiredOnTuesdayNight(): bool
{
return $this->isRequiredOnTuesdayNight;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_wednesday_morning", type="boolean", nullable=false)
*/
protected $isRequiredOnWednesdayMorning;
public function setIsRequiredOnWednesdayMorning(bool $isRequiredOnWednesdayMorning)
{
$this->isRequiredOnWednesdayMorning = $isRequiredOnWednesdayMorning;
}
public function isRequiredOnWednesdayMorning(): bool
{
return $this->isRequiredOnWednesdayMorning;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_wednesday_noon", type="boolean", nullable=false)
*/
protected $isRequiredOnWednesdayNoon;
public function setIsRequiredOnWednesdayNoon(bool $isRequiredOnWednesdayNoon)
{
$this->isRequiredOnWednesdayNoon = $isRequiredOnWednesdayNoon;
}
public function isRequiredOnWednesdayNoon(): bool
{
return $this->isRequiredOnWednesdayNoon;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_wednesday_evening", type="boolean", nullable=false)
*/
protected $isRequiredOnWednesdayEvening;
public function setIsRequiredOnWednesdayEvening(bool $isRequiredOnWednesdayEvening)
{
$this->isRequiredOnWednesdayEvening = $isRequiredOnWednesdayEvening;
}
public function isRequiredOnWednesdayEvening(): bool
{
return $this->isRequiredOnWednesdayEvening;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_wednesday_night", type="boolean", nullable=false)
*/
protected $isRequiredOnWednesdayNight;
public function setIsRequiredOnWednesdayNight(bool $isRequiredOnWednesdayNight)
{
$this->isRequiredOnWednesdayNight = $isRequiredOnWednesdayNight;
}
public function isRequiredOnWednesdayNight(): bool
{
return $this->isRequiredOnWednesdayNight;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_thursday_morning", type="boolean", nullable=false)
*/
protected $isRequiredOnThursdayMorning;
public function setIsRequiredOnThursdayMorning(bool $isRequiredOnThursdayMorning)
{
$this->isRequiredOnThursdayMorning = $isRequiredOnThursdayMorning;
}
public function isRequiredOnThursdayMorning(): bool
{
return $this->isRequiredOnThursdayMorning;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_thursday_noon", type="boolean", nullable=false)
*/
protected $isRequiredOnThursdayNoon;
public function setIsRequiredOnThursdayNoon(bool $isRequiredOnThursdayNoon)
{
$this->isRequiredOnThursdayNoon = $isRequiredOnThursdayNoon;
}
public function isRequiredOnThursdayNoon(): bool
{
return $this->isRequiredOnThursdayNoon;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_thursday_evening", type="boolean", nullable=false)
*/
protected $isRequiredOnThursdayEvening;
public function setIsRequiredOnThursdayEvening(bool $isRequiredOnThursdayEvening)
{
$this->isRequiredOnThursdayEvening = $isRequiredOnThursdayEvening;
}
public function isRequiredOnThursdayEvening(): bool
{
return $this->isRequiredOnThursdayEvening;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_thursday_night", type="boolean", nullable=false)
*/
protected $isRequiredOnThursdayNight;
public function setIsRequiredOnThursdayNight(bool $isRequiredOnThursdayNight)
{
$this->isRequiredOnThursdayNight = $isRequiredOnThursdayNight;
}
public function isRequiredOnThursdayNight(): bool
{
return $this->isRequiredOnThursdayNight;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_friday_morning", type="boolean", nullable=false)
*/
protected $isRequiredOnFridayMorning;
public function setIsRequiredOnFridayMorning(bool $isRequiredOnFridayMorning)
{
$this->isRequiredOnFridayMorning = $isRequiredOnFridayMorning;
}
public function isRequiredOnFridayMorning(): bool
{
return $this->isRequiredOnFridayMorning;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_friday_noon", type="boolean", nullable=false)
*/
protected $isRequiredOnFridayNoon;
public function setIsRequiredOnFridayNoon(bool $isRequiredOnFridayNoon)
{
$this->isRequiredOnFridayNoon = $isRequiredOnFridayNoon;
}
public function isRequiredOnFridayNoon(): bool
{
return $this->isRequiredOnFridayNoon;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_friday_evening", type="boolean", nullable=false)
*/
protected $isRequiredOnFridayEvening;
public function setIsRequiredOnFridayEvening(bool $isRequiredOnFridayEvening)
{
$this->isRequiredOnFridayEvening = $isRequiredOnFridayEvening;
}
public function isRequiredOnFridayEvening(): bool
{
return $this->isRequiredOnFridayEvening;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_friday_night", type="boolean", nullable=false)
*/
protected $isRequiredOnFridayNight;
public function setIsRequiredOnFridayNight(bool $isRequiredOnFridayNight)
{
$this->isRequiredOnFridayNight = $isRequiredOnFridayNight;
}
public function isRequiredOnFridayNight(): bool
{
return $this->isRequiredOnFridayNight;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_saturday_morning", type="boolean", nullable=false)
*/
protected $isRequiredOnSaturdayMorning;
public function setIsRequiredOnSaturdayMorning(bool $isRequiredOnSaturdayMorning)
{
$this->isRequiredOnSaturdayMorning = $isRequiredOnSaturdayMorning;
}
public function isRequiredOnSaturdayMorning(): bool
{
return $this->isRequiredOnSaturdayMorning;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_saturday_noon", type="boolean", nullable=false)
*/
protected $isRequiredOnSaturdayNoon;
public function setIsRequiredOnSaturdayNoon(bool $isRequiredOnSaturdayNoon)
{
$this->isRequiredOnSaturdayNoon = $isRequiredOnSaturdayNoon;
}
public function isRequiredOnSaturdayNoon(): bool
{
return $this->isRequiredOnSaturdayNoon;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_saturday_evening", type="boolean", nullable=false)
*/
protected $isRequiredOnSaturdayEvening;
public function setIsRequiredOnSaturdayEvening(bool $isRequiredOnSaturdayEvening)
{
$this->isRequiredOnSaturdayEvening = $isRequiredOnSaturdayEvening;
}
public function isRequiredOnSaturdayEvening(): bool
{
return $this->isRequiredOnSaturdayEvening;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_saturday_night", type="boolean", nullable=false)
*/
protected $isRequiredOnSaturdayNight;
public function setIsRequiredOnSaturdayNight(bool $isRequiredOnSaturdayNight)
{
$this->isRequiredOnSaturdayNight = $isRequiredOnSaturdayNight;
}
public function isRequiredOnSaturdayNight(): bool
{
return $this->isRequiredOnSaturdayNight;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_sunday_morning", type="boolean", nullable=false)
*/
protected $isRequiredOnSundayMorning;
public function setIsRequiredOnSundayMorning(bool $isRequiredOnSundayMorning)
{
$this->isRequiredOnSundayMorning = $isRequiredOnSundayMorning;
}
public function isRequiredOnSundayMorning(): bool
{
return $this->isRequiredOnSundayMorning;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_sunday_noon", type="boolean", nullable=false)
*/
protected $isRequiredOnSundayNoon;
public function setIsRequiredOnSundayNoon(bool $isRequiredOnSundayNoon)
{
$this->isRequiredOnSundayNoon = $isRequiredOnSundayNoon;
}
public function isRequiredOnSundayNoon(): bool
{
return $this->isRequiredOnSundayNoon;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_sunday_evening", type="boolean", nullable=false)
*/
protected $isRequiredOnSundayEvening;
public function setIsRequiredOnSundayEvening(bool $isRequiredOnSundayEvening)
{
$this->isRequiredOnSundayEvening = $isRequiredOnSundayEvening;
}
public function isRequiredOnSundayEvening(): bool
{
return $this->isRequiredOnSundayEvening;
}
/**
* @var bool
*
* @ORM\Column(name="is_required_on_sunday_night", type="boolean", nullable=false)
*/
protected $isRequiredOnSundayNight;
public function setIsRequiredOnSundayNight(bool $isRequiredOnSundayNight)
{
$this->isRequiredOnSundayNight = $isRequiredOnSundayNight;
}
public function isRequiredOnSundayNight(): bool
{
return $this->isRequiredOnSundayNight;
}
/** @return Collection|OccupationalField[] */
public function getOccupationalFields(): Collection
{
return $this->occupationalFields;
}
public function setOccupationalFields(Collection $occupationalFields): void
{
$this->occupationalFields = $occupationalFields;
}
public function getRequiredExperience(): int
{
return $this->requiredExperience;
}
public function setRequiredExperience(int $requiredExperience)
{
$this->requiredExperience = $requiredExperience;
}
public function getBusinessName(): string
{
return $this->getJobseekerProfile()->getFirstname();
}
public function hasPhoto(): bool
{
return $this->getJobseekerProfile()->hasPhoto();
}
public function hasNegativeReviews(): bool
{
return $this->getJobseekerProfile()->hasNegativeReviews();
}
public function numberOfNegativeReviews(): bool
{
return $this->getJobseekerProfile()->numberOfNegativeReviews();
}
public function getZipcode(): ?string
{
return $this->getJobseekerProfile()->getAvailabilityZipcode();
}
public function isLocked(): bool
{
return $this->getJobseekerProfile()->isLocked();
}
// There would not really be a need for this method anymore, but we keep it because the ElasticSearch index is
// configured to use the lastseenAt attribute; instead of switching ES to use freshnessDate, we keep the method and
// thus avoid an ES reindex.
public function getLastseenAt(): DateTime
{
return $this->getFreshnessDate();
}
public function getFreshnessDate(): DateTime
{
return $this->jobseekerProfile->getLastseenAt();
}
/**
* @var Collection|OccupationalField[] Those occupational fields where the title matched the searchterm
*
* @ORM\ManyToMany(targetEntity="App\Entity\OccupationalField", cascade={"persist"})
*
* @ORM\JoinTable(
* name="wanted_jobs_relevant_occupational_fields",
* joinColumns={
*
* @ORM\JoinColumn(name="wanted_jobs_id", referencedColumnName="id", onDelete="CASCADE")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="occupational_field_id", referencedColumnName="id", onDelete="CASCADE")
* }
* )
*
* @Assert\Type("\Doctrine\Common\Collections\Collection")
*/
protected $relevantOccupationalFields;
public function setRelevantOccupationalFields(Collection $occupationalFields): void
{
$this->relevantOccupationalFields = $occupationalFields;
}
/** @return Collection|OccupationalField[] */
public function getRelevantOccupationalFields(): Collection
{
return $this->relevantOccupationalFields;
}
/**
* @var Collection|OccupationalField[] Those OFs which the user has manually removed
*
* @ORM\ManyToMany(targetEntity="App\Entity\OccupationalField", cascade={"persist"})
*
* @ORM\JoinTable(
* name="wanted_jobs_deactivated_occupational_fields",
* joinColumns={
*
* @ORM\JoinColumn(name="wanted_jobs_id", referencedColumnName="id", onDelete="CASCADE")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="occupational_field_id", referencedColumnName="id", onDelete="CASCADE")
* }
* )
*
* @Assert\Type("\Doctrine\Common\Collections\Collection")
*/
protected $deactivatedOccupationalFields;
public function setDeactivatedOccupationalFields(Collection $occupationalFields): void
{
$this->deactivatedOccupationalFields = $occupationalFields;
}
/**
* @return Profession[]|Collection
*/
public function getDeactivatedOccupationalFields(): Collection
{
return $this->deactivatedOccupationalFields;
}
public function addDeactivatedOccupationalField(OccupationalField $occupationalField): void
{
$this->deactivatedOccupationalFields->add($occupationalField);
}
public function removeDeactivatedOccupationalField(OccupationalField $occupationalField): void
{
$this->deactivatedOccupationalFields->removeElement($occupationalField);
}
public function getEffectiveOccupationalFields(): Collection
{
$effectiveOccupationalFields = new ArrayCollection();
foreach ($this->getRelevantOccupationalFields() as $occupationalField) {
if (!$this->getDeactivatedOccupationalFields()->contains($occupationalField)) {
$effectiveOccupationalFields->add($occupationalField);
}
}
return $effectiveOccupationalFields;
}
/**
* @var Collection|Profession[] Those professions where the name matched the searchterm
*
* @ORM\ManyToMany(targetEntity="App\Entity\Profession", cascade={"persist"})
*
* @ORM\JoinTable(
* name="wanted_jobs_relevant_professions",
* joinColumns={
*
* @ORM\JoinColumn(name="wanted_jobs_id", referencedColumnName="id", onDelete="CASCADE")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="profession_id", referencedColumnName="id", onDelete="CASCADE")
* }
* )
*
* @Assert\Type("\Doctrine\Common\Collections\Collection")
*/
protected $relevantProfessions;
public function setRelevantProfessions(Collection $professions): void
{
$this->relevantProfessions = $professions;
}
/**
* @return Profession[]|Collection
*/
public function getRelevantProfessions(): Collection
{
return $this->relevantProfessions;
}
/**
* @return Profession[]|Collection
*/
public function getProfessions(): Collection
{
$professions = [];
foreach ($this->occupationalFields as $occupationalField) {
foreach ($occupationalField->getProfessions() as $profession) {
$professions[] = $profession;
}
}
return new ArrayCollection($professions);
}
/**
* @var Collection|Profession[] Those professions where the name matched the searchterm
*
* @ORM\ManyToMany(targetEntity="App\Entity\Profession", cascade={"persist"})
*
* @ORM\JoinTable(
* name="wanted_jobs_deactivated_professions",
* joinColumns={
*
* @ORM\JoinColumn(name="wanted_jobs_id", referencedColumnName="id", onDelete="CASCADE")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="profession_id", referencedColumnName="id", onDelete="CASCADE")
* }
* )
*
* @Assert\Type("\Doctrine\Common\Collections\Collection")
*/
protected $deactivatedProfessions;
public function setDeactivatedProfessions(Collection $professions): void
{
$this->deactivatedProfessions = $professions;
}
/**
* @return Profession[]|Collection
*/
public function getDeactivatedProfessions(): Collection
{
return $this->deactivatedProfessions;
}
public function addDeactivatedProfession(Profession $profession): void
{
$this->deactivatedProfessions->add($profession);
}
public function removeDeactivatedProfession(Profession $profession): void
{
$this->deactivatedProfessions->removeElement($profession);
}
public function getEffectiveProfessions(): Collection
{
$effectiveProfessions = new ArrayCollection();
foreach ($this->getRelevantProfessions() as $profession) {
if (!$this->getDeactivatedProfessions()->contains($profession)) {
$effectiveProfessions->add($profession);
}
}
return $effectiveProfessions;
}
/**
* @var string|null
*
* @ORM\Column(name="occupational_field_searchterm", type="string", length=1024, nullable=true)
*
* @AppAssert\LatinWord
*/
protected $occupationalFieldSearchterm;
public function setOccupationalFieldSearchterm(?string $occupationalFieldSearchterm): void
{
$this->occupationalFieldSearchterm = $occupationalFieldSearchterm;
}
public function getOccupationalFieldSearchterm(): string
{
$term = trim((string)$this->occupationalFieldSearchterm);
if (trim($term) === '') {
if (sizeof($this->getEffectiveOccupationalFields()) > 0) {
return $this->getEffectiveOccupationalFields()->first()->getTitle();
}
if (sizeof($this->getOccupationalFields()) > 0) {
return $this->getOccupationalFields()->first()->getTitle();
}
return '';
}
return $term;
}
// The following are helper functions for FOSElastica to get data in the format it needs
public function getOccupationalFieldSearchtermForFulltextsearch(): string
{
return OccupationalFieldsAndProfessionsSearchService::normalizeSearchterm($this->getOccupationalFieldSearchterm());
}
/** @return string[] */
public function getAllOccupationalFieldsTitlesForFulltextsearch(): array
{
$result = [];
$occupationalFields = $this->occupationalFields;
/** @var OccupationalField $occupationalField */
foreach ($occupationalFields as $occupationalField) {
$result[] = OccupationalFieldsAndProfessionsSearchService::normalizeText($occupationalField->getTitle());
}
return $result;
}
/** @return string[] */
public function getRelevantOccupationalFieldsTitlesForFulltextsearch(): array
{
$result = [];
$occupationalFields = $this->relevantOccupationalFields;
/** @var OccupationalField $occupationalField */
foreach ($occupationalFields as $occupationalField) {
$result[] = OccupationalFieldsAndProfessionsSearchService::normalizeText($occupationalField->getTitle());
}
return $result;
}
/** @return string[] */
public function getAllProfessionsTitlesForFulltextsearch(): array
{
$result = [];
$professions = $this->getProfessions();
/** @var Profession $profession */
foreach ($professions as $profession) {
$result[] = OccupationalFieldsAndProfessionsSearchService::normalizeText($profession->getTitle());
}
return $result;
}
/** @return string[] */
public function getRelevantProfessionsTitlesForFulltextsearch(): array
{
$result = [];
$professions = $this->relevantProfessions;
/** @var Profession $profession */
foreach ($professions as $profession) {
$result[] = OccupationalFieldsAndProfessionsSearchService::normalizeText($profession->getTitle());
}
return $result;
}
public function getIndexableIsRequiredOnWeekdayTimeOfDay(): array
{
$result = [];
foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$attrName = 'isRequiredOn' . $weekday . $timeOfDay;
$result[$attrName] = $this->$attrName;
}
}
return $result;
}
public function getIndexableNumberOfRequiredTimesForTimeOfDay(): array
{
$result = [];
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$result[$timeOfDay] = 0;
}
foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$attrName = 'isRequiredOn' . $weekday . $timeOfDay;
if ($this->$attrName === true) {
++$result[$timeOfDay];
}
}
}
return $result;
}
public function __toString()
{
return (string)$this->getId();
}
public function getPausedSince(): ?DateTime
{
return $this->jobseekerProfile->getPausedSince();
}
public function isPaused(): bool
{
return $this->jobseekerProfile->isPaused();
}
/**
* @var string|null
*
* @ORM\Column(name="additional_description", type="text", length=10000, nullable=true)
*
* @Assert\Type("string")
*
* @Assert\Length(
* min = 0,
* max = 3000,
* )
*/
protected $additionalDescription;
public function setAdditionalDescription(?string $additionalDescription)
{
$this->additionalDescription = $additionalDescription;
}
public function getAdditionalDescription(): ?string
{
return $this->additionalDescription;
}
/**
* @var DateTime|null
*
* @ORM\Column(name="appointment_date", type="datetime", nullable=true)
*/
protected $appointmentDate;
public function setAppointmentDate(?DateTime $appointmentDate)
{
$this->appointmentDate = $appointmentDate;
}
public function getAppointmentDate(): ?DateTime
{
return $this->appointmentDate;
}
/**
* @var bool
*
* @ORM\Column(name="is_immediate_appointment", type="boolean", nullable=false)
*/
protected $isImmediateAppointment;
public function setIsImmediateAppointment(bool $isImmediateAppointment)
{
$this->isImmediateAppointment = $isImmediateAppointment;
}
public function isImmediateAppointment(): bool
{
return $this->isImmediateAppointment;
}
/**
* @var int
*
* @ORM\Column(name="status", type="smallint", nullable=false)
*/
protected $status;
public function setStatus(int $status)
{
$this->status = $status;
}
public function getStatus(): int
{
return $this->status;
}
public function isDraft(): bool
{
return $this->status === self::STATUS_DRAFT;
}
public function isPublished(): bool
{
return $this->status === self::STATUS_ACTIVE;
}
public function isDeactivated(): bool
{
return $this->status === self::STATUS_INACTIVE;
}
public function isHidden(): bool
{
return $this->status === self::STATUS_HIDDEN;
}
/**
* @var array|int[]
*
* @ORM\Column(name="career_levels", type="array", nullable=false)
*
* @Count(min = 1, minMessage = "Mindestens eine Option muss gewählt werden")
*/
protected $careerLevels;
/**
* @param array|int[] $careerLevels
*
* @throws Exception
*/
public function setCareerLevels(array $careerLevels): void
{
foreach ($careerLevels as $careerLevel) {
if (!is_int($careerLevel) || $careerLevel < self::CAREER_LEVEL_TRAINEE || $careerLevel > self::CAREER_LEVEL_EXECUTIVE) {
throw new Exception('Invalid value ' . $careerLevel . ' for careerLevel.');
}
}
$this->careerLevels = array_values($careerLevels);
}
public function getCareerLevels(): array
{
if (!is_array($this->careerLevels)) {
return [];
}
return array_values($this->careerLevels);
}
/**
* @var array
*
* @ORM\Column(name="employment_types", type="array", nullable=false)
*
* @Count(min = 1, minMessage = "Mindestens eine Option muss gewählt werden")
*/
protected $employmentTypes;
/** @throws Exception */
public function setEmploymentTypes(array $employmentTypes)
{
foreach ($employmentTypes as $employmentType) {
if (!is_int($employmentType) || $employmentType < self::EMPLOYMENT_TYPE_ONCE || $employmentType > self::EMPLOYMENT_TYPE_UNDEFINED) {
throw new Exception('Invalid value ' . $employmentType . ' for employmentType.');
}
}
$this->employmentTypes = array_values($employmentTypes);
}
public function getEmploymentTypes(): array
{
if (!is_array($this->employmentTypes)) {
return [];
}
return array_values($this->employmentTypes);
}
/**
* @var int
*
* @ORM\Column(name="availability_radius", type="integer", nullable=false)
*
* @Assert\Type("int")
*/
protected $availabilityRadius;
public function setAvailabilityRadius(int $availabilityRadius)
{
$this->availabilityRadius = $availabilityRadius;
}
public function getAvailabilityRadius(): int
{
return $this->availabilityRadius;
}
/**
* @var AutomatedConversationMessagesMailing[]|Collection
*
* @ORM\OneToMany(targetEntity="App\Entity\AutomatedConversationMessagesMailing", mappedBy="wantedJob", cascade={"persist", "remove"})
*/
protected $automatedConversationMessagesMailings;
public function getAutomatedConversationMessagesMailings(): Collection
{
return $this->automatedConversationMessagesMailings;
}
public function setWantedJobValuesAccordingToOccupationalFieldsAndProfessionsSearchResultset(OccupationalFieldsAndProfessionsSearchResultset $resultset): void
{
$this->setOccupationalFieldSearchterm($resultset->getOriginallyEnteredSearchterm());
$this->setOccupationalFields(new ArrayCollection($resultset->getOccupationalFields()));
$this->setRelevantOccupationalFields(new ArrayCollection($resultset->getRelevantOccupationalFields()));
$this->setRelevantProfessions(new ArrayCollection($resultset->getRelevantProfessions()));
}
public function setWantedJobValuesAccordingToOccupationalFieldsAndProfessionsSearchMergedResultset(OccupationalFieldsAndProfessionsSearchMergedResultset $resultset): void
{
$this->setOccupationalFieldSearchterm($resultset->getSearchterm());
$this->setOccupationalFields(new ArrayCollection($resultset->getOccupationalFields()));
$this->setRelevantOccupationalFields(new ArrayCollection($resultset->getRelevantOccupationalFields()));
$this->setRelevantProfessions(new ArrayCollection($resultset->getRelevantProfessions()));
}
}