<?php
namespace App\Entity\Gauge;
use App\Entity\Extension\BlameableTrait;
use App\Entity\Extension\ImportableInterface;
use App\Entity\Extension\TimestampableTrait;
use App\Entity\Gauge\RevisioRecord;
use App\Entity\Import\DataImport;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use App\Repository\Gauge\GaugeReadingRepository;
use App\Validator as AcmeAssert;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass=GaugeReadingRepository::class)
* @ORM\Table(name="gauge_reading", indexes={@ORM\Index(name="read_at_idx", columns={"read_at"})})
*/
class GaugeReading implements ImportableInterface
{
public const STATE_NEW = 0;
public const STATE_BASIC = 1;
public const STATE_FINAL = 2;
/**
* @var int|null
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private ?int $id = null;
/**
* @var Gauge $gauge
* @ORM\ManyToOne(targetEntity="App\Entity\Gauge\Gauge", inversedBy="readings")
* @ORM\JoinColumn(name="gauge_id", referencedColumnName="id", nullable=false)
*/
private Gauge $gauge;
/**
* 0 = nový stav, 1 = odečet, 2 = konečný stav
* @var int
* @ORM\Column(type="smallint", options={"comment":"0 = nový stav, 1 = odečet, 2 = konečný stav"})
*/
private int $state = self::STATE_NEW;
/**
* @var \DateTime
* @AcmeAssert\DateTimeRange()
* @ORM\Column(name="read_at", type="datetime", nullable=false)
*/
protected \DateTime $readAt;
/**
* @var Collection|GaugeReadingValue[]
* @ORM\OneToMany(targetEntity="App\Entity\Gauge\GaugeReadingValue", mappedBy="reading", cascade={"all"})
*/
private $values;
/**
* is set if reading (state=0) is connected with gaugeUnit change
* @var GaugeUnit|null
* @ORM\OneToOne(targetEntity="App\Entity\Gauge\GaugeUnit", mappedBy="gaugeNewStateReading", cascade={"all"})
*/
private ?GaugeUnit $gaugeUnit;
/**
* @var DataImport|null
* @ORM\ManyToOne(targetEntity="App\Entity\Import\DataImport", inversedBy="readings")
* @ORM\JoinColumn(nullable=true)
*/
private ?DataImport $import = null;
/**
* record_id in Revisio source database, also referencing an entry in RevisioRecord
* @var ?RevisioRecord
* @ORM\ManyToOne(targetEntity="App\Entity\Gauge\RevisioRecord", cascade={"all"})
* @ORM\JoinColumn(name="revisio_record_id", referencedColumnName="record_id", nullable=true)
*/
private ?RevisioRecord $revisioRecord = null;
use BlameableTrait;
use TimestampableTrait;
public function __construct()
{
$this->values = new ArrayCollection();
}
/**
* @return int|null
*/
public function getId(): ?int
{
return $this->id;
}
/**
* @param int|null $id
* @return GaugeReading
*/
public function setId(?int $id): GaugeReading
{
$this->id = $id;
return $this;
}
/**
* @return Gauge
*/
public function getGauge(): Gauge
{
return $this->gauge;
}
/**
* @param Gauge $gauge
* @return GaugeReading
*/
public function setGauge(Gauge $gauge): GaugeReading
{
$this->gauge = $gauge;
return $this;
}
/**
* @return int
*/
public function getState(): int
{
return $this->state;
}
/**
* @param int $state
* @return GaugeReading
*/
public function setState(int $state): GaugeReading
{
$this->state = $state;
return $this;
}
/**
* @return \DateTime
*/
public function getReadAt(): \DateTime
{
return $this->readAt;
}
/**
* @param \DateTime $readAt
* @return GaugeReading
*/
public function setReadAt(\DateTime $readAt): GaugeReading
{
$this->readAt = $readAt;
return $this;
}
/**
* @return GaugeReadingValue[]|Collection
*/
public function getValues()
{
return $this->values;
}
/**
* @param GaugeReadingValue[]|Collection $values
* @return GaugeReading
*/
public function setValues($values)
{
$this->values = $values;
return $this;
}
/**
* @param GaugeReadingValue $value
* @return $this
*/
public function addValue(GaugeReadingValue $value): self
{
$value->setReading($this);
$this->values->add($value);
return $this;
}
/**
* @return bool
*/
public function isNew() :bool
{
return $this->getState() === self::STATE_NEW;
}
/**
* @return bool
*/
public function isFinal() :bool
{
return $this->getState() === self::STATE_FINAL;
}
/**
* @param int $segment
* @return float|null
*/
public function getSegmentValue(int $segment) : ?float
{
foreach ($this->getValues() as $readingValue) {
if ($readingValue->getSegment() === $segment) {
return $readingValue->getValue();
}
}
return null;
}
/**
* @param int $segment
* @return int|null
*/
public function getSegmentUnit(int $segment) : ?int
{
foreach ($this->getValues() as $readingValue) {
if ($readingValue->getSegment() === $segment) {
return $readingValue->getUnit();
}
}
return null;
}
/**
* @param int $segment
* @return \App\Entity\Gauge\GaugeReadingValue|null
*/
public function getValueBySegment(int $segment): ?GaugeReadingValue
{
foreach ($this->values as $gRValue) {
if ($segment === $gRValue->getSegment()) {
return $gRValue;
}
}
return null;
}
/**
* @return \App\Entity\Gauge\GaugeUnit|null
*/
public function getGaugeUnit(): ?GaugeUnit
{
return $this->gaugeUnit;
}
/**
* @param \App\Entity\Gauge\GaugeUnit|null $gaugeUnit
* @return GaugeReading
*/
public function setGaugeUnit(?GaugeUnit $gaugeUnit): GaugeReading
{
$this->gaugeUnit = $gaugeUnit;
return $this;
}
public function getImport(): ?DataImport
{
return $this->import;
}
public function setImport(?DataImport $import): GaugeReading
{
$this->import = $import;
return $this;
}
/**
* @return RevisioRecord|null
*/
public function getRevisioRecord(): ?RevisioRecord
{
return $this->revisioRecord;
}
/**
* @param RevisioRecord|null $revisioRecord
* @return $this
*/
public function setRevisioRecord(?RevisioRecord $revisioRecord): GaugeReading
{
$this->revisioRecord = $revisioRecord;
return $this;
}
}