src/App/Entity/ContentDistribution/RecurrentJobContentDistributionValue.php line 19

Open in your IDE?
  1. <?php
  2. namespace App\Entity\ContentDistribution;
  3. use App\Entity\RecurrentJob;
  4. use App\Service\RecurrentJobContentDistributionValueService;
  5. use App\Utility\ReflectionHelper;
  6. use DateTime;
  7. use Doctrine\ORM\Mapping as ORM;
  8. use Exception;
  9. /**
  10. * @ORM\Entity
  11. *
  12. * @ORM\Table(
  13. * name="recurrent_job_content_distribution_values"
  14. * )
  15. */
  16. class RecurrentJobContentDistributionValue
  17. {
  18. public const NAME_FEED_PRICE_SUFFIX = 'XmlFeedPrice';
  19. public const NAME_JOBRAPIDO_XML_FEED_PRICE = 'jobrapidoXmlFeedPrice';
  20. public const NAME_TALENTCOM_XML_FEED_PRICE = 'talentcomXmlFeedPrice';
  21. public const NAME_JOBLIFT_XML_FEED_PRICE = 'jobliftXmlFeedPrice';
  22. public const NAME_KIMETA_XML_FEED_PRICE = 'kimetaXmlFeedPrice';
  23. public const NAME_STELLENONLINE_XML_FEED_PRICE = 'stellenonlineXmlFeedPrice';
  24. public const NAME_MEINESTADT_XML_FEED_PRICE = 'meinestadtXmlFeedPrice';
  25. public const NAME_JOBIJOBA_XML_FEED_PRICE = 'jobijobaXmlFeedPrice';
  26. public const NAME_WHATJOBS_XML_FEED_PRICE = 'whatjobsXmlFeedPrice';
  27. public const NAME_XML_FEED_CATEGORY = 'xmlFeedCategory';
  28. public const NAME_EBAY_XML_FEED_CATEGORY = 'ebayXmlFeedCategory';
  29. public const NAME_INDEED_LAST_PUT_ONLINE_DATE_TIME = 'indeedLastPutOnlineDateTime';
  30. public const NAME_ON_INDEED_PRIORITY_LIST = 'onIndeedPriorityList';
  31. public const NAME_JOOBLE_XML_FEED_PRICE = 'joobleXmlFeedPrice';
  32. public const NAME_STEPSTONE_XML_FEED_PRICE = 'stepstoneXmlFeedPrice';
  33. public const NAME_PERSOMATCH_XML_FEED_PRICE = 'persomatchXmlFeedPrice';
  34. public const NAME_BASE_SALARY = 'baseSalary';
  35. public const NAME_INDEED_PRIORITY_LIST_REMOVAL_DATE = 'indeedPriorityListRemovalDate';
  36. public const NAME_CPC_PREFIX = 'cpc';
  37. public const XML_FEED_CATEGORY_A = 'a';
  38. public const XML_FEED_CATEGORY_B = 'b';
  39. public const XML_FEED_CATEGORY_C = 'c';
  40. public const XML_FEED_CATEGORY_D = 'd';
  41. public const XML_FEED_CATEGORY_E = 'e';
  42. public const XML_FEED_CATEGORY_F = 'f';
  43. public const XML_FEED_CATEGORY_G = 'g';
  44. public const XML_FEED_CATEGORY_H = 'h';
  45. public const XML_FEED_CATEGORY_I = 'i';
  46. public const XML_FEED_CATEGORY_J = 'j';
  47. public const XML_FEED_CATEGORY_K = 'k';
  48. public const XML_FEED_CATEGORY_L = 'l';
  49. public const XML_FEED_CATEGORY_M = 'm';
  50. public const XML_FEED_CATEGORY_N = 'n';
  51. public const XML_FEED_CATEGORIES = [
  52. self::XML_FEED_CATEGORY_A,
  53. self::XML_FEED_CATEGORY_B,
  54. self::XML_FEED_CATEGORY_C,
  55. self::XML_FEED_CATEGORY_D,
  56. self::XML_FEED_CATEGORY_E,
  57. self::XML_FEED_CATEGORY_F,
  58. self::XML_FEED_CATEGORY_G,
  59. self::XML_FEED_CATEGORY_H,
  60. self::XML_FEED_CATEGORY_I,
  61. self::XML_FEED_CATEGORY_J,
  62. self::XML_FEED_CATEGORY_K,
  63. self::XML_FEED_CATEGORY_L,
  64. self::XML_FEED_CATEGORY_M,
  65. self::XML_FEED_CATEGORY_N
  66. ];
  67. public const XML_BASE_FEED_CATEGORIES = [
  68. self::XML_FEED_CATEGORY_A,
  69. self::XML_FEED_CATEGORY_B,
  70. self::XML_FEED_CATEGORY_C
  71. ];
  72. public const XML_FEED_CATEGORIES_AND_DEFAULT_PRICE_LEVELS = [
  73. self::XML_FEED_CATEGORY_A => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_ZERO,
  74. self::XML_FEED_CATEGORY_B => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_LOW,
  75. self::XML_FEED_CATEGORY_C => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_HIGH,
  76. self::XML_FEED_CATEGORY_D => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_XING,
  77. self::XML_FEED_CATEGORY_E => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_DEUTSCHE_BAHN_AG,
  78. self::XML_FEED_CATEGORY_F => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_WISAG_CONCLUDIS_API,
  79. self::XML_FEED_CATEGORY_G => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_MEINESTADT,
  80. self::XML_FEED_CATEGORY_H => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_DPDHL,
  81. self::XML_FEED_CATEGORY_I => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_AREAS,
  82. self::XML_FEED_CATEGORY_J => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_CELLIT,
  83. self::XML_FEED_CATEGORY_K => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_KAUFLAND_XML,
  84. self::XML_FEED_CATEGORY_L => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_KAUFLAND_AUSHILFE,
  85. self::XML_FEED_CATEGORY_M => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_WISAG,
  86. self::XML_FEED_CATEGORY_N => RecurrentJobContentDistributionValueService::PRICE_CATEGORY_ROSSMANN
  87. ];
  88. public const MAXIMUM_PRICE_FOR_EXTERNAL_FEEDS = 3.00;
  89. public const NAME_IN_FEED_JOBRAPIDO = 'inFeedJobrapido';
  90. public const NAME_IN_FEED_JOBLIFT = 'inFeedJoblift';
  91. public const NAME_IN_FEED_TALENTCOM = 'inFeedTalentcom';
  92. public const NAME_IN_FEED_KIMETA = 'inFeedKimeta';
  93. public const NAME_IN_FEED_EBAY = 'ebayInFeedValue';
  94. public const NAME_IN_FEED_INDEED = 'indeedInFeedValue';
  95. public const NAME_IN_FEED_STELLENONLINE = 'stellenonlineInFeedValue';
  96. public const NAME_IN_FEED_MEINESTADT = 'meinestadtInFeedValue';
  97. public const NAME_IN_FEED_JOBIJOBA = 'jobijobaInFeedValue';
  98. public const NAME_IN_FEED_WHATJOBS = 'whatjobsInFeedValue';
  99. public const NAME_IN_FEED_JOOBLE = 'joobleInFeedValue';
  100. public const NAME_IN_FEED_STEPSTONE = 'stepstoneInFeedValue';
  101. public const NAME_IN_FEED_PERSOMATCH = 'persomatchInFeedValue';
  102. public const NAME_IN_FEED_XING = 'xingInFeedValue';
  103. public const TYPE_STRING = 0;
  104. public const TYPE_FLOAT = 1;
  105. public const TYPE_BOOL = 2;
  106. public const TYPE_DATE_TIME = 3;
  107. public const NAMES_TO_TYPES = [
  108. self::NAME_XML_FEED_CATEGORY => self::TYPE_STRING,
  109. self::NAME_JOBRAPIDO_XML_FEED_PRICE => self::TYPE_FLOAT,
  110. self::NAME_TALENTCOM_XML_FEED_PRICE => self::TYPE_FLOAT,
  111. self::NAME_JOBLIFT_XML_FEED_PRICE => self::TYPE_FLOAT,
  112. self::NAME_KIMETA_XML_FEED_PRICE => self::TYPE_FLOAT,
  113. self::NAME_STELLENONLINE_XML_FEED_PRICE => self::TYPE_FLOAT,
  114. self::NAME_MEINESTADT_XML_FEED_PRICE => self::TYPE_FLOAT,
  115. self::NAME_IN_FEED_JOBLIFT => self::TYPE_STRING,
  116. self::NAME_IN_FEED_JOBRAPIDO => self::TYPE_STRING,
  117. self::NAME_IN_FEED_TALENTCOM => self::TYPE_STRING,
  118. self::NAME_IN_FEED_KIMETA => self::TYPE_STRING,
  119. self::NAME_IN_FEED_STELLENONLINE => self::TYPE_STRING,
  120. self::NAME_IN_FEED_EBAY => self::TYPE_BOOL,
  121. self::NAME_EBAY_XML_FEED_CATEGORY => self::TYPE_STRING,
  122. self::NAME_IN_FEED_INDEED => self::TYPE_STRING,
  123. self::NAME_IN_FEED_MEINESTADT => self::TYPE_STRING,
  124. self::NAME_IN_FEED_JOBIJOBA => self::TYPE_STRING,
  125. self::NAME_JOBIJOBA_XML_FEED_PRICE => self::TYPE_FLOAT,
  126. self::NAME_IN_FEED_WHATJOBS => self::TYPE_STRING,
  127. self::NAME_WHATJOBS_XML_FEED_PRICE => self::TYPE_FLOAT,
  128. self::NAME_INDEED_LAST_PUT_ONLINE_DATE_TIME => self::TYPE_DATE_TIME,
  129. self::NAME_ON_INDEED_PRIORITY_LIST => self::TYPE_BOOL,
  130. self::NAME_IN_FEED_JOOBLE => self::TYPE_STRING,
  131. self::NAME_JOOBLE_XML_FEED_PRICE => self::TYPE_FLOAT,
  132. self::NAME_STEPSTONE_XML_FEED_PRICE => self::TYPE_FLOAT,
  133. self::NAME_PERSOMATCH_XML_FEED_PRICE => self::TYPE_FLOAT,
  134. self::NAME_BASE_SALARY => self::TYPE_FLOAT,
  135. self::NAME_INDEED_PRIORITY_LIST_REMOVAL_DATE => self::TYPE_DATE_TIME,
  136. self::NAME_IN_FEED_STEPSTONE => self::TYPE_STRING,
  137. self::NAME_IN_FEED_PERSOMATCH => self::TYPE_STRING,
  138. self::NAME_IN_FEED_XING => self::TYPE_STRING,
  139. ];
  140. public const CATEGORY_A_TERMS = [
  141. 'kellner',
  142. 'service',
  143. 'thekenkraft',
  144. 'abräum-helfer',
  145. 'barkeeper',
  146. 'sommelier',
  147. 'barista',
  148. 'koch',
  149. 'küchenh',
  150. 'spül',
  151. 'garderobe',
  152. 'barkeeper',
  153. 'patissier',
  154. 'chef de partie',
  155. 'chef de rang',
  156. 'sous chef',
  157. 'küchenchef',
  158. 'restaurantleiter',
  159. 'storemanager',
  160. 'housekeeping',
  161. 'restaurantfach',
  162. 'commis de cuisine',
  163. 'hotelzimmermädchen',
  164. 'roomboy',
  165. 'mitarbeiter gastronomie',
  166. 'pizzabäcker',
  167. 'bar-chef',
  168. 'frühstücksbetreuung',
  169. 'imbissverkäufer'
  170. ];
  171. /** @throws Exception */
  172. public static function createWithStringValue(RecurrentJob $recurrentJob, string $name, string $stringValue): self
  173. {
  174. if (!ReflectionHelper::hasConstWithValue(self::class, 'NAME_', $name)) {
  175. throw new Exception("Not a name: '{$name}'.");
  176. }
  177. if (self::NAMES_TO_TYPES[$name] !== self::TYPE_STRING) {
  178. throw new Exception("Value type for name {$name} cannot be 'string'.");
  179. }
  180. $distributionValue = new self();
  181. $distributionValue->recurrentJob = $recurrentJob;
  182. $distributionValue->name = $name;
  183. $distributionValue->stringValue = $stringValue;
  184. return $distributionValue;
  185. }
  186. /** @throws Exception */
  187. public static function createWithFloatValue(RecurrentJob $recurrentJob, string $name, float $floatValue): self
  188. {
  189. if (!ReflectionHelper::hasConstWithValue(self::class, 'NAME_', $name)) {
  190. throw new Exception("Not a name: '{$name}'.");
  191. }
  192. if (self::NAMES_TO_TYPES[$name] !== self::TYPE_FLOAT) {
  193. throw new Exception("Value type for name {$name} cannot be 'float'.");
  194. }
  195. $distributionValue = new self();
  196. $distributionValue->recurrentJob = $recurrentJob;
  197. $distributionValue->name = $name;
  198. $distributionValue->floatValue = $floatValue;
  199. return $distributionValue;
  200. }
  201. /** @throws Exception */
  202. public static function createWithBoolValue(RecurrentJob $recurrentJob, string $name, float $boolValue): self
  203. {
  204. if (!ReflectionHelper::hasConstWithValue(self::class, 'NAME_', $name)) {
  205. throw new Exception("Not a name: '{$name}'.");
  206. }
  207. if (self::NAMES_TO_TYPES[$name] !== self::TYPE_BOOL) {
  208. throw new Exception("Value type for name {$name} cannot be 'float'.");
  209. }
  210. $distributionValue = new self();
  211. $distributionValue->recurrentJob = $recurrentJob;
  212. $distributionValue->name = $name;
  213. $distributionValue->boolValue = $boolValue;
  214. return $distributionValue;
  215. }
  216. /** @throws Exception */
  217. public static function createWithDatetimeValue(RecurrentJob $recurrentJob, string $name, DateTime $dateTimeValue): self
  218. {
  219. if (!ReflectionHelper::hasConstWithValue(self::class, 'NAME_', $name)) {
  220. throw new Exception("Not a name: '{$name}'.");
  221. }
  222. if (self::NAMES_TO_TYPES[$name] !== self::TYPE_DATE_TIME) {
  223. throw new Exception("Value type for name {$name} cannot be 'datetime'.");
  224. }
  225. $distributionValue = new self();
  226. $distributionValue->recurrentJob = $recurrentJob;
  227. $distributionValue->name = $name;
  228. $distributionValue->dateTimeValue = $dateTimeValue;
  229. return $distributionValue;
  230. }
  231. public static function isValidName(string $name): bool
  232. {
  233. return array_key_exists($name, self::NAMES_TO_TYPES);
  234. }
  235. /**
  236. * @ORM\Id
  237. *
  238. * @ORM\Column(type="string", nullable=false)
  239. */
  240. private string $name;
  241. public function getName(): string
  242. {
  243. return $this->name;
  244. }
  245. /**
  246. * @ORM\Column(type="string", name="string_value", nullable=true, length=4096)
  247. */
  248. private ?string $stringValue;
  249. public function getStringValue(): ?string
  250. {
  251. return $this->stringValue;
  252. }
  253. /** @throws Exception */
  254. public function setStringValue(?string $stringValue): void
  255. {
  256. if (self::NAMES_TO_TYPES[$this->name] !== self::TYPE_STRING) {
  257. throw new Exception("Value type for name {$this->name} cannot be 'string'.");
  258. }
  259. $this->stringValue = $stringValue;
  260. }
  261. /**
  262. * @ORM\Column(type="float", name="float_value", nullable=true)
  263. */
  264. private ?float $floatValue;
  265. public function getFloatValue(): ?float
  266. {
  267. return $this->floatValue;
  268. }
  269. /** @throws Exception */
  270. public function setFloatValue(?float $floatValue): void
  271. {
  272. if (self::NAMES_TO_TYPES[$this->name] !== self::TYPE_FLOAT) {
  273. throw new Exception("Value type for name {$this->name} cannot be 'float'.");
  274. }
  275. $this->floatValue = $floatValue;
  276. }
  277. /**
  278. * @ORM\Column(name="date_time_value", type="datetime", nullable=true)
  279. */
  280. private ?DateTime $dateTimeValue;
  281. public function getDateTimeValue(): ?DateTime
  282. {
  283. return $this->dateTimeValue;
  284. }
  285. /** @throws Exception */
  286. public function setDateTimeValue(?DateTime $dateTimeValue): void
  287. {
  288. if (self::NAMES_TO_TYPES[$this->name] !== self::TYPE_DATE_TIME) {
  289. throw new Exception("Value type for name {$this->name} cannot be 'datetime'.");
  290. }
  291. $this->dateTimeValue = $dateTimeValue;
  292. }
  293. /**
  294. * @ORM\Column(type="boolean", name="bool_value", nullable=true)
  295. */
  296. private ?bool $boolValue;
  297. public function getBoolValue(): ?bool
  298. {
  299. return $this->boolValue;
  300. }
  301. /** @throws Exception */
  302. public function setBoolValue(?bool $boolValue): void
  303. {
  304. if (self::NAMES_TO_TYPES[$this->name] !== self::TYPE_BOOL) {
  305. throw new Exception("Value type for name {$this->name} cannot be 'bool'.");
  306. }
  307. $this->boolValue = $boolValue;
  308. }
  309. /**
  310. * @ORM\ManyToOne(targetEntity="App\Entity\RecurrentJob", inversedBy="contentDistributionValues", cascade={"persist"})
  311. *
  312. * @ORM\Id
  313. *
  314. * @ORM\JoinColumn(name="recurrent_jobs_id", referencedColumnName="id", nullable=false, onDelete="CASCADE")
  315. */
  316. private RecurrentJob $recurrentJob;
  317. public function getRecurrentJob(): RecurrentJob
  318. {
  319. return $this->recurrentJob;
  320. }
  321. }