src/Entity/JournalData.php line 31

  1. <?php
  2. namespace App\Entity;
  3. use Doctrine\ORM\Mapping as ORM,
  4.     Doctrine\DBAL\Types\Types;
  5. use Symfony\Component\Serializer\Annotation\Groups,
  6.     Symfony\Component\Validator\Constraints as Assert;
  7. use ApiPlatform\Metadata\ApiProperty,
  8.     ApiPlatform\Metadata\ApiResource,
  9.     ApiPlatform\Metadata\Get;
  10. use App\Entity\Trait\IdTrait,
  11.     App\Entity\Trait\UuidTrait,
  12.     App\Entity\CitationType,
  13.     App\Enum\Language,
  14.     App\Enum\JournalPeriodicity,
  15.     App\Enum\JournalState,
  16.     App\Enum\JournalType,
  17.     App\Enum\JournalLicence,
  18.     App\Doctrine\DBAL\Types\LanguagesType,
  19.     App\Repository\JournalDataRepository;
  20. #[ApiResource(
  21.     security'is_granted("' Journal::class . '")',
  22.     operations: [ new Get() ],
  23.     extraProperties: ['standard_put' => false],
  24. )]
  25. #[ORM\Entity(repositoryClassJournalDataRepository::class)]
  26. class JournalData
  27. {
  28.     use IdTrait,
  29.         UuidTrait;
  30.     #[ApiProperty(description'Parent')]
  31.     #[ORM\OneToOne(targetEntityJournal::class, inversedBy'data')]
  32.     #[ORM\JoinColumn(onDelete'cascade'nullablefalse)]
  33.     private Journal $parent;
  34.     #[ApiProperty(description'Working title')]
  35.     #[Groups(['read''read:list''write'])]
  36.     #[Assert\NotBlank]
  37.     #[ORM\Column(typeTypes::STRINGlength1023)]
  38.     private string $workingTitle;
  39.     #[ApiProperty(description'Working subtitle')]
  40.     #[Groups(['read:' Journal::class, 'write'])]
  41.     #[ORM\Column(typeTypes::STRINGlength1023nullabletrue)]
  42.     private ?string $workingSubtitle null;
  43.     #[ApiProperty(description'Publication languages'writableLinkfalse)]
  44.     #[Groups(['read:' Journal::class, 'write'])]
  45.     #[Assert\Choice(callback: [Language::class, 'cases'], multipletrue)]
  46.     #[Assert\Unique]
  47.     #[Assert\Count(min1)]
  48.     #[ORM\Column(typeLanguagesType::NAME)]
  49.     private array $publicationLanguages = [Language::EN];
  50.     #[ApiProperty(description'Is Uj')]
  51.     #[Groups(['read:' Journal::class, 'write'])]
  52.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => false])]
  53.     private bool $isUj false;
  54.     #[ApiProperty(description'Periodicity'writableLinkfalse)]
  55.     #[Groups(['read:' Journal::class, 'read:list''write'])]
  56.     #[ORM\Column(
  57.         typeTypes::STRING,
  58.         enumTypeJournalPeriodicity::class,
  59.         length255,
  60.         options: ['default' => JournalPeriodicity::MONTHLY]
  61.     )]
  62.     private JournalPeriodicity $periodicity JournalPeriodicity::MONTHLY;
  63.     #[ApiProperty(description'State'writableLinkfalse)]
  64.     #[Groups(['read:'Journal::class, 'write'])]
  65.     #[ORM\Column(
  66.         typeTypes::STRING,
  67.         enumTypeJournalState::class,
  68.         length255,
  69.         options: ['default' => JournalState::ACTIVE]
  70.     )]
  71.     private JournalState $state JournalState::ACTIVE;
  72.     #[ApiProperty(description'Type'writableLinkfalse)]
  73.     #[Groups(['read:'Journal::class, 'write'])]
  74.     #[ORM\Column(
  75.         typeTypes::STRING,
  76.         enumTypeJournalType::class,
  77.         length255,
  78.         options: ['default' => JournalType::SCIENTIFIC]
  79.     )]
  80.     private JournalType $type JournalType::SCIENTIFIC;
  81.     #[ApiProperty(description'Licence'writableLinkfalse)]
  82.     #[Groups(['read:'Journal::class, 'write'])]
  83.     #[ORM\Column(
  84.         typeTypes::STRING,
  85.         enumTypeJournalLicence::class,
  86.         length255,
  87.         options: ['default' => JournalLicence::CC_BY]
  88.     )]
  89.     private JournalLicence $licence JournalLicence::CC_BY;
  90.     #[ApiProperty(description'Is open')]
  91.     #[Groups(['read:' Journal::class, 'write'])]
  92.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => true])]
  93.     private bool $isOpen true;
  94.     #[ApiProperty(description'Price per issue')]
  95.     #[Groups(['read:' Journal::class])]
  96.     #[Assert\PositiveOrZero]
  97.     #[ORM\Column(typeTypes::INTEGERnullabletrue)]
  98.     private ?int $issuePrice null;
  99.     #[ApiProperty(description'VAT per issue')]
  100.     #[Groups(['read:' Journal::class, 'write'])]
  101.     #[Assert\PositiveOrZero]
  102.     #[Assert\Range(min0max100)]
  103.     #[ORM\Column(typeTypes::INTEGERnullabletrue)]
  104.     private ?int $issueVat null;
  105.     #[ApiProperty(description'Price per article')]
  106.     #[Groups(['read:' Journal::class])]
  107.     #[Assert\PositiveOrZero]
  108.     #[ORM\Column(typeTypes::INTEGERnullabletrue)]
  109.     private ?int $articlePrice null;
  110.     #[ApiProperty(description'VAT per article')]
  111.     #[Groups(['read:' Journal::class, 'write'])]
  112.     #[Assert\PositiveOrZero]
  113.     #[Assert\Range(min0max100)]
  114.     #[ORM\Column(typeTypes::INTEGERnullabletrue)]
  115.     private ?int $articleVat null;
  116.     #[ApiProperty(description'Open access granted after period')]
  117.     #[Groups(['read:' Journal::class, 'write'])]
  118.     #[Assert\Regex(
  119.         pattern'/^[0-9]+ (days|months|years)$/',
  120.         message'Wrong format. Required: <int> days|months|years'
  121.     )]
  122.     #[ORM\Column(typeTypes::STRINGlength255nullabletrue)]
  123.     private ?string $openAccessGrantedAfterPeriod null;
  124.     #[ApiProperty(description'Is open access granted after newest issue expired')]
  125.     #[Groups(['read:' Journal::class, 'write'])]
  126.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => false])]
  127.     private bool $isOpenAccessGrantedAfterNewestIssueExpired false;
  128.     #[ApiProperty(description'Is publication free')]
  129.     #[Groups(['read:' Journal::class, 'write'])]
  130.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => true])]
  131.     private bool $isPublicationFree true;
  132.     #[ApiProperty(description'Price per article for publication')]
  133.     #[Groups(['read:' Journal::class])]
  134.     #[Assert\PositiveOrZero]
  135.     #[ORM\Column(typeTypes::INTEGERnullabletrue)]
  136.     private ?int $publicationPrice null;
  137.     #[ApiProperty(description'VAT per article for publication')]
  138.     #[Groups(['read:' Journal::class, 'write'])]
  139.     #[Assert\PositiveOrZero]
  140.     #[Assert\Range(min0max100)]
  141.     #[ORM\Column(typeTypes::INTEGERnullabletrue)]
  142.     private ?int $publicationVat null;
  143.     #[ApiProperty(description'Is new')]
  144.     #[Groups(['read:' Journal::class, 'write'])]
  145.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => false])]
  146.     private bool $isNew false;
  147.     #[ApiProperty(description'Is featured')]
  148.     #[Groups(['read:' Journal::class, 'write'])]
  149.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => false])]
  150.     private bool $isFeatured false;
  151.     #[ApiProperty(description'ISSN')]
  152.     #[Groups(['read:' Journal::class, 'write'])]
  153.     #[Assert\Issn]
  154.     #[ORM\Column(typeTypes::STRINGlength255nullabletrue)]
  155.     private ?string $issn null;
  156.     #[ApiProperty(description'Is ISSN visible')]
  157.     #[Groups(['read:' Journal::class, 'write'])]
  158.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => true])]
  159.     private bool $isIssnVisible true;
  160.     #[ApiProperty(description'E-ISSN')]
  161.     #[Groups(['read:' Journal::class, 'write'])]
  162.     #[Assert\Issn]
  163.     #[ORM\Column(typeTypes::STRINGlength255nullabletrue)]
  164.     private ?string $eIssn null;
  165.     #[ApiProperty(description'Is E-ISSN visible')]
  166.     #[Groups(['read:' Journal::class, 'write'])]
  167.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => true])]
  168.     private bool $isEIssnVisible true;
  169.     #[ApiProperty(description'MEIN score')]
  170.     #[Groups(['read:' Journal::class, 'write'])]
  171.     #[Assert\PositiveOrZero]
  172.     #[ORM\Column(typeTypes::INTEGERnullabletrue)]
  173.     private ?int $meinScore null;
  174.     #[ApiProperty(description'Is MEIN score visible')]
  175.     #[Groups(['read:' Journal::class, 'write'])]
  176.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => true])]
  177.     private bool $isMeinScoreVisible true;
  178.     #[ApiProperty(description'DOI')]
  179.     #[Groups(['read:' Journal::class, 'write'])]
  180.     #[ORM\Column(typeTypes::STRINGlength255nullabletrue)]
  181.     private ?string $doi null;
  182.     #[ApiProperty(description'Is DOI visible')]
  183.     #[Groups(['read:' Journal::class, 'write'])]
  184.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => true])]
  185.     private bool $isDoiVisible true;
  186.     #[ApiProperty(description'UIC ID')]
  187.     #[Groups(['read:' Journal::class, 'write'])]
  188.     #[ORM\Column(typeTypes::INTEGERnullabletrue)]
  189.     private ?int $uicId null;
  190.     #[ApiProperty(description'Is UIC ID visible')]
  191.     #[Groups(['read:' Journal::class, 'write'])]
  192.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => true])]
  193.     private bool $isUicIdVisible true;
  194.     #[ApiProperty(description'Websites')]
  195.     #[Groups(['read:' Journal::class, 'write'])]
  196.     #[Assert\All([new Assert\Expression(
  197.         expression'this.isWebsiteFormatValid(value)',
  198.         message'Wrong format. Required: { url: <string>, isTargetBlank: <bool>, stat: <bool> }'
  199.     ) ])]
  200.     #[ORM\Column(typeTypes::JSON)]
  201.     private array $websites = [];
  202.     #[ApiProperty(description'OJS link')]
  203.     #[Groups(['read:' Journal::class, 'write'])]
  204.     #[ORM\Column(typeTypes::STRINGlength255nullabletrue)]
  205.     private ?string $ojsLink null;
  206.     #[ApiProperty(description'Is OJS link visible')]
  207.     #[Groups(['read:' Journal::class, 'write'])]
  208.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => true])]
  209.     private bool $isOjsLinkVisible true;
  210.     #[ApiProperty(description'Is paper version')]
  211.     #[Groups(['read:' Journal::class, 'write'])]
  212.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => false])]
  213.     private bool $isPaperVersion false;
  214.     #[ApiProperty(description'Is paper version visible')]
  215.     #[Groups(['read:' Journal::class, 'write'])]
  216.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => true])]
  217.     private bool $isPaperVersionVisible true;
  218.     #[ApiProperty(description'Foundation year')]
  219.     #[Groups(['read:' Journal::class, 'write'])]
  220.     #[Assert\Range(min1900)]
  221.     #[ORM\Column(typeTypes::INTEGERnullabletrue)]
  222.     private ?int $foundationYear null;
  223.     #[ApiProperty(description'Is foundation year visible')]
  224.     #[Groups(['read:' Journal::class, 'write'])]
  225.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => true])]
  226.     private bool $isFoundationYearVisible true;
  227.     #[ApiProperty(description'Abbreviations')]
  228.     #[Groups(['read:' Journal::class, 'write'])]
  229.     #[Assert\All([new Assert\Length(max511)])]
  230.     #[ORM\Column(typeTypes::JSON)]
  231.     private array $abbreviations = [];
  232.     #[ApiProperty(description'Is abbreviations visible')]
  233.     #[Groups(['read:' Journal::class, 'write'])]
  234.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => true])]
  235.     private bool $isAbbreviationsVisible true;
  236.     #[ApiProperty(description'Suggested citation type'writableLinkfalse)]
  237.     #[Groups(['read:' Journal::class, 'write'])]
  238.     #[ORM\ManyToOne(targetEntityCitationType::class)]
  239.     #[ORM\JoinColumn(onDelete'set null')]
  240.     private ?CitationType $suggestedCitationType null;
  241.     #[ApiProperty(description'Is suggested citation type visible')]
  242.     #[Groups(['read:' Journal::class, 'write'])]
  243.     #[ORM\Column(typeTypes::BOOLEANoptions: ['default' => true])]
  244.     private bool $isSuggestedCitationTypeVisible true;
  245.     #[ApiProperty(description'Published till')]
  246.     #[Groups(['read:' Journal::class, 'write'])]
  247.     #[Assert\PositiveOrZero]
  248.     #[ORM\Column(typeTypes::INTEGERnullabletrue)]
  249.     private ?int $publishedTill null;
  250.     public function __construct(Journal $parent)
  251.     {
  252.         $this->setUuid();
  253.         $this->parent $parent;
  254.     }
  255.     public function getParent(): Journal
  256.     {
  257.         return $this->parent;
  258.     }
  259.     public function getWorkingTitle(): string
  260.     {
  261.         return $this->workingTitle;
  262.     }
  263.     public function setWorkingTitle(string $workingTitle): self
  264.     {
  265.         $this->workingTitle $workingTitle;
  266.         return $this;
  267.     }
  268.     public function getWorkingSubtitle(): ?string
  269.     {
  270.         return $this->workingSubtitle;
  271.     }
  272.     public function setWorkingSubtitle(?string $workingSubtitle): self
  273.     {
  274.         $this->workingSubtitle $workingSubtitle;
  275.         return $this;
  276.     }
  277.     public function getPublicationLanguages(): array
  278.     {
  279.         return $this->publicationLanguages;
  280.     }
  281.     public function setPublicationLanguages(array $publicationLanguages): self
  282.     {
  283.         $this->publicationLanguages $publicationLanguages;
  284.         return $this;
  285.     }
  286.     public function getIsUj(): bool
  287.     {
  288.         return $this->isUj;
  289.     }
  290.     public function setIsUj(bool $isUj): self
  291.     {
  292.         $this->isUj $isUj;
  293.         return $this;
  294.     }
  295.     public function getPeriodicity(): JournalPeriodicity
  296.     {
  297.         return $this->periodicity;
  298.     }
  299.     public function setPeriodicity(JournalPeriodicity $periodicity): self
  300.     {
  301.         $this->periodicity $periodicity;
  302.         return $this;
  303.     }
  304.     public function getState(): JournalState
  305.     {
  306.         return $this->state;
  307.     }
  308.     public function setState(JournalState $state): self
  309.     {
  310.         $this->state $state;
  311.         return $this;
  312.     }
  313.     public function getType(): JournalType
  314.     {
  315.         return $this->type;
  316.     }
  317.     public function setType(JournalType $type): self
  318.     {
  319.         $this->type $type;
  320.         return $this;
  321.     }
  322.     public function getLicence(): JournalLicence
  323.     {
  324.         return $this->licence;
  325.     }
  326.     public function setLicence(JournalLicence $licence): self
  327.     {
  328.         $this->licence $licence;
  329.         return $this;
  330.     }
  331.     public function getIsOpen(): bool
  332.     {
  333.         return $this->isOpen;
  334.     }
  335.     public function setIsOpen(bool $isOpen): self
  336.     {
  337.         $this->isOpen $isOpen;
  338.         return $this;
  339.     }
  340.     public function getIssuePrice(): ?int
  341.     {
  342.         return $this->issuePrice;
  343.     }
  344.     #[Groups(['read:' self::class, 'read:' Journal::class])]
  345.     public function getIssuePriceReal(): ?float
  346.     {
  347.         return $this->issuePrice round($this->issuePrice 10002) : null;
  348.     }
  349.     public function setIssuePrice(?int $issuePrice): self
  350.     {
  351.         $this->issuePrice $issuePrice;
  352.         return $this;
  353.     }
  354.     #[Groups(['write'])]
  355.     public function setIssuePriceReal(?float $issuePriceReal): self
  356.     {
  357.         $this->issuePrice = (int) ($issuePriceReal 1000);
  358.         return $this;
  359.     }
  360.     public function getIssueVat(): ?int
  361.     {
  362.         return $this->issueVat;
  363.     }
  364.     public function setIssueVat(?int $issueVat): self
  365.     {
  366.         $this->issueVat $issueVat;
  367.         return $this;
  368.     }
  369.     public function getArticlePrice(): ?int
  370.     {
  371.         return $this->articlePrice;
  372.     }
  373.     #[Groups(['read:' self::class, 'read:' Journal::class])]
  374.     public function getArticlePriceReal(): ?float
  375.     {
  376.         return $this->articlePrice round($this->articlePrice 10002) : null;
  377.     }
  378.     public function setArticlePrice(?int $articlePrice): self
  379.     {
  380.         $this->articlePrice $articlePrice;
  381.         return $this;
  382.     }
  383.     #[Groups(['write'])]
  384.     public function setArticlePriceReal(?float $articlePriceReal): self
  385.     {
  386.         $this->articlePrice = (int) ($articlePriceReal 1000);
  387.         return $this;
  388.     }
  389.     public function getArticleVat(): ?int
  390.     {
  391.         return $this->articleVat;
  392.     }
  393.     public function setArticleVat(?int $articleVat): self
  394.     {
  395.         $this->articleVat $articleVat;
  396.         return $this;
  397.     }
  398.     public function getOpenAccessGrantedAfterPeriod(): ?string
  399.     {
  400.         return $this->openAccessGrantedAfterPeriod;
  401.     }
  402.     public function setOpenAccessGrantedAfterPeriod(?string $openAccessGrantedAfterPeriod): self
  403.     {
  404.         $this->openAccessGrantedAfterPeriod $openAccessGrantedAfterPeriod;
  405.         return $this;
  406.     }
  407.     public function getIsOpenAccessGrantedAfterNewestIssueExpired(): bool
  408.     {
  409.         return $this->isOpenAccessGrantedAfterNewestIssueExpired;
  410.     }
  411.     public function setIsOpenAccessGrantedAfterNewestIssueExpired(bool $isOpenAccessGrantedAfterNewestIssueExpired): self
  412.     {
  413.         $this->isOpenAccessGrantedAfterNewestIssueExpired $isOpenAccessGrantedAfterNewestIssueExpired;
  414.         return $this;
  415.     }
  416.     public function getIsPublicationFree(): bool
  417.     {
  418.         return $this->isPublicationFree;
  419.     }
  420.     public function setIsPublicationFree(bool $isPublicationFree): self
  421.     {
  422.         $this->isPublicationFree $isPublicationFree;
  423.         return $this;
  424.     }
  425.     public function getPublicationPrice(): ?int
  426.     {
  427.         return $this->publicationPrice;
  428.     }
  429.     public function setPublicationPrice(?int $publicationPrice): self
  430.     {
  431.         $this->publicationPrice $publicationPrice;
  432.         return $this;
  433.     }
  434.     #[Groups(['read:' self::class, 'read:' Journal::class])]
  435.     public function getPublicationPriceReal(): ?float
  436.     {
  437.         return $this->publicationPrice round($this->publicationPrice 10002) : null;
  438.     }
  439.     #[Groups(['write'])]
  440.     public function setPublicationPriceReal(?float $publicationPriceReal): self
  441.     {
  442.         $this->publicationPrice = (int) ($publicationPriceReal 1000);
  443.         return $this;
  444.     }
  445.     public function getPublicationVat(): ?int
  446.     {
  447.         return $this->publicationVat;
  448.     }
  449.     public function setPublicationVat(?int $publicationVat): self
  450.     {
  451.         $this->publicationVat $publicationVat;
  452.         return $this;
  453.     }
  454.     public function getIsNew(): bool
  455.     {
  456.         return $this->isNew;
  457.     }
  458.     public function setIsNew(bool $isNew): self
  459.     {
  460.         $this->isNew $isNew;
  461.         return $this;
  462.     }
  463.     public function getIsFeatured(): bool
  464.     {
  465.         return $this->isFeatured;
  466.     }
  467.     public function setIsFeatured(bool $isFeatured): self
  468.     {
  469.         $this->isFeatured $isFeatured;
  470.         return $this;
  471.     }
  472.     public function getIssn(): ?string
  473.     {
  474.         return $this->issn;
  475.     }
  476.     public function setIssn(?string $issn): self
  477.     {
  478.         $this->issn $issn;
  479.         return $this;
  480.     }
  481.     public function getIsIssnVisible(): bool
  482.     {
  483.         return $this->isIssnVisible;
  484.     }
  485.     public function setIsIssnVisible(bool $isIssnVisible): self
  486.     {
  487.         $this->isIssnVisible $isIssnVisible;
  488.         return $this;
  489.     }
  490.     public function getEIssn(): ?string
  491.     {
  492.         return $this->eIssn;
  493.     }
  494.     public function setEIssn(?string $eIssn): self
  495.     {
  496.         $this->eIssn $eIssn;
  497.         return $this;
  498.     }
  499.     public function getIsEIssnVisible(): bool
  500.     {
  501.         return $this->isEIssnVisible;
  502.     }
  503.     public function setIsEIssnVisible(bool $isEIssnVisible): self
  504.     {
  505.         $this->isEIssnVisible $isEIssnVisible;
  506.         return $this;
  507.     }
  508.     public function getMeinScore(): ?int
  509.     {
  510.         return $this->meinScore;
  511.     }
  512.     public function setMeinScore(?int $meinScore): self
  513.     {
  514.         $this->meinScore $meinScore;
  515.         return $this;
  516.     }
  517.     public function getIsMeinScoreVisible(): bool
  518.     {
  519.         return $this->isMeinScoreVisible;
  520.     }
  521.     public function setIsMeinScoreVisible(bool $isMeinScoreVisible): self
  522.     {
  523.         $this->isMeinScoreVisible $isMeinScoreVisible;
  524.         return $this;
  525.     }
  526.     public function getDoi(): ?string
  527.     {
  528.         return $this->doi;
  529.     }
  530.     public function setDoi(?string $doi): self
  531.     {
  532.         $this->doi $doi;
  533.         return $this;
  534.     }
  535.     public function getIsDoiVisible(): bool
  536.     {
  537.         return $this->isDoiVisible;
  538.     }
  539.     public function setIsDoiVisible(bool $isDoiVisible): self
  540.     {
  541.         $this->isDoiVisible $isDoiVisible;
  542.         return $this;
  543.     }
  544.     public function getUicId(): ?int
  545.     {
  546.         return $this->uicId;
  547.     }
  548.     public function setUicId(?int $uicId): self
  549.     {
  550.         $this->uicId $uicId;
  551.         return $this;
  552.     }
  553.     public function getIsUicIdVisible(): bool
  554.     {
  555.         return $this->isUicIdVisible;
  556.     }
  557.     public function setIsUicIdVisible(bool $isUicIdVisible): self
  558.     {
  559.         $this->isUicIdVisible $isUicIdVisible;
  560.         return $this;
  561.     }
  562.     public function getWebsites(): array
  563.     {
  564.         return $this->websites;
  565.     }
  566.     public function setWebsites(array $websites): self
  567.     {
  568.         $this->websites $websites;
  569.         return $this;
  570.     }
  571.     public function isWebsiteFormatValid(array $website): bool
  572.     {
  573.         $url $website['url'] ?? null;
  574.         $isTargetBlank $website['isTargetBlank'] ?? null;
  575.         $stat $website['stat'] ?? null;
  576.         if (
  577.             ! is_string($url)
  578.             || ! is_bool($isTargetBlank)
  579.             || ! is_bool($stat)
  580.         ) {
  581.             return false;
  582.         }
  583.         return strlen($url) < 511;
  584.     }
  585.     public function getWebsitesEnabled(): array
  586.     {
  587.         return array_filter(
  588.             $this->websites,
  589.             function ($website) {
  590.                 return $website['stat'] === true;
  591.             }
  592.         );
  593.     }
  594.     public function getIsPaperVersion(): bool
  595.     {
  596.         return $this->isPaperVersion;
  597.     }
  598.     public function setIsPaperVersion(bool $isPaperVersion): self
  599.     {
  600.         $this->isPaperVersion $isPaperVersion;
  601.         return $this;
  602.     }
  603.     public function getOjsLink(): ?string
  604.     {
  605.         return $this->ojsLink;
  606.     }
  607.     public function setOjsLink(?string $ojsLink): self
  608.     {
  609.         $this->ojsLink $ojsLink;
  610.         return $this;
  611.     }
  612.     public function getIsOjsLinkVisible(): bool
  613.     {
  614.         return $this->isOjsLinkVisible;
  615.     }
  616.     public function setIsOjsLinkVisible(bool $isOjsLinkVisible): self
  617.     {
  618.         $this->isOjsLinkVisible $isOjsLinkVisible;
  619.         return $this;
  620.     }
  621.     public function getIsPaperVersionVisible(): bool
  622.     {
  623.         return $this->isPaperVersionVisible;
  624.     }
  625.     public function setIsPaperVersionVisible(bool $isPaperVersionVisible): self
  626.     {
  627.         $this->isPaperVersionVisible $isPaperVersionVisible;
  628.         return $this;
  629.     }
  630.     public function getFoundationYear(): ?int
  631.     {
  632.         return $this->foundationYear;
  633.     }
  634.     public function setFoundationYear(?int $foundationYear): self
  635.     {
  636.         $this->foundationYear $foundationYear;
  637.         return $this;
  638.     }
  639.     public function getIsFoundationYearVisible(): bool
  640.     {
  641.         return $this->isFoundationYearVisible;
  642.     }
  643.     public function setIsFoundationYearVisible(bool $isFoundationYearVisible): self
  644.     {
  645.         $this->isFoundationYearVisible $isFoundationYearVisible;
  646.         return $this;
  647.     }
  648.     public function getAbbreviations(): array
  649.     {
  650.         return $this->abbreviations;
  651.     }
  652.     public function setAbbreviations(array $abbreviations): self
  653.     {
  654.         $this->abbreviations $abbreviations;
  655.         return $this;
  656.     }
  657.     public function getIsAbbreviationsVisible(): bool
  658.     {
  659.         return $this->isAbbreviationsVisible;
  660.     }
  661.     public function setIsAbbreviationsVisible(bool $isAbbreviationsVisible): self
  662.     {
  663.         $this->isAbbreviationsVisible $isAbbreviationsVisible;
  664.         return $this;
  665.     }
  666.     public function getSuggestedCitationType(): ?CitationType
  667.     {
  668.         return $this->suggestedCitationType;
  669.     }
  670.     public function setSuggestedCitationType(?CitationType $suggestedCitationType): self
  671.     {
  672.         $this->suggestedCitationType $suggestedCitationType;
  673.         return $this;
  674.     }
  675.     public function getIsSuggestedCitationTypeVisible(): bool
  676.     {
  677.         return $this->isSuggestedCitationTypeVisible;
  678.     }
  679.     public function setIsSuggestedCitationTypeVisible(bool $isSuggestedCitationTypeVisible): self
  680.     {
  681.         $this->isSuggestedCitationTypeVisible $isSuggestedCitationTypeVisible;
  682.         return $this;
  683.     }
  684.     public function getPublishedTill(): ?int
  685.     {
  686.         return $this->publishedTill;
  687.     }
  688.     public function setPublishedTill(?int $publishedTill): self
  689.     {
  690.         $this->publishedTill $publishedTill;
  691.         return $this;
  692.     }
  693.     public function clone(Journal $parent): self
  694.     {
  695.         $clone = clone $this;
  696.         $clone->id null;
  697.         $clone->setUuid();
  698.         $clone->parent $parent;
  699.         return $clone;
  700.     }
  701. }