src/Entity/User.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\Entity;
  3. use App\Entity\Email\RecipientInterface;
  4. use App\Entity\LegalEntity\Member\Company;
  5. use App\Entity\LegalEntity\Order\AbstractInvoice;
  6. use App\Entity\Substance\Ec;
  7. use App\Entity\Traits\IdTrait;
  8. use App\Entity\User\History;
  9. use App\Entity\User\MailArchive\Message;
  10. use App\Entity\User\Profile;
  11. use App\Entity\User\Settings;
  12. use App\Entity\User\Token;
  13. use App\Entity\User\Tutorial;
  14. use Carbon\Carbon;
  15. use Doctrine\Common\Collections\ArrayCollection;
  16. use Doctrine\ORM\Mapping as ORM;
  17. use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
  18. use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
  19. use Symfony\Component\Security\Core\User\UserInterface;
  20. use Symfony\Component\Validator\Constraints as Assert;
  21. /**
  22.  * Class User.
  23.  *
  24.  * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
  25.  *
  26.  * @ORM\Table(name="security_user")
  27.  *
  28.  * @UniqueEntity(fields={"email", "removed"})
  29.  */
  30. class User extends AbstractEntity implements UserInterfacePasswordAuthenticatedUserInterfaceRecipientInterface\Serializable
  31. {
  32.     use IdTrait;
  33.     /**
  34.      * @ORM\Column(type="string")
  35.      *
  36.      * @Assert\NotBlank()
  37.      *
  38.      * @Assert\Email()
  39.      */
  40.     private string $email;
  41.     /**
  42.      * @ORM\Column(type="string")
  43.      *
  44.      * @Assert\NotBlank()
  45.      */
  46.     private ?string $password '__uninitialised__';
  47.     /**
  48.      * @var Profile
  49.      *
  50.      * @ORM\OneToOne(targetEntity="App\Entity\User\Profile", mappedBy="user", cascade={"all"})
  51.      *
  52.      * @Assert\Valid()
  53.      */
  54.     private $profile;
  55.     /**
  56.      * @var History[]|ArrayCollection
  57.      *
  58.      * @ORM\OneToMany(targetEntity="App\Entity\User\History", mappedBy="user", cascade={"all"})
  59.      */
  60.     private $history;
  61.     /**
  62.      * @var Group[]|ArrayCollection
  63.      *
  64.      * @ORM\ManyToMany(targetEntity="App\Entity\Group", inversedBy="users", cascade={"all"})
  65.      *
  66.      * @ORM\JoinTable(name="_join_table_security_user_and_group")
  67.      */
  68.     private $groups;
  69.     private ?string $plainPassword null;
  70.     /**
  71.      * @var Company[]|ArrayCollection
  72.      *
  73.      * @ORM\OneToMany(targetEntity="App\Entity\LegalEntity\Member\Company", mappedBy="user")
  74.      */
  75.     private $memberCompanies;
  76.     /**
  77.      * @var LegalEntity[]|ArrayCollection
  78.      *
  79.      * @ORM\OneToMany(targetEntity="App\Entity\LegalEntity", mappedBy="user")
  80.      */
  81.     private $entities;
  82.     /**
  83.      * @var Message[]|ArrayCollection
  84.      *
  85.      * @ORM\OneToMany(targetEntity="App\Entity\User\MailArchive\Message", mappedBy="user")
  86.      */
  87.     private $mailArchive;
  88.     /**
  89.      * @var LeadRegistrant[]|ArrayCollection
  90.      *
  91.      * @ORM\OneToMany(targetEntity="App\Entity\LeadRegistrant", mappedBy="user")
  92.      */
  93.     private $leadRegistrantFor;
  94.     /**
  95.      * @var LeadRegistrant[]|ArrayCollection
  96.      *
  97.      * @ORM\OneToMany(targetEntity="App\Entity\LeadRegistrant", mappedBy="spoc")
  98.      */
  99.     private $spocLeadRegistrantFor;
  100.     /**
  101.      * @var bool
  102.      *
  103.      * @ORM\Column(type="boolean")
  104.      */
  105.     private $systemUser false;
  106.     /**
  107.      * @ORM\Column(type="datetime", nullable=true)
  108.      */
  109.     private ?Carbon $invited null;
  110.     /**
  111.      * @var ArrayCollection|Notification[]
  112.      *
  113.      * @ORM\OneToMany(targetEntity="App\Entity\Notification", mappedBy="user")
  114.      *
  115.      * @ORM\OrderBy({"createdAt" = "DESC"})
  116.      */
  117.     protected $notifications;
  118.     /**
  119.      * @var Tutorial
  120.      *
  121.      * @ORM\Embedded(class="App\Entity\User\Tutorial")
  122.      */
  123.     private $tutorial;
  124.     /**
  125.      * @var Settings
  126.      *
  127.      * @ORM\Embedded(class="App\Entity\User\Settings")
  128.      */
  129.     private $settings;
  130.     /**
  131.      * @var bool
  132.      *
  133.      * @ORM\Column(type="boolean")
  134.      */
  135.     protected $removed false;
  136.     /**
  137.      * @var int
  138.      *
  139.      * @ORM\Column(type="integer")
  140.      */
  141.     private $failures 0;
  142.     /**
  143.      * @var Token
  144.      *
  145.      * @ORM\Embedded(class="App\Entity\User\Token")
  146.      */
  147.     private $token;
  148.     private int $invoiceCount 0;
  149.     public function __construct()
  150.     {
  151.         parent::__construct();
  152.         $this->profile = (new Profile())
  153.             ->setUser($this);
  154.         $this->groups = new ArrayCollection();
  155.         $this->history = new ArrayCollection();
  156.         $this->memberCompanies = new ArrayCollection();
  157.         $this->entities = new ArrayCollection();
  158.         $this->leadRegistrantFor = new ArrayCollection();
  159.         $this->spocLeadRegistrantFor = new ArrayCollection();
  160.         $this->notifications = new ArrayCollection();
  161.         $this->tutorial = new Tutorial();
  162.         $this->settings = new Settings();
  163.         $this->token = new Token();
  164.     }
  165.     public function getRoles()
  166.     {
  167.         $ret = [];
  168.         foreach ($this->getGroups() as $group) {
  169.             if (!$group instanceof Group) {
  170.                 continue;
  171.             }
  172.             $ret[] = $group->getId();
  173.         }
  174.         return $ret;
  175.     }
  176.     public function getPassword(): ?string
  177.     {
  178.         return $this->password;
  179.     }
  180.     public function getSalt()
  181.     {
  182.         return '';
  183.     }
  184.     public function getUserIdentifier(): string
  185.     {
  186.         return (string) $this->email;
  187.     }
  188.     public function getUsername()
  189.     {
  190.         return $this->getEmail();
  191.     }
  192.     public function eraseCredentials()
  193.     {
  194.         $this->plainPassword null;
  195.     }
  196.     public function setEmail(string $email): User
  197.     {
  198.         $this->email trim($email);
  199.         return $this;
  200.     }
  201.     /**
  202.      * @return string
  203.      */
  204.     public function getEmail(): ?string
  205.     {
  206.         return trim($this->email);
  207.     }
  208.     public function setPassword(string $password): User
  209.     {
  210.         $this->password $password;
  211.         return $this;
  212.     }
  213.     /**
  214.      * @return string
  215.      */
  216.     public function getPlainPassword(): ?string
  217.     {
  218.         return $this->plainPassword;
  219.     }
  220.     /**
  221.      * @param string $plainPassword
  222.      */
  223.     public function setPlainPassword(string $plainPassword null): User
  224.     {
  225.         $this->plainPassword $plainPassword;
  226.         $this->password null;
  227.         return $this;
  228.     }
  229.     public function getProfile(): Profile
  230.     {
  231.         if (null === $this->profile) {
  232.             $this->profile = (new Profile())->setUser($this);
  233.         }
  234.         return $this->profile;
  235.     }
  236.     public function setProfile(Profile $profile)
  237.     {
  238.         $this->profile $profile;
  239.         $this->profile->setUser($this);
  240.     }
  241.     /**
  242.      * Add history.
  243.      */
  244.     public function addHistory(History $history)
  245.     {
  246.         $this->history[] = $history;
  247.     }
  248.     /**
  249.      * Remove history.
  250.      */
  251.     public function removeHistory(History $history)
  252.     {
  253.         $this->history->removeElement($history);
  254.     }
  255.     /**
  256.      * Get history.
  257.      *
  258.      * @return History[]|ArrayCollection
  259.      */
  260.     public function getHistory()
  261.     {
  262.         return $this->history;
  263.     }
  264.     /**
  265.      * Add group.
  266.      *
  267.      * @return $this
  268.      */
  269.     public function addGroup(Group $group): self
  270.     {
  271.         if (!$this->groups->contains($group)) {
  272.             $this->groups->add($group);
  273.         }
  274.         return $this;
  275.     }
  276.     /**
  277.      * Remove group.
  278.      *
  279.      * @return $this
  280.      */
  281.     public function removeGroup(Group $group): self
  282.     {
  283.         $this->groups->removeElement($group);
  284.         return $this;
  285.     }
  286.     /**
  287.      * Get groups.
  288.      *
  289.      * @return Group[]|ArrayCollection
  290.      */
  291.     public function getGroups()
  292.     {
  293.         return $this->groups;
  294.     }
  295.     public function getName(): string
  296.     {
  297.         switch ($this->getEmail()) {
  298.             case '[email protected]':
  299.                 return 'SIEF.space import user';
  300.                 break;
  301.             case '[email protected]':
  302.                 return 'SIEF.space system user';
  303.                 break;
  304.             default:
  305.                 $p $this->getProfile();
  306.                 if (!empty($p->getFirstName()) && !empty($p->getSurName())) {
  307.                     return sprintf('%s, %s'$p->getSurName(), $p->getFirstName());
  308.                 } elseif (!empty($p->getFirstName())) {
  309.                     return $p->getFirstName();
  310.                 } else {
  311.                     return $this->getEmail();
  312.                 }
  313.                 break;
  314.         }
  315.     }
  316.     public function getSalutation(): string
  317.     {
  318.         $p $this->getProfile();
  319.         if (!empty($p->getFirstName())) {
  320.             return $p->getFirstName();
  321.         } else {
  322.             return 'Mr./Ms.';
  323.         }
  324.     }
  325.     /**
  326.      * @return LegalEntity[]|ArrayCollection
  327.      */
  328.     public function getNonMemberEntities()
  329.     {
  330.         $ret = new ArrayCollection();
  331.         foreach ($this->entities as $entity) {
  332.             if ($entity->isMember()) {
  333.                 continue;
  334.             }
  335.             $ret->add($entity);
  336.         }
  337.         return $ret;
  338.     }
  339.     /**
  340.      * @return LegalEntity[]|ArrayCollection
  341.      */
  342.     public function getMemberEntities()
  343.     {
  344.         $ret = new ArrayCollection();
  345.         foreach ($this->entities as $entity) {
  346.             if (!$entity->isMember()) {
  347.                 continue;
  348.             }
  349.             $ret->add($entity);
  350.         }
  351.         // Also include entities for which the user is a single point of contact
  352.         foreach ($this->getMemberCompanies() as $company) {
  353.             if (!$company->isActive()) {
  354.                 continue;
  355.             }
  356.             foreach ($company->getLegalEntities() as $entity) {
  357.                 if (!$entity->isMember()) {
  358.                     continue;
  359.                 }
  360.                 if ($ret->contains($entity)) {
  361.                     continue;
  362.                 }
  363.                 $ret->add($entity);
  364.             }
  365.         }
  366.         return $ret;
  367.     }
  368.     /**
  369.      * @return LegalEntity[]|ArrayCollection
  370.      */
  371.     public function getEntities()
  372.     {
  373.         return $this->entities;
  374.     }
  375.     public function getValidEntityCount(): int
  376.     {
  377.         $entities array_merge(
  378.             $this->getMemberEntities()->filter(function (LegalEntity $entity) {
  379.                 return $entity->isAccessible();
  380.             })->toArray(),
  381.             $this->getNonMemberEntities()->filter(function (LegalEntity $entity) {
  382.                 return $entity->isAccessible();
  383.             })->toArray()
  384.         );
  385.         return count($entities);
  386.     }
  387.     public function getValidApprovedEntityCount(): int
  388.     {
  389.         $entities array_merge(
  390.             $this->getMemberEntities()->filter(function (LegalEntity $entity) {
  391.                 return $entity->isApproved();
  392.             })->toArray(),
  393.             $this->getNonMemberEntities()->filter(function (LegalEntity $entity) {
  394.                 return $entity->isApproved();
  395.             })->toArray()
  396.         );
  397.         return count($entities);
  398.     }
  399.     /**
  400.      * @return Message[]|ArrayCollection
  401.      */
  402.     public function getMailArchive()
  403.     {
  404.         return $this->mailArchive;
  405.     }
  406.     public function addToMailArchive(Message $message): User
  407.     {
  408.         $this->mailArchive->add($message);
  409.         $message->setUser($this);
  410.         return $this;
  411.     }
  412.     /**
  413.      * @return LeadRegistrant[]|ArrayCollection
  414.      */
  415.     public function getLeadRegistrantFor()
  416.     {
  417.         return $this->leadRegistrantFor;
  418.     }
  419.     public function removeLeadRegistrant(LeadRegistrant $leadRegistrant): User
  420.     {
  421.         $this->leadRegistrantFor->remove($leadRegistrant);
  422.         return $this;
  423.     }
  424.     public function addLeadRegistrant(LeadRegistrant $leadRegistrant): User
  425.     {
  426.         if ($leadRegistrant->getUser() instanceof User) {
  427.             $leadRegistrant->getUser()->removeLeadRegistrant($leadRegistrant);
  428.         }
  429.         $this->leadRegistrantFor->add($leadRegistrant);
  430.         $leadRegistrant->setUser($this);
  431.         return $this;
  432.     }
  433.     public function __toString()
  434.     {
  435.         return $this->getName();
  436.     }
  437.     public function isStaff(bool $allowReadyOnly true): bool
  438.     {
  439.         $groups = ['ROLE_STAFF'];
  440.         if ($allowReadyOnly) {
  441.             $groups[] = 'ROLE_STAFF_RO';
  442.         }
  443.         return !empty(array_intersect($this->getRoles(), $groups));
  444.     }
  445.     public function isSysAdmin(): bool
  446.     {
  447.         return in_array('ROLE_SYS_ADMIN'$this->getRoles(), true);
  448.     }
  449.     public function serialize()
  450.     {
  451.         return serialize([
  452.             $this->id,
  453.             $this->email,
  454.             $this->password,
  455.         ]);
  456.     }
  457.     public function unserialize($serialized)
  458.     {
  459.         list(
  460.             $this->id,
  461.             $this->email,
  462.             $this->password,
  463.         ) = unserialize($serialized);
  464.     }
  465.     public function isSystemUser(): bool
  466.     {
  467.         return $this->systemUser;
  468.     }
  469.     /**
  470.      * @return $this
  471.      */
  472.     public function setSystemUser(bool $systemUser): User
  473.     {
  474.         $this->systemUser $systemUser;
  475.         return $this;
  476.     }
  477.     public function getInvited(): ?Carbon
  478.     {
  479.         return $this->invited;
  480.     }
  481.     public function setInvited(?Carbon $invited): User
  482.     {
  483.         $this->invited $invited;
  484.         return $this;
  485.     }
  486.     public function getInvoiceCount(): int
  487.     {
  488.         return $this->invoiceCount;
  489.         $ret 0;
  490.         foreach ($this->getEntities() as $entity) {
  491.             $ret += $entity->getInvoices()->filter(function (AbstractInvoice $invoice) {
  492.                 return !empty($invoice->getFile()->getPath()) && !$invoice->isHidden();
  493.             })->count();
  494.         }
  495.         return $ret;
  496.     }
  497.     /**
  498.      * @internal
  499.      *
  500.      * @return $this
  501.      */
  502.     public function setInvoiceCount(int $invoiceCount): self
  503.     {
  504.         $this->invoiceCount $invoiceCount;
  505.         return $this;
  506.     }
  507.     public function getFirstName()
  508.     {
  509.         return $this->getProfile()->getFirstName();
  510.     }
  511.     public function getSurName()
  512.     {
  513.         return $this->getProfile()->getSurName();
  514.     }
  515.     /**
  516.      * @return Notification[]|ArrayCollection
  517.      */
  518.     public function getNotifications()
  519.     {
  520.         return $this->notifications;
  521.     }
  522.     public function hasEc(Ec $ec): bool
  523.     {
  524.         foreach ($this->getMemberEntities() as $member) {
  525.             if ($member->hasEc($ec)) {
  526.                 return true;
  527.             }
  528.         }
  529.         foreach ($this->getEntities() as $nonMember) {
  530.             if ($nonMember->hasEc($ec)) {
  531.                 return true;
  532.             }
  533.         }
  534.         foreach ($this->getMergedLeadRegistrantFor() as $leadRegistrant) {
  535.             if ($leadRegistrant->getEc() === $ec) {
  536.                 return true;
  537.             }
  538.         }
  539.         return false;
  540.     }
  541.     public function getTutorial(): Tutorial
  542.     {
  543.         return $this->tutorial;
  544.     }
  545.     /**
  546.      * @return Company[]|ArrayCollection
  547.      */
  548.     public function getMemberCompanies()
  549.     {
  550.         return $this->memberCompanies;
  551.     }
  552.     /**
  553.      * @return Company[]|ArrayCollection
  554.      */
  555.     public function getAssociatedMemberCompanies(): ArrayCollection
  556.     {
  557.         $ret = new ArrayCollection();
  558.         foreach ($this->getMemberCompanies() as $company) {
  559.             if (!$company->isActive()) {
  560.                 continue;
  561.             }
  562.             $ret->add($company);
  563.         }
  564.         foreach ($this->getMemberEntities() as $entity) {
  565.             if (!$entity->isAccessible()) {
  566.                 continue;
  567.             }
  568.             $company $entity->getMemberCompany();
  569.             if (!$company->isActive()) {
  570.                 continue;
  571.             }
  572.             if ($ret->contains($company)) {
  573.                 continue;
  574.             }
  575.             $ret->add($company);
  576.         }
  577.         return $ret;
  578.     }
  579.     public function getSettings(): Settings
  580.     {
  581.         return $this->settings;
  582.     }
  583.     public function isRemovable(): bool
  584.     {
  585.         return !$this->isSysAdmin() && !$this->isSystemUser() && $this->memberCompanies->isEmpty()
  586.             && $this->entities->isEmpty();
  587.     }
  588.     public function isRemoved(): bool
  589.     {
  590.         return $this->removed;
  591.     }
  592.     /**
  593.      * @return $this
  594.      */
  595.     public function setRemoved(bool $removed): self
  596.     {
  597.         $this->removed $removed;
  598.         return $this;
  599.     }
  600.     /**
  601.      * @return LeadRegistrant[]|ArrayCollection
  602.      */
  603.     public function getSpocLeadRegistrantFor()
  604.     {
  605.         return $this->spocLeadRegistrantFor;
  606.     }
  607.     /**
  608.      * @return LeadRegistrant[]|ArrayCollection
  609.      */
  610.     public function getMergedLeadRegistrantFor()
  611.     {
  612.         return new ArrayCollection(
  613.             array_merge($this->leadRegistrantFor->toArray(), $this->spocLeadRegistrantFor->toArray())
  614.         );
  615.     }
  616.     public function HasActiveLeadRegistrants()
  617.     {
  618.         $result false;
  619.         /** @var LeadRegistrant $registrant */
  620.         foreach ($this->getMergedLeadRegistrantFor() as $registrant) {
  621.             if ($registrant->isActive()) {
  622.                 $result true;
  623.             }
  624.         }
  625.         return $result;
  626.     }
  627.     public function getFailures(): int
  628.     {
  629.         return $this->failures;
  630.     }
  631.     public function incrementFailures(): self
  632.     {
  633.         ++$this->failures;
  634.         return $this;
  635.     }
  636.     public function resetFailures(): self
  637.     {
  638.         $this->failures 0;
  639.         return $this;
  640.     }
  641.     public function getToken(): Token
  642.     {
  643.         return $this->token;
  644.     }
  645.     public function __serialize(): array
  646.     {
  647.         return [
  648.             $this->id,
  649.             $this->email,
  650.             $this->password,
  651.         ];
  652.     }
  653.     public function __unserialize(array $data): void
  654.     {
  655.         list(
  656.             $this->id,
  657.             $this->email,
  658.             $this->password,
  659.             ) = $data;
  660.     }
  661. }