<?php
namespace App\Entity\RecurrentJobsSearch;
use App\Entity\Profile\JobseekerProfile;
use App\Entity\RecurrentJob;
use App\Entity\WantedJob;
use App\Validator\Constraint as AppAssert;
use App\Value\PossibleAvailabilitiesValue;
use App\Value\ZipcodeRadiusesValue;
use Exception;
use JsonSerializable;
use ReturnTypeWillChange;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class RecurrentJobsSearchParameters implements JsonSerializable
{
/** @var string */
private $filterSearchterm;
/** @var int */
private $filterZipcodeRadius = ZipcodeRadiusesValue::DEFAULT;
/**
* @var string
*
* @AppAssert\KnownZipcode
*/
private $filterZipcode;
/** @var int */
private $filterRequiredExperience = JobseekerProfile::EXPERIENCE_MORE_THAN_ONE_YEAR;
/** @var array|int[] */
private $filterRequiredCareerLevels;
/** @var bool */
private $atLeastOneRequiredCareerLevelMustMatch;
/** @var array|int[] */
private $filterRequiredEmploymentTypes;
/** @var bool */
private $atLeastOneRequiredEmploymentTypeMustMatch;
/** @var bool */
private $filterIsRequiredOnMondayMorning;
/** @var bool */
private $filterIsRequiredOnMondayNoon;
/** @var bool */
private $filterIsRequiredOnMondayEvening;
/** @var bool */
private $filterIsRequiredOnMondayNight;
/** @var bool */
private $filterIsRequiredOnTuesdayMorning;
/** @var bool */
private $filterIsRequiredOnTuesdayNoon;
/** @var bool */
private $filterIsRequiredOnTuesdayEvening;
/** @var bool */
private $filterIsRequiredOnTuesdayNight;
/** @var bool */
private $filterIsRequiredOnWednesdayMorning;
/** @var bool */
private $filterIsRequiredOnWednesdayNoon;
/** @var bool */
private $filterIsRequiredOnWednesdayEvening;
/** @var bool */
private $filterIsRequiredOnWednesdayNight;
/** @var bool */
private $filterIsRequiredOnThursdayMorning;
/** @var bool */
private $filterIsRequiredOnThursdayNoon;
/** @var bool */
private $filterIsRequiredOnThursdayEvening;
/** @var bool */
private $filterIsRequiredOnThursdayNight;
/** @var bool */
private $filterIsRequiredOnFridayMorning;
/** @var bool */
private $filterIsRequiredOnFridayNoon;
/** @var bool */
private $filterIsRequiredOnFridayEvening;
/** @var bool */
private $filterIsRequiredOnFridayNight;
/** @var bool */
private $filterIsRequiredOnSaturdayMorning;
/** @var bool */
private $filterIsRequiredOnSaturdayNoon;
/** @var bool */
private $filterIsRequiredOnSaturdayEvening;
/** @var bool */
private $filterIsRequiredOnSaturdayNight;
/** @var bool */
private $filterIsRequiredOnSundayMorning;
/** @var bool */
private $filterIsRequiredOnSundayNoon;
/** @var bool */
private $filterIsRequiredOnSundayEvening;
/** @var bool */
private $filterIsRequiredOnSundayNight;
/** @var bool */
private $filterAlreadyContacted;
private bool $filterSuperiorSalary;
/**
* @param array|int[] $filterRequiredCareerLevels
* @param array|int[] $filterRequiredEmploymentTypes
*
* @throws Exception
*/
public function __construct(
string $filterSearchterm = '',
string $filterZipcode = '',
int $filterZipcodeRadius = ZipcodeRadiusesValue::DEFAULT,
int $filterRequiredExperience = RecurrentJob::EXPERIENCE_NONE,
array $filterRequiredCareerLevels = [],
bool $atLeastOneRequiredCareerLevelMustMatch = false,
array $filterRequiredEmploymentTypes = [],
bool $atLeastOneRequiredEmploymentTypeMustMatch = false,
bool $defaultFilterIsRequiredOn = false
) {
$this->setFilterSearchterm($filterSearchterm);
$this->setFilterZipcode($filterZipcode);
$this->setFilterZipcodeRadius($filterZipcodeRadius);
$this->setFilterRequiredExperience($filterRequiredExperience);
$this->setFilterRequiredCareerLevels($filterRequiredCareerLevels);
$this->setAtLeastOneRequiredCareerLevelMustMatch($atLeastOneRequiredCareerLevelMustMatch);
$this->setFilterRequiredEmploymentTypes($filterRequiredEmploymentTypes);
$this->setAtLeastOneRequiredEmploymentTypeMustMatch($atLeastOneRequiredEmploymentTypeMustMatch);
foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$methodName = 'setFilterIsRequiredOn' . $weekday . $timeOfDay;
$this->$methodName($defaultFilterIsRequiredOn);
}
}
$this->filterAlreadyContacted = false;
$this->filterSuperiorSalary = false;
}
public function getFilterSearchterm(): string
{
return $this->filterSearchterm;
}
public function setFilterSearchterm(?string $filterSearchterm = null): void
{
if (is_null($filterSearchterm)) {
$filterSearchterm = '';
}
$this->filterSearchterm = $filterSearchterm;
}
public function getFilterZipcodeRadius(): int
{
return $this->filterZipcodeRadius;
}
public function setFilterZipcodeRadius(int $filterZipcodeRadius): void
{
$this->filterZipcodeRadius = $filterZipcodeRadius;
}
public function getFilterZipcode(): string
{
return $this->filterZipcode;
}
public function setFilterZipcode(string $filterZipcode): void
{
$this->filterZipcode = $filterZipcode;
}
public function getFilterRequiredExperience(): int
{
return $this->filterRequiredExperience;
}
public function setFilterRequiredExperience(int $filterRequiredExperience): void
{
$this->filterRequiredExperience = $filterRequiredExperience;
}
/**
* @param array|int[] $filterRequiredCareerLevels
*
* @throws Exception
*/
public function setFilterRequiredCareerLevels(array $filterRequiredCareerLevels): void
{
foreach ($filterRequiredCareerLevels as $filterRequiredCareerLevel) {
if (!is_int($filterRequiredCareerLevel)
|| $filterRequiredCareerLevel < WantedJob::CAREER_LEVEL_TRAINEE
|| $filterRequiredCareerLevel > WantedJob::CAREER_LEVEL_EXECUTIVE
) {
throw new Exception("Invalid value $filterRequiredCareerLevel in filterRequiredCareerLevels.");
}
}
$this->filterRequiredCareerLevels = $filterRequiredCareerLevels;
}
public function setAtLeastOneRequiredCareerLevelMustMatch(bool $val): void
{
$this->atLeastOneRequiredCareerLevelMustMatch = $val;
}
public function getAtLeastOneRequiredCareerLevelMustMatch(): bool
{
return $this->atLeastOneRequiredCareerLevelMustMatch;
}
/** @return int[] */
public function getFilterRequiredCareerLevels(): array
{
return $this->filterRequiredCareerLevels;
}
public function hasFilterRequiredCareerLevels(): bool
{
return (bool)sizeof($this->filterRequiredCareerLevels);
}
/**
* @param array|int[] $filterRequiredEmploymentTypes
*
* @throws Exception
*/
public function setFilterRequiredEmploymentTypes(array $filterRequiredEmploymentTypes): void
{
foreach ($filterRequiredEmploymentTypes as $filterRequiredEmploymentType) {
if (!is_int($filterRequiredEmploymentType)
|| $filterRequiredEmploymentType < RecurrentJob::EMPLOYMENT_TYPE_ONCE
|| $filterRequiredEmploymentType > RecurrentJob::EMPLOYMENT_TYPE_UNDEFINED
) {
throw new Exception("Invalid value '{$filterRequiredEmploymentType}' in filterRequiredEmploymentTypes.");
}
}
$this->filterRequiredEmploymentTypes = $filterRequiredEmploymentTypes;
}
public function setAtLeastOneRequiredEmploymentTypeMustMatch(bool $val): void
{
$this->atLeastOneRequiredEmploymentTypeMustMatch = $val;
}
public function getAtLeastOneRequiredEmploymentTypeMustMatch(): bool
{
return $this->atLeastOneRequiredEmploymentTypeMustMatch;
}
/** @return int[] */
public function getFilterRequiredEmploymentTypes(): array
{
return $this->filterRequiredEmploymentTypes;
}
public function hasFilterRequiredEmploymentTypes(): bool
{
return (bool)sizeof($this->filterRequiredEmploymentTypes);
}
public function getFilterIsRequiredOnMondayMorning(): bool
{
return $this->filterIsRequiredOnMondayMorning;
}
public function setFilterIsRequiredOnMondayMorning(bool $filterIsRequiredOnMondayMorning): void
{
$this->filterIsRequiredOnMondayMorning = $filterIsRequiredOnMondayMorning;
}
public function getFilterIsRequiredOnMondayNoon(): bool
{
return $this->filterIsRequiredOnMondayNoon;
}
public function setFilterIsRequiredOnMondayNoon(bool $filterIsRequiredOnMondayNoon): void
{
$this->filterIsRequiredOnMondayNoon = $filterIsRequiredOnMondayNoon;
}
public function getFilterIsRequiredOnMondayEvening(): bool
{
return $this->filterIsRequiredOnMondayEvening;
}
public function setFilterIsRequiredOnMondayEvening(bool $filterIsRequiredOnMondayEvening): void
{
$this->filterIsRequiredOnMondayEvening = $filterIsRequiredOnMondayEvening;
}
public function getFilterIsRequiredOnMondayNight(): bool
{
return $this->filterIsRequiredOnMondayNight;
}
public function setFilterIsRequiredOnMondayNight(bool $filterIsRequiredOnMondayNight): void
{
$this->filterIsRequiredOnMondayNight = $filterIsRequiredOnMondayNight;
}
public function getFilterIsRequiredOnTuesdayMorning(): bool
{
return $this->filterIsRequiredOnTuesdayMorning;
}
public function setFilterIsRequiredOnTuesdayMorning(bool $filterIsRequiredOnTuesdayMorning): void
{
$this->filterIsRequiredOnTuesdayMorning = $filterIsRequiredOnTuesdayMorning;
}
public function getFilterIsRequiredOnTuesdayNoon(): bool
{
return $this->filterIsRequiredOnTuesdayNoon;
}
public function setFilterIsRequiredOnTuesdayNoon(bool $filterIsRequiredOnTuesdayNoon): void
{
$this->filterIsRequiredOnTuesdayNoon = $filterIsRequiredOnTuesdayNoon;
}
public function getFilterIsRequiredOnTuesdayEvening(): bool
{
return $this->filterIsRequiredOnTuesdayEvening;
}
public function setFilterIsRequiredOnTuesdayEvening(bool $filterIsRequiredOnTuesdayEvening): void
{
$this->filterIsRequiredOnTuesdayEvening = $filterIsRequiredOnTuesdayEvening;
}
public function getFilterIsRequiredOnTuesdayNight(): bool
{
return $this->filterIsRequiredOnTuesdayNight;
}
public function setFilterIsRequiredOnTuesdayNight(bool $filterIsRequiredOnTuesdayNight): void
{
$this->filterIsRequiredOnTuesdayNight = $filterIsRequiredOnTuesdayNight;
}
public function getFilterIsRequiredOnWednesdayMorning(): bool
{
return $this->filterIsRequiredOnWednesdayMorning;
}
public function setFilterIsRequiredOnWednesdayMorning(bool $filterIsRequiredOnWednesdayMorning): void
{
$this->filterIsRequiredOnWednesdayMorning = $filterIsRequiredOnWednesdayMorning;
}
public function getFilterIsRequiredOnWednesdayNoon(): bool
{
return $this->filterIsRequiredOnWednesdayNoon;
}
public function setFilterIsRequiredOnWednesdayNoon(bool $filterIsRequiredOnWednesdayNoon): void
{
$this->filterIsRequiredOnWednesdayNoon = $filterIsRequiredOnWednesdayNoon;
}
public function getFilterIsRequiredOnWednesdayEvening(): bool
{
return $this->filterIsRequiredOnWednesdayEvening;
}
public function setFilterIsRequiredOnWednesdayEvening(bool $filterIsRequiredOnWednesdayEvening): void
{
$this->filterIsRequiredOnWednesdayEvening = $filterIsRequiredOnWednesdayEvening;
}
public function getFilterIsRequiredOnWednesdayNight(): bool
{
return $this->filterIsRequiredOnWednesdayNight;
}
public function setFilterIsRequiredOnWednesdayNight(bool $filterIsRequiredOnWednesdayNight): void
{
$this->filterIsRequiredOnWednesdayNight = $filterIsRequiredOnWednesdayNight;
}
public function getFilterIsRequiredOnThursdayMorning(): bool
{
return $this->filterIsRequiredOnThursdayMorning;
}
public function setFilterIsRequiredOnThursdayMorning(bool $filterIsRequiredOnThursdayMorning): void
{
$this->filterIsRequiredOnThursdayMorning = $filterIsRequiredOnThursdayMorning;
}
public function getFilterIsRequiredOnThursdayNoon(): bool
{
return $this->filterIsRequiredOnThursdayNoon;
}
public function setFilterIsRequiredOnThursdayNoon(bool $filterIsRequiredOnThursdayNoon): void
{
$this->filterIsRequiredOnThursdayNoon = $filterIsRequiredOnThursdayNoon;
}
public function getFilterIsRequiredOnThursdayEvening(): bool
{
return $this->filterIsRequiredOnThursdayEvening;
}
public function setFilterIsRequiredOnThursdayEvening(bool $filterIsRequiredOnThursdayEvening): void
{
$this->filterIsRequiredOnThursdayEvening = $filterIsRequiredOnThursdayEvening;
}
public function getFilterIsRequiredOnThursdayNight(): bool
{
return $this->filterIsRequiredOnThursdayNight;
}
public function setFilterIsRequiredOnThursdayNight(bool $filterIsRequiredOnThursdayNight): void
{
$this->filterIsRequiredOnThursdayNight = $filterIsRequiredOnThursdayNight;
}
public function getFilterIsRequiredOnFridayMorning(): bool
{
return $this->filterIsRequiredOnFridayMorning;
}
public function setFilterIsRequiredOnFridayMorning(bool $filterIsRequiredOnFridayMorning): void
{
$this->filterIsRequiredOnFridayMorning = $filterIsRequiredOnFridayMorning;
}
public function getFilterIsRequiredOnFridayNoon(): bool
{
return $this->filterIsRequiredOnFridayNoon;
}
public function setFilterIsRequiredOnFridayNoon(bool $filterIsRequiredOnFridayNoon): void
{
$this->filterIsRequiredOnFridayNoon = $filterIsRequiredOnFridayNoon;
}
public function getFilterIsRequiredOnFridayEvening(): bool
{
return $this->filterIsRequiredOnFridayEvening;
}
public function setFilterIsRequiredOnFridayEvening(bool $filterIsRequiredOnFridayEvening): void
{
$this->filterIsRequiredOnFridayEvening = $filterIsRequiredOnFridayEvening;
}
public function getFilterIsRequiredOnFridayNight(): bool
{
return $this->filterIsRequiredOnFridayNight;
}
public function setFilterIsRequiredOnFridayNight(bool $filterIsRequiredOnFridayNight): void
{
$this->filterIsRequiredOnFridayNight = $filterIsRequiredOnFridayNight;
}
public function getFilterIsRequiredOnSaturdayMorning(): bool
{
return $this->filterIsRequiredOnSaturdayMorning;
}
public function setFilterIsRequiredOnSaturdayMorning(bool $filterIsRequiredOnSaturdayMorning): void
{
$this->filterIsRequiredOnSaturdayMorning = $filterIsRequiredOnSaturdayMorning;
}
public function getFilterIsRequiredOnSaturdayNoon(): bool
{
return $this->filterIsRequiredOnSaturdayNoon;
}
public function setFilterIsRequiredOnSaturdayNoon(bool $filterIsRequiredOnSaturdayNoon): void
{
$this->filterIsRequiredOnSaturdayNoon = $filterIsRequiredOnSaturdayNoon;
}
public function getFilterIsRequiredOnSaturdayEvening(): bool
{
return $this->filterIsRequiredOnSaturdayEvening;
}
public function setFilterIsRequiredOnSaturdayEvening(bool $filterIsRequiredOnSaturdayEvening): void
{
$this->filterIsRequiredOnSaturdayEvening = $filterIsRequiredOnSaturdayEvening;
}
public function getFilterIsRequiredOnSaturdayNight(): bool
{
return $this->filterIsRequiredOnSaturdayNight;
}
public function setFilterIsRequiredOnSaturdayNight(bool $filterIsRequiredOnSaturdayNight): void
{
$this->filterIsRequiredOnSaturdayNight = $filterIsRequiredOnSaturdayNight;
}
public function getFilterIsRequiredOnSundayMorning(): bool
{
return $this->filterIsRequiredOnSundayMorning;
}
public function setFilterIsRequiredOnSundayMorning(bool $filterIsRequiredOnSundayMorning): void
{
$this->filterIsRequiredOnSundayMorning = $filterIsRequiredOnSundayMorning;
}
public function getFilterIsRequiredOnSundayNoon(): bool
{
return $this->filterIsRequiredOnSundayNoon;
}
public function setFilterIsRequiredOnSundayNoon(bool $filterIsRequiredOnSundayNoon): void
{
$this->filterIsRequiredOnSundayNoon = $filterIsRequiredOnSundayNoon;
}
public function getFilterIsRequiredOnSundayEvening(): bool
{
return $this->filterIsRequiredOnSundayEvening;
}
public function setFilterIsRequiredOnSundayEvening(bool $filterIsRequiredOnSundayEvening): void
{
$this->filterIsRequiredOnSundayEvening = $filterIsRequiredOnSundayEvening;
}
public function getFilterIsRequiredOnSundayNight(): bool
{
return $this->filterIsRequiredOnSundayNight;
}
public function setFilterIsRequiredOnSundayNight(bool $filterIsRequiredOnSundayNight): void
{
$this->filterIsRequiredOnSundayNight = $filterIsRequiredOnSundayNight;
}
public function getFilterAlreadyContacted(): bool
{
return $this->filterAlreadyContacted;
}
public function setFilterAlreadyContacted(bool $filterAlreadyContacted): void
{
$this->filterAlreadyContacted = $filterAlreadyContacted;
}
public function setAllFilterIsRequiredOnTo(bool $to): void
{
foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$methodName = 'getFilterIsRequiredOn' . $weekday . $timeOfDay;
$this->$methodName($to);
}
}
}
public function isFilterSuperiorSalary(): bool
{
return $this->filterSuperiorSalary;
}
public function setFilterSuperiorSalary(bool $filterSuperiorSalary): void
{
$this->filterSuperiorSalary = $filterSuperiorSalary;
}
/**
* @Assert\Callback
*/
public function validate(ExecutionContextInterface $context, $payload)
{
if (!in_array($this->filterZipcodeRadius, ZipcodeRadiusesValue::ALL)) {
$context->buildViolation('')
->atPath('filterZipcodeRadius')
->addViolation();
}
}
#[ReturnTypeWillChange]
public function jsonSerialize()
{
$result = [];
$result['filterSearchterm'] = $this->filterSearchterm;
$result['filterZipcodeRadius'] = $this->filterZipcodeRadius;
$result['filterZipcode'] = $this->filterZipcode;
$result['filterRequiredExperience'] = $this->filterRequiredExperience;
$result['filterAlreadyContacted'] = $this->filterAlreadyContacted;
$result['filterSuperiorSalary'] = $this->filterSuperiorSalary;
foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$attr = 'filterIsRequiredOn' . $weekday . $timeOfDay;
$result[$attr] = $this->$attr;
}
}
return $result;
}
/** @throws Exception */
public static function createFromArray(array $data): self
{
$recurrentJobsSearchParameters = new self();
$recurrentJobsSearchParameters->filterSearchterm = $data['filterSearchterm'];
$recurrentJobsSearchParameters->filterZipcodeRadius = $data['filterZipcodeRadius'];
$recurrentJobsSearchParameters->filterZipcode = $data['filterZipcode'];
$recurrentJobsSearchParameters->filterRequiredExperience = $data['filterRequiredExperience'];
$recurrentJobsSearchParameters->filterRequiredCareerLevels = $data['filterRequiredCareerLevels'];
$recurrentJobsSearchParameters->filterRequiredEmploymentTypes = $data['filterRequiredEmploymentTypes'];
if (array_key_exists('filterAlreadyContacted', $data) && !is_null($data['filterAlreadyContacted'])) {
$recurrentJobsSearchParameters->filterAlreadyContacted = $data['filterAlreadyContacted'];
} else {
$recurrentJobsSearchParameters->filterAlreadyContacted = false;
}
if (array_key_exists('filterSuperiorSalary', $data) && !is_null($data['filterSuperiorSalary'])) {
$recurrentJobsSearchParameters->filterSuperiorSalary = $data['filterSuperiorSalary'];
} else {
$recurrentJobsSearchParameters->filterSuperiorSalary = false;
}
foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$attr = 'filterIsRequiredOn' . $weekday . $timeOfDay;
if (array_key_exists($attr, $data) && is_bool($data[$attr])) {
$recurrentJobsSearchParameters->$attr = $data[$attr];
}
}
}
return $recurrentJobsSearchParameters;
}
public function toQueryString(int $page = 1): string
{
$queryString = '';
$queryString .= 'recurrent_jobs_search_parameters[filterSearchterm]=' . urlencode($this->filterSearchterm);
$queryString .= '&recurrent_jobs_search_parameters[filterZipcodeRadius]=' . urlencode($this->filterZipcodeRadius);
$queryString .= '&recurrent_jobs_search_parameters[filterZipcode]=' . urlencode($this->filterZipcode);
$queryString .= '&recurrent_jobs_search_parameters[filterRequiredExperience]=' . urlencode($this->filterRequiredExperience);
$queryString .= '&recurrent_jobs_search_parameters[filterAlreadyContacted]=' . urlencode($this->filterAlreadyContacted);
$queryString .= '&recurrent_jobs_search_parameters[filterSuperiorSalary]=' . urlencode($this->filterSuperiorSalary);
foreach ($this->filterRequiredCareerLevels as $careerLevel) {
$queryString .= '&recurrent_jobs_search_parameters[filterRequiredCareerLevels][]=' . urlencode($careerLevel);
}
foreach ($this->filterRequiredEmploymentTypes as $employmentType) {
$queryString .= '&recurrent_jobs_search_parameters[filterRequiredEmploymentTypes][]=' . urlencode($employmentType);
}
foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$attr = 'filterIsRequiredOn' . $weekday . $timeOfDay;
if ($this->$attr === true) {
$queryString .= '&recurrent_jobs_search_parameters[' . $attr . ']=1';
}
}
}
$queryString .= '&page=' . $page;
return $queryString;
}
/**
* Returns a parameter set that matches the given recurrent job perfectly.
*
* @throws Exception
*/
public static function fromWantedJob(WantedJob $wantedJob): self
{
$remainingEmploymentTypes = [];
foreach ($wantedJob->getEmploymentTypes() as $employmentType) {
if ($employmentType !== RecurrentJob::EMPLOYMENT_TYPE_UNDEFINED) {
$remainingEmploymentTypes[] = $employmentType;
}
}
$recurrentJobsSearchParameters = new self();
$recurrentJobsSearchParameters->filterSearchterm = $wantedJob->getOccupationalFieldSearchterm();
$recurrentJobsSearchParameters->filterZipcodeRadius = is_null($wantedJob->getAvailabilityRadius()) ? ZipcodeRadiusesValue::DEFAULT : $wantedJob->getAvailabilityRadius();
$recurrentJobsSearchParameters->filterZipcode = $wantedJob->getZipcode();
$recurrentJobsSearchParameters->filterRequiredExperience = $wantedJob->getRequiredExperience();
$recurrentJobsSearchParameters->filterRequiredCareerLevels = $wantedJob->getCareerLevels();
$recurrentJobsSearchParameters->filterRequiredEmploymentTypes = $remainingEmploymentTypes;
$recurrentJobsSearchParameters->filterSuperiorSalary = false;
foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$paramsAttr = 'filterIsRequiredOn' . $weekday . $timeOfDay;
$profileMethod = 'isRequiredOn' . $weekday . $timeOfDay;
$recurrentJobsSearchParameters->$paramsAttr = $wantedJob->$profileMethod();
}
}
return $recurrentJobsSearchParameters;
}
public static function fromRecurrentJob(RecurrentJob $recurrentJob): self
{
$remainingEmploymentTypes = [];
foreach ($recurrentJob->getEmploymentTypes() as $employmentType) {
if ($employmentType !== RecurrentJob::EMPLOYMENT_TYPE_UNDEFINED) {
$remainingEmploymentTypes[] = $employmentType;
}
}
$recurrentJobsSearchParameters = new self();
$recurrentJobsSearchParameters->filterSearchterm = $recurrentJob->getOccupationalFieldSearchterm();
$recurrentJobsSearchParameters->filterZipcodeRadius = ZipcodeRadiusesValue::MINIMUM;
$recurrentJobsSearchParameters->filterZipcode = $recurrentJob->getZipcode();
$recurrentJobsSearchParameters->filterRequiredExperience = $recurrentJob->getRequiredExperience();
$recurrentJobsSearchParameters->filterRequiredCareerLevels = $recurrentJob->getCareerLevels();
$recurrentJobsSearchParameters->filterRequiredEmploymentTypes = $remainingEmploymentTypes;
$recurrentJobsSearchParameters->filterSuperiorSalary = false;
foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$paramsAttr = 'filterIsRequiredOn' . $weekday . $timeOfDay;
$profileMethod = 'isRequiredOn' . $weekday . $timeOfDay;
$recurrentJobsSearchParameters->$paramsAttr = $recurrentJob->$profileMethod();
}
}
return $recurrentJobsSearchParameters;
}
public function asArray(): array
{
$arr = [
'filterSearchterm' => $this->getFilterSearchterm(),
'filterZipcode' => $this->getFilterZipcode(),
'filterZipcodeRadius' => $this->getFilterZipcodeRadius(),
'filterRequiredExperience' => $this->getFilterRequiredExperience(),
'filterAlreadyContacted' => $this->getFilterAlreadyContacted(),
'filterRequiredCareerLevels' => $this->getFilterRequiredCareerLevels(),
'filterRequiredEmploymentTypes' => $this->getFilterRequiredEmploymentTypes(),
'filterSuperiorSalary' => $this->isFilterSuperiorSalary()
];
foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
$key = 'filterIsRequiredOn' . $weekday . $timeOfDay;
$methodName = 'getFilterIsRequiredOn' . $weekday . $timeOfDay;
if ($this->$methodName() == true) {
$arr[$key] = $this->$methodName();
}
}
}
return $arr;
}
}