<?php
namespace App\Entity;
use App\Concern\Codifiable;
use App\Repository\TicketRepository;
use DateTimeImmutable;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Uid\Uuid;
#[ORM\Entity(repositoryClass: TicketRepository::class)]
#[ORM\Index(columns: ['place'], name: 'tickets_idx_place')]
#[ORM\Index(columns: ['notifier'], name: 'tickets_idx_notifier')]
class Ticket
{
use Codifiable;
public const CODE_NUMBER_LENGTH = 5;
public const TICKET_CODE_PREFIX = 'IN';
public const IN_PROGRESS = '2b78d5d9-d1ec-40d3-82ba-6d6d66ad713f';
public const REOPENED = '376e061f-dcda-4f44-bdfb-6f8182d309e9';
public const CLOSED = '41912f3d-c4db-4fb0-bd1e-74bbb6020cc9';
public const CREATED = 'ec4032b7-5407-4977-80cf-97f1e0e6eb36';
#[ORM\OneToMany(mappedBy: 'ticket', targetEntity: Update::class)]
private Collection $updates;
public function __construct(
#[ORM\Id]
#[ORM\Column(type:"string", length:36)]
private ?string $id = null,
#[ORM\Column(type:"text", nullable: true)]
private ?string $summary = null,
#[ORM\Column(type:"text", nullable: true)]
private ?string $description = null,
#[ORM\Column(type:"string", nullable: true)]
private ?string $userCode = null,
#[ORM\Column(type:"string", nullable: true)]
private ?string $receiver = null,
#[ORM\Column(type: 'string', nullable: true)]
private ?string $notifier = null,
#[ORM\Column(type: 'string', nullable: true)]
private ?string $place = null,
#[ORM\Column(type: 'json', nullable: true)]
private ?array $extraData = null,
#[ORM\Column(type: 'datetime_immutable', nullable: true)]
private ?DateTimeImmutable $createdAt = null,
#[ORM\Column(type: 'datetime_immutable', nullable: true)]
private ?DateTimeImmutable $updatedAt = null,
#[ORM\ManyToOne(inversedBy: 'tickets')]
#[ORM\JoinColumn(name:"statusId", referencedColumnName:"id")]
private ?Status $status = null,
#[ORM\ManyToOne(inversedBy: 'tickets')]
#[ORM\JoinColumn(name:"priorityId", referencedColumnName:"id")]
private ?Priority $priority = null,
#[ORM\ManyToOne(inversedBy: 'tickets')]
#[ORM\JoinColumn(name:"reasonId", referencedColumnName:"id")]
private ?Reason $reason = null,
#[ORM\ManyToOne(inversedBy: 'tickets')]
#[ORM\JoinColumn(name:"categoryId", referencedColumnName:"id")]
private ?Category $category = null,
#[ORM\ManyToOne(inversedBy: 'tickets')]
#[ORM\JoinColumn(name:"locationId", referencedColumnName:"id")]
private ?Location $location = null,
#[ORM\ManyToOne(inversedBy: 'tickets')]
#[ORM\JoinColumn(name:"rateId", referencedColumnName:"id")]
private ?Rate $rate = null,
#[ORM\ManyToOne(inversedBy: 'tickets')]
#[ORM\JoinColumn(name:"agentId", referencedColumnName:"id")]
private ?Agent $agent = null,
#[ORM\Column(type: 'datetime_immutable', nullable: true)]
private ?DateTimeImmutable $adminReadedAt = null,
#[ORM\Column(type: 'datetime_immutable', nullable: true)]
private ?DateTimeImmutable $userReadedAt = null,
#[ORM\Column(type:"string", length: 36, nullable: true)]
private ?string $marketId = null,
#[ORM\Column(type:"boolean", options: ['default' => false])]
private bool $isInquiry = false,
) {
$this->id = is_null($this->id) ? Uuid::v4()->toRfc4122() : $this->id;
$this->updates = new ArrayCollection();
$this->createdAt = $this->createdAt ?? new DateTimeImmutable('now');
}
public function setIsInquiry(bool $isInquiry): void
{
$this->isInquiry = $isInquiry;
}
public function getIsInquiry(): bool
{
return $this->isInquiry;
}
public function getId(): ?string
{
return $this->id;
}
public function getTicketCode(): string
{
$codeNumber = $this->getCodeNumberString();
return sprintf('%s-%s', self::TICKET_CODE_PREFIX, $codeNumber);
}
public function getSummary(): ?string
{
return $this->summary;
}
public function setSummary(string $summary): self
{
$this->summary = $summary;
$this->markAsUpdated();
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(string $description): self
{
$this->description = $description;
$this->markAsUpdated();
return $this;
}
public function getUserCode(): ?string
{
return $this->userCode;
}
/**
* @return string|null
*/
public function getPlace(): ?string
{
return $this->place;
}
/**
* @param string|null $place
* @return self
*/
public function setPlace(?string $place): self
{
$this->place = $place;
$this->markAsUpdated();
return $this;
}
/**
* @return string|null
*/
public function getNotifier(): ?string
{
return $this->notifier;
}
/**
* @param string|null $notifier
* @return self
*/
public function setNotifier(?string $notifier): self
{
$this->notifier = $notifier;
$this->markAsUpdated();
return $this;
}
public function setUserCode(string $userCode): self
{
$this->userCode = $userCode;
$this->markAsUpdated();
return $this;
}
public function getCreatedAt(): ?DateTimeImmutable
{
return $this->createdAt;
}
public function setCreatedAt(DateTimeImmutable $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getUpdatedAt(): ?\DateTimeInterface
{
return $this->updatedAt;
}
public function setUpdatedAt(\DateTimeImmutable $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
public function markAsUpdated(): void
{
$this->updatedAt = new \DateTimeImmutable();
}
public function __toString(): string
{
return $this->getCodeNumberString();
}
public function getPriority(): ?Priority
{
return $this->priority;
}
public function setPriority(?Priority $priority): self
{
$this->priority = $priority;
$this->markAsUpdated();
return $this;
}
public function getReason(): ?Reason
{
return $this->reason;
}
public function setReason(?Reason $reason): self
{
$this->reason = $reason;
$this->markAsUpdated();
return $this;
}
public function getStatus(): ?Status
{
return $this->status;
}
public function setStatus(?Status $status): self
{
$this->status = $status;
$this->markAsUpdated();
return $this;
}
public function getCategory(): ?Category
{
return $this->category;
}
public function setCategory(?Category $category): self
{
$this->category = $category;
$this->markAsUpdated();
return $this;
}
public function getLocation(): ?Location
{
return $this->location;
}
public function setLocation(?Location $location): self
{
$this->location = $location;
$this->markAsUpdated();
return $this;
}
public function getRate(): ?Rate
{
return $this->rate;
}
public function setRate(?Rate $rate): self
{
$this->rate = $rate;
$this->markAsUpdated();
return $this;
}
public function getAgent(): ?Agent
{
return $this->agent;
}
public function setAgent(?Agent $agent): self
{
$this->agent = $agent;
$this->markAsUpdated();
return $this;
}
/**
* @return Collection<int, Update>
*/
public function getUpdates(): Collection
{
return $this->updates;
}
public function addUpdate(Update $update): self
{
if (!$this->updates->contains($update)) {
$this->updates->add($update);
$update->setTicket($this);
}
return $this;
}
public function removeUpdate(Update $update): self
{
if ($this->updates->removeElement($update)) {
// set the owning side to null (unless already changed)
if ($update->getTicket() === $this) {
$update->setTicket(null);
}
}
return $this;
}
public function getExtraData(): ?array
{
return $this->extraData;
}
public function setExtraData(?array $extraData): void
{
$this->extraData = $extraData;
}
/**
* @return DateTimeImmutable|null
*/
public function getAdminReadedAt(): ?DateTimeImmutable
{
return $this->adminReadedAt;
}
/**
* @param DateTimeImmutable|null $adminReadedAt
*/
public function setAdminReadedAt(?DateTimeImmutable $adminReadedAt): void
{
$this->adminReadedAt = $adminReadedAt;
}
/**
* @return DateTimeImmutable|null
*/
public function getUserReadedAt(): ?DateTimeImmutable
{
return $this->userReadedAt;
}
/**
* @param DateTimeImmutable|null $userReadedAt
*/
public function setUserReadedAt(?DateTimeImmutable $userReadedAt): void
{
$this->userReadedAt = $userReadedAt;
}
/**
* @return string|null
*/
public function getReceiver(): ?string
{
return $this->receiver;
}
/**
* @param string|null $receiver
*/
public function setReceiver(?string $receiver): void
{
$this->receiver = $receiver;
}
public function getMarketId(): ?string
{
return $this->marketId;
}
public function setMarketId(?string $marketId): void
{
$this->marketId = $marketId;
}
public function isClose(): bool
{
return $this->status instanceof Status && $this->status->getIsClose();
}
}