src/Entity/Admin.php line 134

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