<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @ORM\Table(name="user")
* @ORM\HasLifecycleCallbacks()
* @UniqueEntity(fields={"email"}, message="Il semblerait que vous ayez déjà un compte!")
*/
class User implements UserInterface
{
const STATUS_INACTIVE = 0;
const STATUS_ACTIVE = 1;
const STATUS_DEACTIVATED = 2;
public function __construct()
{
$this->advertisements = new ArrayCollection();
$this->reviews = new ArrayCollection();
$this->bookmarks = new ArrayCollection();
$this->helpfulReviews = new ArrayCollection();
$this->roles = [];
$this->isPublisher = false;
}
public function hasBookmark(Advertisement $advertisement) {
foreach($this->getBookmarks() as $bookmark) {
if ($bookmark->getId() === $advertisement->getId()) {
return true;
}
}
return false;
}
public function hasHelpfulReviews(Review $review) {
foreach($this->getHelpfulReviews() as $value) {
if ($value->getId() === $review->getId()) {
return true;
}
}
return false;
}
public function getCountActiveReviews(){
$count = 0;
$active_status = Review::STATUS_VALIDATE;
foreach($this->reviews as $review){
if($review->getStatus()==$active_status){
$count ++;
}
}
return $count;
}
public function hasBadge(){
return ($this->badge!=null);
}
/**
* @return boolean
*/
public function hasRole($role)
{
return in_array($role, $this->roles);
}
/* return string rather that an object
* @return string
*/
public function __toString()
{
return sprintf('%s %s', $this->firstname, $this->lastname);
}
public function getInitial(){
$fullname = '';
$values = explode(" ",$this->lastname);
foreach($values as $value){
$fullname .= $value[0].'.';
}
$fullname = ucwords($this->firstname." ".$fullname);
return $fullname;
}
public function getFullname(){
return ucwords($this->firstname." ".$this->lastname);
}
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
private $id;
/**
* @Assert\NotBlank(groups={"AdminCreate", "AdminEdit"})
* @Assert\NotNull()
* @ORM\Column(type="array")
*/
private $roles;
/**
* @Assert\Regex(
* pattern="/\d/",
* match=false,
* message="Un prénom ne peut pas comporter de chiffres"
* )
* @ORM\Column(type="string",nullable=true,options={"default":null})
*/
private $firstname;
/**
* @Assert\Regex(
* pattern="/\d/",
* match=false,
* message="Un nom ne peut pas comporter de chiffres"
* )
* @ORM\Column(type="string",nullable=true,options={"default":null})
*/
private $lastname;
/**
* @ORM\Column(type="string")
*/
private $username;
/**
* @Assert\NotBlank()
* @Assert\Email()
* @ORM\Column(type="string", unique=true)
*/
private $email;
/**
* @Assert\Regex(
* pattern="/^(?:0|\(?\+\d{1,3}\)?\s?)[1-9](?:[\.\-\s]?\d{2}){4}$/",
* match=true,
* message="Ce numéro de téléphone n'est pas valide"
* )
* @Assert\Length(
* min = 10,
* max = 20,
* minMessage = "Attention un numéro de téléphone doit comporter au moins {{ limit }} chiffres",
* maxMessage = "Attention un numéro de téléphone ne peut dépasser {{ limit }} caractères"
* )
* @ORM\Column(type="string", length=20, nullable=true)
*/
private $phone;
/**
* The encoded password
*
* @ORM\Column(type="string")
*/
private $password;
/**
* A non-persisted field that's used to create the encoded password.
*
* @Assert\NotBlank(groups={"Registration", "AdminCreate"})
* @Assert\Length(
* min = 8,
* minMessage = "Attention votre mot de passe doit comporter au moins {{ limit }} caractères",
* )
*
* @var string
*/
private $plainPassword;
/**
* @ORM\ManyToOne(targetEntity="Agency", inversedBy="users", cascade={"persist"})
*/
private $agency;
/**
* Random string to password reset
*
* @ORM\Column(type="string", nullable=true)
*/
private $token;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $tokenValidAt;
/**
* Random string to activate account
*
* @ORM\Column(type="string", nullable=true)
*/
private $validationToken;
/**
* @Assert\NotBlank(groups={"Subscription"})
* @ORM\ManyToOne(targetEntity="Subscription", inversedBy="user")
* @ORM\JoinColumn(name="pack_id", referencedColumnName="id")
*/
private $pack;
/**
* @ORM\Column(type="integer", nullable=true)
*/
private $packAdNumber;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $packDate;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $stripeId;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $stripeToken;
/**
* @ORM\OneToMany(targetEntity="Advertisement", mappedBy="user")
* @ORM\OrderBy({"createdAt" = "DESC"})
*/
private $advertisements;
/**
* @ORM\OneToMany(targetEntity="Review", mappedBy="user")
* @ORM\OrderBy({"publicationDate" = "DESC"})
*/
private $reviews;
/**
* @ORM\OneToMany(targetEntity="Search", mappedBy="user")
* @ORM\OrderBy({"id" = "DESC"})
*/
private $searches;
/**
* @ORM\ManyToMany(targetEntity="Advertisement")
* @ORM\JoinTable(name="user_bookmarks",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="advertisement_id", referencedColumnName="id",onDelete="CASCADE")}
* )
*/
private $bookmarks;
/**
* @ORM\ManyToMany(targetEntity="Review")
* @ORM\JoinTable(name="helpful_reviews",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="review_id", referencedColumnName="id",onDelete="CASCADE")}
* )
*/
private $helpfulReviews;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $ipAddress;
/**
* @ORM\Column(type="datetime")
*/
private $createdAt;
/**
* @ORM\Column(type="datetime", nullable=true)
*/
private $updatedAt;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $avatarPath;
/**
* @ORM\Column(type="integer",options={"default":1})
*/
private $status;
/**
* @ORM\OneToOne(targetEntity="UserApplication", mappedBy="user")
* @ORM\OrderBy({"id" = "DESC"})
*/
private $application;
/**
* @ORM\OneToMany(targetEntity="RentalRecord", mappedBy="user")
* @ORM\OrderBy({"createdAt" = "DESC"})
*/
private $rentalRecords;
/**
* @ORM\OneToMany(targetEntity="DiscountCoupon", mappedBy="user")
* @ORM\OrderBy({"createdAt" = "DESC"})
*/
private $coupons;
/**
* @Assert\File(
* maxSize = "2048k",
* mimeTypes={ "application/pdf", "application/x-pdf" },
* maxSizeMessage = "La taille de fichier maximum autorisé est : {{ limit }} {{ suffix }}.",
* mimeTypesMessage = "Veuillez uploader le document au format pdf"
* )
* @ORM\Column(type="string", nullable=true)
*/
private $leasePath;
/**
* @ORM\OneToMany(targetEntity="Meeting", mappedBy="user")
* @ORM\OrderBy({"createdAt" = "DESC"})
*/
private $meetings;
/**
* @ORM\Column(type="datetime",nullable=true)
*/
private $leaseEndingDate;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $bloggerName;
/**
* @ORM\Column(type="string", nullable=true)
*/
private $bloggerAvatarPath;
/**
* @ORM\Column(type="boolean",options={"default":true})
*/
private $isPublisher;
/**
* @ORM\OneToOne(targetEntity="Badge", mappedBy="userTenant")
* @ORM\OrderBy({"id" = "DESC"})
*/
private $badge;
/**
* @ORM\OneToMany(targetEntity="Badge", mappedBy="userAgency")
* @ORM\OrderBy({"id" = "DESC"})
*/
private $badges;
/**
* @ORM\OneToMany(targetEntity="AgencyDocument", mappedBy="user")
* @ORM\OrderBy({"createdAt" = "DESC"})
*/
private $documents;
private $roleValue;
public function hasActiveAdvertisement()
{
foreach ($this->getAdvertisements() as $advertisement) {
if ($advertisement->getStatus() === Advertisement::STATUS_VALIDATED || $advertisement->getStatus() === Advertisement::STATUS_PUBLISHED) {
return true;
}
}
return false;
}
/**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function updatedTimestamps()
{
$this->setUpdatedAt(new \DateTime('now'));
if ($this->getCreatedAt() == null) {
$this->setCreatedAt(new \DateTime('now'));
}
}
/**
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* @param mixed $id
*/
public function setId($id)
{
$this->id = $id;
}
/**
* @param mixed $username
*/
public function setUsername($username)
{
$this->username = $username;
}
public function getUsername()
{
return $this->username;
}
/**
* @return array The roles
*/
public function getRoles()
{
return $this->roles;
}
/**
* @param array $roles
*/
public function setRoles($roles)
{
$this->roles = $roles;
}
/**
* Add a role.
*
* @param string $role
*
* @return User
*/
public function addRole($role)
{
$role = strtoupper($role);
if (!in_array($role, $this->roles, true)) {
$this->roles[] = $role;
}
return $this;
}
/**
* Remove a role.
*
* @param string $role
*
* @return User
*/
public function removeRole($role)
{
if (false !== $key = array_search(strtoupper($role), $this->roles, true)) {
unset($this->roles[$key]);
$this->roles = array_values($this->roles);
}
return $this;
}
/**
* @return string
*/
public function getPassword()
{
return $this->password;
}
/**
* @param string $password
*/
public function setPassword($password)
{
$this->password = $password;
}
/**
* @return string
*/
public function getPlainPassword()
{
return $this->plainPassword;
}
/**
* @param string $plainPassword
*/
public function setPlainPassword($plainPassword)
{
$this->plainPassword = $plainPassword;
// Avoid Doctrine *not* saving this entity, if only plainPassword changes
$this->password = null;
}
public function getSalt()
{
}
public function eraseCredentials()
{
$this->plainPassword = null;
}
/**
* @return string
*/
public function getFirstname()
{
return $this->firstname;
}
/**
* @param string $firstname
*/
public function setFirstname($firstname)
{
$this->firstname = $firstname;
}
/**
* @return string
*/
public function getLastname()
{
return $this->lastname;
}
/**
* @param string $lastname
*/
public function setLastname($lastname)
{
$this->lastname = $lastname;
}
/**
* @return string
*/
public function getEmail()
{
return $this->email;
}
/**
* @param string $email
*/
public function setEmail($email)
{
$this->email = $email;
}
/**
* @return string
*/
public function getPhone()
{
return $this->phone;
}
/**
* @param string $phone
*/
public function setPhone($phone)
{
$this->phone = $phone;
}
/**
* @return Agency|null
*/
public function getAgency()
{
return $this->agency;
}
/**
* @param Subscription $pack
*
* @return User
*/
public function setPack(Subscription $pack)
{
$this->pack = $pack;
return $this;
}
/**
* @return Subscription
*/
public function getPack()
{
return $this->pack;
}
/**
* @return integer
*/
public function getPackAdNumber()
{
return $this->packAdNumber;
}
/**
* @param integer $packAdNumber
*/
public function setPackAdNumber($packAdNumber)
{
$this->packAdNumber = $packAdNumber;
}
/**
* @ORM\PrePersist
*/
public function setPackDate()
{
$this->packDate = new \DateTime();
}
/**
* @return \DateTime
*/
public function getPackDate()
{
return $this->packDate;
}
/**
* @return string
*/
public function getStripeId()
{
return $this->stripeId;
}
/**
* @param string $stripeId
*/
public function setStripeId($stripeId)
{
$this->stripeId = $stripeId;
}
/**
* @return string
*/
public function getStripeToken()
{
return $this->stripeToken;
}
/**
* @param string $stripeToken
*/
public function setStripeToken($stripeToken)
{
$this->stripeToken = $stripeToken;
}
/**
* @return Collection
*/
public function getAdvertisements()
{
return $this->advertisements;
}
/**
* @param Advertisement $bookmarks
*/
public function addBookmarks($bookmarks)
{
$this->bookmarks[] = $bookmarks;
}
/**
* @param Advertisement $bookmarks
*/
public function removeBookmarks(Advertisement $bookmarks)
{
$this->bookmarks->removeElement($bookmarks);
}
/**
* @return Collection
*/
public function getBookmarks()
{
return $this->bookmarks;
}
/**
* @return Collection
*/
public function getHelpfulReviews()
{
return $this->helpfulReviews;
}
/**
* @param Review $helpfulReviews
*/
public function addHelpfulReviews($helpfulReviews)
{
$this->helpfulReviews[] = $helpfulReviews;
}
/**
* @param Review $helpfulReviews
*/
public function setHelpfulReviews(Review $helpfulReviews)
{
$this->helpfulReviews->removeElement($helpfulReviews);
}
/**
* @param Review $helpfulReviews
*/
public function removeHelpfulReviews(Review $helpfulReviews)
{
$this->helpfulReviews->removeElement($helpfulReviews);
}
/**
* @return string
*/
public function getIpAddress()
{
return $this->ipAddress;
}
/**
* @param string $ipAddress
*/
public function setIpAddress($ipAddress)
{
$this->ipAddress = $ipAddress;
}
/**
* @return string
*/
public function getToken()
{
return $this->token;
}
/**
* @param string $token
*/
public function setToken($token)
{
$this->token = $token;
}
/**
* @param \DateTime $tokenValidAt
*/
public function setTokenValidAt($tokenValidAt)
{
$this->tokenValidAt = $tokenValidAt;
}
/**
* @return \DateTime
*/
public function getTokenValidAt()
{
return $this->tokenValidAt;
}
/**
* @return string
*/
public function getValidationToken()
{
return $this->validationToken;
}
/**
* @param string $validationToken
*/
public function setValidationToken($validationToken)
{
$this->validationToken = $validationToken;
}
/**
* @return mixed
*/
public function getSearches()
{
return $this->searches;
}
/**
* @param mixed $searches
*/
public function setSearches($searches)
{
$this->searches = $searches;
}
/**
* @return \DateTime|null
*/
public function getUpdatedAt()
{
return $this->updatedAt;
}
/**
* @param \DateTime $updatedAt
*/
public function setUpdatedAt($updatedAt)
{
$this->updatedAt = $updatedAt;
}
/**
* @return \DateTime
*/
public function getCreatedAt()
{
return $this->createdAt;
}
/**
* @param \DateTime $createdAt
*/
public function setCreatedAt($createdAt)
{
$this->createdAt = $createdAt;
}
/**
* Set agency
*
* @param \App\Entity\Agency $agency
*
* @return User
*/
public function setAgency(\App\Entity\Agency $agency = null)
{
$this->agency = $agency;
return $this;
}
/**
* Add advertisement
*
* @param \App\Entity\Advertisement $advertisement
*
* @return User
*/
public function addAdvertisement(\App\Entity\Advertisement $advertisement)
{
$this->advertisements[] = $advertisement;
return $this;
}
/**
* Remove advertisement
*
* @param \App\Entity\Advertisement $advertisement
*/
public function removeAdvertisement(\App\Entity\Advertisement $advertisement)
{
$this->advertisements->removeElement($advertisement);
}
/**
* @return mixed
*/
public function getReviews()
{
return $this->reviews;
}
/**
* @param mixed $reviews
*/
public function setReviews($reviews)
{
$this->reviews = $reviews;
}
/**
* Add search
*
* @param \App\Entity\Search $search
*
* @return User
*/
public function addSearch(\App\Entity\Search $search)
{
$this->searches[] = $search;
return $this;
}
/**
* Remove search
*
* @param \App\Entity\Search $search
*/
public function removeSearch(\App\Entity\Search $search)
{
$this->searches->removeElement($search);
}
/**
* Add bookmark
*
* @param \App\Entity\Advertisement $bookmark
*
* @return User
*/
public function addBookmark(\App\Entity\Advertisement $bookmark)
{
$this->bookmarks[] = $bookmark;
return $this;
}
/**
* Remove bookmark
*
* @param \App\Entity\Advertisement $bookmark
*/
public function removeBookmark(\App\Entity\Advertisement $bookmark)
{
$this->bookmarks->removeElement($bookmark);
}
/**
* @return mixed
*/
public function getRoleValue()
{
return $this->roleValue;
}
/**
* @param mixed $roleValue
*/
public function setRoleValue($roleValue)
{
$this->roleValue = $roleValue;
}
/**
* @return mixed
*/
public function getAvatarPath()
{
return $this->avatarPath;
}
/**
* @param mixed $avatar
*/
public function setAvatarPath($avatar)
{
$this->avatarPath = $avatar;
}
/**
* @return mixed
*/
public function getStatus()
{
return $this->status;
}
/**
* @param mixed $status
*/
public function setStatus($status)
{
$this->status = $status;
}
/**
* @return mixed
*/
public function getApplication()
{
return $this->application;
}
/**
* @param mixed $application
*/
public function setApplication($application)
{
$this->application = $application;
}
/**
* @param mixed $rentalRecords
*/
public function setRentalRecords($rentalRecords)
{
$this->rentalRecords = $rentalRecords;
}
/**
* @return mixed
*/
public function getRentalRecords()
{
return $this->rentalRecords;
}
/**
* @param mixed $coupons
*/
public function setCoupons($coupons)
{
$this->coupons = $coupons;
}
/**
* @return mixed
*/
public function getCoupons()
{
return $this->coupons;
}
public function addCoupons(DiscountCoupon $coupon){
$this->coupons[] = $coupon;
return $this;
}
public function removeCoupons(DiscountCoupon $coupon)
{
$this->coupons->removeElement($coupon);
}
/**
* @return mixed
*/
public function getLeasePath()
{
return $this->leasePath;
}
/**
* @param mixed $leasePath
*/
public function setLeasePath($leasePath)
{
$this->leasePath = $leasePath;
}
/**
* @return \DateTime
*/
public function getLeaseEndingDate()
{
return $this->leaseEndingDate;
}
/**
* @param \DateTime $leaseEndingDate
*/
public function setLeaseEndingDate($leaseEndingDate)
{
$this->leaseEndingDate = $leaseEndingDate;
}
/**
* @param mixed $coupons
*/
public function setMeetings($meetings)
{
$this->meetings = $meetings;
}
/**
* @return mixed
*/
public function getMeetings()
{
return $this->meetings;
}
/**
* @return mixed
*/
public function getBloggerName()
{
return $this->bloggerName;
}
/**
* @param mixed $avatar
*/
public function setBloggerName($bloggerName)
{
$this->bloggerName = $bloggerName;
}
/**
* @return mixed
*/
public function getBloggerAvatarPath()
{
return $this->bloggerAvatarPath;
}
/**
* @param mixed $avatar
*/
public function setBloggerAvatarPath($bloggerAvatarPath)
{
$this->bloggerAvatarPath = $bloggerAvatarPath;
}
/**
* @return mixed
*/
public function getIsPublisher()
{
return $this->isPublisher;
}
/**
* @return mixed
*/
public function isPublisher()
{
return $this->isPublisher;
}
/**
* @param mixed $isPublisher
*/
public function setIsPublisher($isPublisher)
{
$this->isPublisher = $isPublisher;
}
/**
* @return mixed
*/
public function getBadge()
{
return $this->badge;
}
/**
* @param mixed $badge
*/
public function setBadge($badge)
{
$this->badge = $badge;
}
/**
* @return mixed
*/
public function getBadges()
{
return $this->badges;
}
/**
* @param mixed $badges
*/
public function setBadges($badges)
{
$this->badges = $badges;
}
/**
* @return mixed
*/
public function getDocuments()
{
return $this->documents;
}
/**
* @param mixed $documents
*/
public function setDocuments($documents)
{
$this->documents = $documents;
}
/**
* @return mixed
*/
public function getDocument()
{
return $this->document;
}
/**
* @param mixed $document
*/
public function setDocument($document)
{
$this->document = $document;
}
/**
* Add document
*
* @param \App\Entity\AgencyDocument $document
*
* @return Agency
*/
public function addDocument(\App\Entity\AgencyDocument $document)
{
$this->documents[] = $document;
return $this;
}
}