<?php
namespace App\Entity\Event;
use App\Entity\Building\Building;
use App\Entity\Client\Client;
use App\Entity\Extension\BlameableTrait;
use App\Entity\Extension\TimestampableTrait;
use App\Entity\File;
use App\Entity\Gauge\Gauge;
use App\Entity\User;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\ORM\Mapping\MappedSuperclass;
/**
* @MappedSuperclass
* @ORM\Entity()
* @ORM\Table(name="events")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr_type", type="string")
* @ORM\DiscriminatorMap({"event" = "Event", "action" = "Action", "notice" = "Notice"})
*/
class Event
{
use BlameableTrait;
use TimestampableTrait;
public const CONTEXT_BUILDING = 1;
public const CONTEXT_GAUGE = 2;
public const CONTEXT_CLIENT = 3;
public const CONTEXT_MEDIUM = 4;
/**
* @var null|int
*
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
protected ?int $id = null;
/**
* @var string|null
*
* @Assert\Type("string")
* @ORM\Column(type="string", nullable=true)
*/
protected ?string $name = null;
/**
* @var Client
* @ORM\ManyToOne(targetEntity="App\Entity\Client\Client")
* @ORM\JoinColumn(name="client_id", referencedColumnName="id", nullable=false)
*/
private Client $client;
/**
* datum ke které se akce váže - TODO optat se
* @var \DateTime|null
* @ORM\Column(type="date", name="event_date", nullable=true)
*/
protected ?\DateTime $date;
/**
* @var int
*
* @ORM\Column(type="smallint", nullable=true)
*/
protected int $state;
/**
* @var Collection|Building[]
*
* @ORM\ManyToMany(targetEntity="App\Entity\Building\Building", inversedBy="events", cascade={"persist"})
*/
protected $buildings;
/**
* @var Collection|Gauge[]
*
* @ORM\ManyToMany(targetEntity="App\Entity\Gauge\Gauge", inversedBy="events", cascade={"persist"})
*/
protected $gauges;
/**
* @var null|int
*
* @Assert\Type("int")
* @ORM\Column(type="smallint", nullable=true)
*/
protected ?int $context = null;
/**
* Medium identifier (e.g., electricity, gas, water) for medium-context events
* @var int|null
*
* @Assert\Type("int")
* @ORM\Column(name="medium_id", type="smallint", nullable=true)
*/
protected ?int $mediumId = null;
/**
* @var null|string
*
* @ORM\Column(type="text", nullable=true)
* @Assert\Type(type="string")
*/
protected ?string $description = null;
/**
* navázaný dokument z kategorie dokumenty|příloha
* @var File|null
*
* @ORM\ManyToOne(targetEntity="App\Entity\File", inversedBy="events")
* @ORM\JoinColumn(nullable=true)
*/
private ?File $file = null;
/**
* SYSTÉMOVÝ KÓD
* @var string|null
* @ORM\Column(type="string", nullable=true)
*/
protected ?string $systemCode;
/**
* INTERNÍ KÓD
* @var string|null
* @ORM\Column(type="string", nullable=true)
*/
protected ?string $internalCode;
/**
* @var User|null $createdBy
*
* @ORM\ManyToOne(targetEntity="App\Entity\User")
* @ORM\JoinColumn(referencedColumnName="id", nullable=true)
*/
protected ?User $guarantor; // todo lepší překlad
/**
* @var null|string
*
* @ORM\Column(type="text", nullable=true)
* @Assert\Type(type="string")
*/
protected ?string $note;
/**
* TERMÍN PRO VYŘEŠENÍ AKCE
* @var \DateTimeInterface|null
* @ORM\Column(type="date", nullable=true)
*/
protected ?\DateTimeInterface $deadline = null;
/**
* @var bool
* @ORM\Column(type="boolean")
*/
protected bool $showInGraph = false;
/**
* @var bool|null
* @ORM\Column(type="boolean", nullable=true)
*/
protected ?bool $notificationEnabled = false;
/**
* @var int|null
* @ORM\Column(type="integer", nullable=true)
*/
protected ?int $notification;
/**
* @var \DateTime|null
*
* @ORM\Column(name="solved_at", type="datetime", nullable=true)
*/
protected ?\DateTime $solvedAt = null;
/**
* @var User|null $updatedBy
*
* @ORM\ManyToOne(targetEntity="App\Entity\User")
* @ORM\JoinColumn(referencedColumnName="id", nullable=true)
*/
protected ?User $solvedBy;
/**
* simple array of connected buildings
* @var array
*/
private $buildingsArray = [];
/**
* simple array of connected gauges
* @var array
*/
private $gaugesArray = [];
/**
* @var null|int
*
* @Assert\Type("int")
* @ORM\Column(type="integer", nullable=true)
*/
protected ?int $serialNumber = null;
/**
* File constructor.
*/
public function __construct()
{
$this->date = new \DateTime();
$this->buildings = new ArrayCollection();
$this->gauges = new ArrayCollection();
}
/**
* @return int|null
*/
public function getId(): ?int
{
return $this->id;
}
/**
* @param int|null $id
* @return Event
*/
public function setId(?int $id): Event
{
$this->id = $id;
return $this;
}
/**
* @return string|null
*/
public function getName(): ?string
{
return $this->name;
}
/**
* @param string|null $name
* @return Event
*/
public function setName(?string $name): Event
{
$this->name = $name;
return $this;
}
/**
* @return int
*/
public function getState(): int
{
return $this->state;
}
/**
* @param int $state
* @return Event
*/
public function setState(int $state): Event
{
$this->state = $state;
return $this;
}
/**
* @return Building[]|Collection
*/
public function getBuildings()
{
return $this->buildings;
}
/**
* @param Building[]|Collection $buildings
* @return Event
*/
public function setBuildings($buildings)
{
$this->buildings = $buildings;
return $this;
}
/**
* @return Gauge[]|Collection
*/
public function getGauges()
{
return $this->gauges;
}
/**
* @param Gauge[]|Collection $gauges
* @return Event
*/
public function setGauges($gauges)
{
$this->gauges = $gauges;
return $this;
}
/**
* @return int|null
*/
public function getContext(): ?int
{
return $this->context;
}
/**
* @param int|null $context
* @return Event
*/
public function setContext(?int $context): Event
{
$this->context = $context;
return $this;
}
/**
* @return int|null
*/
public function getMediumId(): ?int
{
return $this->mediumId;
}
/**
* @param int|null $mediumId
* @return Event
*/
public function setMediumId(?int $mediumId): Event
{
$this->mediumId = $mediumId;
return $this;
}
/**
* @return string|null
*/
public function getDescription(): ?string
{
return $this->description;
}
/**
* @param string|null $description
* @return Event
*/
public function setDescription(?string $description): Event
{
$this->description = $description;
return $this;
}
/**
* @return string|null
*/
public function getSystemCode(): ?string
{
return $this->systemCode;
}
/**
* @param string|null $systemCode
* @return Event
*/
public function setSystemCode(?string $systemCode): Event
{
$this->systemCode = $systemCode;
return $this;
}
/**
* @return User|null
*/
public function getGuarantor(): ?User
{
return $this->guarantor;
}
/**
* @param User|null $guarantor
* @return Event
*/
public function setGuarantor(?User $guarantor): Event
{
$this->guarantor = $guarantor;
return $this;
}
/**
* @return string|null
*/
public function getNote(): ?string
{
return $this->note;
}
/**
* @param string|null $note
* @return Event
*/
public function setNote(?string $note): Event
{
$this->note = $note;
return $this;
}
/**
* @return \DateTimeInterface|null
*/
public function getDeadline(): ?\DateTimeInterface
{
return $this->deadline;
}
/**
* @param \DateTimeInterface|null $deadline
* @return Event
*/
public function setDeadline(?\DateTimeInterface $deadline): Event
{
$this->deadline = $deadline;
return $this;
}
/**
* @return bool
*/
public function isShowInGraph(): bool
{
return $this->showInGraph;
}
/**
* @param bool $showInGraph
* @return Event
*/
public function setShowInGraph(bool $showInGraph): Event
{
$this->showInGraph = $showInGraph;
return $this;
}
/**
* @return string|null
*/
public function getInternalCode(): ?string
{
return $this->internalCode;
}
/**
* @param string|null $internalCode
* @return Event
*/
public function setInternalCode(?string $internalCode): Event
{
$this->internalCode = $internalCode;
return $this;
}
/**
* @return bool|null
*/
public function getNotificationEnabled(): ?bool
{
return $this->notificationEnabled;
}
/**
* @param bool|null $notificationEnabled
* @return Event
*/
public function setNotificationEnabled(?bool $notificationEnabled): Event
{
$this->notificationEnabled = $notificationEnabled;
return $this;
}
/**
* @return int|null
*/
public function getNotification(): ?int
{
return $this->notification;
}
/**
* @param int|null $notification
* @return Event
*/
public function setNotification(?int $notification): Event
{
$this->notification = $notification;
return $this;
}
/**
* @return \DateTime|null
*/
public function getSolvedAt(): ?\DateTime
{
return $this->solvedAt;
}
/**
* @param \DateTime|null $solvedAt
* @return Event
*/
public function setSolvedAt(?\DateTime $solvedAt): Event
{
$this->solvedAt = $solvedAt;
return $this;
}
/**
* @return User|null
*/
public function getSolvedBy(): ?User
{
return $this->solvedBy;
}
/**
* @param User|null $solvedBy
* @return Event
*/
public function setSolvedBy(?User $solvedBy): Event
{
$this->solvedBy = $solvedBy;
return $this;
}
/**
* @return Client
*/
public function getClient(): Client
{
return $this->client;
}
/**
* @param Client $client
* @return Event
*/
public function setClient(Client $client): Event
{
$this->client = $client;
return $this;
}
/**
* @return \DateTime|null
*/
public function getDate(): ?\DateTime
{
return $this->date;
}
/**
* @param \DateTime|null $date
* @return Event
*/
public function setDate(?\DateTime $date): Event
{
$this->date = $date;
return $this;
}
/**
* @return array
*/
public function getBuildingsArray(): array
{
return $this->buildingsArray;
}
/**
* @param array $buildingsArray (buildingsArray in array by fileId as key)
* @return self
*/
public function setBuildingsArrayByArray(array $buildingsArray): self
{
if (key_exists($this->getId(), $buildingsArray)) {
$this->buildingsArray = $buildingsArray[$this->getId()];
}
return $this;
}
/**
* @return array
*/
public function getGaugesArray(): array
{
return $this->gaugesArray;
}
/**
* @param array $gaugesArray (buildingsArray in array by fileId as key)
* @return self
*/
public function setGaugesArrayByArray(array $gaugesArray): self
{
if (key_exists($this->getId(), $gaugesArray)) {
$this->gaugesArray = $gaugesArray[$this->getId()];
}
return $this;
}
/**
* @param bool $fromArray
* @return array
*/
public function getBuildingsNames(bool $fromArray): array
{
$buildings = [];
if ($fromArray) {
foreach ($this->getBuildingsArray() as $building) {
$buildings[] = $building['name'];
}
} else {
foreach ($this->getBuildings() as $building) {
$buildings[] = $building->getName();
}
}
return $buildings;
}
/**
* @param bool $fromArray
* @return array
*/
public function getGaugesNames(bool $fromArray) :array
{
$gauges = [];
if ($fromArray) {
foreach ($this->getGaugesArray() as $gauge) {
$gauges[] = $gauge['buildingName'] . ' - ' . $gauge['name'];
}
} else {
foreach ($this->getGauges() as $gauge) {
$gauges[] = $gauge->getBuilding()->getName() . ' - ' . $gauge->getName();
}
}
return $gauges;
}
/**
* @return int|null
*/
public function getSerialNumber(): ?int
{
return $this->serialNumber;
}
/**
* @param int|null $serialNumber
* @return Event
*/
public function setSerialNumber(?int $serialNumber): Event
{
$this->serialNumber = $serialNumber;
return $this;
}
/**
* @param bool $noBreak
* @return string
*/
public function getOutputCode(bool $noBreak):string
{
$code = '';
if ($this->getInternalCode() !== null) {
$code = $this->getInternalCode();
} elseif ($this->getSystemCode() !== null) {
$code = $this->getSystemCode();
}
return $noBreak ? str_replace('-', '−', $code) : $code;
}
/**
* @return File|null
*/
public function getFile(): ?File
{
return $this->file;
}
/**
* @param File|null $file
* @return Event
*/
public function setFile(?File $file): Event
{
$this->file = $file;
return $this;
}
/**
* @param Gauge $gauge
* @return $this
*/
public function addGauge(Gauge $gauge): self
{
if (!$this->gauges->contains($gauge)) {
$this->gauges[] = $gauge;
$this->addBuilding($gauge->getBuilding());
}
return $this;
}
/**
* @param Gauge $gauge
* @return $this
*/
public function removeGauge(Gauge $gauge): self
{
if ($this->gauges->contains($gauge)) {
$this->gauges->removeElement($gauge);
}
return $this;
}
/**
* @param Building $building
* @return $this
*/
public function addBuilding(Building $building): self
{
if (!$this->buildings->contains($building)) {
$this->buildings[] = $building;
}
return $this;
}
/**
* @param Building $building
* @return $this
*/
public function removeBuilding(Building $building): self
{
if ($this->buildings->contains($building)) {
$this->buildings->removeElement($building);
}
return $this;
}
}