<?php
namespace App\Entity;
use App\Enum\RolEnum;
use App\Validator as ConforcatAssert;
use DateTime;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity
* @ORM\Table(name="usuario_hermes")
* @method string getUserIdentifier()
*/
class UsuarioHermes extends BaseEntity implements UserInterface
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $name;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $surname;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $username;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $password;
/**
* @ORM\Column(type="string", nullable=true, name="metodo_authenticacion")
*/
private $metodoAuthenticacion;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $telefono;
/**
* @ORM\Column(type="string", nullable=true, name="user_token")
*/
private $userToken;
/**
* @ORM\Column(type="datetime", nullable=true, name="deleted_at")
*/
private $deletedAt;
/**
* @ORM\Column(type="datetime", nullable=false, name="updated_at", options={"default":"2024-01-01 00:00:00"})
* @Gedmo\Timestampable(on="update")
*/
private $updatedAt;
/**
* @ORM\Column(type="datetime", nullable=false, name="created_at", options={"default":"2024-01-01 00:00:00"})
* @Gedmo\Timestampable(on="create")
*/
private $createdAt;
/**
* @ORM\Column(type="array", nullable=true)
*/
private $roles;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $salt;
/**
* @ORM\Column(type="string", unique=true, nullable=true)
* @Assert\Email()
*/
private $email;
/**
* @ConforcatAssert\ConstraintIdentidad()
* @ORM\Column(type="string", unique=true, nullable=true)
*/
private $dni;
/**
* @ORM\Column(type="boolean", nullable=true, name="aceptaLodp")
*/
private $aceptaLodp;
/**
* @ORM\Column(type="boolean", nullable=true, options={"default":1})
*/
private $active=1;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $tokenValid;
/**
* @ORM\Column(type="datetime", nullable=true, name="password_changed_at")
* @Gedmo\Timestampable(on="change", field="password")
*/
private $passwordChangedAt;
/**
* @ORM\OneToMany(
* targetEntity=\App\Entity\PropietarioContenidoHasUsuarioHermes::class,
* mappedBy="usuarioHermes",
* cascade={"all"}
* )
*/
private $propietarioContenidoHasUsuarioHermes;
/**
* @ORM\OneToMany(targetEntity=\App\Entity\MensajeLeidoForo::class, mappedBy="usuario")
*/
private $mensajeLeidoForos;
private $plainPassword;
/**
* @ORM\ManyToMany(targetEntity=\App\Entity\SolicitudAccionFormativa::class, inversedBy="usuarioHermesInteres")
* @ORM\JoinTable(
* name="muestra_interes_solicitud",
* joinColumns={@ORM\JoinColumn(name="usuario_hermes_id", referencedColumnName="id", nullable=false)},
* inverseJoinColumns={@ORM\JoinColumn(name="solicitud_accion_formativa_id", referencedColumnName="id", nullable=false)}
* )
*/
private $solicitudesInteres;
/**
* @ORM\ManyToMany(targetEntity=\App\Entity\SolicitudAccionFormativa::class, inversedBy="usuarioHermesFavorito")
* @ORM\JoinTable(
* name="registra_favorito_solicitud",
* joinColumns={@ORM\JoinColumn(name="usuario_hermes_id", referencedColumnName="id", nullable=false)},
* inverseJoinColumns={@ORM\JoinColumn(name="solicitud_accion_formativa_id", referencedColumnName="id", nullable=false)}
* )
*/
private $solicitudesFavorito;
/**
* @ORM\ManyToMany(targetEntity=\App\Entity\CentroFormacion::class, mappedBy="usuarioHermesFavorito")
*/
private $centrosFormacionFavorito;
/**
* @ORM\ManyToMany(targetEntity=\App\Entity\Grupo::class, inversedBy="usuarioHermesInteres")
* @ORM\JoinTable(
* name="muestra_interes_grupo",
* joinColumns={@ORM\JoinColumn(name="usuario_hermes_id", referencedColumnName="id", nullable=false)},
* inverseJoinColumns={@ORM\JoinColumn(name="grupo_id", referencedColumnName="id", nullable=false)}
* )
*/
private $gruposInteres;
/**
* @ORM\ManyToMany(targetEntity=\App\Entity\Grupo::class, inversedBy="usuarioHermesFavorito")
* @ORM\JoinTable(
* name="registra_favorito_grupo",
* joinColumns={@ORM\JoinColumn(name="usuario_hermes_id", referencedColumnName="id", nullable=false)},
* inverseJoinColumns={@ORM\JoinColumn(name="grupo_id", referencedColumnName="id", nullable=false)}
* )
*/
private $gruposFavorito;
/**
* @ORM\ManyToMany(targetEntity=\App\Entity\EntidadColaboradora::class, inversedBy="usuarioHermesFavorito")
* @ORM\JoinTable(
* name="usuario_hermes_has_favorito_entidad_colaboradora",
* joinColumns={@ORM\JoinColumn(name="usuario_hermes_id", referencedColumnName="id", nullable=false)},
* inverseJoinColumns={@ORM\JoinColumn(name="entidad_colaboradora_id", referencedColumnName="id", nullable=false)}
* )
*/
private $entidadColaboradorasFavorito;
/**
* @ORM\ManyToMany(targetEntity=\App\Entity\Formador::class, inversedBy="usuarioHermesFavorito")
* @ORM\JoinTable(
* name="usuario_hermes_has_favorito_formador",
* joinColumns={@ORM\JoinColumn(name="usuario_hermes_id", referencedColumnName="id", nullable=false)},
* inverseJoinColumns={@ORM\JoinColumn(name="formador_id", referencedColumnName="id", nullable=false)}
* )
*/
private $formadoresFavorito;
public function __construct()
{
$this->propietarioContenidoHasUsuarioHermes = new ArrayCollection();
$this->solicitudesFavorito = new ArrayCollection();
$this->solicitudesInteres = new ArrayCollection();
$this->gruposFavorito = new ArrayCollection();
$this->gruposInteres = new ArrayCollection();
$this->entidadColaboradorasFavorito = new ArrayCollection();
$this->formadoresFavorito = new ArrayCollection();
$this->centrosFormacionFavorito = new ArrayCollection();
$this->mensajeLeidoForos = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function setId($id)
{
$this->id = $id;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(?string $name): static
{
$this->name = $name;
return $this;
}
public function getSurname(): ?string
{
return $this->surname;
}
public function setSurname(?string $surname): static
{
$this->surname = $surname;
return $this;
}
public function getUsername(): ?string
{
return $this->username;
}
public function setUsername(?string $username): static
{
$this->username = $username;
return $this;
}
public function getPassword(): ?string
{
return $this->password;
}
public function setPassword(?string $password): static
{
$this->password = $password;
$this->setPasswordChangedAt(new DateTime());
return $this;
}
public function getMetodoAuthenticacion(): ?string
{
return $this->metodoAuthenticacion;
}
public function setMetodoAuthenticacion(?string $metodoAuthenticacion): static
{
$this->metodoAuthenticacion = $metodoAuthenticacion;
return $this;
}
public function getTelefono(): ?string
{
return $this->telefono;
}
public function setTelefono(?string $telefono): static
{
$this->telefono = $telefono;
return $this;
}
public function getUserToken(): ?string
{
return $this->userToken;
}
public function setUserToken(?string $userToken): static
{
$this->userToken = $userToken;
return $this;
}
public function getDeletedAt(): ?\DateTimeInterface
{
return $this->deletedAt;
}
public function setDeletedAt(?\DateTimeInterface $deletedAt): static
{
$this->deletedAt = $deletedAt;
return $this;
}
public function getUpdatedAt(): ?\DateTimeInterface
{
return $this->updatedAt;
}
public function setUpdatedAt(\DateTimeInterface $updatedAt): static
{
$this->updatedAt = $updatedAt;
return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeInterface $createdAt): static
{
$this->createdAt = $createdAt;
return $this;
}
public function getRoles(): ?array
{
return $this->roles;
}
public function setRoles(?array $roles): static
{
$this->roles = $roles;
return $this;
}
public function getSalt(): ?string
{
return $this->salt;
}
public function setSalt(?string $salt): static
{
$this->salt = $salt;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(?string $email): static
{
$this->email = $email;
return $this;
}
public function getDni(): ?string
{
return $this->dni;
}
public function setDni(?string $dni): static
{
$this->dni = $dni;
return $this;
}
public function isAceptaLodp(): ?bool
{
return $this->aceptaLodp;
}
public function setAceptaLodp(?bool $aceptaLodp): static
{
$this->aceptaLodp = $aceptaLodp;
return $this;
}
public function isActive(): ?bool
{
return $this->active;
}
public function setActive(?bool $active): static
{
$this->active = $active;
return $this;
}
public function getNombreCompleto(): ?string
{
return trim($this->getName() . ' ' . $this->getSurname())??'Sin Identificar';
}
/**
* @return Collection<int, PropietarioContenidoHasUsuarioHermes>
*/
public function getPropietarioContenidoHasUsuarioHermes(): Collection
{
return $this->propietarioContenidoHasUsuarioHermes;
}
public function addPropietarioContenidoHasUsuarioHerme(PropietarioContenidoHasUsuarioHermes $propietarioContenidoHasUsuarioHerme): static
{
if (!$this->propietarioContenidoHasUsuarioHermes->contains($propietarioContenidoHasUsuarioHerme)) {
$this->propietarioContenidoHasUsuarioHermes->add($propietarioContenidoHasUsuarioHerme);
$propietarioContenidoHasUsuarioHerme->setUsuarioHermes($this);
}
return $this;
}
public function removePropietarioContenidoHasUsuarioHerme(PropietarioContenidoHasUsuarioHermes $propietarioContenidoHasUsuarioHerme): static
{
if ($this->propietarioContenidoHasUsuarioHermes->removeElement($propietarioContenidoHasUsuarioHerme)) {
// set the owning side to null (unless already changed)
if ($propietarioContenidoHasUsuarioHerme->getUsuarioHermes() === $this) {
$propietarioContenidoHasUsuarioHerme->setUsuarioHermes(null);
}
}
return $this;
}
public function getPropietarioContenidos(): ArrayCollection
{
return $this->getPropietarioContenidoHasUsuarioHermes()?->map(fn($p) => $p->getPropietarioContenido());
}
public function eraseCredentials()
{
// TODO: Implement eraseCredentials() method.
}
/**
* @return Collection<int, SolicitudAccionFormativa>
*/
public function getSolicitudesFavorito(): Collection
{
return $this->solicitudesFavorito;
}
public function addSolicitudesFavorito(SolicitudAccionFormativa $solicitudesFavorito): static
{
if (!$this->solicitudesFavorito->contains($solicitudesFavorito)) {
$this->solicitudesFavorito->add($solicitudesFavorito);
}
return $this;
}
public function removeSolicitudesFavorito(SolicitudAccionFormativa $solicitudesFavorito): static
{
$this->solicitudesFavorito->removeElement($solicitudesFavorito);
return $this;
}
/**
* @return Collection<int, SolicitudAccionFormativa>
*/
public function getSolicitudesInteres(): Collection
{
return $this->solicitudesInteres;
}
public function addSolicitudesIntere(SolicitudAccionFormativa $solicitudesIntere): static
{
if (!$this->solicitudesInteres->contains($solicitudesIntere)) {
$this->solicitudesInteres->add($solicitudesIntere);
}
return $this;
}
public function removeSolicitudesIntere(SolicitudAccionFormativa $solicitudesIntere): static
{
$this->solicitudesInteres->removeElement($solicitudesIntere);
return $this;
}
/**
* @return Collection<int, Grupo>
*/
public function getGruposFavorito(): Collection
{
return $this->gruposFavorito;
}
public function addGruposFavorito(Grupo $grupo): static
{
if (!$this->gruposFavorito->contains($grupo)) {
$this->gruposFavorito->add($grupo);
}
return $this;
}
public function removeGruposFavorito(Grupo $grupo): static
{
$this->gruposFavorito->removeElement($grupo);
return $this;
}
/**
* Get all favorites (both solicitudes and grupos)
*
* @return Collection
*/
public function getFavoritosCursos(): Collection
{
$result = new ArrayCollection();
// Add solicitudes
foreach ($this->getSolicitudesFavorito() as $solicitud) {
$result->add($solicitud);
}
// Add grupos
foreach ($this->getGruposFavorito() as $grupo) {
$result->add($grupo);
}
return $result;
}
/**
* @return Collection<int, EntidadColaboradora>
*/
public function getEntidadColaboradorasFavorito(): Collection
{
return $this->entidadColaboradorasFavorito;
}
public function addEntidadColaboradorasFavorito(EntidadColaboradora $entidadColaboradora): static
{
if (!$this->entidadColaboradorasFavorito->contains($entidadColaboradora)) {
$this->entidadColaboradorasFavorito->add($entidadColaboradora);
}
return $this;
}
public function removeEntidadColaboradorasFavorito(EntidadColaboradora $entidadColaboradora): static
{
$this->entidadColaboradorasFavorito->removeElement($entidadColaboradora);
return $this;
}
/**
* @return Collection<int, Formador>
*/
public function getFormadoresFavorito(): Collection
{
return $this->formadoresFavorito;
}
public function addFormadoresFavorito(Formador $formador): static
{
if (!$this->formadoresFavorito->contains($formador)) {
$this->formadoresFavorito->add($formador);
}
return $this;
}
public function removeFormadoresFavorito(Formador $formador): static
{
$this->formadoresFavorito->removeElement($formador);
return $this;
}
/**
* @return Collection<int, Grupo>
*/
public function getGruposInteres(): Collection
{
return $this->gruposInteres;
}
public function addGruposIntere(Grupo $grupo): static
{
if (!$this->gruposInteres->contains($grupo)) {
$this->gruposInteres->add($grupo);
}
return $this;
}
public function removeGruposIntere(Grupo $grupo): static
{
$this->gruposInteres->removeElement($grupo);
return $this;
}
/**
* Get all interests (both solicitudes and grupos)
*
* @return Collection
*/
public function getIntereses(): Collection
{
$result = new ArrayCollection();
// Add solicitudes
foreach ($this->getSolicitudesInteres() as $solicitud) {
$result->add($solicitud);
}
// Add grupos
foreach ($this->getGruposInteres() as $grupo) {
$result->add($grupo);
}
return $result;
}
public function getTokenValid(): ?string
{
return $this->tokenValid;
}
public function setTokenValid(?string $tokenValid): static
{
$this->tokenValid = $tokenValid;
return $this;
}
public function getPlainPassword()
{
return $this->plainPassword;
}
public function setPlainPassword($plainPassword)
{
$this->plainPassword = $plainPassword;
return $this;
}
public function getPropietarioContenidoByClass ($class){
return $this->getPropietarioContenidos()->filter(fn($p) => $p instanceof $class);
}
/**
* Obtiene el PropietarioContenido del usuario para el rol especificado
*
* @param string $rol
* @return PropietarioContenido|null
*/
public function getPropietarioContenidoByRol(string $rol): ?PropietarioContenido
{
$class = RolEnum::getClass($rol);
$propietarioContenidos = $this->getPropietarioContenidoByClass($class);
return $propietarioContenidos->isEmpty() ? null : $propietarioContenidos->first();
}
/**
* @return Collection<int, CentroFormacion>
*/
public function getCentrosFormacionFavorito(): Collection
{
return $this->centrosFormacionFavorito;
}
public function addCentrosFormacionFavorito(CentroFormacion $centrosFormacionFavorito): static
{
if (!$this->centrosFormacionFavorito->contains($centrosFormacionFavorito)) {
$this->centrosFormacionFavorito->add($centrosFormacionFavorito);
$centrosFormacionFavorito->addUsuarioHermesFavorito($this);
}
return $this;
}
public function removeCentrosFormacionFavorito(CentroFormacion $centrosFormacionFavorito): static
{
if ($this->centrosFormacionFavorito->removeElement($centrosFormacionFavorito)) {
$centrosFormacionFavorito->removeUsuarioHermesFavorito($this);
}
return $this;
}
public function isCentroFormacionFavorito(?CentroFormacion $centroFormacion): bool
{
if(!$centroFormacion) return false;
return $this->getCentrosFormacionFavorito()->contains($centroFormacion);
}
public function getEmpresa(): ?Empresa
{
$propietarioContenidos = $this->getPropietarioContenidos();
if (!$propietarioContenidos) return null;
foreach ($propietarioContenidos as $propietarioContenido) {
if ($propietarioContenido instanceof EmpresaPropietarioContenido) {
return $propietarioContenido->getEmpresa();
}
}
return null;
}
/**
* Obtiene los roles del usuario basados en sus PropietarioContenido
*
* @return array Array de roles (strings)
*/
public function getRolesByPropietarioContenido(): array
{
$roles = [];
$propietarioContenidos = $this->getPropietarioContenidos();
if (!$propietarioContenidos) {
return $roles;
}
foreach ($propietarioContenidos as $propietarioContenido) {
$rol = RolEnum::getRolFromClass(get_class($propietarioContenido));
if ($rol && !in_array($rol, $roles)) {
$roles[] = $rol;
}
}
return $roles;
}
public function getEntidadAsociadaByRol(?string $rol): ?Entidad
{
return !$rol ? null : $this->getPropietarioContenidoByRol($rol)?->getEntidadAsociada();
}
public function getPasswordChangedAt(): ?\DateTimeInterface
{
return $this->passwordChangedAt;
}
public function setPasswordChangedAt(?\DateTimeInterface $passwordChangedAt): static
{
$this->passwordChangedAt = $passwordChangedAt;
return $this;
}
/**
* @return Collection<int, MensajeLeidoForo>
*/
public function getMensajeLeidoForos(): Collection
{
return $this->mensajeLeidoForos;
}
public function addMensajeLeidoForo(MensajeLeidoForo $mensajeLeidoForo): static
{
if (!$this->mensajeLeidoForos->contains($mensajeLeidoForo)) {
$this->mensajeLeidoForos->add($mensajeLeidoForo);
$mensajeLeidoForo->setUsuario($this);
}
return $this;
}
public function removeMensajeLeidoForo(MensajeLeidoForo $mensajeLeidoForo): static
{
if ($this->mensajeLeidoForos->removeElement($mensajeLeidoForo)) {
// set the owning side to null (unless already changed)
if ($mensajeLeidoForo->getUsuario() === $this) {
$mensajeLeidoForo->setUsuario(null);
}
}
return $this;
}
}