<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
/**
* @ORM\Entity(repositoryClass="App\Repository\DynamicReportGoogleAnalyticsRepository")
* @ORM\Table(name="`dynamic_report_google_analytics`")
*/
class DynamicReportGoogleAnalytics
{
use TimestampableEntity;
public const SNAPSHOT_TYPE_LATEST_YEARLY = 'yearly';
public const SNAPSHOT_TYPE_LATEST_MONTHLY = 'monthly';
public const SNAPSHOT_TYPE_LATEST_WEEKLY = 'weekly';
public const SNAPSHOT_TYPE_LATEST_DAILY = 'daily';
public const STATUS_COMPLETED = 'completed';
public const STATUS_PROCESSING = 'processing';
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private ?int $id = null;
/**
* @ORM\Column(type="string", nullable=true)
*/
private ?string $name = null;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="dynamicReportsGoogle")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private ?User $user;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\GoogleAccount", inversedBy="reports")
* @ORM\JoinColumn(name="google_account_id", referencedColumnName="id")
*/
private ?GoogleAccount $googleAccount;
/**
* @ORM\Column(type="string")
*/
private ?string $analyticsAccountId;
/**
* @ORM\Column(type="string", nullable=true)
*/
private ?string $analyticsAccountName = null;
/**
* @ORM\Column(type="string", nullable=true)
*/
private ?string $analyticsPropertyId = null;
/**
* @ORM\Column(type="string", nullable=true)
*/
private ?string $analyticsPropertyName = null;
/**
* @ORM\Column(type="string", nullable=true)
*/
private ?string $analyticsStreamId = null;
/**
* @ORM\Column(type="string", nullable=true)
*/
private ?string $analyticsStreamName = null;
/**
* @ORM\Column(type="string", nullable=true)
*/
private ?string $universalAnalyticsViewId = null;
/**
* @ORM\Column(type="string", nullable=true)
*/
private ?string $universalAnalyticsViewName = null;
/**
* @ORM\Column(type="string", nullable=true)
*/
private ?string $defaultUri = null;
/**
* @ORM\OneToMany(targetEntity="App\Entity\DynamicReportGoogleAnalyticsStatistic", mappedBy="report", cascade={"persist", "remove"}, orphanRemoval=true)
*/
private ?Collection $statistics;
/**
* @ORM\OneToMany(targetEntity="App\Entity\DynamicReportGoogleAnalyticsSnapshot", mappedBy="report", cascade={"persist", "remove"}, orphanRemoval=true)
* @ORM\OrderBy({"periodStart" = "ASC"})
*/
private ?Collection $snapshots;
/**
* @ORM\Column(type="string", nullable=true)
*/
private ?string $hash;
/**
* @ORM\Column(type="string", nullable=false, options={"default" : "monthly"})
*/
private ?string $snapshotType = self::SNAPSHOT_TYPE_LATEST_MONTHLY;
/**
* @ORM\Column(type="date", nullable=true)
*/
private ?\DateTime $periodStart = null;
/**
* @ORM\Column(type="date", nullable=true)
*/
private ?\DateTime $periodEnd = null;
/**
* @ORM\Column(type="string", nullable=false, options={"default" : "processing"})
*/
private ?string $status = self::STATUS_PROCESSING;
public function __construct()
{
$this->statistics = new ArrayCollection();
$this->snapshots = new ArrayCollection();
$this->hash = uniqid('', true);
}
public function getId(): ?int
{
return $this->id;
}
public function setId(?int $id): void
{
$this->id = $id;
}
public function getName(): ?string
{
if (null === $this->name) {
return $this->getDisplayName();
}
return $this->name;
}
public function setName(?string $name): void
{
$this->name = $name;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): void
{
$this->user = $user;
}
public function getGoogleAccount(): ?GoogleAccount
{
return $this->googleAccount;
}
public function setGoogleAccount(?GoogleAccount $googleAccount): void
{
$this->googleAccount = $googleAccount;
}
public function getAnalyticsAccountId(): ?string
{
return $this->analyticsAccountId;
}
public function setAnalyticsAccountId(?string $analyticsAccountId): void
{
$this->analyticsAccountId = $analyticsAccountId;
}
public function getAnalyticsAccountName(): ?string
{
return $this->analyticsAccountName;
}
public function setAnalyticsAccountName(?string $analyticsAccountName): void
{
$this->analyticsAccountName = $analyticsAccountName;
}
public function getAnalyticsPropertyId(): ?string
{
return $this->analyticsPropertyId;
}
public function setAnalyticsPropertyId(?string $analyticsPropertyId): void
{
$this->analyticsPropertyId = $analyticsPropertyId;
}
public function getAnalyticsPropertyName(): ?string
{
return $this->analyticsPropertyName;
}
public function setAnalyticsPropertyName(?string $analyticsPropertyName): void
{
$this->analyticsPropertyName = $analyticsPropertyName;
}
public function getAnalyticsStreamId(): ?string
{
return $this->analyticsStreamId;
}
public function setAnalyticsStreamId(?string $analyticsStreamId): void
{
$this->analyticsStreamId = $analyticsStreamId;
}
public function getAnalyticsStreamName(): ?string
{
return $this->analyticsStreamName;
}
public function setAnalyticsStreamName(?string $analyticsStreamName): void
{
$this->analyticsStreamName = $analyticsStreamName;
}
public function getUniversalAnalyticsViewId(): ?string
{
return $this->universalAnalyticsViewId;
}
public function setUniversalAnalyticsViewId(?string $universalAnalyticsViewId): void
{
$this->universalAnalyticsViewId = $universalAnalyticsViewId;
}
public function getUniversalAnalyticsViewName(): ?string
{
return $this->universalAnalyticsViewName;
}
public function setUniversalAnalyticsViewName(?string $universalAnalyticsViewName): void
{
$this->universalAnalyticsViewName = $universalAnalyticsViewName;
}
public function getDefaultUri(): ?string
{
return $this->defaultUri;
}
public function setDefaultUri(?string $defaultUri): void
{
$this->defaultUri = $defaultUri;
}
public function getStatistics(): Collection
{
return $this->statistics;
}
public function setStatistics($statistics): void
{
$this->statistics = $statistics;
}
public function isCompleted(): bool
{
return self::STATUS_COMPLETED === $this->status;
}
public function getStatus(): ?string
{
return $this->status;
}
public function setStatus(?string $status): void
{
$this->status = $status;
}
public function setIsProcessing()
{
$this->status = self::STATUS_PROCESSING;
}
public function getHash(): ?string
{
return $this->hash;
}
public function setHash(?string $hash): void
{
$this->hash = $hash;
}
public function getSnapshotType(): ?string
{
return $this->snapshotType;
}
public function setSnapshotType(?string $snapshotType): void
{
$this->snapshotType = $snapshotType;
}
public function getPeriodStart(): ?\DateTime
{
return $this->periodStart;
}
public function setPeriodStart(?\DateTime $periodStart): void
{
$this->periodStart = $periodStart;
}
public function getPeriodEnd(): ?\DateTime
{
return $this->periodEnd;
}
public function setPeriodEnd(?\DateTime $periodEnd): void
{
$this->periodEnd = $periodEnd;
}
public function getNextPeriods(): array
{
$periodStart = clone $this->periodStart;
$periodEnd = clone $this->periodEnd;
$periodStart->setTime(0, 0);
$periodEnd->setTime(0, 0);
switch ($this->snapshotType) {
case self::SNAPSHOT_TYPE_LATEST_YEARLY:
$periodStart->modify('NEXT YEAR JANUARY 1');
$periodEnd->modify('NEXT YEAR DECEMBER 31');
break;
case self::SNAPSHOT_TYPE_LATEST_MONTHLY:
$periodStart->modify('FIRST DAY OF NEXT MONTH');
$periodEnd->modify('LAST DAY OF NEXT MONTH');
break;
case self::SNAPSHOT_TYPE_LATEST_WEEKLY:
$periodStart->modify('NEXT WEEK MONDAY');
$periodEnd->modify('NEXT WEEK SUNDAY');
break;
case self::SNAPSHOT_TYPE_LATEST_DAILY:
$periodStart->modify('TOMORROW');
$periodEnd->modify('TOMORROW');
break;
}
$periodStart->setTime(0, 0);
$periodEnd->setTime(0, 0);
return [
$periodStart,
$periodEnd,
];
}
public function getSnapshotPeriods(?\DateTime $periodStart = null, ?\DateTime $periodEnd = null): array
{
if (null === $periodStart) {
$periodStart = clone $this->periodStart;
}
if (null === $periodEnd) {
$periodEnd = clone $this->periodEnd;
}
$periodStart->setTime(0, 0);
$periodEnd->setTime(0, 0);
$datePeriods = [];
switch ($this->snapshotType) {
case self::SNAPSHOT_TYPE_LATEST_YEARLY:
$datePeriod = new \DatePeriod($periodStart, \DateInterval::createFromDateString('+1 YEAR'), $periodEnd);
/** @var \DateTime $date */
foreach ($datePeriod->getIterator() as $date) {
$dateEnd = clone $date;
$datePeriods[] = [
$date,
$dateEnd->modify('DECEMBER 31'),
];
}
return $datePeriods;
case self::SNAPSHOT_TYPE_LATEST_MONTHLY:
$datePeriod = new \DatePeriod($periodStart, \DateInterval::createFromDateString('+1 MONTH'), $periodEnd);
/** @var \DateTime $date */
foreach ($datePeriod->getIterator() as $date) {
$dateEnd = clone $date;
$datePeriods[] = [
$date,
$dateEnd->modify('LAST DAY OF THIS MONTH'),
];
}
return $datePeriods;
case self::SNAPSHOT_TYPE_LATEST_WEEKLY:
$datePeriod = new \DatePeriod($periodStart, \DateInterval::createFromDateString('NEXT MONDAY'), $periodEnd);
/** @var \DateTime $date */
foreach ($datePeriod->getIterator() as $date) {
$dateEnd = clone $date;
$dateEnd->modify('NEXT SUNDAY');
if ($dateEnd > $this->periodEnd) {
$dateEnd = $this->periodEnd;
}
$datePeriods[] = [
$date,
$dateEnd,
];
}
return $datePeriods;
case self::SNAPSHOT_TYPE_LATEST_DAILY:
$datePeriod = new \DatePeriod($periodStart, \DateInterval::createFromDateString('+1 DAY'), $periodEnd);
/** @var \DateTime $date */
foreach ($datePeriod->getIterator() as $date) {
$dateEnd = clone $date;
$datePeriods[] = [
$date,
$dateEnd->modify('TODAY'),
];
}
// Include end of month (PHP 8.2: \DateInterval::INCLUDE_END_DATE)
$datePeriods[] = [
$periodEnd,
$periodEnd,
];
return $datePeriods;
}
return [];
}
public function getDisplayPeriod(): string
{
if (self::SNAPSHOT_TYPE_LATEST_YEARLY === $this->getSnapshotType()) {
return sprintf('%s - %s', $this->periodStart->format('M Y'), $this->periodEnd->format('M Y'));
}
if (self::SNAPSHOT_TYPE_LATEST_MONTHLY === $this->getSnapshotType()) {
return $this->periodStart->format('M Y');
}
if (self::SNAPSHOT_TYPE_LATEST_WEEKLY === $this->getSnapshotType()) {
return sprintf('%s - %s', $this->periodStart->format('M d Y'), $this->periodEnd->format('M d Y'));
}
if (self::SNAPSHOT_TYPE_LATEST_DAILY === $this->getSnapshotType()) {
return $this->periodStart->format('M d Y');
}
return 'Unknown';
}
public function getDisplayName(): string
{
return $this->getDomain();
}
public function getDomain(): string
{
return strtolower(
str_replace('www.', '', parse_url($this->getDefaultUri(), PHP_URL_HOST))
);
}
public function getGoogleAnalyticsReference(): string
{
if ($this->getUniversalAnalyticsViewId()) {
return sprintf('%s / %s', $this->getAnalyticsPropertyId(), $this->getUniversalAnalyticsViewName());
}
if ($this->getAnalyticsAccountName() && $this->getAnalyticsPropertyName()) {
return sprintf('%s / %s', $this->getAnalyticsAccountName(), $this->getAnalyticsPropertyName());
}
return sprintf('Property Identifier: %s', $this->getAnalyticsPropertyId());
}
public function getSnapshots(): ?Collection
{
return $this->snapshots;
}
public function setSnapshots(?Collection $snapshots): void
{
$this->snapshots = $snapshots;
}
public function useUniversalAnalytics(): bool
{
return null !== $this->getUniversalAnalyticsViewId();
}
public function __toString(): string
{
return $this->getDisplayName() ?? 'New Report';
}
}