src/Entity/Admin.php line 126

  1. <?php
  2. namespace App\Entity;
  3. use Doctrine\ORM\Mapping as ORM,
  4.     Doctrine\DBAL\Types\Types,
  5.     Doctrine\Common\Collections\Collection,
  6.     Doctrine\Common\Collections\ArrayCollection;
  7. use Symfony\Component\Serializer\Annotation\Groups,
  8.     Symfony\Component\Validator\Constraints as Assert,
  9.     Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface,
  10.     Symfony\Component\Validator\Constraint;
  11. use ApiPlatform\Metadata\ApiResource,
  12.     ApiPlatform\Metadata\ApiProperty,
  13.     ApiPlatform\Metadata\Get,
  14.     ApiPlatform\Metadata\GetCollection,
  15.     ApiPlatform\Metadata\Post,
  16.     ApiPlatform\Metadata\Put,
  17.     ApiPlatform\Metadata\Delete,
  18.     ApiPlatform\Metadata\ApiFilter,
  19.     ApiPlatform\Doctrine\Orm\Filter\SearchFilter,
  20.     ApiPlatform\Doctrine\Orm\Filter\BooleanFilter,
  21.     ApiPlatform\Doctrine\Orm\Filter\OrderFilter;
  22. use App\Doctrine\DBAL\Types\JournalAdminStatsColumnsType;
  23. use App\Doctrine\DBAL\Types\AuthorAdminStatsColumnsType;
  24. use App\Doctrine\DBAL\Types\AdminStatsColumnsType;
  25. use App\Entity\Trait\IdTrait,
  26.     App\Entity\Trait\UuidTrait,
  27.     App\Entity\Trait\TimestampableTrait,
  28.     App\Entity\Trait\StatTrait,
  29.     App\Entity\Interface\AdminInterface,
  30.     App\Entity\Interface\PasswordResetableInterface,
  31.     App\Repository\AdminRepository;
  32. use App\Enum\JournalAdminStatsColumn;
  33. use App\Enum\AuthorAdminStatsColumn;
  34. use App\Enum\AdminStatsColumn;
  35. use App\Lib\Roles,
  36.     App\Lib\ModuleRoles,
  37.     App\Lib\Actions,
  38.     App\StateProvider\AdminCollectionProvider,
  39.     App\StateProvider\ProfileProvider,
  40.     App\Security\Voter\Resource\ProfileVoter,
  41.     App\Validator\Constraints as CustomAssert,
  42.     App\Enum\JournalAdminColumn,
  43.     App\Enum\JournalArticleAdminColumn,
  44.     App\Enum\JournalArticleAdminStatsColumn,
  45.     App\Doctrine\DBAL\Types\JournalAdminColumnsType,
  46.     App\Doctrine\DBAL\Types\JournalArticleAdminColumnsType,
  47.     App\Doctrine\DBAL\Types\JournalArticleAdminStatsColumnsType;
  48. use App\StateProvider\StatsAdminProvider;
  49. use App\Controller\Stats\StatsAdminXlsxGenerator;
  50. use App\Filter\OrderByUnmapped;
  51. #[ApiResource(
  52.     description'Administrators',
  53.     normalizationContext: ['groups' => ['read''read:' self::class]],
  54.     denormalizationContext: ['groups' => ['write']],
  55.     order: ['createdAt' => 'desc'],
  56.     operations: [
  57.         new GetCollection(
  58.             providerAdminCollectionProvider::class,
  59.             security'is_granted("' self::class . '")'
  60.         ),
  61.         new GetCollection(
  62.             name'get_admin_stats',
  63.             uriTemplate'/admins/stats',
  64.             providerStatsAdminProvider::class,
  65.             security'is_granted("ROLE_MODULE_STATS")',
  66.             normalizationContext: ['groups' => ['read:stats']],
  67.             paginationMaximumItemsPerPage500
  68.         ),
  69.         new GetCollection(
  70.             name'get_admin_stats_xlsx',
  71.             uriTemplate'/admins/stats/xlsx',
  72.             providerStatsAdminProvider::class,
  73.             controllerStatsAdminXlsxGenerator::class,
  74.             security'is_granted("ROLE_MODULE_STATS")',
  75.         ),
  76.         new Post(
  77.             security'is_granted("' self::class . '")',
  78.             validationContext: ['groups' => [Constraint::DEFAULT_GROUP'post']],
  79.             securityPostDenormalize'is_granted("' Actions::CREATE '", object)'
  80.         ),
  81.         new Get(
  82.             security'is_granted("' self::class . '")',
  83.             securityPostDenormalize'is_granted("' Actions::VIEW '", object)'
  84.         ),
  85.         new Put(
  86.             security'is_granted("' self::class . '")',
  87.             securityPostDenormalize'is_granted("' Actions::EDIT '", object)'
  88.         ),
  89.         new Delete(
  90.             security'is_granted("' self::class . '")',
  91.             securityPostDenormalize'is_granted("' Actions::DELETE '", object)'
  92.         ),
  93.         new Get(
  94.             uriTemplate'/profile',
  95.             providerProfileProvider::class,
  96.             securityPostDenormalize'is_granted("' ProfileVoter::ATTRIBUTE '", object)'
  97.         ),
  98.         new Put(
  99.             uriTemplate'/profile',
  100.             providerProfileProvider::class,
  101.             denormalizationContext: ['groups' => ['profile']],
  102.             securityPostDenormalize'is_granted("' ProfileVoter::ATTRIBUTE '", object)',
  103.             validationContext: ['groups' => [Constraint::DEFAULT_GROUP'profile']]
  104.         ),
  105.     ],
  106.     extraProperties: ['standard_put' => false],
  107. )]
  108. #[ApiFilter(SearchFilter::class, properties: [
  109.     'email' => 'partial',
  110.     'fullName' => 'partial',
  111.     'group.title' => 'partial'
  112. ])]
  113. #[ApiFilter(BooleanFilter::class, properties: ['stat'])]
  114. #[ApiFilter(OrderFilter::class, properties: ['email''fullName''stat''createdAt''updatedAt'])]
  115. #[ApiFilter(OrderByUnmapped::class, properties: ['statsAmountOfJournals'])]
  116. #[ORM\Entity(repositoryClassAdminRepository::class)]
  117. class Admin implements AdminInterfacePasswordResetableInterface
  118. {
  119.     use IdTrait,
  120.         UuidTrait,
  121.         TimestampableTrait,
  122.         StatTrait;
  123.     const MAX_PREVIOUS_PASSWORDS 5;
  124.     #[ApiProperty(description'Email')]
  125.     #[Groups(['read''write'])]
  126.     #[Assert\NotBlank]
  127.     #[Assert\Email]
  128.     #[ORM\Column(typeTypes::STRINGlength191uniquetrue)]
  129.     private string $email;
  130.     #[ApiProperty(description'Persisted password')]
  131.     #[ORM\Column(typeTypes::STRINGlength255)]
  132.     private ?string $password null;
  133.     #[ApiProperty(description'New password')]
  134.     #[Groups(['write''profile'])]
  135.     #[Assert\NotBlank(groups: ['post'])]
  136.     #[Assert\Length(max50)]
  137.     #[Assert\Regex(
  138.         pattern'/^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-\.]).{8,}$/',
  139.         match: true,
  140.         message'Password must consist of at least 8 characters (upper case, lower case, number, special character)'
  141.     )]
  142.     #[Assert\Expression(
  143.         expression'!value || this.getCurrentPassword() !== null',
  144.         message'Current password is required.'
  145.     )]
  146.     #[Assert\NotCompromisedPassword]
  147.     #[CustomAssert\User\PreviousPasswords]
  148.     private ?string $rawPassword null;
  149.     #[ApiProperty(description'Current password')]
  150.     #[Groups(['profile'])]
  151.     #[CustomAssert\User\CurrentPassword(groups: ['profile'])]
  152.     private ?string $currentPassword null;
  153.     #[ApiProperty(description'Previous passwords')]
  154.     #[ORM\Column(typeTypes::JSON)]
  155.     private array $previousPasswords = [];
  156.     #[ApiProperty(description'Name and surname')]
  157.     #[Groups(['read''read:stats''write''profile'])]
  158.     #[Assert\NotBlank]
  159.     #[Assert\Length(min3)]
  160.     #[ORM\Column(typeTypes::STRINGlength255)]
  161.     private string $fullName;
  162.     #[ApiProperty(description'Last activity')]
  163.     #[Groups(['read:' self::class])]
  164.     #[ORM\Column(typeTypes::DATETIME_IMMUTABLE)]
  165.     private \DateTimeImmutable $lastActivityAt;
  166.     #[ApiProperty(description'Reset password hash')]
  167.     #[ORM\Column(typeTypes::STRINGlength255nullabletrue)]
  168.     private ?string $resetPasswordHash null;
  169.     #[ApiProperty(description'Reset password hash generated at')]
  170.     #[ORM\Column(typeTypes::DATETIME_IMMUTABLEnullabletrue)]
  171.     private ?\DateTimeImmutable $resetPasswordHashGeneratedAt null;
  172.     #[ApiProperty(description'Is password reset required (account is inactive till reset)')]
  173.     #[Groups(['read:' self::class])]
  174.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => false])]
  175.     private bool $isPasswordResetRequired false;
  176.     #[ApiProperty(description'Is contextual hints visible')]
  177.     #[Groups(['read:' self::class, 'profile'])]
  178.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => true])]
  179.     private bool $isContextualHintsVisible true;
  180.     #[ApiProperty(description'Visible journal admin columns'writableLinkfalse)]
  181.     #[Groups(['read:' self::class, 'write''profile'])]
  182.     #[Assert\Choice(callback: [JournalAdminColumn::class, 'cases'], multipletrue)]
  183.     #[Assert\Unique]
  184.     #[Assert\Count(min1)]
  185.     #[ORM\Column(typeJournalAdminColumnsType::NAME)]
  186.     private array $visibleJournalAdminColumns = [
  187.         JournalAdminColumn::NO,
  188.         JournalAdminColumn::WORKINGTITLE,
  189.         JournalAdminColumn::AFFILIATION,
  190.         JournalAdminColumn::PERIODICITY,
  191.         JournalAdminColumn::STAT
  192.     ];
  193.     #[ApiProperty(description'Visible journal article admin columns'writableLinkfalse)]
  194.     #[Groups(['read:' self::class, 'write''profile'])]
  195.     #[Assert\Choice(callback: [JournalArticleAdminColumn::class, 'cases'], multipletrue)]
  196.     #[Assert\Unique]
  197.     #[Assert\Count(min1)]
  198.     #[ORM\Column(typeJournalArticleAdminColumnsType::NAME)]
  199.     private array $visibleJournalArticleAdminColumns = [
  200.         JournalArticleAdminColumn::NO,
  201.         JournalArticleAdminColumn::TITLE,
  202.         JournalArticleAdminColumn::ISSUE,
  203.         JournalArticleAdminColumn::TYPE,
  204.         JournalArticleAdminColumn::SECTION,
  205.         JournalArticleAdminColumn::UPDATED_AT,
  206.         JournalArticleAdminColumn::DOI,
  207.         JournalArticleAdminColumn::FILES,
  208.         JournalArticleAdminColumn::STAT
  209.     ];
  210.     #[ApiProperty(description'Visible journal admin stats columns'writableLinkfalse)]
  211.     #[Groups(['read:' self::class, 'write''profile'])]
  212.     #[Assert\Choice(callback: [JournalAdminStatsColumn::class, 'cases'], multipletrue)]
  213.     #[Assert\Unique]
  214.     // #[Assert\Count(min: 1)]
  215.     #[ORM\Column(typeJournalAdminStatsColumnsType::NAME)]
  216.     private array $visibleJournalAdminStatsColumns JournalAdminStatsColumn::ORDERABLE;
  217.     #[ApiProperty(description'Order of journal admin stats columns'writableLinkfalse)]
  218.     #[Groups(['read:' self::class, 'write''profile'])]
  219.     #[Assert\Choice(callback: [JournalAdminStatsColumn::class, 'cases'], multipletrue)]
  220.     #[Assert\Unique]
  221.     // #[Assert\Count(min: 13, max: 13)]
  222.     #[ORM\Column(typeJournalAdminStatsColumnsType::NAME)]
  223.     private array $orderJournalAdminStatsColumns JournalAdminStatsColumn::ORDERABLE;
  224.     #[ApiProperty(description'Visible journal article admin stats columns'writableLinkfalse)]
  225.     #[Groups(['read:' self::class, 'write''profile'])]
  226.     #[Assert\Choice(callback: [JournalArticleAdminStatsColumn::class, 'cases'], multipletrue)]
  227.     #[Assert\Unique]
  228.     // #[Assert\Count(min: 1)]
  229.     #[ORM\Column(typeJournalArticleAdminStatsColumnsType::NAME)]
  230.     private array $visibleJournalArticleAdminStatsColumns JournalArticleAdminStatsColumn::ORDERABLE;
  231.     #[ApiProperty(description'Order of journal article admin stats columns'writableLinkfalse)]
  232.     #[Groups(['read:' self::class, 'write''profile'])]
  233.     #[Assert\Choice(callback: [JournalArticleAdminStatsColumn::class, 'cases'], multipletrue)]
  234.     #[Assert\Unique]
  235.     // #[Assert\Count(min: 26, max: 26)]
  236.     #[ORM\Column(typeJournalArticleAdminStatsColumnsType::NAME)]
  237.     private array $orderJournalArticleAdminStatsColumns JournalArticleAdminStatsColumn::ORDERABLE;
  238.     #[ApiProperty(description'Visible author admin stats columns'writableLinkfalse)]
  239.     #[Groups(['read:' self::class, 'write''profile'])]
  240.     #[Assert\Choice(callback: [AuthorAdminStatsColumn::class, 'cases'], multipletrue)]
  241.     #[Assert\Unique]
  242.     // #[Assert\Count(min: 1)]
  243.     #[ORM\Column(typeAuthorAdminStatsColumnsType::NAME)]
  244.     private array $visibleAuthorAdminStatsColumns AuthorAdminStatsColumn::ORDERABLE;
  245.     #[ApiProperty(description'Order of author admin stats columns'writableLinkfalse)]
  246.     #[Groups(['read:' self::class, 'write''profile'])]
  247.     #[Assert\Choice(callback: [AuthorAdminStatsColumn::class, 'cases'], multipletrue)]
  248.     #[Assert\Unique]
  249.     // #[Assert\Count(min: 9, max: 9)]
  250.     #[ORM\Column(typeAuthorAdminStatsColumnsType::NAME)]
  251.     private array $orderAuthorAdminStatsColumns AuthorAdminStatsColumn::ORDERABLE;
  252.     #[ApiProperty(description'Visible admin stats columns'writableLinkfalse)]
  253.     #[Groups(['read:' self::class, 'write''profile'])]
  254.     #[Assert\Choice(callback: [AdminStatsColumn::class, 'cases'], multipletrue)]
  255.     #[Assert\Unique]
  256.     // #[Assert\Count(min: 1)]
  257.     #[ORM\Column(typeAdminStatsColumnsType::NAME)]
  258.     private array $visibleAdminStatsColumns AdminStatsColumn::ORDERABLE;
  259.     #[ApiProperty(description'Order of admin stats columns'writableLinkfalse)]
  260.     #[Groups(['read:' self::class, 'write''profile'])]
  261.     #[Assert\Choice(callback: [AdminStatsColumn::class, 'cases'], multipletrue)]
  262.     #[Assert\Unique]
  263.     // #[Assert\Count(min: 2, max: 2)]
  264.     #[ORM\Column(typeAdminStatsColumnsType::NAME)]
  265.     private array $orderAdminStatsColumns AdminStatsColumn::ORDERABLE;
  266.     #[ApiProperty(description'Administration group'writableLinkfalse)]
  267.     #[Groups(['read:' self::class, 'write'])]
  268.     #[ORM\ManyToOne(targetEntityAdminGroup::class, inversedBy'members')]
  269.     #[ORM\JoinColumn(onDelete'set null')]
  270.     private ?AdminGroup $group null;
  271.     #[ApiProperty(description'Registry entries')]
  272.     #[ORM\OneToMany(targetEntityRegistryEntry::class, mappedBy'admin')]
  273.     private Collection $registryEntries;
  274.     #[ApiProperty(description'Journals')]
  275.     #[ORM\OneToMany(targetEntityJournal::class, mappedBy'createdBy')]
  276.     private Collection $journals;
  277.     #[ApiProperty(description'Statistics: amount of journals')]
  278.     #[Groups(['read:stats'])]
  279.     private int $statsAmountOfJournals 0;
  280.     public function __construct(string $emailstring $fullName)
  281.     {
  282.         $this->setUuid();
  283.         $this->email $email;
  284.         $this->fullName $fullName;
  285.         $this->lastActivityAt = new \DateTimeImmutable();
  286.         $this->registryEntries = new ArrayCollection();
  287.         $this->createdAt = new \DateTimeImmutable();
  288.         $this->updatedAt = new \DateTimeImmutable();
  289.     }
  290.     public function getEmail(): string
  291.     {
  292.         return $this->email;
  293.     }
  294.     public function setEmail(string $email): self
  295.     {
  296.         $this->email $email;
  297.         return $this;
  298.     }
  299.     public function getPassword(): string
  300.     {
  301.         return $this->password;
  302.     }
  303.     public function getRawPassword(): ?string
  304.     {
  305.         return $this->rawPassword;
  306.     }
  307.     public function setRawPassword(
  308.         ?string $rawPassword,
  309.         UserPasswordHasherInterface $encoder,
  310.         Admin $setBy
  311.     ): self {
  312.         if (! $rawPassword) {
  313.             return $this;
  314.         }
  315.         $this->rawPassword $rawPassword;
  316.         $this->password $encoder->hashPassword($this$rawPassword);
  317.         if (count($this->previousPasswords) >= self::MAX_PREVIOUS_PASSWORDS) {
  318.             $this->previousPasswords array_slice($this->previousPasswords1);
  319.         }
  320.         $this->previousPasswords[] = password_hash($rawPasswordPASSWORD_DEFAULT);
  321.         $this->isPasswordResetRequired $setBy->getUuid() !== $this->getUuid();
  322.         $this->resetPasswordHash null;
  323.         $this->resetPasswordHashGeneratedAt null;
  324.         return $this;
  325.     }
  326.     public function setHashedPassword(string $hashedPassword): self
  327.     {
  328.         $this->password $hashedPassword;
  329.         return $this;
  330.     }
  331.     public function getCurrentPassword(): ?string
  332.     {
  333.         return $this->currentPassword;
  334.     }
  335.     public function setCurrentPassword(?string $currentPassword): self
  336.     {
  337.         $this->currentPassword $currentPassword;
  338.         return $this;
  339.     }
  340.     public function getPreviousPasswords(): array
  341.     {
  342.         return $this->previousPasswords;
  343.     }
  344.     public function getFullName(): string
  345.     {
  346.         return $this->fullName;
  347.     }
  348.     public function setFullName(string $fullName): self
  349.     {
  350.         $this->fullName $fullName;
  351.         return $this;
  352.     }
  353.     public function getLastActivityAt(): \DateTimeImmutable
  354.     {
  355.         return $this->lastActivityAt;
  356.     }
  357.     public function setLastActivityAt(\DateTimeImmutable $lastActivityAt): self
  358.     {
  359.         $this->lastActivityAt $lastActivityAt;
  360.         return $this;
  361.     }
  362.     public function getUsername(): string
  363.     {
  364.         return $this->email;
  365.     }
  366.     public function getUserIdentifier(): string
  367.     {
  368.         return $this->email;
  369.     }
  370.     public function getRoles(): array
  371.     {
  372.         $roles = [Roles::ROLE_ADMIN];
  373.         if (! $this->group?->getStat()) {
  374.             return $roles;
  375.         }
  376.         if ($this->group->getIsOpenform()) {
  377.             $roles[] = Roles::ROLE_OPENFORM;
  378.             return $roles;
  379.         }
  380.         if ($this->group->getIsSuperAdmin()) {
  381.             $roles[] = Roles::ROLE_SUPER_ADMIN;
  382.             return $roles;
  383.         }
  384.         foreach ($this->group->getFullyQualifiedResourceAccess() as $resourceAccess) {
  385.             switch(true) {
  386.                 case defined(ModuleRoles::class . '::ROLE_MODULE_' strtoupper($resourceAccess)):
  387.                     return constant(ModuleRoles::class . '::ROLE_MODULE_' strtoupper($resourceAccess));
  388.                 case class_exists($resourceAccess):
  389.                     $roles[] = str_replace('\\'''$resourceAccess);
  390.                 default:
  391.                     throw new \Exception('Resource access is invalid.');
  392.             }
  393.             $roles[] = str_replace('\\'''$resourceAccess);
  394.         }
  395.         return $roles;
  396.     }
  397.     public function getSalt(): ?string
  398.     {
  399.         return null;
  400.     }
  401.     public function eraseCredentials(): void
  402.     {
  403.         return;
  404.     }
  405.     public function setResetPasswordHash(string $hash): self
  406.     {
  407.         $this->resetPasswordHash $hash;
  408.         $this->resetPasswordHashGeneratedAt = new \DateTimeImmutable();
  409.         return $this;
  410.     }
  411.     public function getResetPasswordHash(): ?string
  412.     {
  413.         return $this->resetPasswordHash;
  414.     }
  415.     public function getResetPasswordHashGeneratedAt(): ?\DateTimeImmutable
  416.     {
  417.         return $this->resetPasswordHashGeneratedAt;
  418.     }
  419.     public function getIsPasswordResetRequired(): bool
  420.     {
  421.         return $this->isPasswordResetRequired;
  422.     }
  423.     public function setIsPasswordResetRequired(bool $isPasswordResetRequired): self
  424.     {
  425.         $this->isPasswordResetRequired $isPasswordResetRequired;
  426.         return $this;
  427.     }
  428.     public function getIsContextualHintsVisible(): bool
  429.     {
  430.         return $this->isContextualHintsVisible;
  431.     }
  432.     public function setIsContextualHintsVisible(bool $isContextualHintsVisible): self
  433.     {
  434.         $this->isContextualHintsVisible $isContextualHintsVisible;
  435.         return $this;
  436.     }
  437.     public function getVisibleJournalAdminColumns(): array
  438.     {
  439.         return $this->visibleJournalAdminColumns;
  440.     }
  441.     public function setVisibleJournalAdminColumns(array $visibleJournalAdminColumns): self
  442.     {
  443.         $this->visibleJournalAdminColumns $visibleJournalAdminColumns;
  444.         return $this;
  445.     }
  446.     public function getVisibleJournalArticleAdminColumns(): array
  447.     {
  448.         return $this->visibleJournalArticleAdminColumns;
  449.     }
  450.     public function setVisibleJournalArticleAdminColumns(array $visibleJournalArticleAdminColumns): self
  451.     {
  452.         $this->visibleJournalArticleAdminColumns $visibleJournalArticleAdminColumns;
  453.         return $this;
  454.     }
  455.     public function getVisibleJournalAdminStatsColumns(): array
  456.     {
  457.         return $this->visibleJournalAdminStatsColumns;
  458.     }
  459.     public function setVisibleJournalAdminStatsColumns(array $visibleJournalAdminStatsColumns): self
  460.     {
  461.         $this->visibleJournalAdminStatsColumns $visibleJournalAdminStatsColumns;
  462.         return $this;
  463.     }
  464.     public function getOrderJournalAdminStatsColumns(): array
  465.     {
  466.         return $this->orderJournalAdminStatsColumns;
  467.     }
  468.     public function setOrderJournalAdminStatsColumns(array $orderJournalAdminStatsColumns): self
  469.     {
  470.         $this->orderJournalAdminStatsColumns $orderJournalAdminStatsColumns;
  471.         return $this;
  472.     }
  473.     public function getVisibleJournalArticleAdminStatsColumns(): array
  474.     {
  475.         return $this->visibleJournalArticleAdminStatsColumns;
  476.     }
  477.     public function setVisibleJournalArticleAdminStatsColumns(array $visibleJournalArticleAdminStatsColumns): self
  478.     {
  479.         $this->visibleJournalArticleAdminStatsColumns $visibleJournalArticleAdminStatsColumns;
  480.         return $this;
  481.     }
  482.     public function getOrderJournalArticleAdminStatsColumns(): array
  483.     {
  484.         return $this->orderJournalArticleAdminStatsColumns;
  485.     }
  486.     public function setOrderJournalArticleAdminStatsColumns(array $orderJournalArticleAdminStatsColumns): self
  487.     {
  488.         $this->orderJournalArticleAdminStatsColumns $orderJournalArticleAdminStatsColumns;
  489.         return $this;
  490.     }
  491.     public function getVisibleAuthorAdminStatsColumns(): array
  492.     {
  493.         return $this->visibleAuthorAdminStatsColumns;
  494.     }
  495.     public function setVisibleAuthorAdminStatsColumns(array $visibleAuthorAdminStatsColumns): self
  496.     {
  497.         $this->visibleAuthorAdminStatsColumns $visibleAuthorAdminStatsColumns;
  498.         return $this;
  499.     }
  500.     public function getOrderAuthorAdminStatsColumns(): array
  501.     {
  502.         return $this->orderAuthorAdminStatsColumns;
  503.     }
  504.     public function setOrderAuthorAdminStatsColumns(array $orderAuthorAdminStatsColumns): self
  505.     {
  506.         $this->orderAuthorAdminStatsColumns $orderAuthorAdminStatsColumns;
  507.         return $this;
  508.     }
  509.     public function getVisibleAdminStatsColumns(): array
  510.     {
  511.         return $this->visibleAdminStatsColumns;
  512.     }
  513.     public function setVisibleAdminStatsColumns(array $visibleAdminStatsColumns): self
  514.     {
  515.         $this->visibleAdminStatsColumns $visibleAdminStatsColumns;
  516.         return $this;
  517.     }
  518.     public function getOrderAdminStatsColumns(): array
  519.     {
  520.         return $this->orderAdminStatsColumns;
  521.     }
  522.     public function setOrderAdminStatsColumns(array $orderAdminStatsColumns): self
  523.     {
  524.         $this->orderAdminStatsColumns $orderAdminStatsColumns;
  525.         return $this;
  526.     }
  527.     public function getGroup(): ?AdminGroup
  528.     {
  529.         return $this->group;
  530.     }
  531.     public function setGroup(?AdminGroup $group): self
  532.     {
  533.         $this->group $group;
  534.         return $this;
  535.     }
  536.     public function getRegistryEntries(): Collection
  537.     {
  538.         return $this->registryEntries;
  539.     }
  540.     public function addRegistryEntry(RegistryEntry $registryEntry): self
  541.     {
  542.         if ($this->registryEntries->contains($registryEntry)) {
  543.             return $this;
  544.         }
  545.         $this->registryEntries[] = $registryEntry;
  546.         return $this;
  547.     }
  548.     public function removeRegistryEntry(RegistryEntry $registryEntry): self
  549.     {
  550.         $this->registryEntries->removeElement($registryEntry);
  551.         return $this;
  552.     }
  553.     public function getStatsAmountOfJournals(): int
  554.     {
  555.         return $this->statsAmountOfJournals;
  556.     }
  557.     public function setStatsAmountOfJournals(int $statsAmountOfJournals): self
  558.     {
  559.         $this->statsAmountOfJournals $statsAmountOfJournals;
  560.         return $this;
  561.     }
  562. }