src/Entity/Usuario.php line 24

Open in your IDE?
  1. <?php
  2. namespace App\Entity;
  3. use App\Service\CpfValidator;
  4. use Doctrine\Common\Collections\ArrayCollection;
  5. use Doctrine\Common\Collections\Collection;
  6. use Doctrine\ORM\Mapping as ORM;
  7. use Gedmo\Timestampable\Traits\TimestampableEntity;
  8. use Ramsey\Uuid\Uuid;
  9. use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
  10. use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
  11. use Symfony\Component\Security\Core\User\UserInterface;
  12. use Symfony\Component\Validator\Constraints as Assert;
  13. use Symfony\Component\Validator\Context\ExecutionContextInterface;
  14. /**
  15.  * @ORM\Entity(repositoryClass="App\Repository\UsuarioRepository")
  16.  * @UniqueEntity(
  17.  *     fields={"email"},
  18.  *     message="Este email já está cadastrado no sistema."
  19.  * )
  20.  */
  21. class Usuario implements UserInterfacePasswordAuthenticatedUserInterface
  22. {
  23.     use TimestampableEntity;
  24.     /**
  25.      * @ORM\Id()
  26.      * @ORM\GeneratedValue()
  27.      * @ORM\Column(type="integer")
  28.      */
  29.     private ?int $id=null;
  30.     /**
  31.      * @ORM\Column(type="string", length=191, unique=true)
  32.      * @Assert\Length(max=191)
  33.      */
  34.     private string $email;
  35.     /**
  36.      * @ORM\Column(type="string", length=255)
  37.      * @Assert\Length(max=255)
  38.      */
  39.     private ?string $password=null;
  40.     /**
  41.      * A non-persisted field that's used to create the encoded password.
  42.      */
  43.     private ?string $plainPassword=null;
  44.     /**
  45.      * @ORM\Column(type="json")
  46.      */
  47.     protected array $roles = ['ROLE_USER'];
  48.     /**
  49.      * @ORM\Column(type="string", length=255)
  50.      */
  51.     private string $nome;
  52.     /**
  53.      * @ORM\Column(type="boolean")
  54.      */
  55.     private bool $ativo true;
  56.     /**
  57.      * @var ?string Reset token.
  58.      *
  59.      * @ORM\Column(name="reset_token", type="string", length=32, nullable=true)
  60.      * @Assert\Length(max=32)
  61.      */
  62.     private ?string $resetToken=null;
  63.     /**
  64.      * @var ?int Unix Epoch timestamp when the reset token expires.
  65.      *
  66.      * @ORM\Column(name="reset_token_expires_at", type="integer", nullable=true)
  67.      */
  68.     private ?int $resetTokenExpiresAt=null;
  69.     /**
  70.      * @ORM\OneToMany(targetEntity="App\Entity\Arquivo", mappedBy="usuario")
  71.      */
  72.     private Collection $arquivos;
  73.     /**
  74.      * @ORM\OneToMany(targetEntity="App\Entity\Permissao", mappedBy="professor")
  75.      */
  76.     private Collection $permissoes;
  77.     /**
  78.      * @ORM\Column(type="string", length=255, nullable=false)
  79.      * @Assert\Length(max=255)
  80.      */
  81.     private string $nacionalidade 'BR';
  82.     /**
  83.      * @ORM\Column(type="string", length=15, unique=true, nullable=true)
  84.      * @Assert\Length(max=15)
  85.      */
  86.     private ?string $cpf=null;
  87.     /**
  88.      * @ORM\OneToMany(targetEntity="App\Entity\Inscricao", mappedBy="candidato")
  89.      */
  90.     private Collection $inscricoes;
  91.     /**
  92.      * @ORM\Column(type="string", length=255, nullable=true)
  93.      * @Assert\Length(max=255)
  94.      */
  95.     private ?string $resetEmail=null;
  96.     /**
  97.      * @ORM\Column(type="string", length=20, nullable=true)
  98.      * @Assert\Length(max=20)
  99.      */
  100.     private ?string $telefone=null;
  101.     /**
  102.      * @ORM\Column(type="string", length=25, nullable=true)
  103.      * @Assert\Length(max=25)
  104.      */
  105.     private ?string $passaporte=null;
  106.     /**
  107.      * @ORM\OneToMany(targetEntity="App\Entity\RemanejoInscricao", mappedBy="solicitante")
  108.      */
  109.     private Collection $remanejos;
  110.     /**
  111.      * @ORM\OneToMany(targetEntity="App\Entity\RemanejoInscricao", mappedBy="responsavel")
  112.      */
  113.     private Collection $remanejosAceitos;
  114.     /**
  115.      * @ORM\OneToMany(targetEntity="App\Entity\RecursoInscricao", mappedBy="responsavel")
  116.      */
  117.     private Collection $recursos;
  118.     public function __construct()
  119.     {
  120.         $this->arquivos = new ArrayCollection();
  121.         $this->permissoes = new ArrayCollection();
  122.         $this->inscricoes = new ArrayCollection();
  123.         $this->remanejos = new ArrayCollection();
  124.         $this->remanejosAceitos = new ArrayCollection();
  125.         $this->recursos = new ArrayCollection();
  126.     }
  127.     public function __toString(): string
  128.     {
  129.         return $this->nome;
  130.     }
  131.     /**
  132.      * @return string Versão obfuscada do e-mail (ex: s******a@n******s.com.br)
  133.      */
  134.     public function getObfuscatedEmail(): string
  135.     {
  136.         $email $this->getEmail();
  137.         $parts explode('@'$email);
  138.         foreach ($parts as $p => $v) {
  139.             $subparts explode('.'$v);
  140.             foreach ($subparts as $i => $s) {
  141.                 if (strlen($s) > 3) {
  142.                     $subparts[$i] = substr($s01) . str_repeat('*'strlen($s)-2) . substr($sstrlen($s)-11);
  143.                 }
  144.                 elseif ($p == 0) {
  145.                     // ofusca o username, mesmo se for curtinho
  146.                     $subparts[$i] = str_repeat('*'strlen($s));
  147.                 }
  148.             }
  149.             $parts[$p] = implode('.'$subparts);
  150.         }
  151.         return implode('@'$parts);
  152.     }
  153.     public function getFirstName(): string
  154.     {
  155.         $name explode(' '$this->getNome());
  156.         return mb_convert_case($name[0], MB_CASE_TITLE);
  157.     }
  158.     public function isAdmin(): bool
  159.     {
  160.         return in_array('ROLE_ADMIN'$this->roles);
  161.     }
  162.     public function isProfessor(): bool
  163.     {
  164.         return in_array('ROLE_PROFESSOR'$this->roles) || in_array('ROLE_PROFESSOR_INATIVO'$this->roles);
  165.     }
  166.     public function isFuncionario(): bool
  167.     {
  168.         return in_array('ROLE_FUNCIONARIO'$this->roles) || in_array('ROLE_FUNCIONARIO_INATIVO'$this->roles);
  169.     }
  170.     public function isCandidato(): bool
  171.     {
  172.         return in_array('ROLE_CANDIDATO'$this->roles) || in_array('ROLE_CANDIDATO_BLOQUEADO'$this->roles);
  173.     }
  174.     /**
  175.      * @return string Descrição do nível mais alto das funções do usuário
  176.      */
  177.     public function getTipo(): string
  178.     {
  179.         $tipo "Usuário";
  180.         if ($this->isAdmin()) {
  181.             $tipo "Administrador";
  182.         }
  183.         elseif ($this->isFuncionario()) {
  184.             $tipo "Funcionário";
  185.         }
  186.         elseif ($this->isProfessor()) {
  187.             $tipo "Professor";
  188.         }
  189.         elseif ($this->isCandidato()) {
  190.             $tipo "Candidato";
  191.         }
  192.         return $tipo;
  193.     }
  194.     /**
  195.      * @return string Uma senha forte aleatória
  196.      */
  197.     static public function generatePassword(): string {
  198.         $pass '';
  199.         $points '#@!.;,/=-+*&%[]{}?:<>()_';
  200.         $checks = ['lower' => false'upper' => false'digit' => false'point' => false];
  201.         do {
  202.             $lower chr(rand(ord('a'), ord('z')));
  203.             $upper chr(rand(ord('A'), ord('Z')));
  204.             $digit chr(rand(ord('0'), ord('9')));
  205.             $point substr($pointsrand(0strlen($points)-1), 1);
  206.             $surprise rand(0,100);
  207.             if ($surprise 60) {
  208.                 if ($surprise 40) {
  209.                     $pass .= $lower;
  210.                     $checks['lower'] = true;
  211.                 }
  212.                 else {
  213.                     $pass .= $upper;
  214.                     $checks['upper'] = true;
  215.                 }
  216.             }
  217.             elseif ($surprise 90) {
  218.                 $pass .= $digit;
  219.                 $checks['digit'] = true;
  220.             }
  221.             else {
  222.                 $pass .= $point;
  223.                 $checks['point'] = true;
  224.             }
  225.         } while (strlen($pass) < 10);
  226.         if (!$checks['lower']) {
  227.             $p rand(0strlen($pass));
  228.             $lower chr(rand(ord('a'), ord('z')));
  229.             $pass substr($pass0$p) . $lower substr($pass$p);
  230.         }
  231.         if (!$checks['upper']) {
  232.             $p rand(0strlen($pass));
  233.             $upper chr(rand(ord('A'), ord('Z')));
  234.             $pass substr($pass0$p) . $lower substr($pass$p);
  235.         }
  236.         if (!$checks['digit']) {
  237.             $p rand(0strlen($pass));
  238.             $digit chr(rand(ord('0'), ord('9')));
  239.             $pass substr($pass0$p) . $digit substr($pass$p);
  240.         }
  241.         if (!$checks['point']) {
  242.             $p rand(0strlen($pass));
  243.             $point substr($pointsrand(0strlen($points)-1), 1);
  244.             $pass substr($pass0$p) . $point substr($pass$p);
  245.         }
  246.         return $pass;
  247.     }
  248.     /**---------------------ROTINAS DE SEGURANÇA------------------*/
  249.     /**
  250.      * Returns the salt that was originally used to encode the password.
  251.      *
  252.      * This can return null if the password was not encoded using a salt.
  253.      *
  254.      * @return string|null The salt
  255.      */
  256.     public function getSalt(): ?string
  257.     {
  258.         // Not used
  259.         return null;
  260.     }
  261.     /**
  262.      * Returns the username used to authenticate the user.
  263.      *
  264.      * @return string The username
  265.      */
  266.     public function getUsername(): string
  267.     {
  268.         return $this->email;
  269.     }
  270.     public function getUserIdentifier(): string
  271.     {
  272.         return $this->email;
  273.     }
  274.     /**
  275.      * Removes sensitive data from the user.
  276.      *
  277.      * This is important if, at any given point, sensitive information like
  278.      * the plain-text password is stored on this object.
  279.      */
  280.     public function eraseCredentials(): void
  281.     {
  282.         $this->plainPassword null;
  283.     }
  284.     public function getPlainPassword(): ?string
  285.     {
  286.         return $this->plainPassword;
  287.     }
  288.     public function setPlainPassword(?string $plainPassword): void
  289.     {
  290.         $this->plainPassword $plainPassword;
  291.         // forces the object to look "dirty" to Doctrine. Avoids
  292.         // Doctrine *not* saving this entity, if only plainPassword changes
  293.         $this->password null;
  294.     }
  295.     /**
  296.      * Generates new reset token which expires in specified period of time.
  297.      *
  298.      * @param \DateInterval $interval
  299.      *
  300.      * @return string Generated token.
  301.      */
  302.     public function generateResetToken(\DateInterval $interval): string
  303.     {
  304.         $now = new \DateTime();
  305.         try {
  306.             $this->resetToken Uuid::uuid4()->getHex();
  307.         } catch (\Exception $e) {
  308.             return false;
  309.         }
  310.         $this->resetTokenExpiresAt $now->add($interval)->getTimestamp();
  311.         return $this->resetToken;
  312.     }
  313.     /**
  314.      * Generates new reset token which expires in specified period of time.
  315.      *
  316.      * @param string $email
  317.      * @param \DateInterval $interval
  318.      *
  319.      * @return string Generated token.
  320.      */
  321.     public function generateEmailResetToken(string $email, \DateInterval $interval): string
  322.     {
  323.         $resetToken $this->generateResetToken($interval);
  324.         if ($resetToken) {
  325.             $this->resetEmail $email;
  326.         }
  327.         return $resetToken;
  328.     }
  329.     /**
  330.      * Clears current reset token.
  331.      *
  332.      * @return self
  333.      */
  334.     public function clearResetToken(): self
  335.     {
  336.         $this->resetToken null;
  337.         $this->resetTokenExpiresAt null;
  338.         $this->resetEmail null;
  339.         return $this;
  340.     }
  341.     /**
  342.      * Checks whether reset token is valid.
  343.      *
  344.      * @return bool
  345.      */
  346.     public function isResetTokenValid(): bool
  347.     {
  348.         return
  349.             $this->resetTokenExpiresAt !== null &&
  350.             $this->resetEmail === null &&
  351.             $this->resetTokenExpiresAt time();
  352.     }
  353.     /**
  354.      * Checks whether reset token is valid.
  355.      *
  356.      * @param int $userId ID do usuário logado, ou 0 para ignorar isso
  357.      * @return bool
  358.      */
  359.     public function isEmailResetTokenValid(int $userId): bool
  360.     {
  361.         return
  362.             $this->resetTokenExpiresAt !== null &&
  363.             $this->resetEmail !== null &&
  364.             (!$userId || $userId == $this->getId()) &&
  365.             $this->resetTokenExpiresAt time();
  366.     }
  367.     /**---------------------GETTERS E SETTERS------------------*/
  368.     public function getId(): ?int
  369.     {
  370.         return $this->id;
  371.     }
  372.     public function getEmail(): string
  373.     {
  374.         return $this->email;
  375.     }
  376.     public function setEmail(string $email): self
  377.     {
  378.         $this->email $email;
  379.         return $this;
  380.     }
  381.     public function getPassword(): string
  382.     {
  383.         return $this->password;
  384.     }
  385.     public function setPassword(string $password): self
  386.     {
  387.         $this->password $password;
  388.         return $this;
  389.     }
  390.     public function getRoles(): array
  391.     {
  392.         $roles $this->roles;
  393.         // give everyone ROLE_USER!
  394.         if (!in_array('ROLE_USER'$roles)) {
  395.             $roles[] = 'ROLE_USER';
  396.         }
  397.         return $roles;
  398.     }
  399.     public function setRoles(array $roles): self
  400.     {
  401.         // índices não sequenciais podem afetar a formatação final no campo
  402.         $this->roles array_values($roles);
  403.         return $this;
  404.     }
  405.     public function getNome(): string
  406.     {
  407.         return $this->nome;
  408.     }
  409.     public function setNome(string $nome): self
  410.     {
  411.         $this->nome $nome;
  412.         return $this;
  413.     }
  414.     public function getAtivo(): bool
  415.     {
  416.         return $this->ativo;
  417.     }
  418.     public function setAtivo(bool $ativo): self
  419.     {
  420.         $this->ativo $ativo;
  421.         return $this;
  422.     }
  423.     /**
  424.      * @return Collection|Arquivo[]
  425.      */
  426.     public function getArquivos(): Collection
  427.     {
  428.         return $this->arquivos;
  429.     }
  430.     public function addArquivo(Arquivo $arquivo): self
  431.     {
  432.         if (!$this->arquivos->contains($arquivo)) {
  433.             $this->arquivos[] = $arquivo;
  434.             $arquivo->setUsuario($this);
  435.         }
  436.         return $this;
  437.     }
  438.     public function removeArquivo(Arquivo $arquivo): self
  439.     {
  440.         if ($this->arquivos->contains($arquivo)) {
  441.             $this->arquivos->removeElement($arquivo);
  442.             // set the owning side to null (unless already changed)
  443.             if ($arquivo->getUsuario() === $this) {
  444.                 $arquivo->setUsuario(null);
  445.             }
  446.         }
  447.         return $this;
  448.     }
  449.     /**
  450.      * @return Collection|Permissao[]
  451.      */
  452.     public function getPermissoes(): Collection
  453.     {
  454.         return $this->permissoes;
  455.     }
  456.     public function addPermissao(Permissao $permissao): self
  457.     {
  458.         if (!$this->permissoes->contains($permissao)) {
  459.             $this->permissoes[] = $permissao;
  460.             $permissao->setProfessor($this);
  461.         }
  462.         return $this;
  463.     }
  464.     public function removePermissao(Permissao $permissao): self
  465.     {
  466.         if ($this->permissoes->contains($permissao)) {
  467.             $this->permissoes->removeElement($permissao);
  468.             // set the owning side to null (unless already changed)
  469.             if ($permissao->getProfessor() === $this) {
  470.                 $permissao->setProfessor(null);
  471.             }
  472.         }
  473.         return $this;
  474.     }
  475.     public function getCpf(): ?string
  476.     {
  477.         return $this->cpf;
  478.     }
  479.     public function setCpf(?string $cpf): self
  480.     {
  481.         $this->cpf $cpf;
  482.         return $this;
  483.     }
  484.     public function getNacionalidade(): string
  485.     {
  486.         return $this->nacionalidade;
  487.     }
  488.     public function setNacionalidade(string $nacionalidade): self
  489.     {
  490.         $this->nacionalidade $nacionalidade;
  491.         return $this;
  492.     }
  493.     /**
  494.      * @return Collection|Inscricao[]
  495.      */
  496.     public function getInscricoes(): Collection
  497.     {
  498.         return $this->inscricoes;
  499.     }
  500.     public function addInscricao(Inscricao $inscricao): self
  501.     {
  502.         if (!$this->inscricoes->contains($inscricao)) {
  503.             $this->inscricoes[] = $inscricao;
  504.             $inscricao->setCandidato($this);
  505.         }
  506.         return $this;
  507.     }
  508.     public function removeInscricao(Inscricao $inscricao): self
  509.     {
  510.         if ($this->inscricoes->contains($inscricao)) {
  511.             $this->inscricoes->removeElement($inscricao);
  512.             // set the owning side to null (unless already changed)
  513.             if ($inscricao->getCandidato() === $this) {
  514.                 $inscricao->setCandidato(null);
  515.             }
  516.         }
  517.         return $this;
  518.     }
  519.     public function getResetEmail(): ?string
  520.     {
  521.         return $this->resetEmail;
  522.     }
  523.     public function setResetEmail(?string $new_email): self
  524.     {
  525.         $this->resetEmail $new_email;
  526.         return $this;
  527.     }
  528.     public function getTelefone(): ?string
  529.     {
  530.         return $this->telefone;
  531.     }
  532.     public function setTelefone(?string $telefone): self
  533.     {
  534.         $this->telefone $telefone;
  535.         return $this;
  536.     }
  537.     public function getPassaporte(): ?string
  538.     {
  539.         return $this->passaporte;
  540.     }
  541.     public function setPassaporte(?string $passaporte): self
  542.     {
  543.         $this->passaporte $passaporte;
  544.         return $this;
  545.     }
  546.     /**
  547.      * @return Collection|RemanejoInscricao[]
  548.      */
  549.     public function getRemanejos(): Collection
  550.     {
  551.         return $this->remanejos;
  552.     }
  553.     public function addRemanejo(RemanejoInscricao $remanejo): self
  554.     {
  555.         if (!$this->remanejos->contains($remanejo)) {
  556.             $this->remanejos[] = $remanejo;
  557.             $remanejo->setSolicitante($this);
  558.         }
  559.         return $this;
  560.     }
  561.     public function removeRemanejo(RemanejoInscricao $remanejo): self
  562.     {
  563.         if ($this->remanejos->contains($remanejo)) {
  564.             $this->remanejos->removeElement($remanejo);
  565.             // set the owning side to null (unless already changed)
  566.             if ($remanejo->getSolicitante() === $this) {
  567.                 $remanejo->setSolicitante(null);
  568.             }
  569.         }
  570.         return $this;
  571.     }
  572.     /**
  573.      * @return Collection|RemanejoInscricao[]
  574.      */
  575.     public function getRemanejosAceitos(): Collection
  576.     {
  577.         return $this->remanejosAceitos;
  578.     }
  579.     public function addRemanejosAceito(RemanejoInscricao $remanejosAceito): self
  580.     {
  581.         if (!$this->remanejosAceitos->contains($remanejosAceito)) {
  582.             $this->remanejosAceitos[] = $remanejosAceito;
  583.             $remanejosAceito->setResponsavel($this);
  584.         }
  585.         return $this;
  586.     }
  587.     public function removeRemanejosAceito(RemanejoInscricao $remanejosAceito): self
  588.     {
  589.         if ($this->remanejosAceitos->contains($remanejosAceito)) {
  590.             $this->remanejosAceitos->removeElement($remanejosAceito);
  591.             // set the owning side to null (unless already changed)
  592.             if ($remanejosAceito->getResponsavel() === $this) {
  593.                 $remanejosAceito->setResponsavel(null);
  594.             }
  595.         }
  596.         return $this;
  597.     }
  598.     /**
  599.      * @return Collection|RecursoInscricao[]
  600.      */
  601.     public function getRecursos(): Collection
  602.     {
  603.         return $this->recursos;
  604.     }
  605.     public function addRecurso(RecursoInscricao $recurso): self
  606.     {
  607.         if (!$this->recursos->contains($recurso)) {
  608.             $this->recursos[] = $recurso;
  609.             $recurso->setResponsavel($this);
  610.         }
  611.         return $this;
  612.     }
  613.     public function removeRecurso(RecursoInscricao $recurso): self
  614.     {
  615.         if ($this->recursos->contains($recurso)) {
  616.             $this->recursos->removeElement($recurso);
  617.             // set the owning side to null (unless already changed)
  618.             if ($recurso->getResponsavel() === $this) {
  619.                 $recurso->setResponsavel(null);
  620.             }
  621.         }
  622.         return $this;
  623.     }
  624. }