<?php
namespace App\Entity\ContentDistribution;
use App\Entity\RecurrentJob;
use App\Service\RecurrentJobContentDistributionValueService;
use App\Utility\ReflectionHelper;
use DateTime;
use Doctrine\ORM\Mapping as ORM;
use Exception;
/**
* @ORM\Entity
*
* @ORM\Table(
* name="recurrent_job_content_distribution_values"
* )
*/
class RecurrentJobContentDistributionValue
{
public const NAME_FEED_PRICE_SUFFIX = 'XmlFeedPrice';
public const NAME_JOBRAPIDO_XML_FEED_PRICE = 'jobrapidoXmlFeedPrice';
public const NAME_TALENTCOM_XML_FEED_PRICE = 'talentcomXmlFeedPrice';
public const NAME_JOBLIFT_XML_FEED_PRICE = 'jobliftXmlFeedPrice';
public const NAME_KIMETA_XML_FEED_PRICE = 'kimetaXmlFeedPrice';
public const NAME_STELLENONLINE_XML_FEED_PRICE = 'stellenonlineXmlFeedPrice';
public const NAME_MEINESTADT_XML_FEED_PRICE = 'meinestadtXmlFeedPrice';
public const NAME_JOBIJOBA_XML_FEED_PRICE = 'jobijobaXmlFeedPrice';
public const NAME_WHATJOBS_XML_FEED_PRICE = 'whatjobsXmlFeedPrice';
public const NAME_XML_FEED_CATEGORY = 'xmlFeedCategory';
public const NAME_EBAY_XML_FEED_CATEGORY = 'ebayXmlFeedCategory';
public const NAME_INDEED_LAST_PUT_ONLINE_DATE_TIME = 'indeedLastPutOnlineDateTime';
public const NAME_ON_INDEED_PRIORITY_LIST = 'onIndeedPriorityList';
public const NAME_JOOBLE_XML_FEED_PRICE = 'joobleXmlFeedPrice';
public const NAME_STEPSTONE_XML_FEED_PRICE = 'stepstoneXmlFeedPrice';
public const NAME_PERSOMATCH_XML_FEED_PRICE = 'persomatchXmlFeedPrice';
public const NAME_BASE_SALARY = 'baseSalary';
public const NAME_INDEED_PRIORITY_LIST_REMOVAL_DATE = 'indeedPriorityListRemovalDate';
public const NAME_CPC_PREFIX = 'cpc';
public const XML_FEED_CATEGORY_A = 'a';
public const XML_FEED_CATEGORY_B = 'b';
public const XML_FEED_CATEGORY_C = 'c';
public const XML_FEED_CATEGORY_D = 'd';
public const XML_FEED_CATEGORY_E = 'e';
public const XML_FEED_CATEGORY_F = 'f';
public const XML_FEED_CATEGORY_G = 'g';
public const XML_FEED_CATEGORY_H = 'h';
public const XML_FEED_CATEGORY_I = 'i';
public const XML_FEED_CATEGORY_J = 'j';
public const XML_FEED_CATEGORY_K = 'k';
public const XML_FEED_CATEGORY_L = 'l';
public const XML_FEED_CATEGORY_M = 'm';
public const XML_FEED_CATEGORY_N = 'n';
public const XML_FEED_CATEGORIES = [
self::XML_FEED_CATEGORY_A,
self::XML_FEED_CATEGORY_B,
self::XML_FEED_CATEGORY_C,
self::XML_FEED_CATEGORY_D,
self::XML_FEED_CATEGORY_E,
self::XML_FEED_CATEGORY_F,
self::XML_FEED_CATEGORY_G,
self::XML_FEED_CATEGORY_H,
self::XML_FEED_CATEGORY_I,
self::XML_FEED_CATEGORY_J,
self::XML_FEED_CATEGORY_K,
self::XML_FEED_CATEGORY_L,
self::XML_FEED_CATEGORY_M,
self::XML_FEED_CATEGORY_N
];
public const XML_BASE_FEED_CATEGORIES = [
self::XML_FEED_CATEGORY_A,
self::XML_FEED_CATEGORY_B,
self::XML_FEED_CATEGORY_C
];
public const XML_FEED_CATEGORIES_AND_DEFAULT_PRICE_LEVELS = [
self::XML_FEED_CATEGORY_A => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_ZERO,
self::XML_FEED_CATEGORY_B => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_LOW,
self::XML_FEED_CATEGORY_C => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_HIGH,
self::XML_FEED_CATEGORY_D => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_XING,
self::XML_FEED_CATEGORY_E => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_DEUTSCHE_BAHN_AG,
self::XML_FEED_CATEGORY_F => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_WISAG_CONCLUDIS_API,
self::XML_FEED_CATEGORY_G => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_MEINESTADT,
self::XML_FEED_CATEGORY_H => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_DPDHL,
self::XML_FEED_CATEGORY_I => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_AREAS,
self::XML_FEED_CATEGORY_J => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_CELLIT,
self::XML_FEED_CATEGORY_K => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_KAUFLAND_XML,
self::XML_FEED_CATEGORY_L => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_KAUFLAND_AUSHILFE,
self::XML_FEED_CATEGORY_M => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_WISAG,
self::XML_FEED_CATEGORY_N => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_ROSSMANN
];
public const MAXIMUM_PRICE_FOR_EXTERNAL_FEEDS = 3.00;
public const NAME_IN_FEED_JOBRAPIDO = 'inFeedJobrapido';
public const NAME_IN_FEED_JOBLIFT = 'inFeedJoblift';
public const NAME_IN_FEED_TALENTCOM = 'inFeedTalentcom';
public const NAME_IN_FEED_KIMETA = 'inFeedKimeta';
public const NAME_IN_FEED_EBAY = 'ebayInFeedValue';
public const NAME_IN_FEED_INDEED = 'indeedInFeedValue';
public const NAME_IN_FEED_STELLENONLINE = 'stellenonlineInFeedValue';
public const NAME_IN_FEED_MEINESTADT = 'meinestadtInFeedValue';
public const NAME_IN_FEED_JOBIJOBA = 'jobijobaInFeedValue';
public const NAME_IN_FEED_WHATJOBS = 'whatjobsInFeedValue';
public const NAME_IN_FEED_JOOBLE = 'joobleInFeedValue';
public const NAME_IN_FEED_STEPSTONE = 'stepstoneInFeedValue';
public const NAME_IN_FEED_PERSOMATCH = 'persomatchInFeedValue';
public const NAME_IN_FEED_XING = 'xingInFeedValue';
public const TYPE_STRING = 0;
public const TYPE_FLOAT = 1;
public const TYPE_BOOL = 2;
public const TYPE_DATE_TIME = 3;
public const NAMES_TO_TYPES = [
self::NAME_XML_FEED_CATEGORY => self::TYPE_STRING,
self::NAME_JOBRAPIDO_XML_FEED_PRICE => self::TYPE_FLOAT,
self::NAME_TALENTCOM_XML_FEED_PRICE => self::TYPE_FLOAT,
self::NAME_JOBLIFT_XML_FEED_PRICE => self::TYPE_FLOAT,
self::NAME_KIMETA_XML_FEED_PRICE => self::TYPE_FLOAT,
self::NAME_STELLENONLINE_XML_FEED_PRICE => self::TYPE_FLOAT,
self::NAME_MEINESTADT_XML_FEED_PRICE => self::TYPE_FLOAT,
self::NAME_IN_FEED_JOBLIFT => self::TYPE_STRING,
self::NAME_IN_FEED_JOBRAPIDO => self::TYPE_STRING,
self::NAME_IN_FEED_TALENTCOM => self::TYPE_STRING,
self::NAME_IN_FEED_KIMETA => self::TYPE_STRING,
self::NAME_IN_FEED_STELLENONLINE => self::TYPE_STRING,
self::NAME_IN_FEED_EBAY => self::TYPE_BOOL,
self::NAME_EBAY_XML_FEED_CATEGORY => self::TYPE_STRING,
self::NAME_IN_FEED_INDEED => self::TYPE_STRING,
self::NAME_IN_FEED_MEINESTADT => self::TYPE_STRING,
self::NAME_IN_FEED_JOBIJOBA => self::TYPE_STRING,
self::NAME_JOBIJOBA_XML_FEED_PRICE => self::TYPE_FLOAT,
self::NAME_IN_FEED_WHATJOBS => self::TYPE_STRING,
self::NAME_WHATJOBS_XML_FEED_PRICE => self::TYPE_FLOAT,
self::NAME_INDEED_LAST_PUT_ONLINE_DATE_TIME => self::TYPE_DATE_TIME,
self::NAME_ON_INDEED_PRIORITY_LIST => self::TYPE_BOOL,
self::NAME_IN_FEED_JOOBLE => self::TYPE_STRING,
self::NAME_JOOBLE_XML_FEED_PRICE => self::TYPE_FLOAT,
self::NAME_STEPSTONE_XML_FEED_PRICE => self::TYPE_FLOAT,
self::NAME_PERSOMATCH_XML_FEED_PRICE => self::TYPE_FLOAT,
self::NAME_BASE_SALARY => self::TYPE_FLOAT,
self::NAME_INDEED_PRIORITY_LIST_REMOVAL_DATE => self::TYPE_DATE_TIME,
self::NAME_IN_FEED_STEPSTONE => self::TYPE_STRING,
self::NAME_IN_FEED_PERSOMATCH => self::TYPE_STRING,
self::NAME_IN_FEED_XING => self::TYPE_STRING,
];
public const CATEGORY_A_TERMS = [
'kellner',
'service',
'thekenkraft',
'abräum-helfer',
'barkeeper',
'sommelier',
'barista',
'koch',
'küchenh',
'spül',
'garderobe',
'barkeeper',
'patissier',
'chef de partie',
'chef de rang',
'sous chef',
'küchenchef',
'restaurantleiter',
'storemanager',
'housekeeping',
'restaurantfach',
'commis de cuisine',
'hotelzimmermädchen',
'roomboy',
'mitarbeiter gastronomie',
'pizzabäcker',
'bar-chef',
'frühstücksbetreuung',
'imbissverkäufer'
];
/** @throws Exception */
public static function createWithStringValue(RecurrentJob $recurrentJob, string $name, string $stringValue): self
{
if (!ReflectionHelper::hasConstWithValue(self::class, 'NAME_', $name)) {
throw new Exception("Not a name: '{$name}'.");
}
if (self::NAMES_TO_TYPES[$name] !== self::TYPE_STRING) {
throw new Exception("Value type for name {$name} cannot be 'string'.");
}
$distributionValue = new self();
$distributionValue->recurrentJob = $recurrentJob;
$distributionValue->name = $name;
$distributionValue->stringValue = $stringValue;
return $distributionValue;
}
/** @throws Exception */
public static function createWithFloatValue(RecurrentJob $recurrentJob, string $name, float $floatValue): self
{
if (!ReflectionHelper::hasConstWithValue(self::class, 'NAME_', $name)) {
throw new Exception("Not a name: '{$name}'.");
}
if (self::NAMES_TO_TYPES[$name] !== self::TYPE_FLOAT) {
throw new Exception("Value type for name {$name} cannot be 'float'.");
}
$distributionValue = new self();
$distributionValue->recurrentJob = $recurrentJob;
$distributionValue->name = $name;
$distributionValue->floatValue = $floatValue;
return $distributionValue;
}
/** @throws Exception */
public static function createWithBoolValue(RecurrentJob $recurrentJob, string $name, float $boolValue): self
{
if (!ReflectionHelper::hasConstWithValue(self::class, 'NAME_', $name)) {
throw new Exception("Not a name: '{$name}'.");
}
if (self::NAMES_TO_TYPES[$name] !== self::TYPE_BOOL) {
throw new Exception("Value type for name {$name} cannot be 'float'.");
}
$distributionValue = new self();
$distributionValue->recurrentJob = $recurrentJob;
$distributionValue->name = $name;
$distributionValue->boolValue = $boolValue;
return $distributionValue;
}
/** @throws Exception */
public static function createWithDatetimeValue(RecurrentJob $recurrentJob, string $name, DateTime $dateTimeValue): self
{
if (!ReflectionHelper::hasConstWithValue(self::class, 'NAME_', $name)) {
throw new Exception("Not a name: '{$name}'.");
}
if (self::NAMES_TO_TYPES[$name] !== self::TYPE_DATE_TIME) {
throw new Exception("Value type for name {$name} cannot be 'datetime'.");
}
$distributionValue = new self();
$distributionValue->recurrentJob = $recurrentJob;
$distributionValue->name = $name;
$distributionValue->dateTimeValue = $dateTimeValue;
return $distributionValue;
}
public static function isValidName(string $name): bool
{
return array_key_exists($name, self::NAMES_TO_TYPES);
}
/**
* @ORM\Id
*
* @ORM\Column(type="string", nullable=false)
*/
private string $name;
public function getName(): string
{
return $this->name;
}
/**
* @ORM\Column(type="string", name="string_value", nullable=true, length=4096)
*/
private ?string $stringValue;
public function getStringValue(): ?string
{
return $this->stringValue;
}
/** @throws Exception */
public function setStringValue(?string $stringValue): void
{
if (self::NAMES_TO_TYPES[$this->name] !== self::TYPE_STRING) {
throw new Exception("Value type for name {$this->name} cannot be 'string'.");
}
$this->stringValue = $stringValue;
}
/**
* @ORM\Column(type="float", name="float_value", nullable=true)
*/
private ?float $floatValue;
public function getFloatValue(): ?float
{
return $this->floatValue;
}
/** @throws Exception */
public function setFloatValue(?float $floatValue): void
{
if (self::NAMES_TO_TYPES[$this->name] !== self::TYPE_FLOAT) {
throw new Exception("Value type for name {$this->name} cannot be 'float'.");
}
$this->floatValue = $floatValue;
}
/**
* @ORM\Column(name="date_time_value", type="datetime", nullable=true)
*/
private ?DateTime $dateTimeValue;
public function getDateTimeValue(): ?DateTime
{
return $this->dateTimeValue;
}
/** @throws Exception */
public function setDateTimeValue(?DateTime $dateTimeValue): void
{
if (self::NAMES_TO_TYPES[$this->name] !== self::TYPE_DATE_TIME) {
throw new Exception("Value type for name {$this->name} cannot be 'datetime'.");
}
$this->dateTimeValue = $dateTimeValue;
}
/**
* @ORM\Column(type="boolean", name="bool_value", nullable=true)
*/
private ?bool $boolValue;
public function getBoolValue(): ?bool
{
return $this->boolValue;
}
/** @throws Exception */
public function setBoolValue(?bool $boolValue): void
{
if (self::NAMES_TO_TYPES[$this->name] !== self::TYPE_BOOL) {
throw new Exception("Value type for name {$this->name} cannot be 'bool'.");
}
$this->boolValue = $boolValue;
}
/**
* @ORM\ManyToOne(targetEntity="App\Entity\RecurrentJob", inversedBy="contentDistributionValues", cascade={"persist"})
*
* @ORM\Id
*
* @ORM\JoinColumn(name="recurrent_jobs_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
*/
private RecurrentJob $recurrentJob;
public function getRecurrentJob(): RecurrentJob
{
return $this->recurrentJob;
}
}