<?php
namespace App\Entity\FielpetPol;
use App\Entity\Traits\LoggableTrait;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* Ticket
*
* @ORM\Table(name="ticket")
* @ORM\Entity(repositoryClass="App\Repository\FielpetPol\TicketRepository")
* @ORM\HasLifecycleCallbacks()
*/
class Ticket
{
use LoggableTrait;
const ESTADO_ABIERTO = 'Abierto';
const ESTADO_CERRADO = 'Cerrado';
const ESTADO_PENDIENTE = 'Pendiente';
const ESTADO_DEVUELTO = 'Devuelto';
const ESTADO_REABIERTO = 'Re-Abierto';
public static function getEstados(): array
{
return [
self::ESTADO_ABIERTO => self::ESTADO_ABIERTO,
self::ESTADO_CERRADO => self::ESTADO_CERRADO,
self::ESTADO_PENDIENTE => self::ESTADO_PENDIENTE,
self::ESTADO_DEVUELTO => self::ESTADO_DEVUELTO,
self::ESTADO_REABIERTO => self::ESTADO_REABIERTO,
];
}
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="titulo", type="string", length=255, nullable=false)
*/
private $titulo;
/**
* @var string
*
* @ORM\Column(name="descripcion", type="text", nullable=false)
*/
private $descripcion;
/**
* @var string
*
* @ORM\Column(name="estado", type="string", length=50, nullable=false, options={"default"="Abierto"})
*/
private $estado = self::ESTADO_ABIERTO;
/**
* @var string
*
* @ORM\Column(name="prioridad", type="string", length=50, nullable=false, options={"default"="Normal"})
*/
private $prioridad = 'Normal';
/**
* @var string|null
*
* @ORM\Column(name="categoria", type="string", length=100, nullable=true)
*/
private $categoria;
/**
* @var \DateTime
*
* @ORM\Column(name="fecha_creacion", type="datetime", nullable=false)
*/
private $fechaCreacion;
/**
* @var \DateTime|null
*
* @ORM\Column(name="fecha_cierre", type="datetime", nullable=true)
*/
private $fechaCierre;
/**
* @var \DateTime|null
*
* @ORM\Column(name="deleted_at", type="datetime", nullable=true)
*/
private $deletedAt;
/**
* @var Usuario
*
* @ORM\ManyToOne(targetEntity="App\Entity\FielpetPol\Usuario")
* @ORM\JoinColumn(name="usuario_id", referencedColumnName="id", nullable=false)
*/
private $usuario;
/**
* @var Collection|TicketRespuesta[]
*
* @ORM\OneToMany(targetEntity="App\Entity\FielpetPol\TicketRespuesta", mappedBy="ticket", cascade={"persist", "remove"}, orphanRemoval=true)
* @ORM\OrderBy({"fechaCreacion" = "ASC"})
*/
private $respuestas;
/**
* @var Collection|TicketAdjunto[]
*
* @ORM\OneToMany(targetEntity="App\Entity\FielpetPol\TicketAdjunto", mappedBy="ticket", cascade={"remove"})
* @ORM\OrderBy({"fechaCreacion" = "ASC"})
*/
private $adjuntos;
public function __construct()
{
$this->respuestas = new ArrayCollection();
$this->adjuntos = new ArrayCollection();
$this->fechaCreacion = new \DateTime();
}
// --- Getters & Setters ---
public function getId(): ?int
{
return $this->id;
}
public function getTitulo(): ?string
{
return $this->titulo;
}
public function setTitulo(string $titulo): static
{
$this->titulo = $titulo;
return $this;
}
public function getDescripcion(): ?string
{
return $this->descripcion;
}
public function setDescripcion(string $descripcion): static
{
$this->descripcion = $descripcion;
return $this;
}
public function getEstado(): ?string
{
return $this->estado;
}
public function setEstado(string $estado): static
{
$this->estado = $estado;
if ($estado === self::ESTADO_CERRADO && $this->fechaCierre === null) {
$this->fechaCierre = new \DateTime();
}
if ($estado !== self::ESTADO_CERRADO) {
$this->fechaCierre = null;
}
return $this;
}
public function getPrioridad(): ?string
{
return $this->prioridad;
}
public function setPrioridad(string $prioridad): static
{
$this->prioridad = $prioridad;
return $this;
}
public function getCategoria(): ?string
{
return $this->categoria;
}
public function setCategoria(?string $categoria): static
{
$this->categoria = $categoria;
return $this;
}
public function getFechaCreacion(): ?\DateTimeInterface
{
return $this->fechaCreacion;
}
public function setFechaCreacion(\DateTimeInterface $fechaCreacion): static
{
$this->fechaCreacion = $fechaCreacion;
return $this;
}
public function getFechaCierre(): ?\DateTimeInterface
{
return $this->fechaCierre;
}
public function setFechaCierre(?\DateTimeInterface $fechaCierre): static
{
$this->fechaCierre = $fechaCierre;
return $this;
}
public function getUsuario(): ?Usuario
{
return $this->usuario;
}
public function setUsuario(?Usuario $usuario): static
{
$this->usuario = $usuario;
return $this;
}
public function getRespuestas(): Collection
{
return $this->respuestas;
}
public function addRespuesta(TicketRespuesta $respuesta): static
{
if (!$this->respuestas->contains($respuesta)) {
$this->respuestas[] = $respuesta;
$respuesta->setTicket($this);
}
return $this;
}
public function removeRespuesta(TicketRespuesta $respuesta): static
{
if ($this->respuestas->removeElement($respuesta)) {
if ($respuesta->getTicket() === $this) {
$respuesta->setTicket(null);
}
}
return $this;
}
public function getTotalRespuestas(): int
{
return $this->respuestas->count();
}
public function getDeletedAt(): ?\DateTimeInterface
{
return $this->deletedAt;
}
public function setDeletedAt(?\DateTimeInterface $deletedAt): static
{
$this->deletedAt = $deletedAt;
return $this;
}
public function isDeleted(): bool
{
return $this->deletedAt !== null;
}
public function getAdjuntos(): Collection
{
return $this->adjuntos;
}
/**
* Solo los adjuntos cargados en la creación/edición del ticket (no los de comentarios)
*/
public function getAdjuntosDirectos(): Collection
{
return $this->adjuntos->filter(fn(TicketAdjunto $a) => $a->getTicketRespuesta() === null);
}
}