<?php
namespace App\Entity;
use App\Command\ResetRecurrentJobsFreshnessDate;
use App\Controller\ActivitytrackingController;
use App\Entity\ContentDistribution\AgenturFuerArbeit\AfaProfession;
use App\Entity\ContentDistribution\AgenturFuerArbeit\DestatisEconomicSector;
use App\Entity\ContentDistribution\RecurrentJobContentDistributionValue;
use App\Entity\ExternalPartner\ExternalPartner;
use App\Entity\ExternalPartner\IntegratedExternalPartnerCustomer;
use App\Entity\ExternalPartner\IntegratedExternalPartnerCustomerQuota;
use App\Entity\ExternalPartner\RecurrentJobAdditionalInfo;
use App\Entity\Membership\RecurrentJobBooking;
use App\Entity\OccupationalFieldsAndProfessionsSearch\OccupationalFieldsAndProfessionsSearchMergedResultset;
use App\Entity\OccupationalFieldsAndProfessionsSearch\OccupationalFieldsAndProfessionsSearchResultset;
use App\Entity\Profile\JoboffererProfile;
use App\Service\DestatisEconomicSectorService;
use App\Service\MailService;
use App\Service\OccupationalFieldCapabilitiesService;
use App\Service\OccupationalFieldsAndProfessionsSearchService;
use App\Utility\DateTimeUtility;
use App\Utility\GenderNeutralizer;
use App\Utility\GuidUtility;
use App\Utility\ReflectionHelper;
use App\Utility\TextCleaner;
use App\Utility\UrlHelper;
use App\Validator\Constraint as AppAssert;
use App\Value\PossibleAvailabilitiesValue;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Exception;
use InvalidArgumentException;
use JanusHercules\ExtendedApplicationQuestionnaire\Domain\Entity\ExtendedApplicationQuestion;
use JanusHercules\ExternalApplicationQuestions\Domain\Entity\SoftgardenApplicationJobInformation;
use JanusHercules\IntegratedExternalPartnerCustomers\Domain\Entity\WeclappContractItem;
use JanusHercules\Membership\Domain\Entity\FlexMembershipRecurrentJobSlot;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\Count;
use Symfony\Component\Validator\Exception\ValidationFailedException;
use Symfony\Component\Validator\Validation;
/**
* @ORM\Entity(repositoryClass="App\Repository\RecurrentJobRepository")
*
* @ORM\Table(
* name="recurrent_jobs",
* indexes={
*
* @ORM\Index(name="status_idx", columns={"status"}),
* @ORM\Index(name="freshness_date_idx", columns={"freshness_date"})
* }
* )
*/
class RecurrentJob 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 MAX_FRESHNESS_AGE_FOR_GOOGLE_JOBS = 60;
public const DEFAULT_ADDITIONAL_SEARCHTERM_RANGE = 3;
public const STARTOPTION_IMMEDIATELY = 0;
public const STARTOPTION_DATE = 1;
public const STARTOPTION_NOT_SPECIFIED = 2;
public const STATUS_DRAFT = 0;
public const STATUS_ACTIVE = 1;
public const STATUS_INACTIVE = 2;
// LEGACY STATUS_DEACTIVATED_BECAUSE_OF_QUOTA
public const STATUS_DEACTIVATED_BECAUSE_OF_QUOTA = 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 EXPERIENCE_NONE = WantedJob::EXPERIENCE_NONE;
public const EXPERIENCE_MORE_THAN_ONE_YEAR = WantedJob::EXPERIENCE_MORE_THAN_ONE_YEAR;
public const EXPERIENCE_MORE_THAN_THREE_YEARS = WantedJob::EXPERIENCE_MORE_THAN_THREE_YEARS;
public const EXPERIENCE_MORE_THAN_FIVE_YEARS = WantedJob::EXPERIENCE_MORE_THAN_FIVE_YEARS;
public const APPLICATION_TYPE_CONVERSATION_MESSAGE = 0;
public const APPLICATION_TYPE_FORWARDING = 1;
public const APPLICATION_TYPE_EXTENDED_APPLICATION = 2;
public const POSSIBLE_EMPLOYMENT_TYPES = [
self::EMPLOYMENT_TYPE_ONCE,
self::EMPLOYMENT_TYPE_HELP,
self::EMPLOYMENT_TYPE_PART_TIME,
self::EMPLOYMENT_TYPE_FULL_TIME
];
public const POSSIBLE_CAREER_LEVELS = [
self::CAREER_LEVEL_TRAINEE,
self::CAREER_LEVEL_ASSISTANT,
self::CAREER_LEVEL_EXPERT,
self::CAREER_LEVEL_EXECUTIVE
];
public const POSSIBLE_EXPERIENCE_VALUES_FOR_SELECTION = [
self::EXPERIENCE_NONE,
self::EXPERIENCE_MORE_THAN_ONE_YEAR,
self::EXPERIENCE_MORE_THAN_THREE_YEARS
];
public const POSSIBLE_APPLICATION_TYPES = [
self::APPLICATION_TYPE_CONVERSATION_MESSAGE,
self::APPLICATION_TYPE_FORWARDING,
self::APPLICATION_TYPE_EXTENDED_APPLICATION
];
public const POSSIBLE_EXPERIENCE_VALUES_FOR_SELECTION_WITH_TRANSLATION_MAPPING = [
self::EXPERIENCE_NONE => 'recurrent_jobs.new_page.experience_none',
self::EXPERIENCE_MORE_THAN_ONE_YEAR => 'recurrent_jobs.new_page.experience_more_than_one_year',
self::EXPERIENCE_MORE_THAN_THREE_YEARS => 'recurrent_jobs.new_page.experience_more_than_three_years'
];
public const POSSIBLE_EMPLOYMENT_TYPE_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING = [
'recurrent_jobs.new_page.employment_types.once' => self::EMPLOYMENT_TYPE_ONCE,
'recurrent_jobs.new_page.employment_types.help' => self::EMPLOYMENT_TYPE_HELP,
'recurrent_jobs.new_page.employment_types.part_time' => self::EMPLOYMENT_TYPE_PART_TIME,
'recurrent_jobs.new_page.employment_types.full_time' => self::EMPLOYMENT_TYPE_FULL_TIME
];
public const POSSIBLE_CAREER_LEVEL_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING = [
'recurrent_jobs.new_page.career_level.trainee' => self::CAREER_LEVEL_TRAINEE,
'recurrent_jobs.new_page.career_level.assistant' => self::CAREER_LEVEL_ASSISTANT,
'recurrent_jobs.new_page.career_level.expert' => self::CAREER_LEVEL_EXPERT,
'recurrent_jobs.new_page.career_level.executive' => self::CAREER_LEVEL_EXECUTIVE
];
public const POSSIBLE_APPLICATION_TYPE_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING = [
'recurrent_jobs.new_page.application_type.conversation_message' => self::APPLICATION_TYPE_CONVERSATION_MESSAGE,
'recurrent_jobs.new_page.application_type.forwarding' => self::APPLICATION_TYPE_FORWARDING,
'recurrent_jobs.new_page.application_type.extended_application' => self::APPLICATION_TYPE_EXTENDED_APPLICATION
];
/**
* @throws Exception
*/
public function __construct()
{
$this->joboffererProfile = null;
$this->quota = null;
$this->requiredExperience = RecurrentJob::EXPERIENCE_NONE;
$this->occupationalFields = new ArrayCollection();
$this->occupationalFieldCapabilityValues = new ArrayCollection();
$this->additionalZipcodes = new ArrayCollection();
$this->relevantOccupationalFields = new ArrayCollection();
$this->relevantProfessions = new ArrayCollection();
$this->title = '';
$this->description = '';
$this->createdAt = DateTimeUtility::createDateTimeUtc();
$this->freshnessDate = DateTimeUtility::createDateTimeUtc();
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_DRAFT;
$this->numberOfCreatedJobradarMatches = 0;
$this->contentDistributionValues = new ArrayCollection();
$this->externalPartnerRecurrentJobAdditionalInfos = new ArrayCollection();
$this->numberOfFreshnessDateResets = 0;
$this->automatedConversationMessagesMailings = new ArrayCollection();
$this->additionalZipcodes = new ArrayCollection();
$this->booking = null;
$this->zipcode = null;
$this->address = null;
$this->city = null;
$this->applicationType = null;
$this->selfdescription = null;
$this->profilePhoto = null;
$this->headerImage = null;
$this->isPlus = false;
$this->afaProfessionId = null;
$this->destatisEconomicSector = null;
$this->superiorSalary = null;
$this->concludisApplicationFormSetups = new ArrayCollection();
$this->extendedApplicationQuestions = new ArrayCollection();
$this->softgardenApplicationJobInformation = null;
$this->selfServiceTrafficCampaigns = new ArrayCollection();
$this->selfServiceTrafficCampaignBookings = new ArrayCollection();
$this->slot = null;
$this->duplicatedFromRecurrentJobId = null;
}
/**
* @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->isActive();
}
/**
* @var ?DateTime
*
* @ORM\Column(name="created_at", type="datetime", nullable=true)
*/
protected $createdAt;
public function setCreatedAt(DateTime $createdAt): void
{
$this->createdAt = $createdAt;
}
public function getCreatedAt(): ?DateTime
{
return $this->createdAt;
}
/**
* @var ?DateTime
*
* @ORM\Column(name="edited_at", type="datetime", nullable=true)
*/
protected $editedAt;
public function getEditedAt(): ?DateTime
{
return $this->editedAt;
}
public function setEditedAt(?DateTime $editedAt): void
{
$this->editedAt = $editedAt;
}
/**
* The freshness date is used to influence the ranking of recurrent jobs in searches.
*
* The more recent the freshness date, the more likely it is that a recurrent job ends up at the beginning of a
* result set. Freshness date is updated whenever the owning jobofferer uses the site
* (@see ActivitytrackingController for more info), and through a cronjob that "boosts" recurrent jobs where the
* freshness date is 30 days or older (@see ResetRecurrentJobsFreshnessDate for more info).
*
* @var DateTime
*
* @ORM\Column(name="freshness_date", type="datetime", nullable=false)
*/
protected $freshnessDate;
public function getFreshnessDate(): DateTime
{
return $this->freshnessDate;
}
public function setFreshnessDate(DateTime $freshnessDate)
{
$this->freshnessDate = $freshnessDate;
}
/**
* @var int
*
* @ORM\Column(name="number_of_freshness_date_resets", type="integer", nullable=false)
*/
protected $numberOfFreshnessDateResets;
public function getNumberOfFreshnessDateResets(): int
{
return $this->numberOfFreshnessDateResets;
}
public function setNumberOfFreshnessDateResets(int $numberOfFreshnessDateResets)
{
$this->numberOfFreshnessDateResets = $numberOfFreshnessDateResets;
}
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Profile\JoboffererProfile", inversedBy="recurrentJobs", cascade={"persist"})
*
* @ORM\JoinColumn(name="jobofferer_profiles_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
*/
protected ?JoboffererProfile $joboffererProfile;
public function getJoboffererProfile(): ?JoboffererProfile
{
return $this->joboffererProfile;
}
public function setJoboffererProfile(JoboffererProfile $joboffererProfile): void
{
$this->joboffererProfile = $joboffererProfile;
}
/**
* @var Collection|OccupationalField[]
*
* @ORM\ManyToMany(targetEntity="App\Entity\OccupationalField", inversedBy="recurrentJobs", cascade={"persist"})
*
* @ORM\JoinTable(
* name="recurrent_jobs_occupational_fields",
* joinColumns={
*
* @ORM\JoinColumn(name="recurrent_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;
/** @return Collection|OccupationalField[] */
public function getOccupationalFields(): Collection
{
return $this->occupationalFields;
}
public function setOccupationalFields(Collection $occupationalFields): void
{
$this->occupationalFields = $occupationalFields;
}
/**
* @return Collection|OccupationalField[]
*/
public function getLegacyOccupationalFields(): Collection
{
$legacyOccupationalFields = [];
foreach ($this->occupationalFields as $occupationalField) {
if ($occupationalField->getId() <= OccupationalField::OCCUPATIONAL_FIELD_ID_REINIGUNGSKRAFT) {
$legacyOccupationalFields[] = $occupationalField;
}
}
return new ArrayCollection($legacyOccupationalFields);
}
/**
* @var int
*
* @ORM\Column(name="required_experience", type="smallint", nullable=false)
*
* @Assert\Type("int")
*/
protected $requiredExperience;
/**
* @var string|null
*
* @ORM\Column(name="title", type="string", length=128, nullable=true)
*
* @Assert\Type("string")
*
* @Assert\Length(
* min = 0,
* max = 128,
* )
*/
protected $title;
public function setTitle(?string $title)
{
$this->title = mb_substr($title, 0, 128);
}
public function getTitle(): ?string
{
return $this->title;
}
public function getForDisplay(): string
{
if (is_null($this->getTitle()) || trim($this->getTitle()) === '') {
return "Wir suchen #when einen {$this->getOccupationalFieldSearchterm()} (m/w/d)";
} else {
return $this->getTitle();
}
}
/**
* @var string
*
* @ORM\Column(name="description", type="text", length=10000, nullable=true)
*
* @Assert\Type("string")
*/
protected $description;
public function setDescription(?string $description)
{
if (is_null($description)) {
$this->description = null;
} else {
$this->description = mb_substr($description, 0, 10000);
}
}
public function getDescription(): ?string
{
return TextCleaner::removeSpecialCharacters($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;
}
public function getRequiredExperience(): int
{
return $this->requiredExperience;
}
public function setRequiredExperience(int $requiredExperience)
{
$this->requiredExperience = $requiredExperience;
}
public function getBusinessName(): string
{
return (string)$this->getJoboffererProfile()->getBusinessName();
}
public function hasNegativeReviews(): bool
{
return $this->getJoboffererProfile()->hasNegativeReviews();
}
public function numberOfNegativeReviews(): bool
{
return $this->getJoboffererProfile()->numberOfNegativeReviews();
}
/**
* @var Collection|RecurrentJobAdditionalZipcode[]
*
* @ORM\OneToMany(targetEntity="\App\Entity\RecurrentJobAdditionalZipcode", mappedBy="recurrentJob", cascade={"persist", "remove"})
*/
protected $additionalZipcodes;
/* Note that if you add an additional zipcode here, only the
* DB representation is changed; the additionalZipcodes field
* in ES is not updated automatically, and must be updated
* explicitly through a FOS\ElasticaBundle\Persister\ObjectPersister.
*/
public function addAdditionalZipcode(string $zipcode): void
{
foreach ($this->additionalZipcodes as $additionalZipcode) {
if ($additionalZipcode->getZipcode() === $zipcode) {
return;
}
}
$this->additionalZipcodes->add(new RecurrentJobAdditionalZipcode($this, $zipcode));
}
/** @return array|string[] */
public function getAdditionalZipcodesAsStringArray(): array
{
$zipcodes = [];
foreach ($this->additionalZipcodes as $additionalZipcode) {
$zipcodes[] = $additionalZipcode->getZipcode();
}
return $zipcodes;
}
public function hasAdditionalZipcodes(): bool
{
return sizeof($this->additionalZipcodes) > 0;
}
public function isLocked(): bool
{
return $this->getJoboffererProfile()->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();
}
// The following are helper functions for FOSElastica to get data in the format it needs
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->joboffererProfile->getPausedSince();
}
public function isPaused(): bool
{
return $this->joboffererProfile->isPaused();
}
/**
* @var int|null
*
* @ORM\Column(name="employment_type", type="smallint", nullable=true)
*/
protected $employmentType;
public function getLegacyEmploymentType(): ?int
{
return $this->employmentType;
}
/**
* @var array
*
* @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)
{
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 = $careerLevels;
}
/**
* @return array|int[]
*/
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 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)
{
if (is_null($additionalDescription)) {
$this->additionalDescription = null;
} else {
$this->additionalDescription = mb_substr($additionalDescription, 0, 10000);
}
}
public function getAdditionalDescription(): ?string
{
return TextCleaner::removeSpecialCharacters($this->additionalDescription);
}
/**
* @var string|null
*
* @ORM\Column(name="occupational_field_capabilities_description", type="text", length=10000, nullable=true)
*
* @Assert\Type("string")
*
* @Assert\Length(
* min = 0,
* max = 3000,
* )
*/
protected $occupationalFieldCapabilitiesDescription;
public function setOccupationalFieldCapabilitiesDescription(?string $occupationalFieldCapabilitiesDescription)
{
if (is_null($occupationalFieldCapabilitiesDescription)) {
$this->occupationalFieldCapabilitiesDescription = null;
} else {
$this->occupationalFieldCapabilitiesDescription = mb_substr($occupationalFieldCapabilitiesDescription, 0, 10000);
}
}
public function getOccupationalFieldCapabilitiesDescription(): ?string
{
return TextCleaner::removeSpecialCharacters($this->occupationalFieldCapabilitiesDescription);
}
/**
* @var string|null
*
* @ORM\Column(name="contact_name", type="string", length=128, nullable=true)
*
* @Assert\Length(
* min = 0,
* max = 50,
* )
*/
protected $contactName;
public function setContactName(?string $contactName)
{
if (is_null($contactName)) {
$this->contactName = null;
} else {
$this->contactName = mb_substr($contactName, 0, 128);
}
}
public function getContactName(): ?string
{
return $this->contactName;
}
/**
* @var string|null
*
* @ORM\Column(name="contact_email", type="string", length=128, nullable=true)
*
* @Assert\Email(mode="strict")
*/
protected $contactEmail;
public function setContactEmail(?string $contactEmail)
{
if (!is_null($contactEmail)) {
$contactEmail = mb_substr($contactEmail, 0, 128);
}
if (!is_null($contactEmail) && !MailService::emailAddressIsValidForMailer($contactEmail)) {
throw new InvalidArgumentException("E-mail $contactEmail is not valid for SwiftMailer.");
}
$this->contactEmail = $contactEmail;
}
public function getContactEmail(): ?string
{
if (is_null($this->contactEmail) && $this->getJoboffererProfile()) {
return $this->getJoboffererProfile()->getContactEmail();
} else {
return $this->contactEmail;
}
}
public function getContactEmailNonTransitive(): ?string
{
return $this->contactEmail;
}
/**
* @var string|null
*
* @ORM\Column(name="contact_phone", type="string", length=128, nullable=true)
*
* @Assert\Regex(pattern="/^[ +\-\/0-9]{6,30}$/")
*/
protected $contactPhone;
public function setContactPhone(?string $contactPhone)
{
if (!is_null($contactPhone)) {
$contactPhone = mb_substr($contactPhone, 0, 128);
}
$this->contactPhone = $contactPhone;
}
public function getContactPhone(): ?string
{
return $this->contactPhone;
}
/**
* @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 Collection|RecurrentJobOccupationalFieldCapabilityValue[]
*
* @ORM\OneToMany(targetEntity="\App\Entity\RecurrentJobOccupationalFieldCapabilityValue", mappedBy="recurrentJob", cascade={"persist", "remove"})
*/
protected $occupationalFieldCapabilityValues;
public function getOccupationalFieldCapabilityValues(): Collection
{
return $this->occupationalFieldCapabilityValues;
}
public function setOccupationalFieldCapabilityValues(Collection $occupationalFieldCapabilityValues): void
{
$this->occupationalFieldCapabilityValues = $occupationalFieldCapabilityValues;
}
public function getAllOccupationalFieldIdsToCapabilityIdsToValuesSlim(): array
{
$result = [];
foreach (OccupationalFieldCapabilitiesService::CAPABILITY_IDS_BY_OCCUPATIONAL_FIELD_IDS as $occupationalFieldId => $capabilityIds) {
foreach ($capabilityIds as $capabilityId) {
$value = 0;
/** @var JobseekerOccupationalFieldCapabilityValue $occupationalFieldCapabilityValue */
foreach ($this->occupationalFieldCapabilityValues as $occupationalFieldCapabilityValue) {
if ($occupationalFieldCapabilityValue->getCapabilityId() === $capabilityId) {
$value = $occupationalFieldCapabilityValue->getValue();
}
}
$result[$capabilityId] = $value;
}
}
return $result;
}
public function getAllOccupationalFieldIdsToCapabilityIdsToValuesSlimIncludeLegacy(): array
{
$result = [];
$capabilities = OccupationalFieldCapabilitiesService::CAPABILITY_IDS_BY_OCCUPATIONAL_FIELD_IDS;
array_push($capabilities[0], OccupationalFieldCapabilitiesService::CAPABILITY_ID_GENERAL_LEGACY);
foreach ($capabilities as $occupationalFieldId => $capabilityIds) {
foreach ($capabilityIds as $capabilityId) {
$value = 0;
/** @var JobseekerOccupationalFieldCapabilityValue $occupationalFieldCapabilityValue */
foreach ($this->occupationalFieldCapabilityValues as $occupationalFieldCapabilityValue) {
if ($occupationalFieldCapabilityValue->getCapabilityId() === $capabilityId) {
$value = $occupationalFieldCapabilityValue->getValue();
}
}
$result[$capabilityId] = $value;
}
}
return $result;
}
/**
* @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 isActive(): bool
{
return $this->status === self::STATUS_ACTIVE;
}
public function isInactive(): bool
{
return $this->status === self::STATUS_INACTIVE;
}
/**
* @var int
*
* @ORM\Column(name="career_level", type="smallint", nullable=true)
*/
protected $careerLevel;
public function getLegacyCareerLevel(): ?int
{
return $this->careerLevel;
}
/**
* @ORM\Column(name="number_of_created_jobradar_matches", type="integer", nullable=false)
*
* Note how having this attribute is different from simply counting how many jobradar matches
* currently exist for this recurrent job. We need to actively count how many jobradar matches we have
* ever CREATED for this recurrent job, and not just look up how many currently exist.
*
* This is because there is a business rule that says that for recurrent jobs
* of jobofferers without a membership, we only want to create a maximum of 8
* jobradar matches. See method recurrentJobCannotCreateAnyMoreJobradarMatches below.
*
* If we would simply use the CURRENT number of jobradar matches that exist for a given recurrent job,
* then we would not be able to enforce this rule properly, because we would ignore jobradar matches
* that subsequently got deleted (e.g. because a jobseeker removed his wanted job or his account).
*/
protected int $numberOfCreatedJobradarMatches;
public function setNumberOfCreatedJobradarMatches(
int $numberOfCreatedJobradarMatches
): void {
$this->numberOfCreatedJobradarMatches = $numberOfCreatedJobradarMatches;
}
public function getNumberOfCreatedJobradarMatches(): int
{
return $this->numberOfCreatedJobradarMatches;
}
/**
* @var Collection|OccupationalField[] Those occupational fields where the title matched the searchterm
*
* @ORM\ManyToMany(targetEntity="App\Entity\OccupationalField", inversedBy="recurrentJobsForWhichImRelevant", cascade={"persist"})
*
* @ORM\JoinTable(
* name="recurrent_jobs_relevant_occupational_fields",
* joinColumns={
*
* @ORM\JoinColumn(name="recurrent_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|Profession[] Those professions where the name matched the searchterm
*
* @ORM\ManyToMany(targetEntity="App\Entity\Profession", inversedBy="recurrentJobsForWhichImRelevant", cascade={"persist"})
*
* @ORM\JoinTable(
* name="recurrent_jobs_relevant_professions",
* joinColumns={
*
* @ORM\JoinColumn(name="recurrent_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 string|null
*
* @ORM\Column(name="occupational_field_searchterm", type="string", length=1024, nullable=true)
*
* @AppAssert\LatinWord
*
* @AppAssert\XssSafe
*/
protected $occupationalFieldSearchterm;
public function setOccupationalFieldSearchterm(?string $occupationalFieldSearchterm): void
{
if (is_null($occupationalFieldSearchterm)) {
$this->occupationalFieldSearchterm = null;
} else {
$this->occupationalFieldSearchterm = mb_substr($occupationalFieldSearchterm, 0, 1024);
}
}
public function getOccupationalFieldSearchterm(): string
{
$term = trim((string)$this->occupationalFieldSearchterm);
if (trim($term) === '') {
if (sizeof($this->getRelevantOccupationalFields()) > 0) {
return $this->getRelevantOccupationalFields()->first()->getTitle();
}
if (sizeof($this->getOccupationalFields()) > 0) {
return $this->getOccupationalFields()->first()->getTitle();
}
return '';
}
return $term;
}
/**
* @var string[]|null
*
* @ORM\Column(name="additional_occupational_field_searchterms", type="array", length=65536, nullable=true)
*/
protected $additionalOccupationalFieldSearchterms;
/**
* @param string[]|null $additionalOccupationalFieldSearchterms
*/
public function setAdditionalOccupationalFieldSearchterms(
?array $additionalOccupationalFieldSearchterms,
int $additionalSearchtermRange = self::DEFAULT_ADDITIONAL_SEARCHTERM_RANGE
): void {
if (is_null($additionalOccupationalFieldSearchterms)) {
$this->additionalOccupationalFieldSearchterms = null;
return;
}
if (sizeof($additionalOccupationalFieldSearchterms) > $additionalSearchtermRange) {
throw new InvalidArgumentException('A maximum of ' . $additionalSearchtermRange . ' entries allowed for $additionalOccupationalFieldSearchterms array, but got ' . sizeof($additionalOccupationalFieldSearchterms) . '.');
}
$validator = Validation::createValidator();
foreach ($additionalOccupationalFieldSearchterms as $key => $additionalOccupationalFieldSearchterm) {
$violations = $validator->validate($additionalOccupationalFieldSearchterm, [new AppAssert\LatinWord(), new AppAssert\XssSafe()]);
if ($violations->count() > 0) {
throw new ValidationFailedException($additionalOccupationalFieldSearchterm, $violations);
}
if (!is_string($additionalOccupationalFieldSearchterm)) {
throw new InvalidArgumentException('$additionalOccupationalFieldSearchterms array must only contains strings, but contained value of type "' . gettype($additionalOccupationalFieldSearchterm) . '" at key "' . $key . '".');
}
}
$this->additionalOccupationalFieldSearchterms = $additionalOccupationalFieldSearchterms;
}
/** @return string[] */
public function getAdditionalOccupationalFieldSearchterms(): array
{
if (is_null($this->additionalOccupationalFieldSearchterms)) {
return [];
} else {
return $this->additionalOccupationalFieldSearchterms;
}
}
public function getAdditionalOccupationalFieldSearchtermsForDisplay(): string
{
if (is_null($this->additionalOccupationalFieldSearchterms)) {
return '';
} else {
$additionalSearchtermsForDisplay = '';
$counter = 1;
foreach ($this->additionalOccupationalFieldSearchterms as $additionalOccupationalFieldSearchterm) {
$additionalSearchtermsForDisplay = $additionalSearchtermsForDisplay . GenderNeutralizer::neutralize(ucfirst($additionalOccupationalFieldSearchterm));
if ($counter < sizeof($this->additionalOccupationalFieldSearchterms)) {
$additionalSearchtermsForDisplay = $additionalSearchtermsForDisplay . ', ';
}
++$counter;
}
return $additionalSearchtermsForDisplay;
}
}
public function getAllOccupationalFieldSearchtermsAsString(): string
{
$string = $this->getOccupationalFieldSearchterm();
foreach ($this->getAdditionalOccupationalFieldSearchterms() as $additionalOccupationalFieldSearchterm) {
$string .= ' ' . $additionalOccupationalFieldSearchterm;
}
return $string;
}
// The following are helper functions for FOSElastica to get data in the format it needs
public function getOccupationalFieldSearchtermForFulltextsearch(): string
{
$normalizedAdditionalOccupationalFieldSearchterms = [];
foreach ($this->getAdditionalOccupationalFieldSearchterms() as $additionalOccupationalFieldSearchterm) {
$normalizedAdditionalOccupationalFieldSearchterms[] = OccupationalFieldsAndProfessionsSearchService::normalizeSearchterm($additionalOccupationalFieldSearchterm);
}
$normalizedAdditionalOccupationalFieldSearchtermsString = implode(' ', $normalizedAdditionalOccupationalFieldSearchterms);
return trim(
OccupationalFieldsAndProfessionsSearchService::normalizeSearchterm($this->getOccupationalFieldSearchterm())
. ' '
. $normalizedAdditionalOccupationalFieldSearchtermsString
);
}
/** @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;
}
/**
* @var RecurrentJobContentDistributionValue|Collection
*
* @ORM\OneToMany(targetEntity="App\Entity\ContentDistribution\RecurrentJobContentDistributionValue", mappedBy="recurrentJob", cascade={"persist", "remove"})
*/
protected $contentDistributionValues;
/**
* @return RecurrentJobContentDistributionValue[]|Collection
*/
public function getContentDistributionValues()
{
return $this->contentDistributionValues;
}
/** @throws Exception */
public function setContentDistributionStringValue(string $name, ?string $stringValue): void
{
/** @var RecurrentJobContentDistributionValue $contentDistributionValue */
foreach ($this->contentDistributionValues as $contentDistributionValue) {
if ($contentDistributionValue->getName() === $name) {
$contentDistributionValue->setStringValue($stringValue);
return;
}
}
if (!is_null($stringValue)) {
$this->contentDistributionValues->add(
RecurrentJobContentDistributionValue::createWithStringValue($this, $name, $stringValue)
);
}
}
/** @throws Exception */
public function setContentDistributionFloatValue(string $name, ?float $floatValue): void
{
/** @var RecurrentJobContentDistributionValue $contentDistributionValue */
foreach ($this->contentDistributionValues as $key => $contentDistributionValue) {
if ($contentDistributionValue->getName() === $name) {
$contentDistributionValue->setFloatValue($floatValue);
return;
}
}
if (!is_null($floatValue)) {
$this->contentDistributionValues->add(
RecurrentJobContentDistributionValue::createWithFloatValue($this, $name, $floatValue)
);
}
}
/** @throws Exception */
public function setContentDistributionBoolValue(string $name, ?bool $boolValue): void
{
/** @var RecurrentJobContentDistributionValue $contentDistributionValue */
foreach ($this->contentDistributionValues as $key => $contentDistributionValue) {
if ($contentDistributionValue->getName() === $name) {
$contentDistributionValue->setBoolValue($boolValue);
return;
}
}
if (!is_null($boolValue)) {
$this->contentDistributionValues->add(
RecurrentJobContentDistributionValue::createWithBoolValue($this, $name, $boolValue)
);
}
}
/** @throws Exception */
public function setContentDistributionDateTimeValue(string $name, ?DateTime $dateTimeValue): void
{
/** @var RecurrentJobContentDistributionValue $contentDistributionValue */
foreach ($this->contentDistributionValues as $key => $contentDistributionValue) {
if ($contentDistributionValue->getName() === $name) {
$contentDistributionValue->setDateTimeValue($dateTimeValue);
return;
}
}
if (!is_null($dateTimeValue)) {
$this->contentDistributionValues->add(
RecurrentJobContentDistributionValue::createWithDatetimeValue($this, $name, $dateTimeValue)
);
}
}
public function belongsToExternalPartner(): bool
{
return !is_null($this->getJoboffererProfile()->getUser()->getExternalPartner());
}
public function getExternalPartner(): ?ExternalPartner
{
return $this->getJoboffererProfile()->getUser()->getExternalPartner();
}
/**
* @var RecurrentJobAdditionalInfo|Collection
*
* @ORM\OneToMany(targetEntity="App\Entity\ExternalPartner\RecurrentJobAdditionalInfo", mappedBy="recurrentJob", cascade={"persist", "remove"})
*/
protected $externalPartnerRecurrentJobAdditionalInfos;
public function getExternalPartnerRecurrentJobAdditionalInfos(): array
{
$externalPartnerRecurrentJobInfoArray = [];
/** @var RecurrentJobAdditionalInfo $externalPartnerRecurrentJobAdditionalInfo */
foreach ($this->externalPartnerRecurrentJobAdditionalInfos as $externalPartnerRecurrentJobAdditionalInfo) {
$externalPartnerRecurrentJobInfoArray[] = $externalPartnerRecurrentJobAdditionalInfo;
}
return $externalPartnerRecurrentJobInfoArray;
}
public function getExternalPartnerRecurrentJobAdditionalInfoStringValueByName(string $infoName): ?string
{
/** @var RecurrentJobAdditionalInfo $externalPartnerRecurrentJobAdditionalInfo */
foreach ($this->externalPartnerRecurrentJobAdditionalInfos as $externalPartnerRecurrentJobAdditionalInfo) {
if ($externalPartnerRecurrentJobAdditionalInfo->getInfoName() === $infoName) {
return $externalPartnerRecurrentJobAdditionalInfo->getInfoStringValue();
}
}
return null;
}
public function getExternalPartnerRecurrentJobAdditionalInfosAsKeyValue(): array
{
$additionalInfosAsKeyValue = [];
foreach ($this->externalPartnerRecurrentJobAdditionalInfos as $externalPartnerRecurrentJobAdditionalInfo) {
$additionalInfoKey = $externalPartnerRecurrentJobAdditionalInfo->getInfoName();
$additionalInfoValue = null;
if (!is_null($externalPartnerRecurrentJobAdditionalInfo->getInfoIntValue())) {
$additionalInfoValue = $externalPartnerRecurrentJobAdditionalInfo->getInfoIntValue();
}
if (!is_null($externalPartnerRecurrentJobAdditionalInfo->getInfoStringValue())) {
$additionalInfoValue = $externalPartnerRecurrentJobAdditionalInfo->getInfoStringValue();
}
if (is_null($additionalInfoValue)) {
continue;
}
$additionalInfosAsKeyValue[$additionalInfoKey] = $additionalInfoValue;
}
return $additionalInfosAsKeyValue;
}
/** @throws Exception */
public function setExternalPartnerRecurrentJobAdditionalInfoStringValueByName(string $infoName, ?string $stringValue): void
{
/** @var RecurrentJobAdditionalInfo $externalPartnerRecurrentJobAdditionalInfo */
foreach ($this->externalPartnerRecurrentJobAdditionalInfos as $externalPartnerRecurrentJobAdditionalInfo) {
if ($externalPartnerRecurrentJobAdditionalInfo->getInfoName() === $infoName) {
$externalPartnerRecurrentJobAdditionalInfo->setInfoStringValue($stringValue);
return;
}
}
$externalPartnerRecurrentJobAdditionalInfo = new RecurrentJobAdditionalInfo();
$externalPartnerRecurrentJobAdditionalInfo->setRecurrentJob($this);
$externalPartnerRecurrentJobAdditionalInfo->setInfoName($infoName);
$externalPartnerRecurrentJobAdditionalInfo->setInfoStringValue($stringValue);
$this->externalPartnerRecurrentJobAdditionalInfos->add($externalPartnerRecurrentJobAdditionalInfo);
}
public function getExternalPartnerRecurrentJobAdditionalInfoIntValueByName(string $infoName): ?int
{
/** @var RecurrentJobAdditionalInfo $externalPartnerRecurrentJobAdditionalInfo */
foreach ($this->externalPartnerRecurrentJobAdditionalInfos as $externalPartnerRecurrentJobAdditionalInfo) {
if ($externalPartnerRecurrentJobAdditionalInfo->getInfoName() === $infoName) {
return $externalPartnerRecurrentJobAdditionalInfo->getInfoIntValue();
}
}
return null;
}
/** @throws Exception */
public function setExternalPartnerRecurrentJobAdditionalInfoIntValueByName(string $infoName, int $intValue): void
{
/** @var RecurrentJobAdditionalInfo $externalPartnerRecurrentJobAdditionalInfo */
foreach ($this->externalPartnerRecurrentJobAdditionalInfos as $externalPartnerRecurrentJobAdditionalInfo) {
if ($externalPartnerRecurrentJobAdditionalInfo->getInfoName() === $infoName) {
$externalPartnerRecurrentJobAdditionalInfo->setInfoIntValue($intValue);
return;
}
}
$externalPartnerRecurrentJobAdditionalInfo = new RecurrentJobAdditionalInfo();
$externalPartnerRecurrentJobAdditionalInfo->setRecurrentJob($this);
$externalPartnerRecurrentJobAdditionalInfo->setInfoName($infoName);
$externalPartnerRecurrentJobAdditionalInfo->setInfoIntValue($intValue);
$this->externalPartnerRecurrentJobAdditionalInfos->add($externalPartnerRecurrentJobAdditionalInfo);
}
public function isLinkedToExternalPartner(): bool
{
if (is_null($this->getJoboffererProfile())) {
return false;
}
if (is_null($this->getJoboffererProfile()->getUser())) {
return false;
}
return $this->getJoboffererProfile()->getUser()->isLinkedToExternalPartner();
}
public function setRecurrentJobValuesAccordingToOccupationalFieldsAndProfessionsSearchResultset(
OccupationalFieldsAndProfessionsSearchResultset $resultset
): void {
$this->setOccupationalFieldSearchterm($resultset->getOriginallyEnteredSearchterm());
$this->setAdditionalOccupationalFieldSearchterms([]);
$this->setOccupationalFields(new ArrayCollection($resultset->getOccupationalFields()));
$this->setRelevantOccupationalFields(new ArrayCollection($resultset->getRelevantOccupationalFields()));
$this->setRelevantProfessions(new ArrayCollection($resultset->getRelevantProfessions()));
}
public function setRecurrentJobValuesAccordingToOccupationalFieldsAndProfessionsSearchMergedResultset(
OccupationalFieldsAndProfessionsSearchMergedResultset $mergedResultset,
int $additionalSearchtermRange = self::DEFAULT_ADDITIONAL_SEARCHTERM_RANGE
): void {
$this->setOccupationalFieldSearchterm($mergedResultset->getSearchterm());
$additionalSearchterms = array_slice($mergedResultset->getAdditionalSearchterms(), 0, $additionalSearchtermRange);
$this->setAdditionalOccupationalFieldSearchterms($additionalSearchterms, $additionalSearchtermRange);
$this->setOccupationalFields(new ArrayCollection($mergedResultset->getOccupationalFields()));
$this->setRelevantOccupationalFields(new ArrayCollection($mergedResultset->getRelevantOccupationalFields()));
$this->setRelevantProfessions(new ArrayCollection($mergedResultset->getRelevantProfessions()));
}
/**
* @ORM\ManyToOne(targetEntity="App\Entity\ExternalPartner\IntegratedExternalPartnerCustomerQuota", inversedBy="recurrentJobs", cascade={"persist"})
*
* @ORM\JoinColumn(name="quotas_id", referencedColumnName="id", nullable=true, onDelete="CASCADE")
*/
protected ?IntegratedExternalPartnerCustomerQuota $quota;
public function getQuota(): ?IntegratedExternalPartnerCustomerQuota
{
return $this->quota;
}
/**
* @throws Exception
*/
public function setQuota(?IntegratedExternalPartnerCustomerQuota $quota): void
{
if (is_null($this->getJoboffererProfile())) {
throw new Exception('Need an attached jobofferer profile to set quota, but it is null.');
}
if (is_null($this->getJoboffererProfile()->getUser())) {
throw new Exception('Need a user attached to the jobofferer profile to set quota, but it is null.');
}
if (!is_null($quota)
&& !is_null($this->getJoboffererProfile()->getUser()->getExternalPartner())
&& $this->getJoboffererProfile()->getUser()->getExternalPartner()->getId()
!== $quota->getIntegratedExternalPartnerCustomer()->getExternalPartner()->getId()
) {
throw new InvalidArgumentException("Tried to set quota {$quota->getId()} of customer {$quota->getIntegratedExternalPartnerCustomer()->getId()} to recurrent job {$this->getId()}, but the recurrent job belongs to a user linked to external partner {$this->getJoboffererProfile()->getUser()->getExternalPartner()->getId()} and the quota is linked to external partner {$quota->getIntegratedExternalPartnerCustomer()->getExternalPartner()->getId()}.");
}
if (!is_null($quota)
&& !is_null($this->getIntegratedExternalPartnerCustomer())
&& $this->getIntegratedExternalPartnerCustomer()->getId()
!== $quota->getIntegratedExternalPartnerCustomer()->getId()
) {
throw new InvalidArgumentException("Tried to set quota {$quota->getId()} of customer {$quota->getIntegratedExternalPartnerCustomer()->getInternalId()} to recurrent job {$this->getId()}, but the recurrent job belongs to a user linked to customer {$this->getIntegratedExternalPartnerCustomer()->getInternalId()}.");
}
$this->quota = $quota;
}
public function belongsToIntegratedExternalPartnerCustomer(): bool
{
return !is_null($this->getIntegratedExternalPartnerCustomer());
}
public function getIntegratedExternalPartnerCustomer(): ?IntegratedExternalPartnerCustomer
{
if (is_null($this->joboffererProfile)) {
return null;
}
if (is_null($this->joboffererProfile->getUser())) {
return null;
}
return $this->joboffererProfile->getUser()->getIntegratedExternalPartnerCustomer();
}
public function getIntegratedExternalPartnerCustomerId(): ?string
{
return (!is_null($this->getIntegratedExternalPartnerCustomer())) ? $this->joboffererProfile->getUser()->getIntegratedExternalPartnerCustomer()->getId() : null;
}
/**
* @ORM\Column(name="external_application_url", type="text", length=4096, nullable=true)
*
* @Assert\Length(
* min = 10,
* max = 4096,
* )
*/
protected ?string $externalApplicationUrl = null;
public function getExternalApplicationUrl(): ?string
{
return $this->externalApplicationUrl;
}
/** @throws InvalidArgumentException */
public function setExternalApplicationUrl(?string $externalApplicationUrl): void
{
if (!is_null($externalApplicationUrl)) {
if (mb_strlen($externalApplicationUrl) > 4096) {
throw new InvalidArgumentException('Maximum of 4096 characters allowed!');
}
}
$this->externalApplicationUrl = $externalApplicationUrl;
}
public function getNormalizedExternalApplicationUrl(): ?string
{
return UrlHelper::getNormalizedUrl($this->getExternalApplicationUrl());
}
public function getNormalizedExternalApplicationUrlWithTrackingParameters(): ?string
{
return UrlHelper::getNormalizedUrlWithJobooUtmParameter($this->getExternalApplicationUrl(), $this);
}
/**
* @var string|null
*
* @ORM\Column(name="email_for_applications", type="string", length=128, nullable=true)
*
* @Assert\Email(mode="strict")
*/
protected $emailForApplications;
public function setEmailForApplications(?string $emailForApplications): void
{
if (!is_null($emailForApplications)) {
$emailForApplications = mb_substr($emailForApplications, 0, 128);
if (!MailService::emailAddressIsValidForMailer($emailForApplications)) {
throw new InvalidArgumentException("E-mail '$emailForApplications' is not valid.");
}
}
$this->emailForApplications = $emailForApplications;
}
public function getEmailForApplications(): ?string
{
if (!is_null($this->emailForApplications)) {
return $this->emailForApplications;
} else {
return $this->getContactEmail();
}
}
/**
* @ORM\Column(name="zipcode", type="string", length=128, nullable=true)
*
* @Assert\Type("string")
*
* @AppAssert\KnownZipcode
*/
protected ?string $zipcode;
public function setZipcode(?string $zipcode = null)
{
if (!is_null($zipcode)) {
$trimmedZipcode = trim($zipcode);
if (mb_strlen($trimmedZipcode) !== 5 || !is_numeric($trimmedZipcode)) {
throw new InvalidArgumentException("zipcode must either be null or a string with 5 digits, but got '$zipcode'");
}
$zipcode = $trimmedZipcode;
}
$this->zipcode = $zipcode;
}
public function setZipcodeHierarchically(string $zipcode): void
{
if (!is_null($this->zipcode)) {
$this->setZipcode($zipcode);
} else {
$this->getJoboffererProfile()->setZipcode($zipcode);
}
}
public function getZipcode(): ?string
{
if (is_null($this->zipcode)) {
return $this->getJoboffererProfile()->getZipcode();
}
return $this->zipcode;
}
/**
* @ORM\Column(name="address", type="string", length=128, nullable=true)
*/
protected ?string $address;
public function setAddress(?string $address = null)
{
if (!is_null($address)) {
$address = mb_substr($address, 0, 128);
}
$this->address = $address;
}
public function getAddress(): ?string
{
if (is_null($this->address)) {
return $this->getJoboffererProfile()->getAddress();
}
return $this->address;
}
/**
* @ORM\Column(name="city", type="string", length=128, nullable=true)
*/
protected ?string $city;
public function setCity(?string $city)
{
if (is_null($city)) {
$this->city = null;
} else {
$this->city = mb_substr($city, 0, 128);
}
}
public function getCity(): ?string
{
if (is_null($this->city) || $this->city === '') {
return $this->getJoboffererProfile()->getCity();
}
return $this->city;
}
/**
* @ORM\OneToOne(targetEntity="App\Entity\Membership\RecurrentJobBooking", mappedBy="recurrentJob", cascade={"persist", "remove"})
*/
protected ?RecurrentJobBooking $booking;
public function getBooking(): ?RecurrentJobBooking
{
return $this->booking;
}
public function setBooking(?RecurrentJobBooking $booking): void
{
$this->booking = $booking;
}
/**
* @ORM\Column(name="application_type", type="smallint", nullable=true)
*
* @Assert\Type("int")
*/
protected ?int $applicationType;
public function getApplicationType(): ?int
{
return $this->applicationType;
}
/** @throws Exception */
public function setApplicationType(?int $applicationType): void
{
if (!is_null($applicationType) && !in_array($applicationType, self::POSSIBLE_APPLICATION_TYPES)) {
throw new Exception('Unknown application type "' . $applicationType . '"');
}
$this->applicationType = $applicationType;
}
/**
* @var string
*
* @ORM\Column(name="selfdescription", type="text", length=10000, nullable=true)
*/
protected $selfdescription;
public function setSelfdescription(?string $selfdescription = null)
{
if (!is_null($selfdescription)) {
$selfdescription = mb_substr($selfdescription, 0, 10000);
}
$this->selfdescription = $selfdescription;
}
public function getSelfdescription(): ?string
{
if (is_null($this->selfdescription)) {
return $this->joboffererProfile->getSelfdescription();
}
return TextCleaner::removeSpecialCharacters($this->selfdescription);
}
/**
* @ORM\OneToOne(targetEntity="App\Entity\RecurrentJobProfilePhoto", mappedBy="recurrentJob", cascade={"persist", "remove"})
*/
protected ?RecurrentJobProfilePhoto $profilePhoto;
public function getProfilePhoto(): ?RecurrentJobProfilePhoto
{
return $this->profilePhoto;
}
public function setProfilePhoto(?RecurrentJobProfilePhoto $profilePhoto): void
{
$this->profilePhoto = $profilePhoto;
}
public function getProfilePhotoFileName(): ?string
{
if (!is_null($this->profilePhoto)) {
return $this->profilePhoto->getFileName();
} else {
return $this->getJoboffererProfile()->getPhotoFileName();
}
}
public function hasProfilePhoto(): bool
{
return !is_null($this->getProfilePhotoFileName());
}
public function getImagineFilterNameForMaximizedProfilePhoto(): string
{
if (!is_null($this->profilePhoto)) {
return 'recurrent_job_profile_photos_maximized';
} else {
return 'profile_photos_maximized';
}
}
public function isJoboffererProfilePhoto(): ?string
{
if (!is_null($this->profilePhoto)) {
return false;
}
return true;
}
/**
* @ORM\OneToOne(targetEntity="App\Entity\RecurrentJobHeaderImage", mappedBy="recurrentJob", cascade={"persist", "remove"})
*/
protected ?RecurrentJobHeaderImage $headerImage;
public function getHeaderImage(): ?RecurrentJobHeaderImage
{
return $this->headerImage;
}
public function setHeaderImage(?RecurrentJobHeaderImage $headerImage): void
{
$this->headerImage = $headerImage;
}
public function getHeaderImageFileName(): ?string
{
if (!is_null($this->headerImage)) {
return $this->headerImage->getFileName();
}
return null;
}
public function hasHeaderImage(): bool
{
return !is_null($this->getHeaderImageFileName());
}
public function getImagineFilterNameForMaximizedHeaderImage(): string
{
if (!is_null($this->headerImage)) {
return 'recurrent_job_header_image_maximized';
} else {
return 'header_image_maximized';
}
}
/**
* @ORM\Column(name="is_plus", type="boolean", nullable=false)
*/
protected bool $isPlus;
public function setIsPlus(bool $isPlus): void
{
if (!is_null($this->slot) && $isPlus) {
throw new InvalidArgumentException("Cannot set isPlus to true for rj '$this->id' if rj is already inside of a flex membership slot.");
}
$this->isPlus = $isPlus;
}
public function isPlus(): bool
{
return $this->isPlus;
}
/**
* @var AutomatedConversationMessagesMailing[]|Collection
*
* @ORM\OneToMany(targetEntity="App\Entity\AutomatedConversationMessagesMailing", mappedBy="recurrentJob", cascade={"persist", "remove"})
*/
protected $automatedConversationMessagesMailings;
public function getAutomatedConversationMessagesMailings(): Collection
{
return $this->automatedConversationMessagesMailings;
}
/**
* @ORM\ManyToOne(targetEntity="App\Entity\ContentDistribution\AgenturFuerArbeit\DestatisEconomicSector", cascade={"persist"})
*
* @ORM\JoinColumn(name="destatis_economic_sectors_running_number", referencedColumnName="running_number", nullable=true, onDelete="SET NULL")
*/
protected ?DestatisEconomicSector $destatisEconomicSector = null;
public function getDestatisEconomicSector(): ?DestatisEconomicSector
{
if (is_null($this->destatisEconomicSector)
&& !is_null($this->joboffererProfile)
) {
return $this->joboffererProfile->getDestatisEconomicSector();
}
return $this->destatisEconomicSector;
}
public function setDestatisEconomicSector(?DestatisEconomicSector $destatisEconomicSector): void
{
$this->destatisEconomicSector = $destatisEconomicSector;
}
/**
* @ORM\Column(name="destatis_economic_sector_decision", type="smallint", nullable=true, options={"unsigned": true})
*/
protected ?int $destatisEconomicSectorDecision;
public function setDestatisEconomicSectorDecision(?int $destatisEconomicSectorDecision): void
{
if (!is_null($destatisEconomicSectorDecision)) {
if (!ReflectionHelper::hasConstWithValue(
DestatisEconomicSectorService::class,
'SECTOR_DECISION_',
$destatisEconomicSectorDecision
)
) {
throw new InvalidArgumentException("Value '$destatisEconomicSectorDecision' not allowed for destatisEconomicSectorDecision.");
}
}
$this->destatisEconomicSectorDecision = $destatisEconomicSectorDecision;
}
public function getDestatisEconomicSectorDecision(): ?int
{
if (is_null($this->destatisEconomicSectorDecision)
&& !is_null($this->joboffererProfile)
) {
return $this->joboffererProfile->getDestatisEconomicSectorDecision();
}
return $this->destatisEconomicSectorDecision;
}
public function getDestatisEconomicSectorOrigin(): ?int
{
if (!is_null($this->destatisEconomicSector)) {
return DestatisEconomicSectorService::SECTOR_ORIGIN_RECURRENT_JOB;
}
if (!is_null($this->joboffererProfile)) {
return $this->joboffererProfile->getDestatisEconomicSectorOrigin();
}
return null;
}
/**
* @ORM\Column(name="afa_professions_filename_prefix", type="string", length=16, nullable=true)
*/
protected ?string $afaProfessionFilenamePrefix;
public function getAfaProfessionFilenamePrefix(): ?string
{
return $this->afaProfessionFilenamePrefix;
}
/**
* @ORM\Column(name="afa_professions_id", type="integer", nullable=true, options={"unsigned": true})
*/
protected ?int $afaProfessionId;
public function getAfaProfessionId(): ?int
{
return $this->afaProfessionId;
}
public function setAfaProfession(
?AfaProfession $afaProfession
): void {
if (is_null($afaProfession)) {
$this->afaProfessionFilenamePrefix = null;
$this->afaProfessionId = null;
} else {
$this->afaProfessionFilenamePrefix = mb_substr($afaProfession->getFilenamePrefix(), 0, 16);
$this->afaProfessionId = $afaProfession->getId();
}
}
/**
* @var RecurrentJobStatusChangeLogEntry[]|Collection
*
* @ORM\OneToMany(targetEntity="App\Entity\RecurrentJobStatusChangeLogEntry", mappedBy="recurrentJob", cascade={"persist", "remove"})
*/
private $statusChangeLogEntries;
/**
* @return RecurrentJobStatusChangeLogEntry[]|Collection
*/
public function getStatusChangeLogEntries(): Collection
{
return $this->statusChangeLogEntries;
}
public function addStatusChangeLogEntry(RecurrentJobStatusChangeLogEntry $statusChangeLogEntry): void
{
$this->statusChangeLogEntries[] = $statusChangeLogEntry;
}
public function hasClickBasedBilling(): bool
{
if (is_null($this->getIntegratedExternalPartnerCustomer())) {
return false;
}
return $this->getIntegratedExternalPartnerCustomer()->hasClickBasedBilling();
}
/**
* @ORM\Column(name="superior_salary", type="boolean", nullable=true)
*/
protected ?bool $superiorSalary;
public function setSuperiorSalary(?bool $superiorSalary): void
{
$this->superiorSalary = $superiorSalary;
}
public function getSuperiorSalary(): bool
{
if ($this->belongsToIntegratedExternalPartnerCustomer() && $this->getIntegratedExternalPartnerCustomer()->hasClickBasedBilling()) {
return false;
}
if ($this->belongsToIntegratedExternalPartnerCustomer()) {
return true;
}
if ($this->isLinkedToExternalPartner()) {
return true;
}
return (bool)$this->superiorSalary;
}
/**
* @throws Exception
*/
public function getLatestSyncToSearchIndexAt(): DateTime
{
return DateTimeUtility::createDateTimeUtc();
}
/**
* @ORM\OneToMany(targetEntity="JanusHercules\ExternalApplicationQuestions\Domain\Entity\ConcludisApplicationFormSetup", mappedBy="recurrentJob", cascade={"persist", "remove"})
*/
private Collection $concludisApplicationFormSetups;
/**
* @ORM\ManyToMany(targetEntity="JanusHercules\ExtendedApplicationQuestionnaire\Domain\Entity\ExtendedApplicationQuestion")
*
* @ORM\JoinTable(name="recurrent_jobs_extended_application_questions",
* joinColumns={@ORM\JoinColumn(name="recurrent_jobs_id", referencedColumnName="id", onDelete="CASCADE")},
* inverseJoinColumns={@ORM\JoinColumn(name="extended_application_questions_id", referencedColumnName="id", onDelete="CASCADE")}
* )
*
* Note: The naming here is potentially misleading.
* An extended application question can only be linked to exactly zero or exactly one recurrent jobs,
* but not to multiple recurrent jobs!
*
* The reason that $extendedApplicationQuestions is a "plural" collection is only
* due to the fact that upon implementation of this relationship, we wanted to avoid extending
* the large recurrent jobs table with another column, and instead use a separate table.
*/
protected Collection $extendedApplicationQuestions;
public function getExtendedApplicationQuestions(): Collection
{
return $this->extendedApplicationQuestions;
}
public function setExtendedApplicationQuestions(Collection $extendedApplicationQuestions): void
{
$this->extendedApplicationQuestions = $extendedApplicationQuestions;
}
public function addExtendedApplicationQuestion(ExtendedApplicationQuestion $extendedApplicationQuestion): void
{
$this->extendedApplicationQuestions[] = $extendedApplicationQuestion;
}
public function removeExtendedApplicationQuestionIfExists(ExtendedApplicationQuestion $extendedApplicationQuestionToRemove): bool
{
foreach ($this->extendedApplicationQuestions as $key => $extendedApplicationQuestion) {
if ($extendedApplicationQuestion->getId() === $extendedApplicationQuestionToRemove->getId()) {
$this->extendedApplicationQuestions->remove($key);
return true;
}
}
return false;
}
/**
* @ORM\OneToMany(targetEntity="App\Entity\ExtendedApplication\ExtendedApplication", mappedBy="recurrentJob", cascade={"persist"})
*/
protected Collection $extendedApplications;
public function getExtendedApplications(): Collection
{
return $this->extendedApplications;
}
/**
* @ORM\ManyToOne(targetEntity="JanusHercules\IntegratedExternalPartnerCustomers\Domain\Entity\WeclappContractItem", cascade={"persist"})
*
* @ORM\JoinColumn(name="weclapp_contract_items_id", referencedColumnName="id", nullable=true, onDelete="SET NULL")
*/
protected ?WeclappContractItem $weclappContractItem = null;
public function getWeclappContractItem(): ?WeclappContractItem
{
return $this->weclappContractItem;
}
/**
* @ORM\OneToOne(targetEntity="JanusHercules\ExternalApplicationQuestions\Domain\Entity\SoftgardenApplicationJobInformation", mappedBy="recurrentJob", cascade={"persist", "remove"})
*/
private ?SoftgardenApplicationJobInformation $softgardenApplicationJobInformation;
/**
* @ORM\OneToMany(targetEntity="JanusHercules\SelfServiceTrafficCampaign\Domain\Entity\SelfServiceTrafficCampaign", mappedBy="recurrentJob"))
*/
private ?Collection $selfServiceTrafficCampaigns;
public function getSelfServiceTrafficCampaigns(): Collection
{
return $this->selfServiceTrafficCampaigns;
}
/**
* @ORM\OneToMany(targetEntity="JanusHercules\SelfServiceTrafficCampaign\Domain\Entity\SelfServiceTrafficCampaignBooking", mappedBy="recurrentJob"))
*/
private ?Collection $selfServiceTrafficCampaignBookings;
public function getSelfServiceTrafficCampaignBookings(): Collection
{
return $this->selfServiceTrafficCampaignBookings;
}
/**
* @ORM\OneToOne(targetEntity="JanusHercules\Membership\Domain\Entity\FlexMembershipRecurrentJobSlot", mappedBy="recurrentJob", cascade={"persist", "remove"})
*/
protected ?FlexMembershipRecurrentJobSlot $slot;
public function getSlot(): ?FlexMembershipRecurrentJobSlot
{
return $this->slot;
}
public function setSlot(?FlexMembershipRecurrentJobSlot $slot): void
{
if ($this->isPlus) {
throw new InvalidArgumentException("Was asked to set flex membership slot for rj '$this->id' but rj is already plus.");
}
$this->slot = $slot;
}
/**
* @ORM\Column(name="duplicated_from_recurrent_job_id", type="string", length=48, nullable=true)
*/
protected ?string $duplicatedFromRecurrentJobId;
public function getDuplicatedFromRecurrentJobId(): ?string
{
return $this->duplicatedFromRecurrentJobId;
}
public function setDuplicatedFromRecurrentJobId(?string $duplicatedFromRecurrentJobId): void
{
$this->duplicatedFromRecurrentJobId = $duplicatedFromRecurrentJobId;
}
public function getBusinessnameSearchtermZipcodeAsHash(): string
{
return hash('xxh3', $this->getBusinessName() . $this->getOccupationalFieldSearchterm() . $this->getZipcode());
}
}