<?php
namespace App\Entity;
use App\Entity\Eg\Osm\Parking;
use App\Entity\Eg\Osm\Zone;
use App\Repository\RouteLapRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity(repositoryClass: RouteLapRepository::class)]
#[ORM\Table(name: 'route_laps')]
#[ORM\Index(name: 'route_laps_start_date', columns: ['start_time'])]
#[ORM\Index(name: 'route_laps_inspector_id', columns: ['inspector_id'])]
#[ORM\Index(name: 'lasttime_idx', columns: ['last_time'])]
#[ORM\Index(columns: ['parking_id'])]
class RouteLap
{
/**
* @var int
*/
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'IDENTITY')]
#[ORM\Column(type: 'integer')]
private $id;
/**
* @var \DateTimeInterface
*/
#[ORM\Column(name: 'start_time', type: 'datetimetz_milliseconds')]
private $startTime;
/**
* @var \DateTimeInterface|null
*/
#[ORM\Column(name: 'last_time', type: 'datetimetz_milliseconds', nullable: true)]
private $lastTime = null;
/**
* @var int
*/
#[ORM\Column(name: 'inspector_id', type: 'integer', nullable: false)]
private $inspectorId;
/**
* @var int|null
*/
#[ORM\Column(name: 'total_places', type: 'smallint', nullable: true)]
private $totalPlaces;
/**
* @var int|null
*/
#[ORM\Column(name: 'occupied_places', type: 'smallint', nullable: true)]
private $occupiedPlaces;
/**
* @var int|null
*/
#[ORM\Column(name: 'occupancy_state', type: 'smallint', nullable: true)]
private $occupancyState;
/**
* @var \DateTimeInterface|null
*/
#[ORM\Column(name: 'last_occupancy_change', type: 'datetimetz_milliseconds', nullable: true)]
private $lastOccupancyChange;
/**
* @var int|null
*/
#[ORM\Column(name: 'unpaid_places', type: 'smallint', nullable: true)]
private $unpaidPlaces;
/**
* @var int|null
*/
#[ORM\Column(name: 'payment_state', type: 'smallint', nullable: true)]
private $paymentState;
/**
* @var \DateTimeInterface|null
*/
#[ORM\Column(name: 'last_payment_change', type: 'datetimetz_milliseconds', nullable: true)]
private $lastPaymentChange;
/**
* @var Parking
*/
#[ORM\ManyToOne(targetEntity: Parking::class)]
#[ORM\JoinColumn(name: 'parking_id', referencedColumnName: 'id')]
private $parking;
/**
* Typ przejazdu:
* 0 - przejazd samotny
* 1 - przejazd pierwszego samochodu z pary
* 2 - przejazd drugiego samochodu z pary
*/
#[ORM\Column(type: 'smallint', nullable: true)]
private $lapType;
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private $deviceUID;
#[ORM\OneToMany(targetEntity: RequestLog::class, mappedBy: 'routeLap')]
private $requestLogs;
#[ORM\Column(type: 'boolean', nullable: true)]
private $drivingType;
#[ORM\Column(type: 'boolean', options: ['default' => false])]
private $inParkingDirection = false;
public function __construct()
{
$this->requestLogs = new ArrayCollection();
}
/**
* Metoda do zwracania kluczowych informacji o pojedynczym przejeździe
*/
public function getLapData(): iterable
{
return [
'parking' => $this->getParking() ? $this->getParking()->getName() : 'Brak parkingu',
'lapDate' => $this->getStartTime() ? $this->getStartTime()->format('d.m.Y') : 'Brak daty przejazdu',
'startTime' => $this->getStartTime() ? $this->getStartTime()->format('H:i:s') : 'Brak czasu rozpoczęcia przejazdu',
'endTime' => $this->getLastTime() ? $this->getLastTime()->format('H:i:s') : 'Brak czasu zakończenia przejazdu',
'numberOfRequests' => $this->getRequestLogs() ? count($this->getRequestLogs()) : 0,
'drivingType' => $this->getDrivingTypeTranslated()
];
}
/**
* Metoda do wyciągania informacji na temat pojedynczych odczytów wykonanych podczas danego przejazdu
*/
public function getLapLogsData(): iterable
{
$logs = [];
foreach ($this->getRequestLogs() as $log) {
// Dane całego loga
$logs[] = $log->getBasicLogData();
}
return $logs;
}
public function getId(): ?int
{
return $this->id;
}
public function getStartTime(): ?\DateTimeInterface
{
return $this->startTime;
}
public function setStartTime(\DateTimeInterface $startTime): self
{
$this->startTime = $startTime;
return $this;
}
public function getLastTime(): ?\DateTimeInterface
{
return $this->lastTime;
}
public function setLastTime(?\DateTimeInterface $lastTime): self
{
$this->lastTime = $lastTime;
return $this;
}
public function getInspectorId(): ?int
{
return $this->inspectorId;
}
public function setInspectorId(int $inspectorId): self
{
$this->inspectorId = $inspectorId;
return $this;
}
public function getTotalPlaces(): ?int
{
return $this->totalPlaces;
}
public function setTotalPlaces(?int $totalPlaces): self
{
$this->totalPlaces = $totalPlaces;
return $this;
}
public function getOccupiedPlaces(): ?int
{
return $this->occupiedPlaces;
}
public function setOccupiedPlaces(?int $occupiedPlaces): self
{
$this->occupiedPlaces = $occupiedPlaces;
return $this;
}
public function getOccupancyState(): ?int
{
return $this->occupancyState;
}
public function setOccupancyState(?int $occupancyState): self
{
$this->occupancyState = $occupancyState;
return $this;
}
public function getLastOccupancyChange(): ?\DateTimeInterface
{
return $this->lastOccupancyChange;
}
public function setLastOccupancyChange(?\DateTimeInterface $lastOccupancyChange): self
{
$this->lastOccupancyChange = $lastOccupancyChange;
return $this;
}
public function getUnpaidPlaces(): ?int
{
return $this->unpaidPlaces;
}
public function setUnpaidPlaces(?int $unpaidPlaces): self
{
$this->unpaidPlaces = $unpaidPlaces;
return $this;
}
public function getPaymentState(): ?int
{
return $this->paymentState;
}
public function setPaymentState(?int $paymentState): self
{
$this->paymentState = $paymentState;
return $this;
}
public function getLastPaymentChange(): ?\DateTimeInterface
{
return $this->lastPaymentChange;
}
public function setLastPaymentChange(?\DateTimeInterface $lastPaymentChange): self
{
$this->lastPaymentChange = $lastPaymentChange;
return $this;
}
public function getParking(): ?Parking
{
return $this->parking;
}
public function setParking(?Parking $parking): self
{
$this->parking = $parking;
return $this;
}
public function getLapType(): ?int
{
return $this->lapType;
}
public function setLapType(?int $lapType): self
{
$this->lapType = $lapType;
return $this;
}
public function getDeviceUID(): ?string
{
return $this->deviceUID;
}
public function setDeviceUID(?string $deviceUID): self
{
$this->deviceUID = $deviceUID;
return $this;
}
public function getRequestLogs(): Collection
{
return $this->requestLogs;
}
public function addRequestLog(RequestLog $requestLog): self
{
if (!$this->requestLogs->contains($requestLog)) {
$this->requestLogs[] = $requestLog;
$requestLog->setRouteLap($this);
}
return $this;
}
public function removeRequestLog(RequestLog $requestLog): self
{
if ($this->requestLogs->removeElement($requestLog)) {
// set the owning side to null (unless already changed)
if ($requestLog->getRouteLap() === $this) {
$requestLog->setRouteLap(null);
}
}
return $this;
}
public function getParkingZone(): ?Zone
{
return $this->getParking() ? $this->getParking()->getZone() : null;
}
public function getParkingStreet(): ?string
{
if ($this->getParking() && $streets = $this->getParking()->getDataAggregators()) {
return $streets[0]->getName();
}
return null;
}
public function getDrivingType(): ?bool
{
return $this->drivingType;
}
public function setDrivingType(?bool $drivingType): self
{
$this->drivingType = $drivingType;
return $this;
}
public function getDrivingTypeTranslated(): ?string
{
if ($this->getDrivingType()) {
return 'Pojazd lider/samodzielny przejazd';
}
return 'Pojazd podążający';
}
public function isInParkingDirection(): ?bool
{
return $this->inParkingDirection;
}
public function setInParkingDirection(bool $inParkingDirection): self
{
$this->inParkingDirection = $inParkingDirection;
return $this;
}
}