src/App/Entity/PlatformEvent.php line 32

Open in your IDE?
  1. <?php
  2. namespace App\Entity;
  3. use App\Utility\DateTimeUtility;
  4. use App\Utility\ReflectionHelper;
  5. use DateTime;
  6. use Doctrine\ORM\Mapping as ORM;
  7. use Exception;
  8. use ValueError;
  9. /**
  10. * Platform Event: track what happens on the platform in order to decide how platform behavior should change.
  11. *
  12. * While Business-, Application-, and Webrequest-Events are tracked for statistical use in the Data Warehouse, Platform
  13. * Events are collected to keep track of what happens on the platform that has an impact on future software behavior.
  14. * Example: if a warning mail about something is sent, it should not be sent again the next day. In comparison to UsageEvents, it is
  15. * not connected to a user and does not decide user-individual software behavior.
  16. *
  17. * @ORM\Entity()
  18. *
  19. * @ORM\Table(
  20. * name="platform_events",
  21. * indexes={
  22. *
  23. * @ORM\Index(name="event_type_additional_data_idx", columns={"event_type", "additional_data"}),
  24. * @ORM\Index(name="event_type_occured_at_idx", columns={"event_type", "occured_at"}),
  25. * @ORM\Index(name="event_type_additional_data_occurred_at_idx", columns={"event_type", "additional_data", "occured_at"}),
  26. * }
  27. * )
  28. */
  29. class PlatformEvent
  30. {
  31. public const EVENT_TYPE_QUOTA_WARNING_MAIL_WAS_SENT = 0;
  32. public const EVENT_TYPE_GOOGLE_INDEXING_WAS_REQUESTED_FOR_RECURRENT_JOB = 1;
  33. public const EVENT_TYPE_GOOGLE_INDEX_DELETE_WAS_REQUESTED_FOR_RECURRENT_JOB = 2;
  34. public const EVENT_TYPE_RECURRENT_JOB_WAS_CHECKED_AT_JOBLIFT = 3;
  35. public const EVENT_TYPE_RECURRENT_JOB_WAS_CHECKED_AT_TALENTCOM = 4;
  36. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_A_FEED = 5;
  37. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBRAPIDO_A_FEED = 6;
  38. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_KIMETA_A_FEED = 7;
  39. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_TALENTCOM_A_FEED = 8;
  40. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_B_FEED = 9;
  41. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBRAPIDO_B_FEED = 10;
  42. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_KIMETA_B_FEED = 11;
  43. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_TALENTCOM_B_FEED = 12;
  44. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_C_FEED = 13;
  45. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBRAPIDO_C_FEED = 14;
  46. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_KIMETA_C_FEED = 15;
  47. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_TALENTCOM_C_FEED = 16;
  48. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_INDEED_FEED = 17;
  49. public const EVENT_TYPE_USER_CLICKED_ON_RECURRENT_JOB_ON_INDEED_SITE = 18;
  50. // LEGACY - see event type 38
  51. public const EVENT_TYPE_FORWARDED_TO_XING_RECURRENT_JOB = 19;
  52. // LEGACY - see event type 39
  53. public const EVENT_TYPE_INFORMED_PM_ABOUT_XING_EVENT = 20;
  54. public const EVENT_TYPE_RECURRENT_JOB_WAS_CHECKED_AT_STELLENONLINE = 21;
  55. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_A_FEED = 22;
  56. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_B_FEED = 23;
  57. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_C_FEED = 24;
  58. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBRAPIDO_D_FEED = 25;
  59. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_TALENTCOM_D_FEED = 26;
  60. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_D_FEED = 27;
  61. public const EVENT_TYPE_RECURRENT_JOB_WAS_ADDED_FOR_AGENTUR_FUER_ARBEIT = 28;
  62. public const EVENT_TYPE_RECURRENT_JOB_WAS_DELETED_FOR_AGENTUR_FUER_ARBEIT = 29;
  63. public const EVENT_TYPE_AGENTUR_FUER_ARBEIT_FILE_UPLOAD_NAME_CREATED = 30;
  64. public const EVENT_TYPE_AGENTUR_FUER_ARBEIT_RESPONSE_FILE_WAS_CHECKED = 31;
  65. /* Deprecated - we now use the RecurrentJobAfaCategorizationRequest entity for this */
  66. public const EVENT_TYPE_RECURRENT_JOB_WAS_ADDED_FOR_AGENTUR_FUER_ARBEIT_CATEGORIZATION = 32;
  67. public const EVENT_TYPE_RECURRENT_JOB_WAS_CATEGORIZED_FOR_AGENTUR_FUER_ARBEIT = 33;
  68. public const EVENT_TYPE_RECURRENT_JOB_WAS_PERMANENTLY_REMOVED_FOR_AGENTUR_FUER_ARBEIT = 34;
  69. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_E_FEED = 35;
  70. public const EVENT_TYPE_RECURRENT_JOB_NEEDED_TO_BE_SKIPPED_IN_EBAY_FEED = 36;
  71. public const EVENT_TYPE_RECURRENT_JOB_WAS_REMOVED_BY_AVAILABILITY_CHECKER = 37;
  72. public const EVENT_TYPE_FORWARDED_TO_CUSTOMER_WITH_CLICK_BASED_BILLING_RECURRENT_JOB = 38;
  73. public const EVENT_TYPE_INFORMED_PM_ABOUT_CUSTOMER_WITH_CLICK_BASED_BILLING_EVENT = 39;
  74. public const EVENT_TYPE_RECURRENT_JOB_WAS_DEACTIVATED_BECAUSE_OF_QUOTA = 40;
  75. public const EVENT_TYPE_RECURRENT_JOB_WAS_DEACTIVATED_BECAUSE_OF_MAX_CLICKS_REACHED = 41;
  76. public const EVENT_TYPE_RECURRENT_JOB_WAS_PUBLISHED = 42;
  77. public const EVENT_TYPE_INTEGRATED_EXTERNAL_PARTNER_CUSTOMER_PREMIUM_RADAR_WAS_CREATED_FOR_CUSTOMER = 43;
  78. public const EVENT_TYPE_NEW_JOB_ADDED_TO_EBAY_FEED = 44;
  79. public const EVENT_TYPE_EBAY_FEED_WARNING_MAIL_SENT = 45;
  80. public const EVENT_TYPE_INTEGRATED_EXTERNAL_PARTNER_CUSTOMER_PREMIUM_RADAR_WHATSAPP_MESSAGE_WAS_CREATED = 46;
  81. public const EVENT_TYPE_INTEGRATED_EXTERNAL_PARTNER_CUSTOMER_PREMIUM_RADAR_DIRECT_EMAIL_WAS_CREATED = 47;
  82. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_A_FEED = 48;
  83. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_B_FEED = 49;
  84. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_C_FEED = 50;
  85. public const EVENT_TYPE_MASS_MAILING_WHATSAPP_MAIL_SENT = 51;
  86. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_D_FEED = 52;
  87. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_E_FEED = 53;
  88. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_F_FEED = 54;
  89. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBIJOBA_A_FEED = 55;
  90. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBIJOBA_B_FEED = 56;
  91. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBIJOBA_C_FEED = 57;
  92. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBIJOBA_D_FEED = 58;
  93. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBIJOBA_E_FEED = 59;
  94. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBIJOBA_F_FEED = 60;
  95. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_WHATJOBS_A_FEED = 61;
  96. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_WHATJOBS_B_FEED = 62;
  97. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_WHATJOBS_C_FEED = 63;
  98. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_WHATJOBS_D_FEED = 64;
  99. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_WHATJOBS_E_FEED = 65;
  100. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_WHATJOBS_F_FEED = 66;
  101. public const EVENT_TYPE_MASS_MAILING_FOCUS_SIEGEL_MAIL_SENT = 67;
  102. public const EVENT_TYPE_DEACTIVATED_PREMIUM_RADAR_BECAUSE_OF_CLICK_BUDGET = 68;
  103. public const EVENT_TYPE_DEACTIVATED_PREMIUM_RADAR_BECAUSE_OF_FEED_MANAGEMENT = 69;
  104. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_TALENTCOM_E_FEED = 70;
  105. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_TALENTCOM_F_FEED = 71;
  106. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_TALENTCOM_G_FEED = 72;
  107. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_F_FEED = 73;
  108. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_G_FEED = 74;
  109. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_H_FEED = 75;
  110. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_I_FEED = 76;
  111. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_J_FEED = 77;
  112. public const EVENT_TYPE_LEAD_CONVERSION_RADAR_WHATSAPP_MESSAGE_WAS_CREATED = 78;
  113. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_K_FEED = 79;
  114. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOOBLE_A_FEED = 80;
  115. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOOBLE_B_FEED = 81;
  116. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOOBLE_C_FEED = 82;
  117. public const EVENT_TYPE_SENT_REQUEST_TO_API_TO_INFORM_ABOUT_EXTENDED_APPLICATION = 83;
  118. public const EVENT_TYPE_INFORMED_ACCOUNTING_ABOUT_NEW_BILLED_PARTY_EXTERNAL_PARTNER_GOHIRING = 84;
  119. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_L_FEED = 85;
  120. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOOBLE_D_FEED = 86;
  121. public const EVENT_TYPE_LEAD_CONVERSION_RADAR_WHATSAPP_MESSAGE_WAS_CREATED_FOR_USER_WITH_MEMBERSHIP = 87;
  122. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_G_FEED = 88;
  123. public const EVENT_TYPE_EXTERNAL_JOB_AVAILABILITY_CHECK_WAS_POSITIVE = 89;
  124. public const EVENT_TYPE_EXTERNAL_JOB_AVAILABILITY_CHECK_WAS_NEGATIVE = 90;
  125. public const EVENT_TYPE_POTENTIAL_CUSTOMER_BUSINESS_INFO_CRAWLER_CONTENT_PARSER_RESULT_STATUS_FORBIDDEN = 91;
  126. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_M_FEED = 92;
  127. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_JOBLIFT_M_FEED = 93;
  128. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STELLENONLINE_M_FEED = 94;
  129. public const EVENT_TYPE_INFORMING_GOHIRING_ABOUT_PUBLISHED_RECURRENT_JOB_FAILED = 95;
  130. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_MEINESTADT_N_FEED = 96;
  131. public const EVENT_TYPE_DPDHL_RECURRENT_JOB_HAS_BEEN_CREATED = 97;
  132. public const EVENT_TYPE_INFO_MAIL_ABOUT_REACHING_DPDHL_RECURRENT_JOBS_THRESHOLD_HAS_BEEN_SENT = 98;
  133. public const EVENT_TYPE_LOGGED_ABOUT_INFORMING_GOHIRING_ABOUT_PUBLISHED_RECURRENT_JOB_FAILED = 99;
  134. public const EVENT_TYPE_LIMIT_EXHAUSTED_WARNING_MAIL_WAS_SENT = 100;
  135. public const EVENT_TYPE_AI_RESPONSE_ERRONEOUS_MAIL_WAS_SENT = 101;
  136. public const EVENT_TYPE_INFORMED_ACCOUNTING_ABOUT_NEW_BILLED_PARTY_EXTERNAL_PARTNER_VONQ = 102;
  137. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STEPSTONE_B_FEED = 103;
  138. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STEPSTONE_A_FEED = 104;
  139. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_STEPSTONE_C_FEED = 105;
  140. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_PERSOMATCH_B_FEED = 103;
  141. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_PERSOMATCH_A_FEED = 104;
  142. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_PERSOMATCH_C_FEED = 105;
  143. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_XING_A_FEED = 106;
  144. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_XING_B_FEED = 107;
  145. public const EVENT_TYPE_FORWARDED_TO_RECURRENT_JOB_FROM_XING_C_FEED = 108;
  146. // unused Event Id 102
  147. public const EVENT_TYPE_ASK_USER_FOR_GOOGLE_RATINGS_WHATSAPP_MESSAGE_WAS_SENT = 103;
  148. /**
  149. * @throws Exception
  150. */
  151. public function __construct(
  152. int $eventType,
  153. ?string $additionalData,
  154. ?RecurrentJob $recurrentJob = null,
  155. ?string $sessionId = null,
  156. bool $consideredDuplicate = false,
  157. ) {
  158. if (!ReflectionHelper::hasConstWithValue(
  159. self::class,
  160. 'EVENT_TYPE_',
  161. $eventType
  162. )) {
  163. throw new ValueError("Unknown event type '$eventType'.");
  164. }
  165. $this->eventType = $eventType;
  166. $this->additionalData = $additionalData;
  167. $this->sessionId = $sessionId;
  168. $this->consideredDuplicate = $consideredDuplicate;
  169. $this->occuredAt = DateTimeUtility::createDateTimeUtc();
  170. if (!is_null($recurrentJob)) {
  171. $this->recurrentJobIdForDuplicationChecking = $recurrentJob->getId();
  172. }
  173. }
  174. /**
  175. * @ORM\GeneratedValue(strategy="CUSTOM")
  176. *
  177. * @ORM\CustomIdGenerator(class="App\Utility\DatabaseIdGenerator")
  178. *
  179. * @ORM\Column(name="id", type="guid")
  180. *
  181. * @ORM\Id
  182. */
  183. private string $id;
  184. public function getId(): string
  185. {
  186. return $this->id;
  187. }
  188. /**
  189. * @ORM\Column(name="event_type", type="smallint", nullable=false)
  190. */
  191. private int $eventType;
  192. public function getEventType(): int
  193. {
  194. return $this->eventType;
  195. }
  196. /**
  197. * @ORM\Column(name="occured_at", type="datetime", nullable=false)
  198. */
  199. private DateTime $occuredAt;
  200. public function setOccuredAt(DateTime $occuredAt): void
  201. {
  202. $this->occuredAt = $occuredAt;
  203. }
  204. public function getOccuredAt(): DateTime
  205. {
  206. return $this->occuredAt;
  207. }
  208. /**
  209. * @ORM\Column(name="additional_data", type="string", length=512, nullable=true)
  210. */
  211. private ?string $additionalData;
  212. /**
  213. * @throws Exception
  214. */
  215. public function setAdditionalData(?string $additionalData = null): void
  216. {
  217. if (!is_null($additionalData)) {
  218. $additionalData = mb_substr($additionalData, 0, 512);
  219. if (is_null(json_decode($additionalData))) {
  220. throw new Exception('additionalData must be valid JSON');
  221. }
  222. }
  223. $this->additionalData = $additionalData;
  224. }
  225. public function getAdditionalData(): ?string
  226. {
  227. return $this->additionalData;
  228. }
  229. /**
  230. * @ORM\Column(name="is_probably_bot_request", type="boolean", nullable=true)
  231. */
  232. private ?bool $isProbablyBotRequest = null;
  233. public function getIsProbablyBotRequest(): ?bool
  234. {
  235. return $this->isProbablyBotRequest;
  236. }
  237. public function setIsProbablyBotRequest(?bool $isProbablyBotRequest): void
  238. {
  239. $this->isProbablyBotRequest = $isProbablyBotRequest;
  240. }
  241. /**
  242. * @ORM\Column(name="considered_duplicate", type="boolean", nullable=false)
  243. */
  244. public bool $consideredDuplicate = false;
  245. public function isConsideredDuplicate(): bool
  246. {
  247. return $this->consideredDuplicate;
  248. }
  249. public function setConsideredDuplicate(bool $consideredDuplicate): void
  250. {
  251. $this->consideredDuplicate = $consideredDuplicate;
  252. }
  253. /**
  254. * @ORM\Column(name="session_id", type="string", nullable=true)
  255. */
  256. public ?string $sessionId;
  257. public function isSessionId(): bool
  258. {
  259. return $this->sessionId;
  260. }
  261. public function setSessionId(bool $sessionId): void
  262. {
  263. $this->sessionId = $sessionId;
  264. }
  265. /*
  266. * 'recurrent_job_id_for_duplication_checking' field added for CPC duplication checks.
  267. * Only used for EVENT_TYPE_FORWARDED_TO_CUSTOMER_WITH_CLICK_BASED_BILLING_RECURRENT_JOB.
  268. * Not to be confused with 'recurrentJobId' in additionalData (used by some other event types)
  269. */
  270. /**
  271. * @ORM\Column(name="recurrent_job_id_for_duplication_checking", type="string", nullable=true)
  272. */
  273. public ?string $recurrentJobIdForDuplicationChecking = null;
  274. public function getRecurrentJobIdForDuplicationChecking(): ?string
  275. {
  276. return $this->recurrentJobIdForDuplicationChecking;
  277. }
  278. public function setRecurrentJobIdForDuplicationChecking(?string $recurrentJobId): void
  279. {
  280. $this->recurrentJobIdForDuplicationChecking = $recurrentJobId;
  281. }
  282. }