<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use JMS\Serializer\Annotation\Groups;
use JMS\Serializer\Annotation\Type;
use Doctrine\ORM\Mapping\Index;
use DMS\Filter\Rules as Filter;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @ORM\Table(name="user",
* uniqueConstraints={
* @ORM\UniqueConstraint(name="email", columns={"email"})
* }
* )
* @UniqueEntity("email", groups={"Registration", "CustomerRegistration", "UserPartnerRegistration"}, message="user.email.unique")
* @Gedmo\SoftDeleteable(fieldName="deletedAt")
*/
class User implements UserInterface
{
use TimestampableEntity;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="json")
*/
private $roles = [];
/**
* @Filter\StripTags()
* @Filter\Trim()
* @Filter\StripNewlines()
* @ORM\Column(type="string", length=100, nullable=true)
* @Groups({"user"})
*/
private $firstName;
/**
* @Filter\StripTags()
* @Filter\Trim()
* @Filter\StripNewlines()
* @ORM\Column(type="string", length=100, nullable=true)
* @Groups({"user"})
*/
private $lastName;
/**
* @Filter\StripTags()
* @Filter\Trim()
* @Filter\StripNewlines()
* @ORM\Column(type="string", length=100, nullable=true)
* @Groups({"user"})
*/
private $email;
/**
* @var string The hashed password
* @ORM\Column(type="string", nullable=true)
*/
private $password;
/**
* @var string
* @Type("string")
*/
private $plainPassword;
/**
* @var string
* @Type("string")
*/
private $plainPassword2;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $deletedAt;
/**
* @ORM\Column(type="string", length=20, nullable=true)
* @Groups({"user"})
*/
private $phoneNumber;
/**
* @ORM\ManyToOne(targetEntity=Country::class)
* @Groups({"user"})
*/
private $phoneNumberAreaCode;
/**
* @ORM\ManyToOne(targetEntity=Customer::class, inversedBy="users")
* @Groups({"user"})
*/
private $customer;
/**
* @ORM\OneToMany(targetEntity=BalanceTransaction::class, mappedBy="user")
*/
private $balanceTransactions;
/**
* @ORM\Column(type="boolean")
*/
private $isAuthenticationless = false;
/**
* @ORM\ManyToOne(targetEntity=Partner::class)
*/
private $partner;
public function __construct()
{
$this->balanceTransactions = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function setId(int $id): self
{
$this->id = $id;
return $this;
}
/**
* @see UserInterface
*/
public function eraseCredentials()
{
// If you store any temporary, sensitive data on the user, clear it here
$this->plainPassword = null;
$this->plainPassword2 = null;
}
/**
* @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 (string) $this->password;
}
public function setPassword(string $password): self
{
$this->password = $password;
return $this;
}
/**
* @see UserInterface
*/
public function getPlainPassword(): ?string
{
return (string) $this->plainPassword;
}
public function setPlainPassword(?string $plainPassword): self
{
$this->plainPassword = $plainPassword;
return $this;
}
/**
* @see UserInterface
*/
public function getPlainPassword2(): ?string
{
return (string) $this->plainPassword2;
}
public function setPlainPassword2(?string $plainPassword2): self
{
$this->plainPassword2 = $plainPassword2;
return $this;
}
/**
* @see UserInterface
*/
public function getSalt()
{
// not needed when using the "bcrypt" algorithm in security.yaml
}
public function getFirstName(): ?string
{
return $this->firstName;
}
public function setFirstName(?string $firstName): self
{
$this->firstName = $firstName;
return $this;
}
public function getLastName(): ?string
{
return $this->lastName;
}
public function setLastName(?string $lastName): self
{
$this->lastName = $lastName;
return $this;
}
public function getEmail(): ?string
{
return $this->email;
}
public function setEmail(?string $email): self
{
$this->email = $email;
return $this;
}
public function getDeletedAt(): ?\DateTimeInterface
{
return $this->deletedAt;
}
public function setDeletedAt(?\DateTimeInterface $deletedAt): self
{
$this->deletedAt = $deletedAt;
return $this;
}
/**
* A visual identifier that represents this user.
*
* @see UserInterface
*/
public function getUsername(): ?string
{
return (string) $this->email;
}
public function setUsername(?string $username): self
{
$this->email = $username;
return $this;
}
public function getPhoneNumber(): ?string
{
return $this->phoneNumber;
}
public function setPhoneNumber(?string $phoneNumber): self
{
$this->phoneNumber = $phoneNumber;
return $this;
}
public function getPhoneNumberAreaCode(): ?Country
{
return $this->phoneNumberAreaCode;
}
public function setPhoneNumberAreaCode(?Country $phoneNumberAreaCode): self
{
$this->phoneNumberAreaCode = $phoneNumberAreaCode;
return $this;
}
public function getCustomer(): ?Customer
{
return $this->customer;
}
public function setCustomer(?Customer $customer): self
{
$this->customer = $customer;
return $this;
}
/**
* @return Collection<int, BalanceTransaction>
*/
public function getBalanceTransactions(): Collection
{
return $this->balanceTransactions;
}
public function addBalanceTransaction(BalanceTransaction $balanceTransaction): self
{
if (!$this->balanceTransactions->contains($balanceTransaction)) {
$this->balanceTransactions[] = $balanceTransaction;
$balanceTransaction->setUser($this);
}
return $this;
}
public function removeBalanceTransaction(BalanceTransaction $balanceTransaction): self
{
if ($this->balanceTransactions->removeElement($balanceTransaction)) {
// set the owning side to null (unless already changed)
if ($balanceTransaction->getUser() === $this) {
$balanceTransaction->setUser(null);
}
}
return $this;
}
// custom methods
public function getFullName() {
return $this->firstName . ' ' . $this->lastName;
}
public function getIsAuthenticationless(): ?bool
{
return $this->isAuthenticationless;
}
public function setIsAuthenticationless(bool $isAuthenticationless): self
{
$this->isAuthenticationless = $isAuthenticationless;
return $this;
}
public function getPartner(): ?Partner
{
return $this->partner;
}
public function setPartner(?Partner $partner): self
{
$this->partner = $partner;
return $this;
}
}