src/Entity/User.php line 19

  1. <?php
  2. namespace App\Entity;
  3. use App\Repository\UserRepository;
  4. use Doctrine\Common\Collections\ArrayCollection;
  5. use Doctrine\Common\Collections\Collection;
  6. use Doctrine\ORM\Mapping as ORM;
  7. use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
  8. use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
  9. use Symfony\Component\Security\Core\User\UserInterface;
  10. use Symfony\Component\String\Slugger\SluggerInterface;
  11. use Symfony\Component\Validator\Constraints as Assert;
  12. #[ORM\Entity(repositoryClassUserRepository::class)]
  13. #[ORM\HasLifecycleCallbacks]
  14. #[UniqueEntity(fields: ['username'], message'fos_user.username.already_used')]
  15. #[UniqueEntity(fields: ['email'], message'fos_user.email.already_used')]
  16. class User implements UserInterfacePasswordAuthenticatedUserInterface
  17. {
  18.     const SPEAKOS_RATIO 850;
  19.     
  20.     const LEVEL_BEGINNER 1;
  21.     const LEVEL_MEDIUM 2;
  22.     const LEVEL_ADVANCED 3;
  23.     
  24.     const SUB_BOTH "both";
  25.     const SUB_LEARN "learn";
  26.     const SUB_NONE "none";
  27.     
  28.     const HELP_LEARN "learn";
  29.     const HELP_MOTHER "mother";
  30.     
  31.     const ROLE_SUPER_ADMIN 'ROLE_SUPER_ADMIN';
  32.     const ROLE_ADMIN 'ROLE_ADMIN';
  33.     const ROLE_NOGIFT 'ROLE_NOGIFT';                //user inscrit sans la période gratuite
  34.     const ROLE_POPIN 'ROLE_POPIN';                //user inscrit avec affichage popin
  35.     const ROLE_PARENT 'ROLE_PARENT';                //user inscrit avec le form parent
  36.     const ROLE_SCHOOL 'ROLE_SCHOOL';                //ecole inscrite avec 2 mois gratuits
  37.     const ROLE_SCHOOLGIFT 'ROLE_SCHOOLGIFT';        //ecole inscrite avec code cadeau mailing
  38.     const ROLE_GIFT 'ROLE_GIFT';                    //user inscrit avec code cadeau
  39.     const ROLE_DIRECT 'ROLE_DIRECT';
  40.     const ROLE_GROUP 'ROLE_GROUP';
  41.     const ROLE_PGP 'ROLE_PGP';
  42.     const ROLE_DEMO 'ROLE_DEMO';
  43.     const ROLE_404 'ROLE_404'//can access to payment stats via /restricted/stats.html
  44.     
  45.     const ROLE_DEV 'ROLE_DEV';
  46.     
  47.     const ROLE_SCHOOLCONTEST 'ROLE_SCHOOLCONTEST';
  48.     const ROLE_AMAZON 'ROLE_AMAZON';
  49.     const ROLE_GOOGLE 'ROLE_GOOGLE';
  50.     const ROLE_APPLE 'ROLE_APPLE';
  51.     const ROLE_BIBLIO 'ROLE_BIBLIO';
  52.     const ROLE_ARCHIMED 'ROLE_ARCHIMED';
  53.     const ROLE_CVS 'ROLE_CVS';
  54.     const ROLE_CAS 'ROLE_CAS'//utilisé actuellement pour le portail soane et loire de C3RB
  55.     const ROLE_BIBLIO_ADM 'ROLE_BIBLIO_ADM'//user pouvant créer des comptes pour les bibliotheque, lié a un biblioInfo
  56.     const ROLE_USERNAME 'ROLE_USERNAME';
  57.     const ROLE_ACCESS 'ROLE_ACCESS'//inscription avec confirmation et acces gratuit
  58.     #[ORM\Id]
  59.     #[ORM\GeneratedValue]
  60.     #[ORM\Column(type'integer')]
  61.     private $id;
  62.     #[Assert\NotBlank(groups: ['registration'])]
  63.     #[ORM\Column(type'string'length180uniquetrue)]
  64.     private $username;
  65.     #[ORM\Column(type'json')]
  66.     private $roles = [];
  67.     #[ORM\Column(type'string')]
  68.     private $password;
  69.     #[Assert\NotBlank(groups: ['registration'])]
  70.     #[Assert\Email(groups: ['registration'])]
  71.     #[ORM\Column(type'string'length255uniquetrue)]
  72.     private $email;
  73.     #[ORM\Column(type'string'length255nullabletrue)]
  74.     private $firstName;
  75.     #[ORM\Column(type'string'length255nullabletrue)]
  76.     private $lastName;
  77.     #[ORM\Column(type'datetime_immutable'nullabletrue)]
  78.     private $birthDate;
  79.     #[ORM\Column(type'datetime_immutable'nullabletrue)]
  80.     private $lastBirthday;
  81.     #[ORM\Column(type'datetime_immutable'nullabletrue)]
  82.     private $lastAppLogin;
  83.     #[ORM\Column(type'boolean')]
  84.     private $male;
  85.     #[ORM\Column(type'string'length255nullabletrue)]
  86.     private $schoolName;
  87.     #[ORM\Column(type'string'length255nullabletrue)]
  88.     private $address;
  89.     #[ORM\Column(type'string'length255nullabletrue)]
  90.     private $zipCode;
  91.     #[ORM\Column(type'string'length255nullabletrue)]
  92.     private $city;
  93.     #[ORM\Column(type'string'length25nullabletrue)]
  94.     private $locale;
  95.     #[ORM\Column(type'string'length255nullabletrue)]
  96.     private $facebookId;
  97.     #[ORM\Column(type'datetime_immutable'nullabletrue)]
  98.     private $subscriptionExpireAt;
  99.     #[ORM\Column(type'datetime_immutable'nullabletrue)]
  100.     private $unsetcardExpireAt;
  101.     #[ORM\Column(type'datetime_immutable'nullabletrue)]
  102.     private $subscriptionDate;
  103.     #[ORM\Column(type'boolean'nullabletrue)]
  104.     private $isSubscriber;
  105.     #[ORM\Column(type'string'length10nullabletrue)]
  106.     private $subscriptionConfirmed;
  107.     #[ORM\Column(type'boolean'nullabletrue)]
  108.     private $isRegistrationConfirmed;
  109.     #[ORM\Column(type'text'nullabletrue)]
  110.     private $presentation;
  111.     #[ORM\Column(type'text'nullabletrue)]
  112.     private $newPresentation;
  113.     #[ORM\Column(type'boolean'nullabletrue)]
  114.     private $incorrectPresentation;
  115.     #[ORM\Column(type'string'length255nullabletrue)]
  116.     private $theme;
  117.     #[ORM\Column(type'string'length255nullabletrue)]
  118.     private $biblioId;
  119.     #[ORM\Column(type'datetime_immutable'nullabletrue)]
  120.     private $lastPartBoughtAt;
  121.     #[ORM\Column(type'datetime_immutable')]
  122.     private $createdAt;
  123.     #[ORM\Column(type'datetime_immutable')]
  124.     private $updatedAt;
  125.     #[ORM\Column(type'datetime_immutable'nullabletrue)]
  126.     private $mailConfirmedAt;
  127.     #[ORM\Column(type'string'length255nullabletrue)]
  128.     private $salt;
  129.     #[ORM\Column(type'string'length255nullabletrue)]
  130.     private $legacyPassword;
  131.     #[ORM\Column(type'boolean')]
  132.     private $newsletter;
  133.     #[ORM\Column(type'integer')]
  134.     private $reminderIndex;
  135.     #[ORM\Column(type'text')]
  136.     private $serializedTags;
  137.     #[ORM\Column(type'integer')]
  138.     private $speakos;
  139.     #[ORM\Column(type'integer')]
  140.     private $totalSpeakos;
  141.     #[ORM\Column(type'string'length255nullabletrue)]
  142.     private $appToken;
  143.     #[ORM\ManyToOne(targetEntityCountry::class, inversedBy'users')]
  144.     #[ORM\JoinColumn(nullablefalse)]
  145.     private $eCountry;
  146.     #[ORM\ManyToOne(targetEntityLibrary::class, inversedBy'users')]
  147.     private $library;
  148.     #[ORM\OneToOne(targetEntitySpeaky::class, cascade: ['persist''remove'])]
  149.     private $avatar;
  150.     #[ORM\OneToMany(mappedBy'user'targetEntityUserGameConfig::class, orphanRemovaltrue)]
  151.     private $gameConfigs;
  152.     #[ORM\OneToMany(mappedBy'user'targetEntityUserSubscribeActivity::class, orphanRemovaltrue)]
  153.     private $subscribeActivities;
  154.     #[ORM\OneToMany(mappedBy'user'targetEntityGameComment::class, orphanRemovaltrue)]
  155.     private $gameComments;
  156.     #[ORM\OneToMany(mappedBy'user'targetEntityGameVote::class, orphanRemovaltrue)]
  157.     private $gameVotes;
  158.     #[ORM\OneToMany(mappedBy'user'targetEntityGamePlay::class, orphanRemovaltrue)]
  159.     private $gamePlays;
  160.     #[ORM\OneToMany(mappedBy'user'targetEntityUserOverallProgress::class, orphanRemovaltrue)]
  161.     private $userProgress;
  162.     #[ORM\OneToMany(mappedBy'user'targetEntityUserWordProgress::class, orphanRemovaltrue)]
  163.     private $userWordProgress;
  164.     #[ORM\OneToMany(mappedBy'user'targetEntityUserPayment::class)]
  165.     private $userPayments;
  166.     #[ORM\OneToMany(mappedBy'user'targetEntityUserGiftPayment::class)]
  167.     private $userGiftPayments;
  168.     #[ORM\OneToMany(mappedBy'user'targetEntityUserLogin::class, orphanRemovaltrue)]
  169.     private $userLogins;
  170.     #[ORM\OneToMany(mappedBy'user'targetEntityUserSentence::class, orphanRemovaltruecascade: ['persist''remove'])]
  171.     private $sentences;
  172.     #[ORM\OneToMany(mappedBy'user'targetEntityUserSpeakyPart::class, orphanRemovaltruecascade: ['persist''remove'])]
  173.     private $parts;
  174.     #[ORM\ManyToMany(targetEntityGiftCode::class, inversedBy'users')]
  175.     private $giftCodes;
  176.     #[ORM\Column(type'boolean')]
  177.     private $isVerified false;
  178.     #[Assert\NotBlank(groups: ['registration'])]
  179.     private ?string $plainPassword null;
  180.     #[Assert\NotBlank(groups: ['giftCode'])]
  181.     private ?string $code null;
  182.     //permet de stocker les sentences dans l'ordre
  183.     protected $orderedSentences;
  184.     #[ORM\Column(type'string'length255)]
  185.     private $usernameCanonical;
  186.     public function setValue($field$value
  187.     {
  188.         $methodName 'set'.ucfirst($field);
  189.         try {
  190.             $this->$methodName($value);
  191.         } catch (\Exception $e) {
  192.             dump("Method "$methodName " doesnt work !");
  193.         }
  194.         return $this;
  195.     }
  196.     public function getValue($field
  197.     {
  198.         $value null;
  199.         $methodName 'get'.ucfirst($field);
  200.         try {
  201.             $value $this->$methodName();
  202.         } catch (\Exception $e) {
  203.             dump("Method "$methodName " doesnt work !");
  204.         }
  205.         return $value;
  206.     }
  207.     public function getPlainPassword(): ?string
  208.     {
  209.         return $this->plainPassword;
  210.     }
  211.     public function setPlainPassword(string $password): void
  212.     {
  213.         $this->plainPassword $password;
  214.     }
  215.     public function getCode(): ?string
  216.     {
  217.         return $this->code;
  218.     }
  219.     public function setCode(string $code): void
  220.     {
  221.         $this->code $code;
  222.     }
  223.     
  224.     public function getCountry()
  225.     {
  226.         if (!$this->eCountry)
  227.             return 'France métropolitaine';
  228.         return $this->eCountry->getName();
  229.     }
  230.     
  231.     public function getCountryCode()
  232.     {
  233.         if (!$this->eCountry)
  234.             return 'FR';
  235.             $code $this->eCountry->getIsoCode();
  236.             if(is_int($code))
  237.                 return 'FR';
  238.             return $code;
  239.     }
  240.     
  241.     public function needsQuote() {
  242.         $firstLetter strtolower($this->usernameCanonical[0]);
  243.         $quotesNeeded = array('a''e''i''o''u');
  244.         foreach ($quotesNeeded as $needed) {
  245.             if ($firstLetter == $needed) {
  246.                 return true;
  247.             }
  248.         }
  249.         return false;
  250.     }
  251.     
  252.     /**
  253.      * Tells if the the given user has the super admin role.
  254.      *
  255.      * @return Boolean
  256.      */
  257.     public function isAdmin()
  258.     {
  259.         return $this->hasRole(static::ROLE_ADMIN) || $this->hasRole(static::ROLE_SUPER_ADMIN);
  260.     }
  261.     
  262.     /**
  263.      * Tells if the the given user has the super admin role.
  264.      *
  265.      * @return Boolean
  266.      */
  267.     public function isSuperAdmin()
  268.     {
  269.         return $this->hasRole(static::ROLE_SUPER_ADMIN);
  270.     }
  271.     
  272.     public function hasRestrictedAccess(){
  273.         return $this->hasRole(self::ROLE_BIBLIO) || $this->hasRole(self::ROLE_SCHOOL) || $this->hasRole(self::ROLE_DEMO);
  274.     }
  275.     public function getAge()
  276.     {
  277.         if ($this->birthDate == null)
  278.             return null;
  279.         $age $this->birthDate->diff(new \DateTime('now'), true);
  280.         return (int) $age->format('%y');
  281.     }
  282.     
  283.     public function isSubscribed()
  284.     {
  285.         $date = new \DateTime();
  286.         return ($this->subscriptionExpireAt >= $date || $this->isSubscriber);
  287.     }
  288.     public function winSpeakos($speakos)
  289.     {
  290.         $this->speakos += $speakos;
  291.         $this->totalSpeakos += $speakos;
  292.     }
  293.     public function __construct()
  294.     {
  295.         $this->gameConfigs = new ArrayCollection();
  296.         $this->subscribeActivities = new ArrayCollection();
  297.         $this->gameComments = new ArrayCollection();
  298.         $this->gameVotes = new ArrayCollection();
  299.         $this->gamePlays = new ArrayCollection();
  300.         $this->userProgress = new ArrayCollection();
  301.         $this->userWordProgress = new ArrayCollection();
  302.         $this->userPayments = new ArrayCollection();
  303.         $this->userGiftPayments = new ArrayCollection();
  304.         $this->userLogins = new ArrayCollection();
  305.         $this->sentences = new ArrayCollection();
  306.         $this->parts = new ArrayCollection();
  307.         $this->giftCodes = new ArrayCollection();
  308.         $this->reminderIndex 1;
  309.         $this->newsletter true;
  310.         $this->speakos 0;
  311.         $this->totalSpeakos 0;
  312.         $this->registrationConfirmed false;
  313.         $this->male true;
  314.         $this->locale 'fr';
  315.         $this->password '';
  316.         $this->serializedTags '';
  317.     }
  318.     
  319.     public function initTempData(UserTempData $data){
  320.         $this->username $data->getUserName();
  321.         $this->password $data->getPassword();
  322.         $this->email $data->getEmail();
  323.         $this->serializedTags $data->getSerializedTags();
  324.         
  325.         $this->locale $data->getLocale();
  326.         
  327.         $this->address $data->getAddress();
  328.         $this->zipCode $data->getZipCode();
  329.         $this->city $data->getCity();
  330.         $this->eCountry $data->getECountry();
  331.         $this->firstName $data->getFirstName();
  332.         $this->lastName $data->getLastName();
  333.         $this->schoolName $data->getSchoolName();
  334.         $this->facebookId $data->getFacebookId();
  335.         
  336.         if($this->schoolName != null && $this->schoolName != ''){
  337.             $this->addRole(User::ROLE_SCHOOL);
  338.         }
  339.     }
  340.     public function __toString(): string
  341.     {
  342.         return "#" $this->id " " $this->username;
  343.     }
  344.     public function computeSlug(SluggerInterface $slugger)
  345.     {
  346.         $this->usernameCanonical = (string) $slugger->slug((string) $this->username)->lower();
  347.     }
  348.     #[ORM\PrePersist]
  349.     public function setCreatedAtValue() 
  350.     {
  351.         $this->mailConfirmedAt = new \DateTimeImmutable();
  352.         $this->createdAt = new \DateTimeImmutable();
  353.         $this->updatedAt = new \DateTimeImmutable();
  354.     }
  355.     #[ORM\PreUpdate]
  356.     public function setUpdatedAtValue() 
  357.     {
  358.         $this->updatedAt = new \DateTimeImmutable();
  359.     }
  360.     public function getDisplayAge(): ?int
  361.     {
  362.         if ($this->birthDate == null)
  363.             return null;
  364.         $age $this->birthDate->diff(new \DateTime('now'), true);
  365.         $display $age->format('%y');//.' ans';
  366.         /*if ((int) $age->format('%m') >= 6)
  367.             $display .= ' et demi';*/
  368.         return $display;
  369.     }
  370.     public function getDisplayCountry()
  371.     {
  372.         if (!$this->eCountry || $this->eCountry->getName() == 'France métropolitaine')
  373.             return 'France';
  374.         return $this->eCountry->getName();
  375.     }
  376.     public function getId(): ?int
  377.     {
  378.         return $this->id;
  379.     }
  380.     public function setId(int $id): self
  381.     {
  382.         $this->id $id;
  383.         return $this;
  384.     }
  385.     public function getUsername(): ?string
  386.     {
  387.         return $this->username;
  388.     }
  389.     public function setUsername(string $username): self
  390.     {
  391.         $this->username $username;
  392.         return $this;
  393.     }
  394.     /**
  395.      * A visual identifier that represents this user.
  396.      *
  397.      * @see UserInterface
  398.      */
  399.     public function getUserIdentifier(): string
  400.     {
  401.         return (string) $this->username;
  402.     }
  403.     /**
  404.      * @see UserInterface
  405.      */
  406.     public function getRoles(): array
  407.     {
  408.         $roles $this->roles;
  409.         // guarantee every user at least has ROLE_USER
  410.         $roles[] = 'ROLE_USER';
  411.         return array_unique($roles);
  412.     }
  413.     public function setRoles(array $roles): self
  414.     {
  415.         $this->roles $roles;
  416.         return $this;
  417.     }
  418.     public function hasRole($role)
  419.     {
  420.         return in_array(strtoupper($role), $this->getRoles(), true);
  421.     }
  422.     
  423.     public function addRole($role): self
  424.     {
  425.         $roles $this->roles;
  426.         // guarantee every user at least has ROLE_USER
  427.         $roles[] = $role;
  428.         $this->setRoles(array_unique($roles));
  429.         return $this;
  430.     }
  431.     /**
  432.      * @see PasswordAuthenticatedUserInterface
  433.      */
  434.     public function getPassword(): string
  435.     {
  436.         return $this->password;
  437.     }
  438.     public function setPassword(string $password): self
  439.     {
  440.         $this->password $password;
  441.         return $this;
  442.     }
  443.     /**
  444.      * @see UserInterface
  445.      */
  446.     public function eraseCredentials()
  447.     {
  448.         // If you store any temporary, sensitive data on the user, clear it here
  449.         // $this->plainPassword = null;
  450.     }
  451.     public function getEmail(): ?string
  452.     {
  453.         return $this->email;
  454.     }
  455.     public function setEmail(string $email): self
  456.     {
  457.         $this->email $email;
  458.         return $this;
  459.     }
  460.     public function getFirstName(): ?string
  461.     {
  462.         return $this->firstName;
  463.     }
  464.     public function setFirstName(?string $firstName): self
  465.     {
  466.         $this->firstName $firstName;
  467.         return $this;
  468.     }
  469.     public function getLastName(): ?string
  470.     {
  471.         return $this->lastName;
  472.     }
  473.     public function setLastName(?string $lastName): self
  474.     {
  475.         $this->lastName $lastName;
  476.         return $this;
  477.     }
  478.     public function getBirthDate(): ?\DateTimeImmutable
  479.     {
  480.         return $this->birthDate;
  481.     }
  482.     public function setBirthDate(?\DateTimeImmutable $birthDate): self
  483.     {
  484.         $this->birthDate $birthDate;
  485.         return $this;
  486.     }
  487.     public function getLastBirthday(): ?\DateTimeImmutable
  488.     {
  489.         return $this->lastBirthday;
  490.     }
  491.     public function setLastBirthday(?\DateTimeImmutable $lastBirthday): self
  492.     {
  493.         $this->lastBirthday $lastBirthday;
  494.         return $this;
  495.     }
  496.     public function getLastAppLogin(): ?\DateTimeImmutable
  497.     {
  498.         return $this->lastAppLogin;
  499.     }
  500.     public function setLastAppLogin(?\DateTimeImmutable $lastAppLogin): self
  501.     {
  502.         $this->lastAppLogin $lastAppLogin;
  503.         return $this;
  504.     }
  505.     public function getMale(): ?bool
  506.     {
  507.         return $this->male;
  508.     }
  509.     public function setMale(bool $male): self
  510.     {
  511.         $this->male $male;
  512.         return $this;
  513.     }
  514.     public function getSchoolName(): ?string
  515.     {
  516.         return $this->schoolName;
  517.     }
  518.     public function setSchoolName(?string $schoolName): self
  519.     {
  520.         $this->schoolName $schoolName;
  521.         return $this;
  522.     }
  523.     public function getAddress(): ?string
  524.     {
  525.         return $this->address;
  526.     }
  527.     public function setAddress(?string $address): self
  528.     {
  529.         $this->address $address;
  530.         return $this;
  531.     }
  532.     public function getZipCode(): ?string
  533.     {
  534.         return $this->zipCode;
  535.     }
  536.     public function setZipCode(?string $zipCode): self
  537.     {
  538.         $this->zipCode $zipCode;
  539.         return $this;
  540.     }
  541.     public function getCity(): ?string
  542.     {
  543.         return $this->city;
  544.     }
  545.     public function setCity(?string $city): self
  546.     {
  547.         $this->city $city;
  548.         return $this;
  549.     }
  550.     public function getLocale(): ?string
  551.     {
  552.         return $this->locale;
  553.     }
  554.     public function setLocale(?string $locale): self
  555.     {
  556.         $this->locale $locale;
  557.         return $this;
  558.     }
  559.     public function getFacebookId(): ?string
  560.     {
  561.         return $this->facebookId;
  562.     }
  563.     public function setFacebookId(?string $facebookId): self
  564.     {
  565.         $this->facebookId $facebookId;
  566.         return $this;
  567.     }
  568.     public function getSubscriptionExpireAt(): ?\DateTimeImmutable
  569.     {
  570.         return $this->subscriptionExpireAt;
  571.     }
  572.     public function setSubscriptionExpireAt(?\DateTimeImmutable $subscriptionExpireAt): self
  573.     {
  574.         $this->subscriptionExpireAt $subscriptionExpireAt;
  575.         return $this;
  576.     }
  577.     public function getUnsetcardExpireAt(): ?\DateTimeImmutable
  578.     {
  579.         return $this->unsetcardExpireAt;
  580.     }
  581.     public function setUnsetcardExpireAt(?\DateTimeImmutable $unsetcardExpireAt): self
  582.     {
  583.         $this->unsetcardExpireAt $unsetcardExpireAt;
  584.         return $this;
  585.     }
  586.     public function getSubscriptionDate(): ?\DateTimeImmutable
  587.     {
  588.         return $this->subscriptionDate;
  589.     }
  590.     public function setSubscriptionDate(?\DateTimeImmutable $subscriptionDate): self
  591.     {
  592.         $this->subscriptionDate $subscriptionDate;
  593.         return $this;
  594.     }
  595.     public function getIsSubscriber(): ?bool
  596.     {
  597.         return $this->isSubscriber;
  598.     }
  599.     public function setIsSubscriber(?bool $isSubscriber): self
  600.     {
  601.         $this->isSubscriber $isSubscriber;
  602.         return $this;
  603.     }
  604.     public function getSubscriptionConfirmed(): ?string
  605.     {
  606.         return $this->subscriptionConfirmed;
  607.     }
  608.     public function setSubscriptionConfirmed(?string $subscriptionConfirmed): self
  609.     {
  610.         $this->subscriptionConfirmed $subscriptionConfirmed;
  611.         return $this;
  612.     }
  613.     public function getIsRegistrationConfirmed(): ?bool
  614.     {
  615.         return $this->isRegistrationConfirmed;
  616.     }
  617.     public function setIsRegistrationConfirmed(?bool $isRegistrationConfirmed): self
  618.     {
  619.         $this->isRegistrationConfirmed $isRegistrationConfirmed;
  620.         return $this;
  621.     }
  622.     public function getPresentation(): ?string
  623.     {
  624.         return $this->presentation;
  625.     }
  626.     public function setPresentation(?string $presentation): self
  627.     {
  628.         $this->presentation $presentation;
  629.         return $this;
  630.     }
  631.     public function getNewPresentation(): ?string
  632.     {
  633.         return $this->newPresentation;
  634.     }
  635.     public function setNewPresentation(?string $newPresentation): self
  636.     {
  637.         $this->newPresentation $newPresentation;
  638.         return $this;
  639.     }
  640.     public function getIncorrectPresentation(): ?bool
  641.     {
  642.         return $this->incorrectPresentation;
  643.     }
  644.     public function setIncorrectPresentation(?bool $incorrectPresentation): self
  645.     {
  646.         $this->incorrectPresentation $incorrectPresentation;
  647.         return $this;
  648.     }
  649.     public function getTheme(): ?string
  650.     {
  651.         return $this->theme;
  652.     }
  653.     public function setTheme(?string $theme): self
  654.     {
  655.         $this->theme $theme;
  656.         return $this;
  657.     }
  658.     public function getBiblioId(): ?string
  659.     {
  660.         return $this->biblioId;
  661.     }
  662.     public function setBiblioId(?string $biblioId): self
  663.     {
  664.         $this->biblioId $biblioId;
  665.         return $this;
  666.     }
  667.     public function getLastPartBoughtAt(): ?\DateTimeImmutable
  668.     {
  669.         return $this->lastPartBoughtAt;
  670.     }
  671.     public function setLastPartBoughtAt(?\DateTimeImmutable $lastPartBoughtAt): self
  672.     {
  673.         $this->lastPartBoughtAt $lastPartBoughtAt;
  674.         return $this;
  675.     }
  676.     public function getCreatedAt(): ?\DateTimeImmutable
  677.     {
  678.         return $this->createdAt;
  679.     }
  680.     public function setCreatedAt(\DateTimeImmutable $createdAt): self
  681.     {
  682.         $this->createdAt $createdAt;
  683.         return $this;
  684.     }
  685.     public function getUpdatedAt(): ?\DateTimeImmutable
  686.     {
  687.         return $this->updatedAt;
  688.     }
  689.     public function setUpdatedAt(\DateTimeImmutable $updatedAt): self
  690.     {
  691.         $this->updatedAt $updatedAt;
  692.         return $this;
  693.     }
  694.     public function getMailConfirmedAt(): ?\DateTimeImmutable
  695.     {
  696.         return $this->mailConfirmedAt;
  697.     }
  698.     public function setMailConfirmedAt(?\DateTimeImmutable $mailConfirmedAt): self
  699.     {
  700.         $this->mailConfirmedAt $mailConfirmedAt;
  701.         return $this;
  702.     }
  703.     public function getSalt(): ?string
  704.     {
  705.         return $this->salt;
  706.     }
  707.     public function setSalt(string $salt): self
  708.     {
  709.         $this->salt $salt;
  710.         return $this;
  711.     }
  712.     public function getLegacyPassword(): ?string
  713.     {
  714.         return $this->legacyPassword;
  715.     }
  716.     public function setLegacyPassword(?string $legacyPassword): self
  717.     {
  718.         $this->legacyPassword $legacyPassword;
  719.         return $this;
  720.     }
  721.     public function getNewsletter(): ?bool
  722.     {
  723.         return $this->newsletter;
  724.     }
  725.     public function setNewsletter(bool $newsletter): self
  726.     {
  727.         $this->newsletter $newsletter;
  728.         return $this;
  729.     }
  730.     public function getReminderIndex(): ?int
  731.     {
  732.         return $this->reminderIndex;
  733.     }
  734.     public function setReminderIndex(int $reminderIndex): self
  735.     {
  736.         $this->reminderIndex $reminderIndex;
  737.         return $this;
  738.     }
  739.     public function getSerializedTags(): ?string
  740.     {
  741.         return $this->serializedTags;
  742.     }
  743.     public function setSerializedTags(string $serializedTags): self
  744.     {
  745.         $this->serializedTags $serializedTags;
  746.         return $this;
  747.     }
  748.     public function getSpeakos(): ?int
  749.     {
  750.         return $this->speakos;
  751.     }
  752.     public function setSpeakos(int $speakos): self
  753.     {
  754.         $this->speakos $speakos;
  755.         return $this;
  756.     }
  757.     public function addSpeakos(int $speakos): self
  758.     {
  759.         $this->speakos += $speakos;
  760.         $this->totalSpeakos += $speakos;
  761.     
  762.         return $this;
  763.     }
  764.     public function getTotalSpeakos(): ?int
  765.     {
  766.         return $this->totalSpeakos;
  767.     }
  768.     public function setTotalSpeakos(int $totalSpeakos): self
  769.     {
  770.         $this->totalSpeakos $totalSpeakos;
  771.         return $this;
  772.     }
  773.     public function getAppToken(): ?string
  774.     {
  775.         return $this->appToken;
  776.     }
  777.     public function setAppToken(?string $appToken): self
  778.     {
  779.         $this->appToken $appToken;
  780.         return $this;
  781.     }
  782.     public function getECountry(): ?Country
  783.     {
  784.         return $this->eCountry;
  785.     }
  786.     public function setECountry(?Country $eCountry): self
  787.     {
  788.         $this->eCountry $eCountry;
  789.         return $this;
  790.     }
  791.     public function getLibrary(): ?Library
  792.     {
  793.         return $this->library;
  794.     }
  795.     public function setLibrary(?Library $library): self
  796.     {
  797.         $this->library $library;
  798.         return $this;
  799.     }
  800.     public function getAvatar(): ?Speaky
  801.     {
  802.         return $this->avatar;
  803.     }
  804.     public function setAvatar(?Speaky $avatar): self
  805.     {
  806.         $this->avatar $avatar;
  807.         return $this;
  808.     }
  809.     /**
  810.      * @return Collection<int, UserGameConfig>
  811.      */
  812.     public function getGameConfigs(): Collection
  813.     {
  814.         return $this->gameConfigs;
  815.     }
  816.     public function addGameConfig(UserGameConfig $gameConfig): self
  817.     {
  818.         if (!$this->gameConfigs->contains($gameConfig)) {
  819.             $this->gameConfigs[] = $gameConfig;
  820.             $gameConfig->setUser($this);
  821.         }
  822.         return $this;
  823.     }
  824.     public function removeGameConfig(UserGameConfig $gameConfig): self
  825.     {
  826.         if ($this->gameConfigs->removeElement($gameConfig)) {
  827.             // set the owning side to null (unless already changed)
  828.             if ($gameConfig->getUser() === $this) {
  829.                 $gameConfig->setUser(null);
  830.             }
  831.         }
  832.         return $this;
  833.     }
  834.     /**
  835.      * @return Collection<int, UserSubscribeActivity>
  836.      */
  837.     public function getSubscribeActivities(): Collection
  838.     {
  839.         return $this->subscribeActivities;
  840.     }
  841.     public function addSubscribeActivity(UserSubscribeActivity $subscribeActivity): self
  842.     {
  843.         if (!$this->subscribeActivities->contains($subscribeActivity)) {
  844.             $this->subscribeActivities[] = $subscribeActivity;
  845.             $subscribeActivity->setUser($this);
  846.         }
  847.         return $this;
  848.     }
  849.     public function removeSubscribeActivity(UserSubscribeActivity $subscribeActivity): self
  850.     {
  851.         if ($this->subscribeActivities->removeElement($subscribeActivity)) {
  852.             // set the owning side to null (unless already changed)
  853.             if ($subscribeActivity->getUser() === $this) {
  854.                 $subscribeActivity->setUser(null);
  855.             }
  856.         }
  857.         return $this;
  858.     }
  859.     /**
  860.      * @return Collection<int, GameComment>
  861.      */
  862.     public function getGameComments(): Collection
  863.     {
  864.         return $this->gameComments;
  865.     }
  866.     public function addGameComment(GameComment $gameComment): self
  867.     {
  868.         if (!$this->gameComments->contains($gameComment)) {
  869.             $this->gameComments[] = $gameComment;
  870.             $gameComment->setUser($this);
  871.         }
  872.         return $this;
  873.     }
  874.     public function removeGameComment(GameComment $gameComment): self
  875.     {
  876.         if ($this->gameComments->removeElement($gameComment)) {
  877.             // set the owning side to null (unless already changed)
  878.             if ($gameComment->getUser() === $this) {
  879.                 $gameComment->setUser(null);
  880.             }
  881.         }
  882.         return $this;
  883.     }
  884.     /**
  885.      * @return Collection<int, GameVote>
  886.      */
  887.     public function getGameVotes(): Collection
  888.     {
  889.         return $this->gameVotes;
  890.     }
  891.     public function addGameVote(GameVote $gameVote): self
  892.     {
  893.         if (!$this->gameVotes->contains($gameVote)) {
  894.             $this->gameVotes[] = $gameVote;
  895.             $gameVote->setUser($this);
  896.         }
  897.         return $this;
  898.     }
  899.     public function removeGameVote(GameVote $gameVote): self
  900.     {
  901.         if ($this->gameVotes->removeElement($gameVote)) {
  902.             // set the owning side to null (unless already changed)
  903.             if ($gameVote->getUser() === $this) {
  904.                 $gameVote->setUser(null);
  905.             }
  906.         }
  907.         return $this;
  908.     }
  909.     /**
  910.      * @return Collection<int, GamePlay>
  911.      */
  912.     public function getGamePlays(): Collection
  913.     {
  914.         return $this->gamePlays;
  915.     }
  916.     public function addGamePlay(GamePlay $gamePlay): self
  917.     {
  918.         if (!$this->gamePlays->contains($gamePlay)) {
  919.             $this->gamePlays[] = $gamePlay;
  920.             $gamePlay->setUser($this);
  921.         }
  922.         return $this;
  923.     }
  924.     public function removeGamePlay(GamePlay $gamePlay): self
  925.     {
  926.         if ($this->gamePlays->removeElement($gamePlay)) {
  927.             // set the owning side to null (unless already changed)
  928.             if ($gamePlay->getUser() === $this) {
  929.                 $gamePlay->setUser(null);
  930.             }
  931.         }
  932.         return $this;
  933.     }
  934.     /**
  935.      * @return Collection<int, UserOverallProgress>
  936.      */
  937.     public function getUserProgress(): Collection
  938.     {
  939.         return $this->userProgress;
  940.     }
  941.     public function addUserProgress(UserOverallProgress $userProgress): self
  942.     {
  943.         if (!$this->userProgress->contains($userProgress)) {
  944.             $this->userProgress[] = $userProgress;
  945.             $userProgress->setUser($this);
  946.         }
  947.         return $this;
  948.     }
  949.     public function removeUserProgress(UserOverallProgress $userProgress): self
  950.     {
  951.         if ($this->userProgress->removeElement($userProgress)) {
  952.             // set the owning side to null (unless already changed)
  953.             if ($userProgress->getUser() === $this) {
  954.                 $userProgress->setUser(null);
  955.             }
  956.         }
  957.         return $this;
  958.     }
  959.     /**
  960.      * @return Collection<int, UserWordProgress>
  961.      */
  962.     public function getUserWordProgress(): Collection
  963.     {
  964.         return $this->userWordProgress;
  965.     }
  966.     public function addUserWordProgress(UserWordProgress $userWordProgress): self
  967.     {
  968.         if (!$this->userWordProgress->contains($userWordProgress)) {
  969.             $this->userWordProgress[] = $userWordProgress;
  970.             $userWordProgress->setUser($this);
  971.         }
  972.         return $this;
  973.     }
  974.     public function removeUserWordProgress(UserWordProgress $userWordProgress): self
  975.     {
  976.         if ($this->userWordProgress->removeElement($userWordProgress)) {
  977.             // set the owning side to null (unless already changed)
  978.             if ($userWordProgress->getUser() === $this) {
  979.                 $userWordProgress->setUser(null);
  980.             }
  981.         }
  982.         return $this;
  983.     }
  984.     /**
  985.      * @return Collection<int, UserPayment>
  986.      */
  987.     public function getUserPayments(): Collection
  988.     {
  989.         return $this->userPayments;
  990.     }
  991.     public function addUserPayment(UserPayment $userPayment): self
  992.     {
  993.         if (!$this->userPayments->contains($userPayment)) {
  994.             $this->userPayments[] = $userPayment;
  995.             $userPayment->setUser($this);
  996.         }
  997.         return $this;
  998.     }
  999.     public function removeUserPayment(UserPayment $userPayment): self
  1000.     {
  1001.         if ($this->userPayments->removeElement($userPayment)) {
  1002.             // set the owning side to null (unless already changed)
  1003.             if ($userPayment->getUser() === $this) {
  1004.                 $userPayment->setUser(null);
  1005.             }
  1006.         }
  1007.         return $this;
  1008.     }
  1009.     /**
  1010.      * @return Collection<int, UserGiftPayment>
  1011.      */
  1012.     public function getUserGiftPayments(): Collection
  1013.     {
  1014.         return $this->userGiftPayments;
  1015.     }
  1016.     public function addUserGiftPayment(UserGiftPayment $userGiftPayment): self
  1017.     {
  1018.         if (!$this->userGiftPayments->contains($userGiftPayment)) {
  1019.             $this->userGiftPayments[] = $userGiftPayment;
  1020.             $userGiftPayment->setUser($this);
  1021.         }
  1022.         return $this;
  1023.     }
  1024.     public function removeUserGiftPayment(UserGiftPayment $userGiftPayment): self
  1025.     {
  1026.         if ($this->userGiftPayments->removeElement($userGiftPayment)) {
  1027.             // set the owning side to null (unless already changed)
  1028.             if ($userGiftPayment->getUser() === $this) {
  1029.                 $userGiftPayment->setUser(null);
  1030.             }
  1031.         }
  1032.         return $this;
  1033.     }
  1034.     /**
  1035.      * @return Collection<int, UserLogin>
  1036.      */
  1037.     public function getUserLogins(): Collection
  1038.     {
  1039.         return $this->userLogins;
  1040.     }
  1041.     public function addUserLogin(UserLogin $userLogin): self
  1042.     {
  1043.         if (!$this->userLogins->contains($userLogin)) {
  1044.             $this->userLogins[] = $userLogin;
  1045.             $userLogin->setUser($this);
  1046.         }
  1047.         return $this;
  1048.     }
  1049.     public function removeUserLogin(UserLogin $userLogin): self
  1050.     {
  1051.         if ($this->userLogins->removeElement($userLogin)) {
  1052.             // set the owning side to null (unless already changed)
  1053.             if ($userLogin->getUser() === $this) {
  1054.                 $userLogin->setUser(null);
  1055.             }
  1056.         }
  1057.         return $this;
  1058.     }
  1059.     /**
  1060.      * @return Collection<int, UserSentence>
  1061.      */
  1062.     public function getSentences(): Collection
  1063.     {
  1064.         return $this->sentences;
  1065.     }
  1066.     public function addSentence(UserSentence $sentence): self
  1067.     {
  1068.         if (!$this->sentences->contains($sentence)) {
  1069.             $this->sentences[] = $sentence;
  1070.             $sentence->setUser($this);
  1071.         }
  1072.         return $this;
  1073.     }
  1074.     public function removeSentence(UserSentence $sentence): self
  1075.     {
  1076.         if ($this->sentences->removeElement($sentence)) {
  1077.             // set the owning side to null (unless already changed)
  1078.             if ($sentence->getUser() === $this) {
  1079.                 $sentence->setUser(null);
  1080.             }
  1081.         }
  1082.         return $this;
  1083.     }
  1084.     public function getorderedSentences() {
  1085.         if (!$this->orderedSentences) {
  1086.             $this->orderedSentences = new ArrayCollection();
  1087.             //Order the sentences by sentenceOrder
  1088.             $maxOrder 0;
  1089.             foreach ($this->getSentences() as $sentence) {
  1090.                 if ($sentence->getSentenceOrder() > $maxOrder)
  1091.                     $maxOrder $sentence->getSentenceOrder();
  1092.             }
  1093.             for ($i 0$i <= $maxOrder$i++) {
  1094.                 foreach ($this->getSentences() as $sentence) {
  1095.                     if ($sentence->getSentenceOrder() == $i && !$this->orderedSentences->contains($sentence->getSentence()))
  1096.                         $this->orderedSentences->add($sentence->getSentence());
  1097.                 }
  1098.             }
  1099.         }
  1100.         return $this->orderedSentences;
  1101.     }
  1102.     /**
  1103.      * @return Collection<int, UserSpeakyPart>
  1104.      */
  1105.     public function getParts(): Collection
  1106.     {
  1107.         return $this->parts;
  1108.     }
  1109.     public function addPart(UserSpeakyPart $part): self
  1110.     {
  1111.         if (!$this->parts->contains($part)) {
  1112.             $this->parts[] = $part;
  1113.             $part->setUser($this);
  1114.         }
  1115.         return $this;
  1116.     }
  1117.     public function removePart(UserSpeakyPart $part): self
  1118.     {
  1119.         if ($this->parts->removeElement($part)) {
  1120.             // set the owning side to null (unless already changed)
  1121.             if ($part->getUser() === $this) {
  1122.                 $part->setUser(null);
  1123.             }
  1124.         }
  1125.         return $this;
  1126.     }
  1127.     /**
  1128.      * @return Collection<int, GiftCode>
  1129.      */
  1130.     public function getGiftCodes(): Collection
  1131.     {
  1132.         return $this->giftCodes;
  1133.     }
  1134.     public function addGiftCode(GiftCode $giftCode): self
  1135.     {
  1136.         if (!$this->giftCodes->contains($giftCode)) {
  1137.             $this->giftCodes[] = $giftCode;
  1138.         }
  1139.         return $this;
  1140.     }
  1141.     public function removeGiftCode(GiftCode $giftCode): self
  1142.     {
  1143.         $this->giftCodes->removeElement($giftCode);
  1144.         return $this;
  1145.     }
  1146.     public function isVerified(): bool
  1147.     {
  1148.         return $this->isVerified;
  1149.     }
  1150.     public function setIsVerified(bool $isVerified): self
  1151.     {
  1152.         $this->isVerified $isVerified;
  1153.         return $this;
  1154.     }
  1155.     public function getUsernameCanonical(): ?string
  1156.     {
  1157.         return $this->usernameCanonical;
  1158.     }
  1159.     public function setUsernameCanonical(string $usernameCanonical): self
  1160.     {
  1161.         $this->usernameCanonical $usernameCanonical;
  1162.         return $this;
  1163.     }
  1164.     
  1165.     /**
  1166.      * Tells if the the given user has the school role.
  1167.      *
  1168.      * @return Boolean
  1169.      */
  1170.     public function isSchool()
  1171.     {
  1172.         return $this->hasRole(static::ROLE_SCHOOL) || $this->hasRole(static::ROLE_SCHOOLGIFT);
  1173.     }
  1174.     
  1175.     public function isLibrary() {
  1176.         return $this->hasRole(self::ROLE_BIBLIO || self::ROLE_ARCHIMED || self::ROLE_CVS || self::ROLE_BIBLIO_ADM);
  1177.     }
  1178. }