<?php
namespace App\Entity\App;
use App\Utils\CommonFunctions;
use App\Utils\Constants;
use App\Utils\Traits\ActivoTrait;
use App\Utils\Traits\PosicionTrait;
use App\Validator\UniqueCategoriaNombre;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\SoftDeleteable\Traits\SoftDeleteableEntity;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\Validator\Constraints as Assert;
/**
* Categoria
*
* @ORM\Table(name="categoria", indexes={@ORM\Index(name="IDX_NOMBRE", columns={"nombre"})})
* @ORM\Entity(repositoryClass="App\Repository\App\CategoriaRepository")
* @Gedmo\SoftDeleteable(fieldName="deletedAt", timeAware=false)
* @ORM\HasLifecycleCallbacks()
* @UniqueEntity(
* fields={"etiqueta"},
* message="La etiqueta ya está en uso. Por favor, elige otro."
* )
* @UniqueCategoriaNombre()
*/
class Categoria
{
const ASPECT_RATIO = array('width' => 1, 'height' => 1);
/**
* @var integer|null
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue
*/
private $id;
/**
* @var File|null
*/
private $file;
/**
* @var string|null
*
* @ORM\Column(name="nombre", type="string", length=255)
* @Assert\NotBlank(message="El valor es requerido")
*/
private $nombre;
/**
* @var string|null
*
* @ORM\Column(name="descripcion", type="string", length=255, nullable=true)
* @Assert\Length(
* max = 255,
* maxMessage = "La cantidad maxima es {{ limit }} caracteres"
* )
*/
private $descripcion;
/**
* @var string|null
*
* @ORM\Column(name="icono", type="text")
* @Assert\Length(
* max = 2000,
* maxMessage = "La cantidad maxima es {{ limit }} caracteres"
* )
*/
private $icono;
/**
* @var Categoria|null
*
* @ORM\ManyToOne(targetEntity="App\Entity\App\Categoria", inversedBy="subCategorias")
* @ORM\JoinColumn(name="categoria_id", referencedColumnName="id")
*/
private $categoria;
/**
* @ORM\OneToMany(targetEntity="App\Entity\App\Categoria", mappedBy="categoria", cascade={"persist", "remove"})
* @ORM\OrderBy({"posicion"="ASC", "nombre"="ASC"})
*/
private $subCategorias;
/**
* @ORM\OneToMany(targetEntity="App\Entity\App\Grupo", mappedBy="categoria", cascade={"persist", "remove"})
* @ORM\OrderBy({"posicion"="ASC", "nombre"="ASC"})
*/
private $grupos;
/**
* @ORM\OneToMany(targetEntity="App\Entity\App\MaterialRecurso", mappedBy="categoria", cascade={"persist", "remove"})
* @ORM\OrderBy({"posicion"="ASC", "nombre"="ASC"})
*/
private $materialesRecursos;
/**
* @var TipoCategoria|null
* @ORM\ManyToOne(targetEntity="App\Entity\App\TipoCategoria", inversedBy="categorias")
* @ORM\JoinColumn(name="tipo_categoria_id", referencedColumnName="id", nullable=false)
*/
private $tipoCategoria;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\App\Tramite", mappedBy="categorias")
*/
private $tramites;
/**
* @var string|null
* @ORM\Column(name="url", type="string")
*/
private $url;
/**
* @var string|null
* @ORM\Column(name="etiqueta", type="string")
*/
private $etiqueta;
/**
* @var string|null
* @ORM\Column(name="color", type="string", length=32, nullable=true)
* @Assert\Length(
* max = 32,
* maxMessage = "El color no puede tener más de {{ limit }} caracteres"
* )
* @Assert\Regex(
* pattern="/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/",
* message="El color debe ser un código hexadecimal válido (ej: #FFF o #FFFFFF)"
* )
*/
private $color;
use ActivoTrait;
use PosicionTrait;
use TimestampableEntity;
use SoftDeleteableEntity;
public function __construct()
{
$this->subCategorias = new ArrayCollection();
$this->grupos = new ArrayCollection();
$this->materialesRecursos = new ArrayCollection();
$this->tramites = new ArrayCollection();
}
/**
* @return int|null
*/
public function getId(): ?int
{
return $this->id;
}
/**
* @return File|null
*/
public function getFile(): ?File
{
return $this->file;
}
/**
* @param File|null $file
*/
public function setFile(?File $file): void
{
$this->file = $file;
}
/**
* @return string|null
*/
public function getNombre(): ?string
{
return $this->nombre;
}
/**
* @param string|null $nombre
*/
public function setNombre(?string $nombre): void
{
$this->nombre = $nombre;
}
/**
* @return string|null
*/
public function getDescripcion(): ?string
{
return $this->descripcion;
}
/**
* @param string|null $descripcion
*/
public function setDescripcion(?string $descripcion): void
{
$this->descripcion = $descripcion;
}
/**
* @return string|null
*/
public function getIcono(): ?string
{
return $this->icono;
}
/**
* @param string|null $icono
*/
public function setIcono(?string $icono): void
{
$this->icono = $icono;
}
/**
* @return Categoria|null
*/
public function getCategoria(): ?Categoria
{
return $this->categoria;
}
/**
* @param Categoria|null $categoria
*/
public function setCategoria(?Categoria $categoria): void
{
$this->categoria = $categoria;
}
/**
* @return Collection
*/
public function getSubCategorias(): Collection
{
return $this->subCategorias;
}
/**
* @param Collection $subCategorias
*/
public function setSubCategorias(Collection $subCategorias): void
{
$this->subCategorias = $subCategorias;
}
/**
* @return Collection
*/
public function getGrupos(): Collection
{
return $this->grupos;
}
/**
* @param Collection $grupos
*/
public function setGrupos(Collection $grupos): void
{
$this->grupos = $grupos;
}
/**
* @return Collection
*/
public function getMaterialesRecursos(): Collection
{
return $this->materialesRecursos;
}
/**
* @param Collection $materialesRecursos
*/
public function setMaterialesRecursos(Collection $materialesRecursos): void
{
$this->materialesRecursos = $materialesRecursos;
}
private function getDirectoryFile()
{
$class = CommonFunctions::getClassMethod(__CLASS__);
$class = CommonFunctions::camelCaseToSnakeCase($class, '-');
$dir = CommonFunctions::getParameter('BASE_PATH_IMAGENES');
return CommonFunctions::getPathOrURLWithSlash($dir) . $class;
}
public function getAbsolutePath()
{
return CommonFunctions::getAbsolutePath($this->getDirectoryFile(), $this->getIcono());
}
public function guardarImagen()
{
$name = 'imagen_categoria_' . $this->getId();
$filename = CommonFunctions::saveUploadedFile($this->getFile(), $this->getDirectoryFile(), $name);
if ($filename && $filename != $this->getIcono()) {
$this->preRemove();
$this->setIcono($filename);
}
}
/**
* @ORM\PrePersist
*/
public function prePersist()
{
if (!$this->getIcono()) {
$this->setIcono(Constants::NO_IMAGE_ICON);
}
}
/**
* @ORM\PreRemove
*/
public function preRemove()
{
CommonFunctions::removeFile($this->getAbsolutePath());
}
public function getImagenBase64()
{
$image = null;
if ($this->getId()) {
$image = CommonFunctions::getBase64OfImage($this->getAbsolutePath(), Constants::DEFAULT_IMAGE);
}
return $image;
}
public function getIconoValue()
{
return $this->esSubCategoria() ? $this->getIcono() : $this->getImagenBase64();
}
public function esSubCategoria()
{
return $this->getCategoria() !== null;
}
public function getNivel($nivel = 1)
{
if ($this->getCategoria()) {
$nivel = $this->getCategoria()->getNivel($nivel + 1);
}
return $nivel;
}
public function getBreadcrumb($categorias = array())
{
if ($this->getCategoria()) {
$categorias[] = $this->getCategoria();
$categorias = array_reverse($this->getCategoria()->getBreadcrumb($categorias));
}
return array_reverse($categorias);
}
public function getMaterialesRecursosCategoria()
{
$materialesRecursos = $this->getMaterialesRecursos();
$materialesRecursosCategoria = array();
foreach ($materialesRecursos as $materialRecurso) {
if (!$materialRecurso->getGrupo()) {
$materialesRecursosCategoria[] = $materialRecurso;
}
}
return $materialesRecursosCategoria;
}
public function getAllChilds()
{
return array_merge(
$this->getChildCategorias(),
$this->getChildGrupos(),
$this->getChildTramites(),
$this->getChildMaterialesRecursos()
);
}
private function getChildCategorias($categorias = array())
{
$categorias = array_merge($categorias, $this->getSubCategorias()->toArray());
foreach ($this->getSubCategorias() as $categoria) {
$categorias = array_merge($categorias, $categoria->getChildCategorias());
}
return $categorias;
}
private function getChildGrupos()
{
$grupos = $this->getGrupos()->toArray();
foreach ($this->getChildCategorias() as $categoria) {
$grupos = array_merge($grupos, $categoria->getGrupos()->toArray());
}
return $grupos;
}
private function getChildTramites()
{
$tramites = array();
foreach ($this->getChildGrupos() as $grupo) {
$tramites = array_merge($tramites, $grupo->getTramites()->toArray());
}
return $tramites;
}
private function getChildMaterialesRecursos()
{
$materialesRecursos = $this->getMaterialesRecursos()->toArray();
foreach ($this->getChildCategorias() as $categoria) {
$materialesRecursos = array_merge($materialesRecursos, $categoria->getMaterialesRecursos()->toArray());
}
return $materialesRecursos;
}
public function __toString()
{
$nuevo = $this->esSubCategoria() ? 'Nueva subcategoría' : 'Nueva categoría';
return $this->getNombre() ?: $nuevo;
}
public function getTipoCategoria(): ?TipoCategoria
{
return $this->tipoCategoria;
}
public function setTipoCategoria(?TipoCategoria $tipoCategoria): void
{
$this->tipoCategoria = $tipoCategoria;
}
public function getTramites(): Collection
{
return $this->tramites;
}
public function getUrl(): ?string
{
return $this->url;
}
public function setUrl(?string $url): void
{
$this->url = $url;
}
public function getEtiqueta(): ?string
{
return $this->etiqueta;
}
public function setEtiqueta(?string $etiqueta): void
{
$this->etiqueta = $etiqueta;
}
public function getColor(): ?string
{
return $this->color;
}
public function setColor(?string $color): void
{
$this->color = $color;
}
}