<?php
namespace App\Entity;
use App\Repository\UsuarioRepository;
use DateTime;
use DateTimeInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as Serializer;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;
use App\Validator as CustomAssert;
#[ORM\InheritanceType('JOINED')]
#[ORM\DiscriminatorColumn(name: 'tipo', type: 'string')]
#[ORM\DiscriminatorMap(['usuario' => 'Usuario'])]
#[ORM\Entity(repositoryClass: UsuarioRepository::class)]
#[UniqueEntity('usuario')]
#[UniqueEntity('email')]
#[UniqueEntity('dniNie')]
#[ORM\Table(name: 'usuario')]
#[ORM\UniqueConstraint(name: 'unique_usuario', columns: ['usuario'])]
#[ORM\UniqueConstraint(name: 'unique_email', columns: ['email'])]
class Usuario implements UserInterface
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
#[Serializer\Groups(groups: ['api'])]
private ?int $id = null;
#[Assert\NotBlank]
#[Assert\Length(max: 190)]
#[ORM\Column(type: 'string', length: 190, unique: true)]
#[Serializer\Groups(groups: ['api'])]
private ?string $usuario = null;
#[Assert\NotBlank]
#[Assert\Email]
#[Assert\Length(max: 190)]
#[ORM\Column(type: 'string', length: 190, unique: true)]
#[Serializer\Groups(groups: ['api'])]
private ?string $email = null;
#[ORM\Column(type: 'array')]
#[Serializer\Groups(groups: ['api'])]
private ?array $roles = [];
#[Assert\Length(max: 255)]
#[ORM\Column(type: 'string')]
private ?string $password = null;
#[Assert\Length(max: 255)]
#[ORM\Column(type: 'string', nullable: true)]
#[Serializer\Groups(groups: ['api'])]
private ?string $imagen = null;
#[ORM\Column(type: 'boolean')]
private ?bool $borrado = false;
#[ORM\Column(type: 'datetime', nullable: true)]
private ?DateTimeInterface $ultimoAcceso = null;
#[ORM\Column(type: 'datetime', nullable: true)]
#[Serializer\Groups(groups: ['api'])]
private ?DateTime $ultimoAccesoApp = null;
#[ORM\Column(type: 'datetime')]
#[Serializer\Groups(groups: ['api'])]
private ?DateTime $fechaRegistro = null;
#[Assert\Length(max: 255)]
#[ORM\Column(type: 'string', nullable: true)]
protected $tokenConfirmacion;
#[ORM\Column(type: 'datetime', nullable: true)]
protected $fechaSolicitudPassword;
#[ORM\Column(type: 'boolean')]
#[Serializer\Groups(groups: ['api'])]
private ?bool $activo = true;
#[ORM\Column(type: 'boolean')]
private ?bool $aceptaCondicionesPrivacidad = null;
#[ORM\OneToMany(mappedBy: 'usuario', targetEntity: NotificacionPush::class)]
private Collection $notificacionesPushes;
#[ORM\Column(type: 'boolean')]
private bool $recibirEmailsSistema = true;
#[Assert\Length(max: 255)]
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private ?string $nombre = null;
#[Assert\Length(max: 255)]
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private ?string $apellidos = null;
#[CustomAssert\IsDniNie]
#[ORM\Column(type: 'string', length: 9, unique: true, nullable: true)]
private ?string $dniNie = null;
#[ORM\Column(type: 'date', nullable: true)]
private ?DateTimeInterface $fechaNacimiento = null;
#[ORM\ManyToOne(targetEntity: SexoUsuario::class, inversedBy: 'usuarios')]
private ?SexoUsuario $sexo = null;
#[ORM\OneToMany(mappedBy: 'usuario', targetEntity: Solicitud::class)]
private Collection $solicitudes;
#[ORM\ManyToOne(targetEntity: Localidad::class, inversedBy: 'usuarios')]
private ?Localidad $localidad = null;
#[ORM\Column(type: 'string', length: 255, nullable: true)]
private ?string $direccion = null;
#[ORM\Column(type: 'string', length: 5, nullable: true)]
private ?string $codigoPostal = null;
#[ORM\Column(type: 'string', length: 9, nullable: true)]
private ?string $telefono1 = null;
#[ORM\Column(type: 'string', length: 9, nullable: true)]
private ?string $telefono2 = null;
#[ORM\ManyToOne(inversedBy: 'usuarios')]
private ?EmpresaFormacion $empresaFormacion = null;
#[ORM\OneToMany(mappedBy: 'usuario', targetEntity: BitacoraUsuario::class)]
private Collection $mensagesBitacora;
#[ORM\OneToMany(mappedBy: 'autor', targetEntity: BitacoraUsuario::class)]
private Collection $mensajesBitacoraComoAutor;
#[ORM\Column]
private bool $llamar = true;
#[ORM\OneToMany(mappedBy: 'usuario', targetEntity: InscripcionUsuarioJornadaCurso::class)]
private Collection $inscripcionesJornadasCursos;
public function __construct()
{
$this->fechaRegistro = new DateTime();
$this->setRoles([]);
$this->notificacionesPushes = new ArrayCollection();
$this->solicitudes = new ArrayCollection();
$this->mensagesBitacora = new ArrayCollection();
$this->mensajesBitacoraComoAutor = new ArrayCollection();
$this->inscripcionesJornadasCursos = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function setId(?int $id): self
{
$this->id = $id;
return $this;
}
public function getUsuario(): ?string
{
return $this->usuario;
}
public function setUsuario(?string $usuario): self
{
$this->usuario = $usuario;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(?string $email): self
{
$this->email = $email;
$this->usuario = $email;
return $this;
}
/**
* A visual identifier that represents this user.
*
* @see UserInterface
*/
public function getUsername(): string
{
return (string) $this->usuario;
}
/**
* @see UserInterface
*/
public function getRoles(): array
{
$roles = $this->roles;
// guarantee every user at least has ROLE_USER
$roles[] = 'ROLE_USER';
return array_unique($roles);
}
public function setRoles(?array $roles): self
{
$this->roles = $roles;
return $this;
}
/**
* @see UserInterface
*/
public function getPassword(): string
{
return $this->password;
}
public function setPassword(?string $password): self
{
$this->password = $password;
return $this;
}
/**
* @see UserInterface
*/
public function getSalt(): void
{
// not needed when using the "bcrypt" algorithm in security.yaml
}
/**
* @see UserInterface
*/
public function eraseCredentials(): void
{
// If you store any temporary, sensitive data on the user, clear it here
// $this->plainPassword = null;
}
public function getImagen(): ?string
{
return $this->imagen;
}
public function setImagen(?string $imagen): self
{
$this->imagen = $imagen;
return $this;
}
public function getBorrado(): ?bool
{
return $this->borrado;
}
public function setBorrado(?bool $borrado): self
{
$this->borrado = $borrado;
return $this;
}
public function getUltimoAcceso(): ?DateTimeInterface
{
return $this->ultimoAcceso;
}
public function setUltimoAcceso(?DateTimeInterface $ultimoAcceso): self
{
$this->ultimoAcceso = $ultimoAcceso;
return $this;
}
public function getActivo(): ?bool
{
return $this->activo;
}
public function setActivo(?bool $activo): self
{
$this->activo = $activo;
return $this;
}
/**
* @return mixed
*/
public function getTokenConfirmacion()
{
return $this->tokenConfirmacion;
}
public function setTokenConfirmacion(?string $tokenConfirmacion): Usuario
{
$this->tokenConfirmacion = $tokenConfirmacion;
return $this;
}
public function getFechaSolicitudPassword(): ?DateTime
{
return $this->fechaSolicitudPassword;
}
public function setFechaSolicitudPassword(?DateTime $fechaSolicitudPassword): Usuario
{
$this->fechaSolicitudPassword = $fechaSolicitudPassword;
return $this;
}
public function getUltimoAccesoApp(): ?DateTime
{
return $this->ultimoAccesoApp;
}
public function setUltimoAccesoApp(?DateTime $ultimoAccesoApp): Usuario
{
$this->ultimoAccesoApp = $ultimoAccesoApp;
return $this;
}
public function getFechaRegistro(): ?DateTime
{
return $this->fechaRegistro;
}
public function setFechaRegistro(?DateTime $fechaRegistro): Usuario
{
$this->fechaRegistro = $fechaRegistro;
return $this;
}
public function isAceptaCondicionesPrivacidad(): ?bool
{
return $this->aceptaCondicionesPrivacidad;
}
public function setAceptaCondicionesPrivacidad(?bool $aceptaCondicionesPrivacidad): self
{
$this->aceptaCondicionesPrivacidad = $aceptaCondicionesPrivacidad;
return $this;
}
/**
* @return Collection<int, NotificacionPush>
*/
public function getNotificacionesPushes(): Collection
{
return $this->notificacionesPushes;
}
public function addNotificacionesPush(?NotificacionPush $notificacionesPush): self
{
if (!$this->notificacionesPushes->contains($notificacionesPush)) {
$this->notificacionesPushes[] = $notificacionesPush;
$notificacionesPush->setUsuario($this);
}
return $this;
}
public function removeNotificacionesPush(?NotificacionPush $notificacionesPush): self
{
// set the owning side to null (unless already changed)
if ($this->notificacionesPushes->removeElement($notificacionesPush) && $notificacionesPush->getUsuario() === $this) {
$notificacionesPush->setUsuario(null);
}
return $this;
}
public function isRecibirEmailsSistema(): ?bool
{
return $this->recibirEmailsSistema;
}
public function setRecibirEmailsSistema(bool $recibirEmailsSistema): self
{
$this->recibirEmailsSistema = $recibirEmailsSistema;
return $this;
}
public function getNombre(): ?string
{
return $this->nombre;
}
public function setNombre(?string $nombre): self
{
$this->nombre = $nombre;
return $this;
}
public function getApellidos(): ?string
{
return $this->apellidos;
}
public function setApellidos(?string $apellidos): self
{
$this->apellidos = $apellidos;
return $this;
}
public function getDniNie(): ?string
{
return $this->dniNie;
}
public function setDniNie(?string $dniNie): self
{
$this->dniNie = $dniNie;
return $this;
}
public function getFechaNacimiento(): ?DateTimeInterface
{
return $this->fechaNacimiento;
}
public function setFechaNacimiento(?DateTimeInterface $fechaNacimiento): self
{
$this->fechaNacimiento = $fechaNacimiento;
return $this;
}
public function getSexo(): ?SexoUsuario
{
return $this->sexo;
}
public function setSexo(?SexoUsuario $sexo): self
{
$this->sexo = $sexo;
return $this;
}
/**
* @return Collection<int, Solicitud>
*/
public function getSolicitudes(): Collection
{
return $this->solicitudes;
}
public function addSolicitude(Solicitud $solicitude): self
{
if (!$this->solicitudes->contains($solicitude)) {
$this->solicitudes[] = $solicitude;
$solicitude->setUsuario($this);
}
return $this;
}
public function removeSolicitude(Solicitud $solicitude): self
{
// set the owning side to null (unless already changed)
if ($this->solicitudes->removeElement($solicitude) && $solicitude->getUsuario() === $this) {
$solicitude->setUsuario(null);
}
return $this;
}
public function getLocalidad(): ?Localidad
{
return $this->localidad;
}
public function setLocalidad(?Localidad $localidad): self
{
$this->localidad = $localidad;
return $this;
}
public function getDireccion(): ?string
{
return $this->direccion;
}
public function setDireccion(?string $direccion): self
{
$this->direccion = $direccion;
return $this;
}
public function getCodigoPostal(): ?string
{
return $this->codigoPostal;
}
public function setCodigoPostal(?string $codigoPostal): self
{
$this->codigoPostal = $codigoPostal;
return $this;
}
public function getTelefono1(): ?string
{
return $this->telefono1;
}
public function setTelefono1(?string $telefono1): self
{
$this->telefono1 = $telefono1;
return $this;
}
public function getTelefono2(): ?string
{
return $this->telefono2;
}
public function setTelefono2(?string $telefono2): self
{
$this->telefono2 = $telefono2;
return $this;
}
public function getEmpresaFormacion(): ?EmpresaFormacion
{
return $this->empresaFormacion;
}
public function setEmpresaFormacion(?EmpresaFormacion $empresaFormacion): static
{
$this->empresaFormacion = $empresaFormacion;
return $this;
}
/**
* @return Collection<int, BitacoraUsuario>
*/
public function getMensagesBitacora(): Collection
{
return $this->mensagesBitacora;
}
public function addMensagesBitacora(BitacoraUsuario $mensagesBitacora): static
{
if (!$this->mensagesBitacora->contains($mensagesBitacora)) {
$this->mensagesBitacora->add($mensagesBitacora);
$mensagesBitacora->setUsuario($this);
}
return $this;
}
public function removeMensagesBitacora(BitacoraUsuario $mensagesBitacora): static
{
if ($this->mensagesBitacora->removeElement($mensagesBitacora)) {
// set the owning side to null (unless already changed)
if ($mensagesBitacora->getUsuario() === $this) {
$mensagesBitacora->setUsuario(null);
}
}
return $this;
}
/**
* @return Collection<int, BitacoraUsuario>
*/
public function getMensajesBitacoraComoAutor(): Collection
{
return $this->mensajesBitacoraComoAutor;
}
public function addMensajesBitacoraComoAutor(BitacoraUsuario $mensajesBitacoraComoAutor): static
{
if (!$this->mensajesBitacoraComoAutor->contains($mensajesBitacoraComoAutor)) {
$this->mensajesBitacoraComoAutor->add($mensajesBitacoraComoAutor);
$mensajesBitacoraComoAutor->setAutor($this);
}
return $this;
}
public function removeMensajesBitacoraComoAutor(BitacoraUsuario $mensajesBitacoraComoAutor): static
{
if ($this->mensajesBitacoraComoAutor->removeElement($mensajesBitacoraComoAutor)) {
// set the owning side to null (unless already changed)
if ($mensajesBitacoraComoAutor->getAutor() === $this) {
$mensajesBitacoraComoAutor->setAutor(null);
}
}
return $this;
}
public function isLlamar(): ?bool
{
return $this->llamar;
}
public function setLlamar(bool $llamar): static
{
$this->llamar = $llamar;
return $this;
}
/**
* @return Collection<int, InscripcionUsuarioJornadaCurso>
*/
public function getInscripcionesJornadasCursos(): Collection
{
return $this->inscripcionesJornadasCursos;
}
public function addInscripcionesJornadasCurso(InscripcionUsuarioJornadaCurso $inscripcionesJornadasCurso): static
{
if (!$this->inscripcionesJornadasCursos->contains($inscripcionesJornadasCurso)) {
$this->inscripcionesJornadasCursos->add($inscripcionesJornadasCurso);
$inscripcionesJornadasCurso->setUsuario($this);
}
return $this;
}
public function removeInscripcionesJornadasCurso(InscripcionUsuarioJornadaCurso $inscripcionesJornadasCurso): static
{
if ($this->inscripcionesJornadasCursos->removeElement($inscripcionesJornadasCurso)) {
// set the owning side to null (unless already changed)
if ($inscripcionesJornadasCurso->getUsuario() === $this) {
$inscripcionesJornadasCurso->setUsuario(null);
}
}
return $this;
}
}