src/App/Entity/WantedJobsSearch/WantedJobsSearchParameters.php line 19

Open in your IDE?
  1. <?php
  2. namespace App\Entity\WantedJobsSearch;
  3. use App\Entity\Profile\JobseekerProfile;
  4. use App\Entity\RecurrentJob;
  5. use App\Entity\WantedJob;
  6. use App\Utility\GenderNeutralizer;
  7. use App\Validator\Constraint as AppAssert;
  8. use App\Value\PossibleAvailabilitiesValue;
  9. use App\Value\ZipcodeRadiusesValue;
  10. use Exception;
  11. use JsonSerializable;
  12. use ReturnTypeWillChange;
  13. use Symfony\Component\Validator\Constraints as Assert;
  14. use Symfony\Component\Validator\Context\ExecutionContextInterface;
  15. use ValueError;
  16. class WantedJobsSearchParameters implements JsonSerializable
  17. {
  18. /** @var string */
  19. private $filterSearchterm;
  20. /** @var int */
  21. private $filterZipcodeRadius = ZipcodeRadiusesValue::DEFAULT;
  22. /**
  23. * @var string
  24. *
  25. * @AppAssert\KnownZipcode
  26. */
  27. private $filterZipcode;
  28. /** @var int */
  29. private $filterRequiredExperience = JobseekerProfile::EXPERIENCE_MORE_THAN_ONE_YEAR;
  30. /** @var bool */
  31. private $filterAlreadyContacted;
  32. /** @var int[]|array */
  33. private $filterRequiredCareerLevels;
  34. /** @var bool */
  35. private $atLeastOneRequiredCareerLevelMustMatch;
  36. /** @var int[]|array */
  37. private $filterRequiredEmploymentTypes;
  38. /** @var bool */
  39. private $atLeastOneRequiredEmploymentTypeMustMatch;
  40. /** @var bool */
  41. private $filterIsRequiredOnMondayMorning;
  42. /** @var bool */
  43. private $filterIsRequiredOnMondayNoon;
  44. /** @var bool */
  45. private $filterIsRequiredOnMondayEvening;
  46. /** @var bool */
  47. private $filterIsRequiredOnMondayNight;
  48. /** @var bool */
  49. private $filterIsRequiredOnTuesdayMorning;
  50. /** @var bool */
  51. private $filterIsRequiredOnTuesdayNoon;
  52. /** @var bool */
  53. private $filterIsRequiredOnTuesdayEvening;
  54. /** @var bool */
  55. private $filterIsRequiredOnTuesdayNight;
  56. /** @var bool */
  57. private $filterIsRequiredOnWednesdayMorning;
  58. /** @var bool */
  59. private $filterIsRequiredOnWednesdayNoon;
  60. /** @var bool */
  61. private $filterIsRequiredOnWednesdayEvening;
  62. /** @var bool */
  63. private $filterIsRequiredOnWednesdayNight;
  64. /** @var bool */
  65. private $filterIsRequiredOnThursdayMorning;
  66. /** @var bool */
  67. private $filterIsRequiredOnThursdayNoon;
  68. /** @var bool */
  69. private $filterIsRequiredOnThursdayEvening;
  70. /** @var bool */
  71. private $filterIsRequiredOnThursdayNight;
  72. /** @var bool */
  73. private $filterIsRequiredOnFridayMorning;
  74. /** @var bool */
  75. private $filterIsRequiredOnFridayNoon;
  76. /** @var bool */
  77. private $filterIsRequiredOnFridayEvening;
  78. /** @var bool */
  79. private $filterIsRequiredOnFridayNight;
  80. /** @var bool */
  81. private $filterIsRequiredOnSaturdayMorning;
  82. /** @var bool */
  83. private $filterIsRequiredOnSaturdayNoon;
  84. /** @var bool */
  85. private $filterIsRequiredOnSaturdayEvening;
  86. /** @var bool */
  87. private $filterIsRequiredOnSaturdayNight;
  88. /** @var bool */
  89. private $filterIsRequiredOnSundayMorning;
  90. /** @var bool */
  91. private $filterIsRequiredOnSundayNoon;
  92. /** @var bool */
  93. private $filterIsRequiredOnSundayEvening;
  94. /** @var bool */
  95. private $filterIsRequiredOnSundayNight;
  96. /**
  97. * @throws Exception
  98. */
  99. public function __construct(
  100. string $filterSearchterm = '',
  101. string $filterZipcode = '',
  102. int $filterZipcodeRadius = ZipcodeRadiusesValue::DEFAULT,
  103. int $filterRequiredExperience = WantedJob::EXPERIENCE_NONE,
  104. bool $atLeastOneRequiredCareerLevelMustMatch = false,
  105. bool $atLeastOneRequiredEmploymentTypeMustMatch = false
  106. ) {
  107. $this->setFilterSearchterm($filterSearchterm);
  108. $this->setFilterZipcode($filterZipcode);
  109. $this->setFilterZipcodeRadius($filterZipcodeRadius);
  110. $this->setFilterRequiredExperience($filterRequiredExperience);
  111. $this->setAtLeastOneRequiredCareerLevelMustMatch($atLeastOneRequiredCareerLevelMustMatch);
  112. $this->setAtLeastOneRequiredEmploymentTypeMustMatch($atLeastOneRequiredEmploymentTypeMustMatch);
  113. $this->setFilterAlreadyContacted(false);
  114. foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
  115. foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
  116. $methodName = 'setFilterIsRequiredOn' . $weekday . $timeOfDay;
  117. $this->$methodName(false);
  118. }
  119. }
  120. $this->filterRequiredCareerLevels = [];
  121. $this->filterRequiredEmploymentTypes = [];
  122. }
  123. public function getFilterSearchterm(): string
  124. {
  125. return $this->filterSearchterm;
  126. }
  127. public function getFilterSearchtermForDisplay(): string
  128. {
  129. return GenderNeutralizer::neutralize($this->filterSearchterm);
  130. }
  131. public function setFilterSearchterm(?string $filterSearchterm = null): void
  132. {
  133. if (is_null($filterSearchterm)) {
  134. $filterSearchterm = '';
  135. }
  136. $this->filterSearchterm = $filterSearchterm;
  137. }
  138. public function getFilterZipcodeRadius(): int
  139. {
  140. return $this->filterZipcodeRadius;
  141. }
  142. public function setFilterZipcodeRadius(?int $filterZipcodeRadius): void
  143. {
  144. if (is_null($filterZipcodeRadius)) {
  145. $filterZipcodeRadius = ZipcodeRadiusesValue::DEFAULT;
  146. }
  147. $this->filterZipcodeRadius = $filterZipcodeRadius;
  148. }
  149. public function getFilterZipcode(): string
  150. {
  151. return $this->filterZipcode;
  152. }
  153. public function setFilterZipcode(string $filterZipcode): void
  154. {
  155. $this->filterZipcode = $filterZipcode;
  156. }
  157. public function getFilterRequiredExperience(): int
  158. {
  159. return $this->filterRequiredExperience;
  160. }
  161. public function setFilterRequiredExperience(int $filterRequiredExperience): void
  162. {
  163. $this->filterRequiredExperience = $filterRequiredExperience;
  164. }
  165. public function setAtLeastOneRequiredCareerLevelMustMatch(bool $val): void
  166. {
  167. $this->atLeastOneRequiredCareerLevelMustMatch = $val;
  168. }
  169. public function getAtLeastOneRequiredCareerLevelMustMatch(): bool
  170. {
  171. return $this->atLeastOneRequiredCareerLevelMustMatch;
  172. }
  173. public function setAtLeastOneRequiredEmploymentTypeMustMatch(bool $val): void
  174. {
  175. $this->atLeastOneRequiredEmploymentTypeMustMatch = $val;
  176. }
  177. public function getAtLeastOneRequiredEmploymentTypeMustMatch(): bool
  178. {
  179. return $this->atLeastOneRequiredEmploymentTypeMustMatch;
  180. }
  181. public function getFilterIsRequiredOnMondayMorning(): bool
  182. {
  183. return $this->filterIsRequiredOnMondayMorning;
  184. }
  185. public function setFilterIsRequiredOnMondayMorning(bool $filterIsRequiredOnMondayMorning): void
  186. {
  187. $this->filterIsRequiredOnMondayMorning = $filterIsRequiredOnMondayMorning;
  188. }
  189. public function getFilterIsRequiredOnMondayNoon(): bool
  190. {
  191. return $this->filterIsRequiredOnMondayNoon;
  192. }
  193. public function setFilterIsRequiredOnMondayNoon(bool $filterIsRequiredOnMondayNoon): void
  194. {
  195. $this->filterIsRequiredOnMondayNoon = $filterIsRequiredOnMondayNoon;
  196. }
  197. public function getFilterIsRequiredOnMondayEvening(): bool
  198. {
  199. return $this->filterIsRequiredOnMondayEvening;
  200. }
  201. public function setFilterIsRequiredOnMondayEvening(bool $filterIsRequiredOnMondayEvening): void
  202. {
  203. $this->filterIsRequiredOnMondayEvening = $filterIsRequiredOnMondayEvening;
  204. }
  205. public function getFilterIsRequiredOnMondayNight(): bool
  206. {
  207. return $this->filterIsRequiredOnMondayNight;
  208. }
  209. public function setFilterIsRequiredOnMondayNight(bool $filterIsRequiredOnMondayNight): void
  210. {
  211. $this->filterIsRequiredOnMondayNight = $filterIsRequiredOnMondayNight;
  212. }
  213. public function getFilterIsRequiredOnTuesdayMorning(): bool
  214. {
  215. return $this->filterIsRequiredOnTuesdayMorning;
  216. }
  217. public function setFilterIsRequiredOnTuesdayMorning(bool $filterIsRequiredOnTuesdayMorning): void
  218. {
  219. $this->filterIsRequiredOnTuesdayMorning = $filterIsRequiredOnTuesdayMorning;
  220. }
  221. public function getFilterIsRequiredOnTuesdayNoon(): bool
  222. {
  223. return $this->filterIsRequiredOnTuesdayNoon;
  224. }
  225. public function setFilterIsRequiredOnTuesdayNoon(bool $filterIsRequiredOnTuesdayNoon): void
  226. {
  227. $this->filterIsRequiredOnTuesdayNoon = $filterIsRequiredOnTuesdayNoon;
  228. }
  229. public function getFilterIsRequiredOnTuesdayEvening(): bool
  230. {
  231. return $this->filterIsRequiredOnTuesdayEvening;
  232. }
  233. public function setFilterIsRequiredOnTuesdayEvening(bool $filterIsRequiredOnTuesdayEvening): void
  234. {
  235. $this->filterIsRequiredOnTuesdayEvening = $filterIsRequiredOnTuesdayEvening;
  236. }
  237. public function getFilterIsRequiredOnTuesdayNight(): bool
  238. {
  239. return $this->filterIsRequiredOnTuesdayNight;
  240. }
  241. public function setFilterIsRequiredOnTuesdayNight(bool $filterIsRequiredOnTuesdayNight): void
  242. {
  243. $this->filterIsRequiredOnTuesdayNight = $filterIsRequiredOnTuesdayNight;
  244. }
  245. public function getFilterIsRequiredOnWednesdayMorning(): bool
  246. {
  247. return $this->filterIsRequiredOnWednesdayMorning;
  248. }
  249. public function setFilterIsRequiredOnWednesdayMorning(bool $filterIsRequiredOnWednesdayMorning): void
  250. {
  251. $this->filterIsRequiredOnWednesdayMorning = $filterIsRequiredOnWednesdayMorning;
  252. }
  253. public function getFilterIsRequiredOnWednesdayNoon(): bool
  254. {
  255. return $this->filterIsRequiredOnWednesdayNoon;
  256. }
  257. public function setFilterIsRequiredOnWednesdayNoon(bool $filterIsRequiredOnWednesdayNoon): void
  258. {
  259. $this->filterIsRequiredOnWednesdayNoon = $filterIsRequiredOnWednesdayNoon;
  260. }
  261. public function getFilterIsRequiredOnWednesdayEvening(): bool
  262. {
  263. return $this->filterIsRequiredOnWednesdayEvening;
  264. }
  265. public function setFilterIsRequiredOnWednesdayEvening(bool $filterIsRequiredOnWednesdayEvening): void
  266. {
  267. $this->filterIsRequiredOnWednesdayEvening = $filterIsRequiredOnWednesdayEvening;
  268. }
  269. public function getFilterIsRequiredOnWednesdayNight(): bool
  270. {
  271. return $this->filterIsRequiredOnWednesdayNight;
  272. }
  273. public function setFilterIsRequiredOnWednesdayNight(bool $filterIsRequiredOnWednesdayNight): void
  274. {
  275. $this->filterIsRequiredOnWednesdayNight = $filterIsRequiredOnWednesdayNight;
  276. }
  277. public function getFilterIsRequiredOnThursdayMorning(): bool
  278. {
  279. return $this->filterIsRequiredOnThursdayMorning;
  280. }
  281. public function setFilterIsRequiredOnThursdayMorning(bool $filterIsRequiredOnThursdayMorning): void
  282. {
  283. $this->filterIsRequiredOnThursdayMorning = $filterIsRequiredOnThursdayMorning;
  284. }
  285. public function getFilterIsRequiredOnThursdayNoon(): bool
  286. {
  287. return $this->filterIsRequiredOnThursdayNoon;
  288. }
  289. public function setFilterIsRequiredOnThursdayNoon(bool $filterIsRequiredOnThursdayNoon): void
  290. {
  291. $this->filterIsRequiredOnThursdayNoon = $filterIsRequiredOnThursdayNoon;
  292. }
  293. public function getFilterIsRequiredOnThursdayEvening(): bool
  294. {
  295. return $this->filterIsRequiredOnThursdayEvening;
  296. }
  297. public function setFilterIsRequiredOnThursdayEvening(bool $filterIsRequiredOnThursdayEvening): void
  298. {
  299. $this->filterIsRequiredOnThursdayEvening = $filterIsRequiredOnThursdayEvening;
  300. }
  301. public function getFilterIsRequiredOnThursdayNight(): bool
  302. {
  303. return $this->filterIsRequiredOnThursdayNight;
  304. }
  305. public function setFilterIsRequiredOnThursdayNight(bool $filterIsRequiredOnThursdayNight): void
  306. {
  307. $this->filterIsRequiredOnThursdayNight = $filterIsRequiredOnThursdayNight;
  308. }
  309. public function getFilterIsRequiredOnFridayMorning(): bool
  310. {
  311. return $this->filterIsRequiredOnFridayMorning;
  312. }
  313. public function setFilterIsRequiredOnFridayMorning(bool $filterIsRequiredOnFridayMorning): void
  314. {
  315. $this->filterIsRequiredOnFridayMorning = $filterIsRequiredOnFridayMorning;
  316. }
  317. public function getFilterIsRequiredOnFridayNoon(): bool
  318. {
  319. return $this->filterIsRequiredOnFridayNoon;
  320. }
  321. public function setFilterIsRequiredOnFridayNoon(bool $filterIsRequiredOnFridayNoon): void
  322. {
  323. $this->filterIsRequiredOnFridayNoon = $filterIsRequiredOnFridayNoon;
  324. }
  325. public function getFilterIsRequiredOnFridayEvening(): bool
  326. {
  327. return $this->filterIsRequiredOnFridayEvening;
  328. }
  329. public function setFilterIsRequiredOnFridayEvening(bool $filterIsRequiredOnFridayEvening): void
  330. {
  331. $this->filterIsRequiredOnFridayEvening = $filterIsRequiredOnFridayEvening;
  332. }
  333. public function getFilterIsRequiredOnFridayNight(): bool
  334. {
  335. return $this->filterIsRequiredOnFridayNight;
  336. }
  337. public function setFilterIsRequiredOnFridayNight(bool $filterIsRequiredOnFridayNight): void
  338. {
  339. $this->filterIsRequiredOnFridayNight = $filterIsRequiredOnFridayNight;
  340. }
  341. public function getFilterIsRequiredOnSaturdayMorning(): bool
  342. {
  343. return $this->filterIsRequiredOnSaturdayMorning;
  344. }
  345. public function setFilterIsRequiredOnSaturdayMorning(bool $filterIsRequiredOnSaturdayMorning): void
  346. {
  347. $this->filterIsRequiredOnSaturdayMorning = $filterIsRequiredOnSaturdayMorning;
  348. }
  349. public function getFilterIsRequiredOnSaturdayNoon(): bool
  350. {
  351. return $this->filterIsRequiredOnSaturdayNoon;
  352. }
  353. public function setFilterIsRequiredOnSaturdayNoon(bool $filterIsRequiredOnSaturdayNoon): void
  354. {
  355. $this->filterIsRequiredOnSaturdayNoon = $filterIsRequiredOnSaturdayNoon;
  356. }
  357. public function getFilterIsRequiredOnSaturdayEvening(): bool
  358. {
  359. return $this->filterIsRequiredOnSaturdayEvening;
  360. }
  361. public function setFilterIsRequiredOnSaturdayEvening(bool $filterIsRequiredOnSaturdayEvening): void
  362. {
  363. $this->filterIsRequiredOnSaturdayEvening = $filterIsRequiredOnSaturdayEvening;
  364. }
  365. public function getFilterIsRequiredOnSaturdayNight(): bool
  366. {
  367. return $this->filterIsRequiredOnSaturdayNight;
  368. }
  369. public function setFilterIsRequiredOnSaturdayNight(bool $filterIsRequiredOnSaturdayNight): void
  370. {
  371. $this->filterIsRequiredOnSaturdayNight = $filterIsRequiredOnSaturdayNight;
  372. }
  373. public function getFilterIsRequiredOnSundayMorning(): bool
  374. {
  375. return $this->filterIsRequiredOnSundayMorning;
  376. }
  377. public function setFilterIsRequiredOnSundayMorning(bool $filterIsRequiredOnSundayMorning): void
  378. {
  379. $this->filterIsRequiredOnSundayMorning = $filterIsRequiredOnSundayMorning;
  380. }
  381. public function getFilterIsRequiredOnSundayNoon(): bool
  382. {
  383. return $this->filterIsRequiredOnSundayNoon;
  384. }
  385. public function setFilterIsRequiredOnSundayNoon(bool $filterIsRequiredOnSundayNoon): void
  386. {
  387. $this->filterIsRequiredOnSundayNoon = $filterIsRequiredOnSundayNoon;
  388. }
  389. public function getFilterIsRequiredOnSundayEvening(): bool
  390. {
  391. return $this->filterIsRequiredOnSundayEvening;
  392. }
  393. public function setFilterIsRequiredOnSundayEvening(bool $filterIsRequiredOnSundayEvening): void
  394. {
  395. $this->filterIsRequiredOnSundayEvening = $filterIsRequiredOnSundayEvening;
  396. }
  397. public function getFilterIsRequiredOnSundayNight(): bool
  398. {
  399. return $this->filterIsRequiredOnSundayNight;
  400. }
  401. public function setFilterIsRequiredOnSundayNight(bool $filterIsRequiredOnSundayNight): void
  402. {
  403. $this->filterIsRequiredOnSundayNight = $filterIsRequiredOnSundayNight;
  404. }
  405. public function setAllFilterIsRequiredOnTo(bool $to): void
  406. {
  407. foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
  408. foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
  409. $methodName = 'setFilterIsRequiredOn' . $weekday . $timeOfDay;
  410. $this->$methodName($to);
  411. }
  412. }
  413. }
  414. public function getFilterAlreadyContacted(): bool
  415. {
  416. return $this->filterAlreadyContacted;
  417. }
  418. public function setFilterAlreadyContacted(bool $filterAlreadyContacted): void
  419. {
  420. $this->filterAlreadyContacted = $filterAlreadyContacted;
  421. }
  422. /** @return int[]|array */
  423. public function getFilterRequiredCareerLevels(): array
  424. {
  425. return $this->filterRequiredCareerLevels;
  426. }
  427. public function hasFilterRequiredCareerLevels(): bool
  428. {
  429. return (bool)sizeof($this->filterRequiredCareerLevels);
  430. }
  431. /**
  432. * @param array int[]|array $filterRequiredCareerLevels
  433. *
  434. * @throws Exception
  435. */
  436. public function setFilterRequiredCareerLevels(array $filterRequiredCareerLevels): void
  437. {
  438. foreach ($filterRequiredCareerLevels as $filterRequiredCareerLevel) {
  439. if (!in_array($filterRequiredCareerLevel, array_values(WantedJob::POSSIBLE_CAREER_LEVEL_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING))) {
  440. throw new Exception('Invalid value' . $filterRequiredCareerLevel . ' in filterRequiredEmploymentTypes.');
  441. }
  442. }
  443. $this->filterRequiredCareerLevels = $filterRequiredCareerLevels;
  444. }
  445. /** @return int[]|array */
  446. public function getFilterRequiredEmploymentTypes(): array
  447. {
  448. return $this->filterRequiredEmploymentTypes;
  449. }
  450. public function hasFilterRequiredEmploymentTypes(): bool
  451. {
  452. return (bool)sizeof($this->filterRequiredEmploymentTypes);
  453. }
  454. /**
  455. * @param int[]|array $filterRequiredEmploymentTypes
  456. *
  457. * @throws Exception
  458. */
  459. public function setFilterRequiredEmploymentTypes(array $filterRequiredEmploymentTypes): void
  460. {
  461. foreach ($filterRequiredEmploymentTypes as $filterRequiredEmploymentType) {
  462. if (!in_array($filterRequiredEmploymentType, array_values(WantedJob::POSSIBLE_EMPLOYMENT_TYPE_AVAILABLE_FOR_SELECTION_WITH_TRANSLATION_MAPPING))) {
  463. throw new Exception("Invalid value '{$filterRequiredEmploymentType}' in filterRequiredEmploymentTypes.");
  464. }
  465. }
  466. $this->filterRequiredEmploymentTypes = $filterRequiredEmploymentTypes;
  467. }
  468. /**
  469. * @Assert\Callback
  470. */
  471. public function validate(ExecutionContextInterface $context, $payload)
  472. {
  473. if (!in_array($this->filterZipcodeRadius, ZipcodeRadiusesValue::ALL)) {
  474. $context->buildViolation('')
  475. ->atPath('filterZipcodeRadius')
  476. ->addViolation();
  477. }
  478. }
  479. #[ReturnTypeWillChange]
  480. public function jsonSerialize()
  481. {
  482. $result = [];
  483. $result['filterSearchterm'] = $this->filterSearchterm;
  484. $result['filterZipcodeRadius'] = $this->filterZipcodeRadius;
  485. $result['filterZipcode'] = $this->filterZipcode;
  486. $result['filterRequiredExperience'] = $this->filterRequiredExperience;
  487. foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
  488. foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
  489. $attr = 'filterIsRequiredOn' . $weekday . $timeOfDay;
  490. $result[$attr] = $this->$attr;
  491. }
  492. }
  493. return $result;
  494. }
  495. /** @throws Exception */
  496. public static function createFromArray(array $data): self
  497. {
  498. $wantedJobsSearchParameters = new self();
  499. if (array_key_exists('filterSearchterm', $data)) {
  500. $wantedJobsSearchParameters->setFilterSearchterm($data['filterSearchterm']);
  501. }
  502. if (array_key_exists('filterZipcodeRadius', $data) && !is_null($data['filterZipcodeRadius'])) {
  503. $wantedJobsSearchParameters->setFilterZipcodeRadius($data['filterZipcodeRadius']);
  504. }
  505. if (array_key_exists('filterZipcode', $data)) {
  506. $wantedJobsSearchParameters->setFilterZipcode($data['filterZipcode']);
  507. }
  508. if (array_key_exists('filterRequiredExperience', $data)) {
  509. $wantedJobsSearchParameters->setFilterRequiredExperience($data['filterRequiredExperience']);
  510. }
  511. if (array_key_exists('filterRequiredCareerLevels', $data)) {
  512. $wantedJobsSearchParameters->setFilterRequiredCareerLevels($data['filterRequiredCareerLevels']);
  513. }
  514. if (array_key_exists('atLeastOneRequiredCareerLevelMustMatch', $data)) {
  515. $wantedJobsSearchParameters->setAtLeastOneRequiredCareerLevelMustMatch($data['atLeastOneRequiredCareerLevelMustMatch']);
  516. }
  517. if (array_key_exists('filterRequiredEmploymentTypes', $data)) {
  518. $wantedJobsSearchParameters->setFilterRequiredEmploymentTypes($data['filterRequiredEmploymentTypes']);
  519. }
  520. if (array_key_exists('atLeastOneRequiredEmploymentTypeMustMatch', $data)) {
  521. $wantedJobsSearchParameters->setAtLeastOneRequiredEmploymentTypeMustMatch($data['atLeastOneRequiredEmploymentTypeMustMatch']);
  522. }
  523. foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
  524. foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
  525. $key = 'filterIsRequiredOn' . $weekday . $timeOfDay;
  526. if (array_key_exists($key, $data)) {
  527. $methodName = 'setFilterIsRequiredOn' . $weekday . $timeOfDay;
  528. $wantedJobsSearchParameters->$methodName($data[$key]);
  529. }
  530. }
  531. }
  532. return $wantedJobsSearchParameters;
  533. }
  534. public function toQueryString(int $page = 1)
  535. {
  536. $queryString = '';
  537. $queryString .= 'wanted_jobs_search_parameters[filterSearchterm]=' . urlencode($this->filterSearchterm);
  538. $queryString .= '&wanted_jobs_search_parameters[filterZipcodeRadius]=' . urlencode($this->filterZipcodeRadius);
  539. $queryString .= '&wanted_jobs_search_parameters[filterZipcode]=' . urlencode($this->filterZipcode);
  540. $queryString .= '&wanted_jobs_search_parameters[filterRequiredExperience]=' . urlencode($this->filterRequiredExperience);
  541. foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
  542. foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
  543. $attr = 'filterIsRequiredOn' . $weekday . $timeOfDay;
  544. if ($this->$attr === true) {
  545. $queryString .= '&wanted_jobs_search_parameters[' . $attr . ']=1';
  546. }
  547. }
  548. }
  549. foreach ($this->filterRequiredCareerLevels as $filterRequiredCareerLevel) {
  550. $queryString .= '&wanted_jobs_search_parameters[filterRequiredCareerLevels][]=' . urlencode($filterRequiredCareerLevel);
  551. }
  552. foreach ($this->filterRequiredEmploymentTypes as $filterRequiredEmploymentType) {
  553. $queryString .= '&wanted_jobs_search_parameters[filterRequiredEmploymentTypes][]=' . urlencode($filterRequiredEmploymentType);
  554. }
  555. $queryString .= '&wanted_jobs_search_parameters[filterAlreadyContacted]=' . urlencode($this->filterAlreadyContacted);
  556. $queryString .= '&page=' . $page;
  557. return $queryString;
  558. }
  559. /**
  560. * Returns a parameter set that matches the given wanted job perfectly.
  561. *
  562. * @throws Exception
  563. */
  564. public static function fromWantedJob(WantedJob $wantedJob): self
  565. {
  566. $remainingEmploymentTypes = [];
  567. foreach ($wantedJob->getEmploymentTypes() as $employmentType) {
  568. if ($employmentType !== RecurrentJob::EMPLOYMENT_TYPE_UNDEFINED) {
  569. $remainingEmploymentTypes[] = $employmentType;
  570. }
  571. }
  572. $wantedJobsSearchParameters = new self();
  573. $wantedJobsSearchParameters->setFilterSearchterm($wantedJob->getOccupationalFieldSearchterm());
  574. $wantedJobsSearchParameters->setFilterZipcodeRadius(ZipcodeRadiusesValue::MINIMUM);
  575. $wantedJobsSearchParameters->setFilterZipcode($wantedJob->getZipcode());
  576. $wantedJobsSearchParameters->setFilterRequiredExperience($wantedJob->getRequiredExperience());
  577. $wantedJobsSearchParameters->setFilterRequiredCareerLevels($wantedJob->getCareerLevels());
  578. $wantedJobsSearchParameters->setFilterRequiredEmploymentTypes($remainingEmploymentTypes);
  579. foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
  580. foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
  581. $paramsMethodName = 'setFilterIsRequiredOn' . $weekday . $timeOfDay;
  582. $jobMethodName = 'isRequiredOn' . $weekday . $timeOfDay;
  583. $wantedJobsSearchParameters->$paramsMethodName($wantedJob->$jobMethodName());
  584. }
  585. }
  586. return $wantedJobsSearchParameters;
  587. }
  588. /** @throws Exception */
  589. public static function fromRecurrentJob(RecurrentJob $recurrentJob): self
  590. {
  591. if (is_null($recurrentJob->getZipcode())) {
  592. throw new ValueError("Recurrent Job '{$recurrentJob->getId()}' has no zipcode, but one is required to create a WantedJobsSearchParameters object.");
  593. }
  594. $remainingEmploymentTypes = [];
  595. foreach ($recurrentJob->getEmploymentTypes() as $employmentType) {
  596. if ($employmentType !== RecurrentJob::EMPLOYMENT_TYPE_UNDEFINED) {
  597. $remainingEmploymentTypes[] = $employmentType;
  598. }
  599. }
  600. $data = [
  601. 'filterSearchterm' => $recurrentJob->getOccupationalFieldSearchterm(),
  602. 'filterZipcode' => $recurrentJob->getZipcode(),
  603. 'filterZipcodeRadius' => ZipcodeRadiusesValue::DEFAULT,
  604. 'filterRequiredExperience' => $recurrentJob->getRequiredExperience(),
  605. 'filterRequiredCareerLevels' => $recurrentJob->getCareerLevels(),
  606. 'filterRequiredEmploymentTypes' => $remainingEmploymentTypes
  607. ];
  608. foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
  609. foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
  610. $attributeName = 'filterIsRequiredOn' . $weekday . $timeOfDay;
  611. $methodName = 'isRequiredOn' . $weekday . $timeOfDay;
  612. $data[$attributeName] = $recurrentJob->$methodName();
  613. }
  614. }
  615. return self::createFromArray($data);
  616. }
  617. public function asArray(): array
  618. {
  619. $arr = [
  620. 'filterSearchterm' => $this->getFilterSearchterm(),
  621. 'filterZipcode' => $this->getFilterZipcode(),
  622. 'filterZipcodeRadius' => $this->getFilterZipcodeRadius(),
  623. 'filterRequiredExperience' => $this->getFilterRequiredExperience(),
  624. 'filterAlreadyContacted' => $this->getFilterAlreadyContacted(),
  625. 'filterRequiredCareerLevels' => $this->getFilterRequiredCareerLevels(),
  626. 'filterRequiredEmploymentTypes' => $this->getFilterRequiredEmploymentTypes(),
  627. ];
  628. foreach (PossibleAvailabilitiesValue::WEEKDAYS as $weekday) {
  629. foreach (PossibleAvailabilitiesValue::TIMES_OF_DAY as $timeOfDay) {
  630. $key = 'filterIsRequiredOn' . $weekday . $timeOfDay;
  631. $methodName = 'getFilterIsRequiredOn' . $weekday . $timeOfDay;
  632. if ($this->$methodName() == true) {
  633. $arr[$key] = $this->$methodName();
  634. }
  635. }
  636. }
  637. if (!is_null($this->getAtLeastOneRequiredCareerLevelMustMatch())) {
  638. $arr['atLeastOneRequiredCareerLevelMustMatch'] = $this->getAtLeastOneRequiredCareerLevelMustMatch();
  639. }
  640. if (!is_null($this->getAtLeastOneRequiredEmploymentTypeMustMatch())) {
  641. $arr['atLeastOneRequiredEmploymentTypeMustMatch'] = $this->getAtLeastOneRequiredEmploymentTypeMustMatch();
  642. }
  643. return $arr;
  644. }
  645. }