<?php
namespace App\Entity;
use App\Service\ConversionEventService;
use App\Utility\GuidUtility;
use App\Utility\ReflectionHelper;
use DateTime;
use Doctrine\ORM\Mapping as ORM;
use Exception;
use InvalidArgumentException;
use ValueError;
/**
* @ORM\Entity()
*
* @ORM\Table(
* name="conversion_events",
* indexes={
*
* @ORM\Index(name="occured_at_idx", columns={"occured_at"}),
* @ORM\Index(name="affected_user_id_occured_at_idx", columns={"affected_user_id", "occured_at"}, options={"lengths": {8, null}})
* }
* )
*/
class ConversionEvent
{
public const STEP_LINK_CREATED = 0;
public const STEP_LINK_CLICKED = 1;
public const STEP_GOAL_REACHED = 2;
public function __construct()
{
$this->affectedUserIsJobofferer = false;
$this->affectedUserIsJobseeker = false;
$this->referencedConversionEventId = null;
$this->affectedUserId = null;
$this->affectedUserRegisteredAt = null;
$this->relatedRecurrentJobId = null;
$this->numberOfCampaignStarts = null;
$this->requestId = null;
$this->sessionId = null;
$this->clientId = null;
$this->additionalData = null;
$this->isProbablyBotRequest = null;
}
/**
* @ORM\GeneratedValue(strategy="CUSTOM")
*
* @ORM\CustomIdGenerator(class="App\Utility\DatabaseIdGenerator")
*
* @ORM\Column(name="id", type="guid")
*
* @ORM\Id
*/
private string $id;
public function setId(string $id)
{
GuidUtility::validOrThrow($id);
$this->id = $id;
}
public function getId(): string
{
return $this->id;
}
/**
* @ORM\Column(name="affected_user_id", type="guid", nullable=true)
*
* We don't make this a foreign key on purpose, we don't need the integrity and don't want to delete event data
* if a user is deleted.
*/
protected ?string $affectedUserId;
public function setAffectedUserId(?string $userId)
{
GuidUtility::validOrThrow($userId, true);
$this->affectedUserId = $userId;
}
public function getAffectedUserId(): ?string
{
return $this->affectedUserId;
}
/**
* @ORM\Column(name="affected_user_is_jobofferer", type="boolean", nullable=false)
*/
protected bool $affectedUserIsJobofferer;
public function setAffectedUserIsJobofferer(bool $affectedUserIsJobofferer)
{
$this->affectedUserIsJobofferer = $affectedUserIsJobofferer;
}
public function getAffectedUserIsJobofferer(): bool
{
return $this->affectedUserIsJobofferer;
}
/**
* @ORM\Column(name="affected_user_is_jobseeker", type="boolean", nullable=false)
*/
protected bool $affectedUserIsJobseeker;
public function setAffectedUserIsJobseeker(bool $affectedUserIsJobseeker)
{
$this->affectedUserIsJobseeker = $affectedUserIsJobseeker;
}
public function getAffectedUserIsJobseeker(): bool
{
return $this->affectedUserIsJobseeker;
}
/**
* @ORM\Column(name="affected_user_registered_at", type="datetime", nullable=true)
*/
protected ?DateTime $affectedUserRegisteredAt;
public function setAffectedUserRegisteredAt(?DateTime $affectedUserRegisteredAt): void
{
$this->affectedUserRegisteredAt = $affectedUserRegisteredAt;
}
public function getAffectedUserRegisteredAt(): ?DateTime
{
return $this->affectedUserRegisteredAt;
}
/**
* @ORM\Column(name="referenced_conversion_events_id", type="guid", nullable=true)
*/
protected ?string $referencedConversionEventId;
public function setReferencedConversionEventId(?string $referencedConversionEventId): void
{
GuidUtility::validOrThrow($referencedConversionEventId, true);
$this->referencedConversionEventId = $referencedConversionEventId;
}
public function getReferencedConversionEventId(): ?string
{
return $this->referencedConversionEventId;
}
/**
* @ORM\Column(name="campaign_id", type="integer", nullable=false)
*/
protected int $campaignId;
public function setCampaignId(int $campaignId): void
{
if (!ReflectionHelper::hasConstWithValue(
ConversionEventService::class,
'CAMPAIGN_ID_',
$campaignId)
) {
throw new ValueError("Invalid campaign id '$campaignId'.");
}
$this->campaignId = $campaignId;
}
public function getCampaignId(): int
{
return $this->campaignId;
}
/**
* @ORM\Column(name="subcampaign_id", type="integer", nullable=false)
*/
protected int $subcampaignId;
public function setSubcampaignId(int $subcampaignId): void
{
if ($subcampaignId < 0) {
throw new ValueError("Invalid subcampaign id '$subcampaignId'.");
}
$this->subcampaignId = $subcampaignId;
}
public function getSubcampaignId(): int
{
return $this->subcampaignId;
}
/**
* @ORM\Column(name="step", type="smallint", nullable=false)
*/
protected int $step;
/** @throws Exception */
public function setStep(int $step): void
{
if (!in_array($step, [self::STEP_LINK_CREATED, self::STEP_LINK_CLICKED, self::STEP_GOAL_REACHED])) {
throw new Exception("Invalid step value '$step'.");
}
$this->step = $step;
}
public function getStep(): int
{
return $this->step;
}
/**
* @ORM\Column(name="occured_at", type="datetime", nullable=false)
*/
protected DateTime $occuredAt;
public function getOccuredAt(): DateTime
{
return $this->occuredAt;
}
public function setOccuredAt(DateTime $occuredAt)
{
$this->occuredAt = $occuredAt;
}
/**
* @ORM\Column(name="related_recurrent_job_id", type="guid", nullable=true)
*
* We don't make this a foreign key on purpose, we don't need the integrity and don't want to delete event data
* if a user is deleted.
*/
protected ?string $relatedRecurrentJobId;
/** @throws InvalidArgumentException */
public function setRelatedRecurrentJobId(?string $relatedRecurrentJobId = null): void
{
GuidUtility::validOrThrow($relatedRecurrentJobId, true);
$this->relatedRecurrentJobId = $relatedRecurrentJobId;
}
public function getRelatedRecurrentJobId(): ?string
{
return $this->relatedRecurrentJobId;
}
/**
* @ORM\Column(name="number_of_campaign_starts", type="integer", nullable=true)
*/
protected ?int $numberOfCampaignStarts;
/** @throws Exception */
public function setNumberOfCampaignStarts(?int $numberOfCampaignStarts): void
{
$this->numberOfCampaignStarts = $numberOfCampaignStarts;
}
public function getNumberOfCampaignStarts(): ?int
{
return $this->numberOfCampaignStarts;
}
/**
* @ORM\Column(name="request_id", type="text", length=256, nullable=true)
*/
protected ?string $requestId;
public function setRequestId(?string $requestId = null): void
{
$this->requestId = $requestId;
}
public function getRequestId(): ?string
{
return $this->requestId;
}
/**
* @ORM\Column(name="session_id", type="text", length=256, nullable=true)
*/
protected ?string $sessionId;
public function setSessionId(?string $sessionId = null): void
{
$this->sessionId = $sessionId;
}
public function getSessionId(): ?string
{
return $this->sessionId;
}
/**
* @ORM\Column(name="client_id", type="text", length=64, nullable=true)
*/
protected ?string $clientId;
public function setClientId(?string $clientId = null): void
{
$this->clientId = $clientId;
}
public function getClientId(): ?string
{
return $this->clientId;
}
/**
* @ORM\Column(name="additional_data", type="text", length=4096, nullable=true)
*/
protected ?string $additionalData;
/** @throws Exception */
public function setAdditionalData($additionalData): void
{
if (!is_null($additionalData)) {
if (is_null(json_decode($additionalData))) {
throw new Exception('additionalData must be valid JSON');
}
}
$this->additionalData = $additionalData;
}
public function getAdditionalData(): ?string
{
return $this->additionalData;
}
/**
* @ORM\Column(name="is_probably_bot_request", type="boolean", nullable=true)
*/
private ?bool $isProbablyBotRequest;
public function getIsProbablyBotRequest(): ?bool
{
return $this->isProbablyBotRequest;
}
public function setIsProbablyBotRequest(?bool $isProbablyBotRequest): void
{
$this->isProbablyBotRequest = $isProbablyBotRequest;
}
}